DF-2494 / manifest.json
{ "finding_id": "DF-2494", "title": "BSS out-of-bounds write on global ata_raid_arrays[] via untrusted LSI v2 raid_number", "verdict": "reproduced", "impact": "none_demonstrated_silent_corruption", "reproduce": { "build": "guest /root/dfrig: ./build.sh (compiles production sys/dev/disk/nata/ata-raid.c into dfrig_ata.ko via #include)", "run": "kldload /root/dfrig/dfrig_ata.ko; sysctl kern.dfrig_ata_test=1 (or 2/4/5/6); sysctl -n kern.dfrig_ata_status", "expected": "test1: production parse stores an ar_softc heap pointer at raidp[0+29], 104 bytes past the 16-entry array (rc=1, before/after witness diff). test2: first OOB slot (+128 = &atapi_cam_devclass in the real kernel) written and retained. test6: same parse against the REAL kernel ata_raid_arrays (0xffffffff8114dec0): skip-occupied walk corrupts real kernel BSS / type-confuses a live heap object." }, "kernel_refs": [ "sys/dev/disk/nata/ata-raid.c:2799-2806", "sys/dev/disk/nata/ata-raid.c:2816", "sys/dev/disk/nata/ata-raid.c:2819-2822", "sys/dev/disk/nata/ata-raid.c:2866-2876", "sys/dev/disk/nata/ata-raid.h:456-513", "sys/dev/disk/nata/ata-raid.c:138" ], "fix": "fix.diff: reject meta->raid_number >= MAX_ARRAYS or meta->disk_number >= MAX_DISKS right after the $XIDE$ magic check (also bounds configs[raid_number] and, with the companion disk_count check from DF-2495, disks[])", "artifacts": [ "README.md", "VERDICT.md", "dfrig_ata.c", "Makefile", "craft_meta.py", "build.sh", "run.sh", "build.log", "run.log", "run.2.log", "env.txt", "fix.diff", "fix_build.log", "fix_run.log", "fix_tests_123.log", "fix_tests_67.log", "manifest.json", "verdict.json" ] } |