DF-4788 / verdict.json
{ "finding_id": "DF-4788", "status": "untested", "reproduced": 0, "impact": "none", "confidence": "likely", "verdict": "Latent hardening gaps in dal_gpio_service_open: (1) is_pin_busy/set_pin_busy/set_pin_free index the number_of_pins-sized busyness bitmap with a raw caller-supplied uint32_t en that is never bounds-checked in the service layer (gpio_service.c:197-221 vs sizing at :89-94) โ an out-of-range en would be an OOB heap read/write, but every current caller passes translate-table-bounded enum constants so the path is unreachable today; (2) .create_generic/.create_sync/.create_gsl are NULL on all four shipped ASIC factory tables yet are invoked without NULL checks (gpio_service.c:254-270) โ no display code ever opens those pin classes, so the NULL call is also latent. Filed as defense-in-depth; not exercisable on the audit guest (no AMD GPU).", "exploit_chain": "", "evidence": "README.md, VERDICT.md (bounds trace), env.txt (guest pci inventory), fix.diff (minimal en-bound hunk)", "kernel_refs": [ "sys/dev/drm/amd/display/dc/gpio/gpio_service.c:190", "sys/dev/drm/amd/display/dc/gpio/gpio_service.c:202", "sys/dev/drm/amd/display/dc/gpio/gpio_service.c:213", "sys/dev/drm/amd/display/dc/gpio/gpio_service.c:233", "sys/dev/drm/amd/display/dc/gpio/gpio_service.c:254", "sys/dev/drm/amd/display/dc/gpio/gpio_service.c:263", "sys/dev/drm/amd/display/dc/gpio/gpio_service.c:267", "sys/dev/drm/amd/display/dc/gpio/dce110/hw_factory_dce110.c:148" ], "poc_changes": "no PoC produced โ no reachable trigger path exists in current callers; hardware-gated besides", "attempts": 0, "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": 0, "guest_dirty": 0, "build_cmd": "", "run_cmd": "", "code_hash": "", "notes": "The full fixed function (en bound + NULL creator guards + define-after-check reorder) is in findings/poc/DF-4787/fix.diff.", "recommended_fix": "Bound en against factory.number_of_pins[id] in dal_gpio_service_open and NULL-check the create_* factory pointers", "fix_status": "not_testable", "fix_baseline_reproduced": 0, "fix_patched_reproduced": 0, "fix_verdict": "one-line bounds check; no behavioral change for any current caller (all pass in-range enums); cannot be boot-validated without AMD hardware", "fix_evidence": "findings/poc/DF-4788/fix.diff" } |