DF-4355 / verdict.json
{ "finding_id": "DF-4355", "status": "untested", "reproduced": 0, "impact": "none", "confidence": "certain", "verdict": "The SMC91xx driver waits on the on-chip MMU engine with four completely unbounded busy-loops - if_sn.c:275-276 (sninit), 641-642 (snresume), 871-872 (sn_intr TX-error, hard IRQ context), 1056-1057 (snread, hard IRQ, per packet) - plus two device-driven no-exit loops (ARR_FAILED retry at 446-450->354; read_another FIFO walk at 1063-1067). On a glitching card or after physical PCMCIA ejection (floating port reads keep MMUCR_BUSY=0x0001 asserted), the spins never terminate while holding the ifnet serializer in interrupt context: the machine hangs and only a power cycle recovers. Source-level certainty is high (the same driver bounds its allocation wait at 415-419 with MEMORY_WAIT_TIME=1000, showing the omission is an oversight), but reproduction requires SMC91xx hardware which the QEMU guest lacks -> untested. Local DoS only, physical-presence/failing-hardware trigger, severity Low.", "exploit_chain": "", "evidence": "VERDICT.md (site-by-site table with lock context), README.md (trigger model + bounded-wait fix sketch), env.txt (guest lacks hardware), fix.diff (bounded waits at all four MMU sites). Decisive lines: if_sn.c:275, 641, 871, 1056 (unbounded spins), if_sn.c:415-419 (bounded counter-example), if_snreg.h:238/60.", "kernel_refs": [ "sys/dev/netif/sn/if_sn.c:275", "sys/dev/netif/sn/if_sn.c:641", "sys/dev/netif/sn/if_sn.c:871", "sys/dev/netif/sn/if_sn.c:1056", "sys/dev/netif/sn/if_sn.c:446", "sys/dev/netif/sn/if_sn.c:1063", "sys/dev/netif/sn/if_sn.c:415", "sys/dev/netif/sn/if_snreg.h:238", "sys/dev/netif/sn/if_snreg.h:60" ], "poc_changes": "No executable PoC exists: path requires SMC91xx PCMCIA hardware (card ejection mid-transfer) absent from the guest. Evidence pack is source-level (VERDICT.md) plus guest hardware-inventory proof (env.txt).", "attempts": 0, "guest_uname": "DragonFly dfbsd 6.5-DEVELOPMENT DragonFly 6.5-DEVELOPMENT #0: Thu Jul 2 06:02:54 UTC 2026 root:dfbsd:/usr/obj/usr/src/sys/X86_64_GENERIC x86_64", "runtime_sec": 0, "guest_dirty": 0, "build_cmd": null, "run_cmd": null, "code_hash": "sha256:d8511df37fba8dc921f0e29e7614da17d470456e64448e36619eb7ee9e079fbd (fix.diff)", "notes": "Hardware-gated DoS family. The detach path also cannot recover (sn_pccard_detach needs the same serializer - known DF-2186, if_sn_pccard.c). Folded in (not separately reported): snresume wrong-size path returns without clearing oactive/restarting TX (TX stall on misbehaving card) - same fault model, lower impact.", "recommended_fix": "Bound all four MMUCR_BUSY waits with a MEMORY_WAIT_TIME-scaled counter + DELAY(1) and bail out leaving the interface for the watchdog, mirroring the existing bounded wait at if_sn.c:415-419; cap the read_another/ARR_FAILED loops.", "fix_status": "not_testable", "fix_baseline_reproduced": 0, "fix_patched_reproduced": 0, "fix_verdict": "not_testable: fix validation requires SMC91xx hardware (guest has none). fix.diff applies bounded waits at all four MMU sites using the drivers own MEMORY_WAIT_TIME idiom; by inspection every patched loop terminates within ~1s per wait on both healthy and vanished hardware, converting the hang into a logged timeout.", "fix_evidence": "findings/poc/DF-4355/fix.diff (4 hunks); env.txt (hardware absent)." } |