DF-4488 / verdict.json
{ "finding_id": "DF-4488", "status": "untested", "reproduced": 0, "impact": "none", "confidence": "speculative", "verdict": "Lock-domain mismatch: vo destroy paths (acpi_video_detach :300-304, REPROBE destroy loop :389-395) hold only the video serial while all four vo sysctl handlers (:754,:774,:815,:858) hold only video_output; sysctl_ctx_free cannot stop an in-flight handler. A firmware REPROBE destroying an output racing a sysctl read frees vo/vo_levels under the reader: the world-readable levels oid then runs sysctl_handle_opaque on freed memory (unpriv kernel-heap disclosure) and the brightness handler can write vo->vo_brightness into freed memory (:800). vo_active_sysctl also reads vo->handle before locking (:751-753). Speculative: single microsecond-scale window per destroy event; not reliably demonstrable on the guest, but the missing mutual exclusion is plain in the source.", "exploit_chain": "", "evidence": "VERDICT.md (lock analysis with path:line)", "kernel_refs": [ "sys/dev/acpica/acpi_video/acpi_video.c:301", "sys/dev/acpica/acpi_video/acpi_video.c:389", "sys/dev/acpica/acpi_video/acpi_video.c:754", "sys/dev/acpica/acpi_video/acpi_video.c:867" ], "poc_changes": "", "attempts": 0, "guest_uname": "DragonFly dfbsd 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": 0, "guest_dirty": 0, "build_cmd": "", "run_cmd": "", "code_hash": "", "notes": "Race window ~instructions wide; would need repeated destroy/recreate churn of outputs to ever hit.", "recommended_fix": "Take ACPI_SERIAL_BEGIN(video) in the vo sysctl handlers (or video_output in vo_destroy) so destroy and handler execution are mutually exclusive", "fix_status": "not_testable", "fix_baseline_reproduced": 0, "fix_patched_reproduced": 0, "fix_verdict": "Speculative race; not runtime-tested.", "fix_evidence": "" } |