DragonFlyBSD Kernel Audit
DF-1088 / verify.sh
← back to finding ↓ download raw
#!/bin/sh
# DF-1088 static source-verification script.
# Confirms the bug exists in the audit tree without requiring a SCSI device.
# Run from repo root.
set +e
PASS=0; FAIL=0
check() {
	if eval "$2"; then
		echo "PASS  $1"
		PASS=$((PASS+1))
	else
		echo "FAIL  $1"
		FAIL=$((FAIL+1))
	fi
}

# 1. passsendccb gates cam_periph_mapmem on (flags & CAM_DATA_PHYS)==0 only
check "passsendccb gate uses only CAM_DATA_PHYS (no strip)" \
	'grep -q "((ccb->ccb_h.flags & CAM_DATA_PHYS) == 0)" sys/bus/cam/scsi/scsi_pass.c'

# 2. No CAM_DATA_PHYS rejection anywhere in scsi_pass.c
check "no CAM_DATA_PHYS rejection in scsi_pass.c (unpatched)" \
	'! grep -q "flags & (CAM_DATA_PHYS" sys/bus/cam/scsi/scsi_pass.c'

# 3. No cdb_len clamp against IOCDBLEN anywhere in scsi_pass.c
check "no cdb_len clamp against IOCDBLEN in scsi_pass.c (unpatched)" \
	'! grep -qE "cdb_len > IOCDBLEN|cdb_len > CAM_MAX_CDBLEN" sys/bus/cam/scsi/scsi_pass.c'

# 4. The kernel-internal XPT path DOES reject CAM_DATA_PHYS for DEV_MATCH
check "XPT rejects CAM_DATA_PHYS for XPT_DEV_MATCH (control case)" \
	'grep -qA1 "if (inccb->ccb_h.flags & CAM_DATA_PHYS)" sys/bus/cam/cam_xpt.c'

# 5. Dangerous flags are all defined in cam_ccb.h
check "CAM_CDB_POINTER/CAM_SENSE_PTR/CAM_SENSE_PHYS/CAM_CDB_PHYS all defined" \
	'grep -q "CAM_CDB_POINTER" sys/bus/cam/cam_ccb.h && grep -q "CAM_SENSE_PTR" sys/bus/cam/cam_ccb.h && grep -q "CAM_SENSE_PHYS" sys/bus/cam/cam_ccb.h && grep -q "CAM_CDB_PHYS" sys/bus/cam/cam_ccb.h'

# 6. IOCDBLEN == 16 (so cdb_len=255 is a 239-byte over-read)
check "IOCDBLEN == 16 (CAM_MAX_CDBLEN)" \
	'grep -q "^#define CAM_MAX_CDBLEN 16" sys/bus/cam/cam.h'

# 7. passopen is gated by caps_priv_check_self(SYSCAP_RESTRICTEDROOT)
check "passopen gated by SYSCAP_RESTRICTEDROOT (privilege required)" \
	'grep -q "caps_priv_check_self(SYSCAP_RESTRICTEDROOT)" sys/bus/cam/scsi/scsi_pass.c'

echo
echo "PASS=$PASS FAIL=$FAIL"
[ "$FAIL" -eq 0 ]