DF-3287 / verdict.json
{ "finding_id": "DF-3287", "status": "reproduced", "reproduced": 1, "impact": "panic", "confidence": "certain", "verdict": "Single 54-byte AE=01 unicast DSTODS QoS mesh data frame from an established peer panics the stock INVARIANTS kernel with panic: no route at the inlined mesh_recv_indiv_data_to_fwrd KASSERT (mesh_input+0x127b); on non-INVARIANTS builds the same path calls ieee80211_mesh_rt_update(NULL) whose MESH_RT_ENTRY_LOCK writes near NULL. Root cause: mesh_checkpseq only ensures a route for the AE-specific SA while to_fwrd/to_me deref a route for i_addr4 unconditionally.", "exploit_chain": "attacker beacon -> victim auto-peers (OPENSNT) -> synchronous OPEN+CONFIRM -> ESTABLISHED -> one crafted AE=01 4-address unicast data frame (addr4 = never-routed MAC, addr3 = the mc_addr4 the seq-check routed) -> rt_find(i_addr4) == NULL -> KASSERT panic (INVARIANTS) / near-NULL lockmgr write (production) -> remote DoS", "evidence": "panic.txt: full console trace (panic: no route, mesh_input+0x127b)\nREADME.md root-cause cites mesh.c:1758-1768, 1441-1444, 1482-1488", "kernel_refs": [ "sys/netproto/802_11/wlan/ieee80211_mesh.c:1441", "sys/netproto/802_11/wlan/ieee80211_mesh.c:1442", "sys/netproto/802_11/wlan/ieee80211_mesh.c:1482", "sys/netproto/802_11/wlan/ieee80211_mesh.c:1488", "sys/netproto/802_11/wlan/ieee80211_mesh.c:1758" ], "poc_changes": "shared harness fwm.c (DF-3286 pack); step 11 crafts the AE=01 frame with addr3==mc_addr4 so the rt_meshda lookup passes and the NULL rt_meshsa deref is reached", "attempts": 1, "guest_uname": "DragonFly dfbsd 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": 240, "guest_dirty": 1, "build_cmd": "sh findings/poc/DF-3286/build.sh", "run_cmd": "sh findings/poc/DF-3287/run.sh", "code_hash": "1b0e0b1a43331b1bc92e2614476535a88b88d3863db6ef91a36eead5c8ad7503", "notes": "guest wedged in ddb after panic; reset with-src performed", "recommended_fix": "NULL-check the addr4 route in to_fwrd/to_me and discard the frame instead of KASSERT+deref (fix.diff hunks 2-3)", "fix_status": "fixed", "fix_kernel_uname": "DragonFly dfbsd 6.5-DEVELOPMENT #1: Thu Sep 10 05:34:08 UTC 2026 root@dfbsd:/usr/obj/usr/src/sys/X86_64_GENERIC x86_64 (fix kernel)", "fix_baseline_reproduced": 1, "fix_patched_reproduced": 0, "fix_verdict": "same single AE=1 frame that panicked the stock kernel (panic: no route) is silently discarded on the fixed kernel (NO_PANIC_3287); link stays established", "fix_evidence": [ "fix.log: NO_PANIC_3287" ] } |