DF-3897 / verdict.json
{ "finding_id": "DF-3897", "status": "not_reproduced", "reproduced": 0, "impact": "none", "confidence": "speculative", "verdict": "The WarpDrive validation in mps_wd_config_pages only rejects NumPhysDisks > 8 (sys/dev/raid/mps/mps_config.c:399-400) while explicitly rejecting stripe-size 0 and block-size 0 (mps_config.c:428-433, 447-452) โ a RAID0 volume page with zero physical disks passes, sets DD_num_phys_disks = 0 (mps_config.c:412) and WD_valid_config = TRUE (mps_config.c:511). Every subsequent READ/WRITE to the volume DevHandle then reaches `stripe_unit = physLBA / sc->DD_num_phys_disks` in mpssas_direct_drive_io (mps_sas.c:2190, 2269, 2347) โ integer divide by zero, kernel panic on the first qualifying I/O by any unprivileged user of the device. Trigger is firmware/NVRAM-gated (controller config page, observed-class 0-disk RAID0 during volume teardown), hence speculative; the sink is certain from source. Not reproduced: guest has no SAS2/WarpDrive HBA (env.txt).", "exploit_chain": "", "evidence": "VERDICT.md (path:line proof: unchecked count, three division sinks, guarded siblings), env.txt, run.sh + run.log (hardware gate), fix.diff (== 0 rejection in mps_config.c)", "kernel_refs": [ "sys/dev/raid/mps/mps_config.c:399", "sys/dev/raid/mps/mps_config.c:412", "sys/dev/raid/mps/mps_config.c:511", "sys/dev/raid/mps/mps_sas.c:2190", "sys/dev/raid/mps/mps_sas.c:2269", "sys/dev/raid/mps/mps_sas.c:2347", "sys/dev/raid/mps/mps_sas.c:1760" ], "poc_changes": "n/a โ hardware/firmware-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": 15, "guest_dirty": 0, "build_cmd": "n/a", "run_cmd": "sh findings/poc/DF-3897/run.sh", "code_hash": "", "notes": "Sink is in mps_sas.c (audited file); the missing validation is in mps_config.c, cited accordingly. Upstream FreeBSD mps(4) shares the unguarded count.", "recommended_fix": "Reject NumPhysDisks == 0 in mps_wd_config_pages beside the existing > 8 check.", "fix_status": "not_testable", "fix_baseline_reproduced": 0, "fix_patched_reproduced": 0, "fix_verdict": "fix.diff adds the one-line rejection; cannot be exercised on this guest (no SAS2 HBA).", "fix_evidence": "findings/poc/DF-3897/fix.diff" } |