DF-3626 / verdict.json
{ "finding_id": "DF-3626", "status": "inconclusive", "reproduced": 0, "impact": "none", "confidence": "certain", "verdict": "Source-level certain, runtime inconclusive: intel_dp_check_mst_status() (sys/dev/drm/i915/intel_dp.c:4294-4323) retries the sink-driven ESI handshake via goto go_again with no iteration bound; drm_dp_mst_hpd_irq() (sys/dev/drm/drm_dp_mst_topology.c:2450-2473) returns handled=true whenever the sink keeps DP_DOWN_REP_MSG_RDY/UP_REQ_MSG_RDY set or toggles the 6-bit sink count, so a malicious MST branch device livelocks the dp_wq hotplug kthread forever, leaks the intel_display_power_get() reference taken at intel_dp.c:5684, and starves all display hotplug handling until reboot. Could not be exercised at runtime because the audit guest is virtio-only (vgapci chip 0x1111:1234): i915 never PCI-attaches and /dev/dri does not exist; however the vulnerable function ships in the stock /boot/kernel/i915.ko (nm: 00000000000cbd80 t intel_dp_check_mst_status; loop debug strings present) and enable_dp_mst defaults to true (i915_params.h:69). Expected impact on real HSW+ hardware: kernel DoS via evil dock/monitor (physical-access vector).", "exploit_chain": "evil DP branch device -> advertise DPCD rev>=0x12 + DP_MSTM_CAP(MST) -> i915 enters MST -> device asserts one short HPD -> kernel reads ESI (0x2002..0x200f) -> device always returns esi[1]|DP_DOWN_REP_MSG_RDY and ignores the clear-writes -> intel_dp_check_mst_status() loops go_again forever -> dp_wq kthread busy-spins, display power-well refcount leaked, all-port HPD dead until reboot (DoS). No memory-corruption primitive, no escalation path.", "evidence": "VERDICT.md (full path trace table + guest hardware proof); README.md (loop anatomy, attacker spec, consequences); env.txt (guest pci/kld state); fix.diff (bounded-bounce patch). Decisive lines: intel_dp.c:4294 (go_again label), 4306-4322 (handled->clear->re-read->goto), drm_dp_mst_topology.c:2455-2470 (handled set from sink bits only).", "kernel_refs": [ "sys/dev/drm/i915/intel_dp.c:4287", "sys/dev/drm/i915/intel_dp.c:4294", "sys/dev/drm/i915/intel_dp.c:4306", "sys/dev/drm/i915/intel_dp.c:4319", "sys/dev/drm/i915/intel_dp.c:5684", "sys/dev/drm/i915/intel_dp.c:5687", "sys/dev/drm/drm_dp_mst_topology.c:2450", "sys/dev/drm/drm_dp_mst_topology.c:2462", "sys/dev/drm/i915/intel_hotplug.c:496" ], "poc_changes": "No seed PoC existed; this is a hardware-in-the-loop bug (malicious DP sink). The evidence pack documents the exact evil-sink DPCD behavior spec instead of a runnable host program, plus proof the vulnerable code ships in the default-install kernel module.", "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": 0, "guest_dirty": 0, "fix_status": "not_testable", "fix_baseline_reproduced": 0, "fix_patched_reproduced": 0, "fix_verdict": "fix.diff bounds the go_again loop to 8 bounces and emits a hotplug event + DRM_ERROR on exhaustion; could not be build-validated on this guest because the target path requires Intel display hardware (no i915 attach on virtio guest) and a hostile sink to drive it.", "fix_evidence": "findings/poc/DF-3626/fix.diff", "build_cmd": "", "run_cmd": "", "code_hash": "", "notes": "Upstream-inherited bug (Linux 4.14-era intel_dp.c has the identical loop; still present in current Linux). Guest checks: pciconf chip=0x11111234 (virtio), no drm kld loaded, /dev/dri absent, i915.ko present in /boot/kernel with symbol at 0xcbd80.", "recommended_fix": "Bound the go_again bounce count (e.g. 8) in intel_dp_check_mst_status(); on exhaustion schedule a full hotplug reprobe instead of looping." } |