DF-3969 / verdict.json
{ "finding_id": "DF-3969", "status": "not_reproduced", "reproduced": 0, "impact": "none", "confidence": "certain", "verdict": "Certain missing NULL checks: rt2560_scan_end (rt2560.c:2566-2574) dereferences ic->ic_scan->ss_vap->iv_bss and rt2560_enable_tsf_sync (rt2560.c:2277,2284) dereferences TAILQ_FIRST(&ic->ic_vaps)->iv_bss without checking for NULL; the scanner invokes ic_scan_end unlocked (ieee80211_scan_sw.c:796-798, self-annotated scan state can change!) and ieee80211_scan_vdetach (ieee80211_scan.c:147-155) clears ss_vap and empties ic_vaps under the lock \u2014 destroying the only vap in that window yields NULL -> Fatal trap 12 (privileged-triggered race, local DoS). Identical pattern to the proven sibling finding DF-3968 (rt2661); rt2560 even guards the same TAILQ_FIRST elsewhere (rt2560.c:2691). Not reproduced: the audit guest has no Ralink NIC (env.txt); the on-target trigger recipe (destroy-vs-bgscan loop) is documented in trigger.c.", "exploit_chain": "assoc + background scan running -> concurrent ifconfig wlan0 destroy wins the unlocked ic_scan_end window -> ieee80211_vap_delete/scan_vdetach clears ss_vap and empties ic_vaps -> rt2560_enable_tsf_sync reads vap->iv_bss at NULL (2284) or rt2560_scan_end reads ss_vap->iv_bss (2573) -> kernel panic (DoS).", "evidence": "VERDICT.md (race window path:line incl. net80211 call site and the guarded sibling line rt2560.c:2691), trigger.c (on-target loop), env.txt (no Ralink NIC), fix.diff (NULL guards at both sites), build.log (if_ral.ko rebuilt -Werror clean on the guest /usr/src copy)", "kernel_refs": [ "sys/dev/netif/ral/rt2560.c:2566", "sys/dev/netif/ral/rt2560.c:2571", "sys/dev/netif/ral/rt2560.c:2573", "sys/dev/netif/ral/rt2560.c:2277", "sys/dev/netif/ral/rt2560.c:2284", "sys/dev/netif/ral/rt2560.c:2691", "sys/netproto/802_11/wlan/ieee80211_scan_sw.c:796", "sys/netproto/802_11/wlan/ieee80211_scan.c:147" ], "poc_changes": "Trigger is a documented race recipe (needs NIC + association); informational C stub compiled only.", "attempts": 1, "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": 6, "guest_dirty": 0, "build_cmd": "guest: cd /usr/src && patch -p1 < /root/fix1.diff && cd sys/dev/netif/ral && make # -Werror, full if_ral.ko link (build.log)", "run_cmd": "dfbsd-qemu/vm.sh run_root pciconf -lv | grep -i ralink; ifconfig -l # => no Ralink device (run.log/env.txt)", "code_hash": "d1ec4747b40848f34e360e892f99a12591e3e4426b417306d2df93d02fe0da5e", "notes": "Pass-2 finding (GLM 5.3). FreeBSD-inherited pattern, sibling of DF-3968 (rt2661). DoS-only (privileged destroy race); no memory corruption.", "recommended_fix": "NULL-guard ss_vap in rt2560_scan_end and TAILQ_FIRST in rt2560_enable_tsf_sync (fix.diff).", "fix_status": "not_testable", "fix_baseline_reproduced": 0, "fix_patched_reproduced": 0, "fix_verdict": "Two two-line NULL guards eliminate the deref; git apply --check clean against sys/ and the patched module rebuilt -Werror clean (build.log; combined with the other two rt2560 fix.diffs of this batch). Runtime validation impossible without the NIC.", "fix_evidence": "fix.diff; build.log (if_ral.ko linked from patched rt2560.o with -Werror on the guest /usr/src copy)" } |