DF-4589 / verdict.json
{ "finding_id": "DF-4589", "status": "not_reproduced", "reproduced": 0, "impact": "none", "confidence": "likely", "verdict": "radeon_dp_link_train_cr() (atombios_dp.c:684-722) has no overall iteration bound: all four loop exits are sink-controlled, and the 5-try counter is reset to 0 on ANY voltage change (atombios_dp.c:713-714), so a crafted DP sink that alternates its adjust-request voltage between levels < 3 while never achieving clock recovery spins the loop forever (>= 100 us delay + DPCD read per iteration, drm_dp_helper.c:121-134). The caller runs in the DRM modeset path holding mode_config.mutex (atombios_encoders.c:1777) - user ioctl thread or HPD workqueue - producing an unkillable task and a permanently wedged display subsystem. Not reproduced on the audit guest: no AMD GPU exists (Bochs 0x1234:0x1111, run.log/env.txt) and QEMU cannot emulate the crafted DP sink, so execution is hardware-gated; the loop analysis is exhaustive and the defect is certain from source (the CE loop by contrast IS bounded at atombios_dp.c:762). Realistic impact ceiling: local physical DoS (same malicious-sink threat model as DF-1730/DF-1778), no memory corruption.", "exploit_chain": "", "evidence": "VERDICT.md (exit-condition enumeration + caller-context proof); trigger.c (deterministic oscillating-sink state machine with iteration trace table); run.log/env.txt/guest_probe.log (no 0x1002 device on guest); fix.diff (50-iteration hard cap, git-apply clean)", "kernel_refs": [ "sys/dev/drm/radeon/atombios_dp.c:684", "sys/dev/drm/radeon/atombios_dp.c:707", "sys/dev/drm/radeon/atombios_dp.c:713", "sys/dev/drm/radeon/atombios_dp.c:762", "sys/dev/drm/drm_dp_helper.c:121", "sys/dev/drm/radeon/atombios_encoders.c:1777" ], "poc_changes": "No seed pack existed; trigger authored as a documented malicious-sink state machine (guest DragonFly cc compile-check passed; runtime needs radeon HW + crafted DP dongle).", "attempts": 1, "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": 18, "guest_dirty": 0, "build_cmd": "guest: cc -Wall -Wextra -o trigger trigger.c", "run_cmd": "./run.sh", "code_hash": "db5b536a77da04c5ad1669da5b245af7d64a6f9e00f4e8c72945f26c42d8ebb8", "notes": "Hardware-gated (radeon GPU + crafted DP sink required; guest has Boths VGA only). Ceiling: unkillable modeset task holding mode_config.mutex -> all DRM ioctls on the card block; physical-access DoS, no privilege gain. Distinct from DF-1778 (different file/loop) and DF-1730 (memory OOB).", "recommended_fix": "Add an overall iteration cap to the CR loop (50 iterations) so a spec-violating sink cannot wedge the modeset path (see fix.diff).", "fix_status": "not_testable", "fix_baseline_reproduced": 0, "fix_patched_reproduced": 0, "fix_verdict": "Fix not validated on guest: baseline cannot run (no radeon GPU). fix.diff applies cleanly (git apply --check) against atombios_dp.c:668-722 and bounds the loop unconditionally; validated by inspection.", "fix_evidence": "findings/poc/DF-4589/fix.diff" } |