DF-2739 / manifest.json
{ "finding_id": "DF-2739", "file": "sys/kern/kern_linker.c", "title": "linker_file_unload() veto-path refcount underflow -> premature teardown -> UAF", "verdict": "reproduced", "impact": "panic", "confidence": "certain", "severity": "Medium", "privilege_required": "root (SYSCAP_NOKLD)", "reproduce": { "build": "cd /tmp/kldtest && csh build.sh", "run": "cd /tmp/kldtest && ./poc", "expected": "VULNERABLE: step2 EBUSY but kldstat shows refs=0 on live file; step4 kldunload succeeds and kldfind(vetoa)=ENOENT while depb still loaded; step5 kldunload(depb) -> panic 'Bad link elm ... next->prev != elm' with nested linker_file_unload frames. FIXED: refs sequence 1->1->2->1, vetoa survives step4, clean unload, no panic." }, "kernel_refs": [ "sys/kern/kern_linker.c:514-520 (veto path, erroneous file->refs-- at :518)", "sys/kern/kern_linker.c:494-497 (refs>1 fast path)", "sys/kern/kern_linker.c:540-549 (teardown + recursive dep unload)", "sys/kern/kern_linker.c:556 (ops->unload indirect call on freed object)", "sys/kern/kern_linker.c:1636 (dependency refs++)", "sys/kern/kern_linker.c:841,853-856 (privilege gate + userrefs accounting)" ], "fix_validated": true, "fix_kernel": "DragonFly 6.5-DEVELOPMENT #1: Mon Aug 31 12:46:55 UTC 2026", "artifacts": [ "README.md", "VERDICT.md", "poc.c", "vetoa_mod/vetoa.c", "vetoa_mod/Makefile", "depb_mod/depb.c", "depb_mod/Makefile", "Makefile", "build.sh", "run.sh", "build.log", "run.log (baseline: underflow + premature teardown + panic)", "run.fixed.log (patched kernel: clean)", "panic.txt", "env.txt", "fix.diff", "manifest.json", "verdict.json" ] } |