DF-3963 / verdict.json
{ "finding_id": "DF-3963", "status": "not_reproduced", "reproduced": 0, "impact": "none", "confidence": "certain", "verdict": "Source-certain device-fed OOB bus-space access: hptiop_mv_outbound_read (hptiop.c:232,236-239) and hptiop_mv_inbound_write (:254,260-262) use the device-maintained outbound_tail / inbound_head registers unmasked as indices into the 512-entry inbound_q/outbound_q arrays (hptiop.h:96-107); a value >=512 steers an MMIO read (and an 8-byte MMIO WRITE of a host phys|flags value) up to ~32GB past BAR2. Impact bounded to MMIO space (machine-check/panic or neighbouring-BAR corruption), not host RAM -> Low, same device-trust class as the known DF-1312 (which covers the srb[] index, not the queue-pointer registers). Not reproduced: no mv-family HBA on the guest (env.txt).", "exploit_chain": "wedge/emulated mv HBA sets inbound_head=0x400 -> next hptiop_mv_inbound_write posts 8 bytes at BAR2+0x40+0x2000 (outside the 4KB queue window) -> unmapped-MMIO machine check (panic/DoS) or corruption of an adjacent mapped BAR; symmetric OOB read path via outbound_tail in the interrupt drain.", "evidence": "VERDICT.md (offset math + path:line), trigger.c, env.txt, fix.diff (mask both registers, git apply --check clean)", "kernel_refs": [ "sys/dev/raid/hptiop/hptiop.c:229", "sys/dev/raid/hptiop/hptiop.c:232", "sys/dev/raid/hptiop/hptiop.c:236", "sys/dev/raid/hptiop/hptiop.c:252", "sys/dev/raid/hptiop/hptiop.c:254", "sys/dev/raid/hptiop/hptiop.c:260", "sys/dev/raid/hptiop/hptiop.h:96", "sys/dev/raid/hptiop/hptiop.h:105" ], "poc_changes": "Informational trigger only; hardware-gated.", "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": 5, "guest_dirty": 0, "build_cmd": "guest: cd /usr/src/sys/dev/raid/hptiop && patch -p1 < fix.diff && make # after make obj", "run_cmd": "dfbsd-qemu/vm.sh run_root pciconf -lv | grep -i 1103", "code_hash": "73b5892e75169a049b9921e8c21b2d8bd65a0f3956da1d0befe31cd9b4d43c54", "notes": "Pass-2 finding, checklist item (a) (remaining firmware-fed indices: the reply/request queues). Distinct from DF-1312 (srb[] array index from popped queue values).", "recommended_fix": "Mask device-fed queue pointers: & (MVIOP_QUEUE_LEN - 1) in hptiop_mv_outbound_read/hptiop_mv_inbound_write (fix.diff).", "fix_status": "not_testable", "fix_baseline_reproduced": 0, "fix_patched_reproduced": 0, "fix_verdict": "Two-line mask keeps all accesses inside the 512-entry arrays; git apply --check clean. Runtime validation impossible without the HBA fix.diff applied to the guest /usr/src copy and the hptiop.ko module rebuilt clean with -Werror (build.log; combined with the other four hptiop fix.diffs of this batch); runtime validation still impossible without the HBA.", "fix_evidence": "fix.diff; fix.diff applied to the guest /usr/src copy and the hptiop.ko module rebuilt clean with -Werror (build.log; combined with the other four hptiop fix.diffs of this batch); runtime validation still impossible without the HBA." } |