⬢ DragonFlyBSD Kernel Audit
DF-5534 / matrix.sh
← back to finding ↓ download raw
#!/bin/sh
# Negative-validation matrix for sys/platform/vkernel64/x86_64/autoconf.c (pass 2)
# Four boots, hostile operator-supplied boot args; criterion = autoconf/pxe parsing
# survives with no memory-safety signature (no Fatal trap / unexpected panic).
VK=/usr/obj/usr/src/sys/VKERNEL64/kernel.debug
KDIR=/usr/obj/usr/src/sys/VKERNEL64

run_vk() {
    name=$1; secs=$2; mem=$3; shift 3
    rm -f /tmp/vkin.$name /tmp/vkc.$name
    mkfifo /tmp/vkin.$name
    (sleep $((secs + 90)) > /tmp/vkin.$name) &
    H=$!
    ( exec 3> /tmp/vkin.$name
      i=0
      while [ $i -lt $secs ]; do
        grep -q "mountroot>" /tmp/vkc.$name 2>/dev/null && break
        sleep 1; i=$((i+1))
      done
      echo "ufs:vkd0" >&3
    ) &
    P=$!
    ( cd $KDIR && exec ./kernel.debug -m $mem -r /vkroot.img -n 1 \
        -e init_path=/bin/vkinit "$@" -s < /tmp/vkin.$name > /tmp/vkc.$name 2>&1 ) &
    V=$!
    echo "[$name] vkernel pid=$V"
    i=0
    while [ $i -lt $secs ]; do
      kill -0 $V 2>/dev/null || break
      grep -q "vkinit\|# \|\$ " /tmp/vkc.$name 2>/dev/null && break
      sleep 1; i=$((i+1))
    done
    sleep 3
    if kill -0 $V 2>/dev/null; then ALIVE=YES; else ALIVE=NO; fi
    echo "[$name] alive=$ALIVE after ${i}s"
    kill $P $H 2>/dev/null
    pkill -9 -f "kernel.debug.*$name" 2>/dev/null
    kill -9 $V 2>/dev/null
    i=0
    while pgrep -f kernel.debug >/dev/null 2>&1 && [ $i -lt 45 ]; do sleep 1; i=$((i+1)); done
    sleep 2
    echo "[$name] === console ==="
    cat /tmp/vkc.$name
    echo "[$name] === end ==="
}

echo "########## RUN B: layered garbage (int overflow fields, unbounded hex) ##########"
run_vk garbage 90 512m \
  -e boot.netif.ip=-2147483648.2147483647.0.0 \
  -e boot.netif.netmask=4294967295.99999999999999999999.1.1 \
  -e boot.netif.hwaddr=ffffffffffffffffffffffffffffffff

echo "########## RUN C: valid hwaddr -> interface match walk ##########"
run_vk matchwalk 90 512m \
  -e boot.netif.ip=10.0.0.1 \
  -e boot.netif.netmask=255.0.0.0 \
  -e 'boot.netif.hwaddr="aa:bb:cc:dd:ee:ff"'

echo "########## RUN A: deep path (name=lo0, server=127.0.0.1, handle, path, iosize) ##########"
run_vk deep 120 512m \
  -e boot.netif.ip=10.1.2.3 \
  -e boot.netif.netmask=255.255.255.0 \
  -e boot.netif.name=lo0 \
  -e boot.netif.gateway=10.1.2.1 \
  -e boot.nfsroot.server=127.0.0.1 \
  -e boot.nfsroot.nfshandle=Xdeadbeefcafebabe0123456789abcdefaabbccdd \
  -e boot.nfsroot.path=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA \
  -e nfsroot.iosize=99999999999999999999 \
  -e nfsroot.rahead=-7

echo "########## RUN D: kern.nbuf extreme (cpu_startup clamp) ##########"
run_vk nbuf 90 2g \
  -e kern.nbuf=99999999999

echo "MATRIX DONE"