Conpot methodology & trust notes
Status: Informative · evaluation proof
Related: TUTORIAL.md · full/run-meta.json · quick/run-meta.json
1. Claims / non-claims
| We claim |
We do not claim |
Artifacts come from UHBS-Lab v4.0.1 against a live Conpot container Modbus :5020 |
That Conpot is UHBS-certified |
| Full run used 1000-sample timing, source audit, SAST, and real log directory |
That Module A exercised every Modbus function code / every Conpot template |
| Manifests include SHA-256 digests |
That Docker Desktop equals a production air-gap |
| Grades follow normative UHQS / δ_C math |
That UHBS is an industry consortium standard |
| Module D skipped shell probes because this decoy has no SSH listener (correct for Modbus-primary ICS) |
That other Conpot listeners (HTTP/S7/SNMP/…) were graded |
2. Software under test
| Field |
Value |
| Project |
mushorg/conpot |
| Description |
ICS/SCADA honeypot (default multi-protocol template) |
| Git commit |
b82b7a7fae8866c648f7be37f7033481a1b93482 |
| Image |
conpot:lab-fixed (upstream build + setuptools<81 wrapper) |
| Image id |
sha256:a59010a7d6b449906612343cb36e762e4d0f6f2cd1d3e7e0174381d9926f4abe |
| Graded listen |
TCP 5020 Modbus (host publish 502:5020) |
| Template note |
Default Modbus mode=serial, delay=100; slaves expose coils/discrete/analog — not holding registers at addr 0 |
3. Grader
Why ICS-SCADA? Matches the industrial decoy class weights (heavy Module A).
Why Modbus-only? UHBS has a first-class Modbus plugin; grading every Conpot listener in one UHQS would mix protocols and obscure failure modes.
4. Topology
┌──────────────────────┐ network uhbs-lab ┌──────────────────────────┐
│ uhbs:4.0.1[-full] │ ───────────────────── │ conpot-lab │
│ mounts /honeypot │ ← source tree │ Modbus :5020 (graded) │
│ mounts /telemetry │ ← conpot.log │ (+ other listeners N/A) │
└──────────────────────┘ └──────────────────────────┘
5. Module notes (full)
| Module |
What ran |
Outcome driver |
| A |
Modbus FSM + FC03 nego + 1000× timing |
FC03 illegal data address on default map → nego 30; timing strong |
| B |
FC06 write/read + binary fuzz |
Survives blast; write/read exchange completed |
| C |
/telemetry with conpot.log |
Text logs → no STIX/OTel → capped at 55 |
| D |
No shell-exec port |
Airgap + clean gateway → C=90, δ_C=0.81 |
| E |
5×50 connect load |
P95 ~1.7 ms; moderated vs 25×200 (Conpot CLOSE_WAIT fragility) |
| F |
bandit + semgrep on source |
Template SSL keys + Bandit HIGH → F capped at 70 |
6. Integrity
python - <<'PY'
import hashlib, json
from pathlib import Path
for mode in ("quick", "full"):
root = Path(f"docs/conformance/reports/conpot/{mode}")
man = json.loads((root / "MANIFEST.json").read_text())
print("==", mode, "==")
for art in man["artifacts"]:
p = root / art["path"]
h = hashlib.sha256(p.read_bytes()).hexdigest() if p.is_file() else None
print(("OK" if h == art["sha256"] else "FAIL"), art["path"])
PY
uhbs validate-scorecard docs/conformance/fixtures/conpot-ics-scada.scorecard.json --strict
7. Limitations
- Holding-register probe vs default map — Module A FC03 failure is template realism, not “Modbus dead.”
- Air-gap attested —
UHBS_AIRGAP_ATTESTED=1 inside Docker Desktop.
- No remote shell containment probes — Module D only Paramikos an explicit
ports.ssh / ssh_port.
- Telemetry format — classic text logger, not detection-pipeline schemas.
- Moderated Module E — published full run is not a 25×200 storm (that wedged Conpot in this lab).
- Other protocols — HTTP/S7/SNMP/BACnet/… not included in UHQS.
- Non-endorsement — naming Conpot ≠ UHBS requirement.
8. Replication
Follow TUTORIAL.md. Compare image digests and run-meta.json if UHQS diverges.