DF-2924 / verdict.json
{ "finding_id": "DF-2924", "status": "not_reproduced", "reproduced": 0, "impact": "none", "confidence": "likely", "verdict": "cmd_get_usage_all() (vfs_quota.c:187/:202) iterates the accounting RB trees and reads ac_bytes/ac_limit without holding ac_spin while vfs_stdaccount (:158-171) and cmd_set_usage_all (:228-268) mutate/rebalance the same trees under the spinlock. RB_NEXT chases rbe_parent pointers, so a concurrent rotation can make the successor walk revisit nodes => traversal cycle => unkillable kernel-mode spin; plus torn 64-bit counter reads. The locking defect is plain in the source; on the guest every attempt to exercise it was masked by DF-2926 (sustained vquotactl traffic exhausts the proplib malloc limit and panics the kernel within ~60 s, at 4096- and 128-entry arrays alike; a 60 s low-rate run did not livelock). Classified likely / not reproduced (confounder documented).", "exploit_chain": "", "evidence": [ "README.md result section — DF-2926 panic preempted the measurement both times", "source citations: unlocked walk at vfs_quota.c:183-215 vs locked mutation at :158-171 and :228-268" ], "kernel_refs": [ "sys/kern/vfs_quota.c:187", "sys/kern/vfs_quota.c:202", "sys/kern/vfs_quota.c:158-171", "sys/kern/vfs_quota.c:228-268" ], "poc_changes": "Array size reduced 4096->128 for the second attempt to stay under the proplib limit (still hit it).", "attempts": 2, "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": 180, "guest_dirty": 0, "build_cmd": "cc -O -o vqlivelock vqlivelock.c -lprop", "run_cmd": "/tmp/vqlivelock /boot 60 (unprivileged writer+reader)", "code_hash": "bc9e23fc03192321b000a7e57ad5ff43ddcec84a0c426bc3e94f71f6bd0c28e1", "notes": "Fix is trivial (take ac_spin around the read walk) and is defense-in-depth regardless of whether the livelock window is ever landed.", "recommended_fix": "Hold ac_spin across cmd_get_usage_all()'s tree walk and counter reads (or a seqlock for readers).", "fix_status": "not_testable", "fix_kernel_uname": "", "fix_baseline_reproduced": 0, "fix_patched_reproduced": 0, "fix_verdict": "not_testable: no baseline reproduction to compare against.", "fix_evidence": "README.md" } |