DF-3745 / verdict.json
{ "finding_id": "DF-3745", "status": "inconclusive", "reproduced": 0, "impact": "none", "confidence": "certain", "verdict": "radeon_get_atom_connector_info_from_object_table() (the DCE4+ connector path) dereferences a web of unvalidated BIOS values: (1) table bases from u16 offsets usStateArrayOffset/usClockInfoArrayOffset/usNonClockInfoArrayOffset/usDisplayPathTableOffset/usConnectorObjectTableOffset/usEncoderObjectTableOffset/usRouterObjectTableOffset (:537-548); (2) the display-path walk accumulates attacker u16 usSize values (:551-557) \u2014 two 0x8000 sizes put the record pointer 64 KiB out; (3) per-object usRecordOffset/usSrcDstTableOffset u16 offsets dereferenced immediately (:654-656, :685-698); (4) router src/dst: enum_id runs to *num_dst_objs (u8<=255) then indexes ucMuxState[enum_id] though ucMuxState is UCHAR[2] (atombios.h:4380-4395) \u2014 up to 253 B OOB (:732/:740); (5) record chains stepped by ucRecordSize with no image-end bound (:660-672, :772-803). All of this reads past the rdev->bios heap image at boot/attach (values feed connector config; distinct surface from the power-table indices of DF-1200). Harness on guest demonstrates each sub-case. Kernel path unreachable on this guest.", "exploit_chain": "crafted Object_Header table -> OOB pointer arithmetic at radeon_modeset_init -> reads of adjacent kernel heap -> crash (values also propagate into connector/encoder setup)", "evidence": "harness_objtable.c + build.log + run.log; VERDICT.md; kernel refs sys/dev/drm/radeon/radeon_atombios.c:536-548", "kernel_refs": [ "sys/dev/drm/radeon/radeon_atombios.c:536-548", "sys/dev/drm/radeon/radeon_atombios.c:551-557", "sys/dev/drm/radeon/radeon_atombios.c:654-656", "sys/dev/drm/radeon/radeon_atombios.c:682-698", "sys/dev/drm/radeon/radeon_atombios.c:703-740", "sys/dev/drm/radeon/radeon_atombios.c:772-803", "sys/dev/drm/radeon/atombios.h:4380-4395" ], "poc_changes": "harness written from scratch (no seed PoC): verbatim kernel arithmetic replica with canary-guarded destination model, built and executed on the DragonFly guest (cc 8.3); fixed nested-comment, stddef/stdint includes and volatile divisors during bring-up", "attempts": 3, "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": 6, "guest_dirty": 0, "build_cmd": "./build.sh", "run_cmd": "./run.sh (after ./build.sh)", "code_hash": "9465d6ae79ceabe9b5478eec57f8c6848dfd4c892fcb9b1ebfdcbe64f9ec8218", "notes": "Guest has NO AMD/radeon GPU (virtio-only); /boot/kernel/radeon.ko exists (code shipped in the default install) but cannot attach, so the kernel code path is unreachable at runtime on this guest. Evidence is source-level certainty (path:line traced) plus a verbatim-arithmetic userland harness compiled and executed on the guest (build.log/run.log).", "recommended_fix": "validate every BIOS offset/size against the image length before use (needs the bios_size plumbing of DF-3744)", "fix_status": "not_tested", "fix_baseline_reproduced": 0, "fix_patched_reproduced": 0, "fix_verdict": "fix.diff authored after source-level verification; cannot be validated on this guest (no AMD GPU; radeon.ko cannot attach). Compiling the module or booting a patched kernel would not exercise the path without hardware.", "fix_evidence": "fix.diff (unified, against read-only sys/ tree; never applied)" } |