DF-3928 / verdict.json
{ "finding_id": "DF-3928", "fix_status": "not_testable", "fix_baseline_reproduced": 0, "fix_patched_reproduced": 0, "fix_verdict": "Fix not validated on the guest: the trigger path requires mly/age hardware absent from the audit guest. fix.diff is mechanical (bounds/termination-only) and authored post-verification against the cited lines.", "fix_evidence": "findings/poc/DF-3928/fix.diff + VERDICT.md", "status": "not_reproduced", "reproduced": 0, "impact": "none", "confidence": "certain", "verdict": "Hardware-gated (no Mylex controller in the audit guest); source-certain. mly_get_controllerinfo (mly.c:744-780) trusts the firmware-DMAd u_int8_t channel counts; mly_cam_attach (mly.c:1947-1961) stores cam_sim pointers into mly_cam_sim[6] for chn up to 509 (~4KB of kernel-pointer writes past the softc) and mly_scan_devices/mly_periodic (mly.c:802-805, 1378-1391) write MLY_BTL_RESCAN across mly_btl[6][16] for bus < mly_cam_channels <= 510 (~290KB strided OOB write past the softc into the heap). Same trust boundary as accepted DF-1290 but attach-time, larger, and pointer-valued. Verified guest has no mly device (virtio-only PCI list), so no runtime trigger exists; per pass-1 family convention (DF-1289/DF-1290) filed not_reproduced with certain source confidence.", "exploit_chain": "malicious/buggy controller answers GETCONTROLLERINFO with channel counts > 6 -> attach-time kernel heap corruption (pointer writes + 290KB strided flag writes) -> panic or groomed corruption", "evidence": "findings/poc/DF-3928/VERDICT.md (line-cited chain); env.txt (no mly hardware in guest); fix.diff (channel-count validation)", "kernel_refs": [ "sys/dev/raid/mly/mly.c:744", "sys/dev/raid/mly/mly.c:1927", "sys/dev/raid/mly/mly.c:1947", "sys/dev/raid/mly/mly.c:1967", "sys/dev/raid/mly/mly.c:802", "sys/dev/raid/mly/mly.c:1378", "sys/dev/raid/mly/mlyvar.h:206", "sys/dev/raid/mly/mlyreg.h:576" ], "poc_changes": "No seed PoC; hardware-gated attach-time defect - evidence pack documents the exact lab reproduction (QEMU device-model answering GETCONTROLLERINFO with virtual_channels_present=255).", "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": 240, "guest_dirty": 0, "notes": "pass-2 GLM5.3. Excluded knowns DF-1288..DF-1291. Negative checks: mly_describe_code returns the post-NULL sentinel string (mly_tables.h:44-51) so event printing cannot NULL-deref; mly_cam_action_ios invalid-bus branch (mly.c:2187-2190) is unreachable because cam_sim_bus(sim) is always a registered channel.", "recommended_fix": "Validate physical+virtual channel counts against MLY_MAX_CHANNELS right after GETCONTROLLERINFO and fail attach (EIO).", "build_cmd": null, "run_cmd": null, "code_hash": null } |