⬢ DragonFlyBSD Kernel Audit
DF-4589 / verdict.json
← back to finding ↓ download raw
{
  "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"
}