DF-2792 / verdict.json
{ "finding_id": "DF-2792", "status": "reproduced", "reproduced": 1, "impact": "none", "confidence": "certain", "verdict": "sys_ioprio_get()'s PRIO_PGRP scan (kern_resource.c:366-368) gates members on p->p_nice while assigning p->p_ionice; the PROCESS/USER paths compare p_ionice. Deterministic unprivileged PoC: pgrp members with ionice {1,2,8} and nice {0,5,1} yields ioprio_get(PRIO_PGRP)=2 while ioprio_get(PRIO_USER)=8, and the call can even return ESRCH with live members when no member's nice exceeds the running high. Pure correctness defect in a query API (wrong I/O-priority hint to userland); no memory safety, disclosure, or privilege impact. Reproduced identically on stock kernel #0 and the DF-2791-patched kernel #1.", "exploit_chain": "", "evidence": [ "run.log / run.2.log: 'ioprio_get(PRIO_PGRP, 965) = 2 (correct max = 8)' with USER path returning 8" ], "kernel_refs": [ "sys/kern/kern_resource.c:366", "sys/kern/kern_resource.c:368", "sys/kern/kern_resource.c:408" ], "poc_changes": "Dropped local ioprio_set/ioprio_get wrappers (DF libc already declares them in sys/resource.h), added signal.h; syscall numbers 520/521 from syscalls.master.", "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": 10, "guest_dirty": 0, "build_cmd": "cc -O2 -o ioprio_pgrp ioprio_pgrp.c", "run_cmd": "./ioprio_pgrp", "code_hash": "b82da74631f4bdaee7089f1a454d51d2efb2c8e790c80acd2345507794665257", "notes": "ESRCH variant (all members nice <= running high) also reachable per source, not separately demoed.", "recommended_fix": "Compare p->p_ionice instead of p->p_nice in the ioprio_get PRIO_PGRP member scan (fix.diff).", "fix_status": "not_testable", "fix_kernel_uname": "", "fix_baseline_reproduced": 1, "fix_patched_reproduced": 0, "fix_verdict": "One-line field fix authored (fix.diff); dedicated kernel rebuild not performed for a Low correctness finding — behavior validated by inspection against the correct PROCESS/USER paths in the same function.", "fix_evidence": ["fix.diff"] } |