DF-3437 / verdict.json
{ "finding_id": "DF-3437", "status": "untested", "reproduced": 0, "impact": "none", "confidence": "likely", "verdict": "Not exercised on the guest: the QEMU target has no 802.11 radio and DragonFly has no virtual 802.11 driver, so no vap can be created to drive the scan framework (same constraint that left DF-0640/DF-0587 unverified in pass 1). The defect is established by code walk: ieee80211_scan_timeout (ieee80211_scan.c:582-588, called from the unlocked ieee80211_node_timeout callout, ieee80211_node.c:2243-2256) and scan_iterate/scan_flush (:626-647) dispatch through ss->ss_ops with no com lock, while ieee80211_scan_vdetach (:137-155) under the lock calls scan_detach -> sta_detach (ieee80211_scan_sta.c:186-199) which kfrees ss->ss_priv (the sta_table) without clearing it before ss->ss_ops is NULLed. The check-then-call window lets the timers scan_age run SCAN_TABLE_LOCK + TAILQ walks on freed memory. Root-gated trigger (ifconfig wlanX destroy) racing a once-per-interval callout; DF-0587 family (lock-discipline hole at a different site).", "exploit_chain": "", "evidence": [ "README.md: interleaving diagram + path:line walk", "ieee80211_node.c:2253 (unlocked callout call), ieee80211_scan.c:586-587 (unlocked ss_ops check-then-call), ieee80211_scan_sta.c:186-199 (sta_detach frees ss_priv, never clears it)" ], "kernel_refs": [ "sys/netproto/802_11/wlan/ieee80211_scan.c:582", "sys/netproto/802_11/wlan/ieee80211_scan.c:586", "sys/netproto/802_11/wlan/ieee80211_scan.c:626", "sys/netproto/802_11/wlan/ieee80211_scan.c:639", "sys/netproto/802_11/wlan/ieee80211_scan.c:147", "sys/netproto/802_11/wlan/ieee80211_node.c:2253", "sys/netproto/802_11/wlan/ieee80211_scan_sta.c:186" ], "poc_changes": "", "attempts": 0, "guest_uname": "", "runtime_sec": 0, "guest_dirty": 0, "build_cmd": "", "run_cmd": "", "code_hash": "", "notes": "Guest lacks radio hardware; not testable this session. Suggested fix: hold IEEE80211_LOCK in the unlocked dispatchers (scan_timeout/iterate/flush/assoc_*) and clear ss->ss_priv in sta_detach before returning.", "recommended_fix": "Take IEEE80211_LOCK(ic) around the ss_ops dispatches in ieee80211_scan.c and clear ss->ss_priv in sta_detach()." } |