DF-3714 / verdict.json
{ "finding_id": "DF-3714", "status": "inconclusive", "reproduced": 0, "impact": "none", "confidence": "certain", "verdict": "Source-certain, runtime hardware-gated: em_tx_collect (sys/dev/netif/em/if_em.c:3275-3335) uses the raw TDH register read (:3284) as the cleanup walk terminator with no range validation. An out-of-range TDH makes while (first != tdh) unreachable: first wrap frees every TX buffer (including hardware-owned descriptors - DMA-after-free), KKASSERT(num_avail < num_tx_desc) at :3302 panics INVARIANTS builds, and on production builds (KKASSERT compiled out, sys/sys/systm.h:117-119) the loop spins forever holding the interface serializer - permanent soft-lockup. Same class in em_82547_move_tail_serialized (:2003-2024): unvalidated TDT-based hw_tdt walk over tx_desc_base[] and an out-of-ring TDT register write. Mirrors DF-3668 (ix) / DF-3680 (igb). Guest-executed bound-math harness demonstrates the non-terminating walk; no em hardware on the audit guest.", "exploit_chain": "", "evidence": "findings/poc/DF-3714/VERDICT.md; run.log (probe + harness section [C]: TDH=4096 vs 512-entry ring -> 1,048,576 iterations / 2048 wraps without termination; in-range TDH safe); build.log; fix.diff (bail when (uint32_t)tdh >= num_tx_desc)", "kernel_refs": [ "sys/dev/netif/em/if_em.c:3284", "sys/dev/netif/em/if_em.c:3299", "sys/dev/netif/em/if_em.c:3302", "sys/dev/netif/em/if_em.c:3320", "sys/dev/netif/em/if_em.c:2003", "sys/dev/netif/em/if_em.c:2007", "sys/dev/netif/em/if_em.c:2010", "sys/sys/systm.h:117" ], "poc_changes": "No seed PoC. em_bounds_harness.c section [C] written for this finding.", "attempts": 2, "guest_uname": "DragonFly dfbsd 6.5-DEVELOPMENT #0: Thu Jul 2 06:02:54 UTC 2026 x86_64", "runtime_sec": 90, "guest_dirty": 0, "build_cmd": "cc -O -o /root/em_bounds_harness /root/em_bounds_harness.c", "run_cmd": "vm.sh run_root ifconfig -l; pciconf -l; ...; harness/module per run.sh", "code_hash": "062bd0525775d326bb2d63520b01e5d5600be3d5f77de6e6832f262bf7aecb80", "notes": "Device-trust DoS only; em_txeof itself walks driver-internal tx_dd[] and is safe.", "recommended_fix": "Bail out of em_tx_collect() when (uint32_t)TDH >= num_tx_desc instead of walking the ring toward an unreachable index.", "fix_status": "not_testable", "fix_baseline_reproduced": 0, "fix_patched_reproduced": 0, "fix_verdict": "fix.diff authored against the read-only sys/ tree (patch --dry-run clean); cannot be validated on a guest without em hardware.", "fix_evidence": "findings/poc/DF-3714/fix.diff" } |