DF-2590 / verdict.json
{ "finding_id": "DF-2590", "status": "reproduced", "reproduced": 1, "impact": "panic", "confidence": "certain", "verdict": "Confirmed on the verbatim driver in the DF-2386 kernel rig: acpi_panasonic_hkey_event discards the AcpiEvaluateObject status for HINF (acpi_panasonic.c:403) and dereferences res = buf.Pointer at :405; the driver sets buf.Pointer = NULL at :402 and ACPICA leaves it NULL on every failure path (nsxfeval.c:525-631). The rig captured the real verbatim acpi_panasonic_notify registered by the real attach and dispatched notify 0x80 exactly as ACPICA deferred dispatch would: happy path first (HINF integer 0x81 -> key decode, acpi_UserNotify fired, handler returned, no panic), then with the HINF evaluation failing the identical injection panicked the kernel 4/4 runs at Stopped at acpi_panasonic_notify+0x9f cmpl 0x1,(%rdi) -- that immediate (ACPI_TYPE_INTEGER == 1) fingerprints the res->Type != ACPI_TYPE_INTEGER test at :405 with %rdi = res = NULL (hkey_event inlined into notify), exactly as 0x4 fingerprinted :279 in DF-2386. The late if (buf.Pointer) AcpiOsFree at :420-421 proves the author knew the pointer can be NULL, one check too late. Trigger on hardware is an Fn-hotkey ACPI notify coinciding with an HINF evaluation failure (physical user + failing eval or hostile firmware) -- AC:H/UI:R as scored. NULL-deref panic, no write primitive, not a privesc. fix.diff (status check + res NULL guard) A/B validated: the identical armed injection makes the handler return cleanly with the guest staying up.", "exploit_chain": "ACPI notify 0x80 on the MAT0019 device (Fn hotkey press; rig injects it to the captured real handler from a kthread, mirroring ACPICA deferred dispatch) -> acpi_panasonic_notify case 0x80 -> ACPI_SERIAL_BEGIN -> acpi_panasonic_hkey_event -> AcpiEvaluateObject(HINF) fails leaving buf.Pointer NULL -> res->Type load from NULL -> fatal trap, kernel panic. Ceiling is DoS from a firmware-event context; no unprivileged syscall trigger, no write primitive, no uid0 path.", "evidence": "panic.txt (serial: login: PANASIM: worker: exec cmd=3 / PStopped at acpi_panasonic_notify+0x9f cmpl 0x1,(%rdi) / db>); run.log + run.2.log (happy path notify_seen=1 then armed trigger kills the ssh session -- Connection closed by remote host); run_fixed.log + rig ring (fixed: inject: dispatching -> eval HINF AE_NO_MEMORY -> inject: handler returned, guest up)", "kernel_refs": [ "sys/dev/acpica/acpi_panasonic/acpi_panasonic.c:401-405", "sys/dev/acpica/acpi_panasonic/acpi_panasonic.c:420-421", "sys/dev/acpica/acpi_panasonic/acpi_panasonic.c:486-492", "sys/contrib/dev/acpica/source/components/namespace/nsxfeval.c:530-566" ], "poc_changes": "No seed PoC existed; reused the DF-2386 rig and added the HINF reply mode knob plus notify injection: the interposed AcpiInstallNotifyHandler captures the verbatim acpi_panasonic_notify + softc context, and hw.panasim.cmd=3 dispatches notify 0x80 from a kthread (ACPICA dispatch model). Harness observations baked into the VERDICT: all console and msgbuf output originating from the injected-notify kthread is silently dropped by the console layer (both kprintf lines and the trap block; only DDB own print survives), so the full-format trap block of the sibling DF-2386 panic plus the 4/4 deterministic DDB stop line constitute the capture.", "attempts": 3, "guest_uname": "DragonFly dfbsd 6.5-DEVELOPMENT DragonFly 6.5-DEVELOPMENT #4: Mon Oct 19 09:05:52 UTC 2026 root@dfbsd:/usr/obj/usr/src/sys/PANHARNESS x86_64", "runtime_sec": 2400, "guest_dirty": 0, "build_cmd": "sh build.sh # shared with DF-2386 (verbatim driver + rig, PANHARNESS kernel)", "run_cmd": "sh run.sh baseline # create device, happy-path notify (hinf_mode=1), arm hw.panasim.hinf_mode=0, inject notify 0x80 (cmd=3) -> panic; sh run.sh fixed", "code_hash": "a70387113f982a4e39cc0daf840d67df623a06cdbcd64a5b48c1ab3aafd39ac7", "notes": "Same NULL-Type class as DF-2386 (whose sinf half is also duplicated by DF-2589) but notify-reachable rather than sysctl-reachable; recommend folding with DF-2386 on triage per the pass-2 note for this file. Happy-path proof rules out a rig artifact: the identical injection with a conformant HINF integer completes through the whole verbatim notify path.", "recommended_fix": "acpi_panasonic_hkey_event: check the AcpiEvaluateObject status (device_printf + goto end on failure) and guard res == NULL before res->Type, matching the existing buf.Pointer guard at :420" } |