DF-4731 / verdict.json
{ "finding_id": "DF-4731", "status": "untested", "reproduced": 0, "impact": "none", "confidence": "certain", "verdict": "One-past-end guard defect in DAL_VALID_IRQ_SRC_NUM (irq_types.h:157-158, <= instead of <) trusted by amdgpu_dm_irq.cs register/unregister validation (:176/:193) before indexing irq_handler_list_{low,high}_tab[irq_source] (:238/:242/:123/:127), arrays sized [DAL_IRQ_SOURCES_NUMBER]=90 (amdgpu_dm.h:106-107). The guard math was proven on the DragonFly guest with a verbatim-enum harness (run.log: src=90 accepted, src=89 accepted, src=91 rejected - exactly one OOB index passes). The in-kernel path is untestable on this guest (no AMD GPU; no /dev/dri; only QEMU virtual VGA) and is latent anyway: every register caller passes in-range sources and amdgpu_dm_irq_unregister_interrupt has zero callers tree-wide. Inherited verbatim from upstream Linux v4.17.", "exploit_chain": "", "evidence": "run.log lines accept src=90 (ONE PAST) : true and RESULT: OFF-BY-ONE CONFIRMED; VERDICT.md reachability analysis (callers at amdgpu_dm.c:1274-1452 all in-range); env.txt documents absent AMD hardware", "kernel_refs": [ "sys/dev/drm/amd/display/dc/irq_types.h:157", "sys/dev/drm/amd/display/amdgpu_dm/amdgpu_dm_irq.c:176", "sys/dev/drm/amd/display/amdgpu_dm/amdgpu_dm_irq.c:238", "sys/dev/drm/amd/display/amdgpu_dm/amdgpu_dm_irq.c:242", "sys/dev/drm/amd/display/amdgpu_dm/amdgpu_dm.h:106" ], "poc_changes": "n/a - harness authored fresh (verbatim enum+macro extraction from the tree), no seed PoC existed", "attempts": 1, "guest_uname": "DragonFly dfbsd 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": 45, "guest_dirty": 0, "build_cmd": "cc -O2 -Wall -o df4731_proof df4731_proof.c", "run_cmd": "./df4731_proof", "code_hash": "b639027a84da01454b56fe3bab84614b3cac5200acb9c1810772bd02e821889d", "notes": "Guest /tmp artifacts removed. Upstream v4.17 carries the identical macro (verified against torvalds/linux v4.17 during this audit).", "recommended_fix": "irq_types.h:158 change <= to < in DAL_VALID_IRQ_SRC_NUM", "fix_status": "not_testable", "fix_baseline_reproduced": 0, "fix_patched_reproduced": 0, "fix_verdict": "Single-character fix (fix.diff); cannot be kernel-validated without AMD GPU. The same harness logic confirms the fixed bound still accepts 0<src<90 and rejects 90+.", "fix_evidence": "fix.diff; VERDICT.md Fix validation section" } |