DF-2528 / verdict.json
{ "finding_id": "DF-2528", "status": "not_reproduced", "reproduced": 0, "impact": "none", "confidence": "likely", "verdict": "A root-driven hammer (raw dd I/O on vn3 racing 8 vnconfig -u detach rounds) produced no panic - the window is narrow and the opencount gate serializes the common case. The source trace stands: struct vn_softc carries no lock; vnstrategy/vnget peek VNF_INITED/sc_vp unlocked while vnclear (VNIOCDETACH, RESTRICTEDROOT) closes the vnode, deallocates the object and NULLs the pointers (:744-756); disk_getopencount is an unlocked read. Privileged-cooperator local DoS as filed. Fix (state token serializing the strategy snapshot against vnclear) compile-validated in the vn module build; the full vnode-lifetime fix additionally needs a held reference across I/O (noted in the diff).", "exploit_chain": "root+operator cooperation required; ceiling: panic/UAF on a racing detach.", "evidence": "no crash in the hammer; vn module builds with the token fix.", "kernel_refs": [ "sys/dev/disk/vn/vn.c:272", "sys/dev/disk/vn/vn.c:794", "sys/dev/disk/vn/vn.c:744", "sys/dev/disk/vn/vn.c:124" ], "poc_changes": "hammer only; the deterministic race driver was not built (finding is Low, privileged race).", "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": 400, "guest_dirty": 0, "build_cmd": "(hammer) dd/vnconfig loops", "run_cmd": "(for i in 1..8; do dd if=/dev/vn3 of=/dev/null bs=64k count=4; done) racing (vnconfig -u vn3 x8)", "code_hash": "n/a", "notes": "Natural race not hit in a short root-driven hammer (8 detach rounds vs raw I/O); no panic observed. Source trace stands: no lock anywhere on struct vn_softc state; vnstrategy/vnget peek VNF_INITED/sc_vp unlocked while vnclear (VNIOCDETACH, RESTRICTEDROOT) frees them. Fix (state token) compile-validated in the vn module build.", "recommended_fix": "serialize vnstrategy state snapshot against vnclear with a token", "fix_status": "compile_validated" } |