1870c2f7aSEnji Cooper#!/bin/sh 2870c2f7aSEnji Cooper 3870c2f7aSEnji Coopersysctl security.mac.portacl >/dev/null 2>&1 4870c2f7aSEnji Cooperif [ $? -ne 0 ]; then 5870c2f7aSEnji Cooper echo "1..0 # SKIP MAC_PORTACL is unavailable." 6870c2f7aSEnji Cooper exit 0 7870c2f7aSEnji Cooperfi 8870c2f7aSEnji Cooperif [ $(id -u) -ne 0 ]; then 9870c2f7aSEnji Cooper echo "1..0 # SKIP testcases must be run as root" 10870c2f7aSEnji Cooper exit 0 11870c2f7aSEnji Cooperfi 12870c2f7aSEnji Cooper 13870c2f7aSEnji Cooperntest=1 14870c2f7aSEnji Cooper 15870c2f7aSEnji Coopercheck_bind() { 16870c2f7aSEnji Cooper local host idtype name proto port udpflag 17870c2f7aSEnji Cooper 18870c2f7aSEnji Cooper host="127.0.0.1" 19*ec5fd095SLi-Wen Hsu timeout=1 20870c2f7aSEnji Cooper 21870c2f7aSEnji Cooper idtype=${1} 22870c2f7aSEnji Cooper name=${2} 23870c2f7aSEnji Cooper proto=${3} 24870c2f7aSEnji Cooper port=${4} 25870c2f7aSEnji Cooper 26870c2f7aSEnji Cooper [ "${proto}" = "udp" ] && udpflag="-u" 27870c2f7aSEnji Cooper 28870c2f7aSEnji Cooper out=$( 29870c2f7aSEnji Cooper case "${idtype}" in 30870c2f7aSEnji Cooper uid|gid) 31*ec5fd095SLi-Wen Hsu ( echo -n | su -m ${name} -c "nc ${udpflag} -l -w ${timeout} $host $port" 2>&1 ) & 32870c2f7aSEnji Cooper ;; 33870c2f7aSEnji Cooper jail) 34870c2f7aSEnji Cooper kill $$ 35870c2f7aSEnji Cooper ;; 36870c2f7aSEnji Cooper *) 37870c2f7aSEnji Cooper kill $$ 38870c2f7aSEnji Cooper esac 39870c2f7aSEnji Cooper sleep 0.3 40*ec5fd095SLi-Wen Hsu echo | nc ${udpflag} -w ${timeout} $host $port >/dev/null 2>&1 41870c2f7aSEnji Cooper wait 42870c2f7aSEnji Cooper ) 43870c2f7aSEnji Cooper case "${out}" in 44870c2f7aSEnji Cooper "nc: Permission denied"*|"nc: Operation not permitted"*) 45870c2f7aSEnji Cooper echo fl 46870c2f7aSEnji Cooper ;; 47870c2f7aSEnji Cooper "") 48870c2f7aSEnji Cooper echo ok 49870c2f7aSEnji Cooper ;; 50870c2f7aSEnji Cooper *) 51870c2f7aSEnji Cooper echo ${out} 52870c2f7aSEnji Cooper ;; 53870c2f7aSEnji Cooper esac 54870c2f7aSEnji Cooper} 55870c2f7aSEnji Cooper 56870c2f7aSEnji Cooperbind_test() { 57870c2f7aSEnji Cooper local expect_without_rule expect_with_rule idtype name proto port 58870c2f7aSEnji Cooper 59870c2f7aSEnji Cooper expect_without_rule=${1} 60870c2f7aSEnji Cooper expect_with_rule=${2} 61870c2f7aSEnji Cooper idtype=${3} 62870c2f7aSEnji Cooper name=${4} 63870c2f7aSEnji Cooper proto=${5} 64870c2f7aSEnji Cooper port=${6} 65870c2f7aSEnji Cooper 66870c2f7aSEnji Cooper sysctl security.mac.portacl.rules= >/dev/null 67870c2f7aSEnji Cooper out=$(check_bind ${idtype} ${name} ${proto} ${port}) 68870c2f7aSEnji Cooper if [ "${out}" = "${expect_without_rule}" ]; then 69870c2f7aSEnji Cooper echo "ok ${ntest}" 70870c2f7aSEnji Cooper elif [ "${out}" = "ok" -o "${out}" = "fl" ]; then 71870c2f7aSEnji Cooper echo "not ok ${ntest} # '${out}' != '${expect_without_rule}'" 72870c2f7aSEnji Cooper else 73870c2f7aSEnji Cooper echo "not ok ${ntest} # unexpected output: '${out}'" 74870c2f7aSEnji Cooper fi 75870c2f7aSEnji Cooper : $(( ntest += 1 )) 76870c2f7aSEnji Cooper 77870c2f7aSEnji Cooper if [ "${idtype}" = "uid" ]; then 78870c2f7aSEnji Cooper idstr=$(id -u ${name}) 79870c2f7aSEnji Cooper elif [ "${idtype}" = "gid" ]; then 80870c2f7aSEnji Cooper idstr=$(id -g ${name}) 81870c2f7aSEnji Cooper else 82870c2f7aSEnji Cooper idstr=${name} 83870c2f7aSEnji Cooper fi 84870c2f7aSEnji Cooper sysctl security.mac.portacl.rules=${idtype}:${idstr}:${proto}:${port} >/dev/null 85870c2f7aSEnji Cooper out=$(check_bind ${idtype} ${name} ${proto} ${port}) 86870c2f7aSEnji Cooper if [ "${out}" = "${expect_with_rule}" ]; then 87870c2f7aSEnji Cooper echo "ok ${ntest}" 88870c2f7aSEnji Cooper elif [ "${out}" = "ok" -o "${out}" = "fl" ]; then 89870c2f7aSEnji Cooper echo "not ok ${ntest} # '${out}' != '${expect_with_rule}'" 90870c2f7aSEnji Cooper else 91870c2f7aSEnji Cooper echo "not ok ${ntest} # unexpected output: '${out}'" 92870c2f7aSEnji Cooper fi 93870c2f7aSEnji Cooper : $(( ntest += 1 )) 94870c2f7aSEnji Cooper 95870c2f7aSEnji Cooper sysctl security.mac.portacl.rules= >/dev/null 96870c2f7aSEnji Cooper} 97870c2f7aSEnji Cooper 98870c2f7aSEnji Cooperreserved_high=$(sysctl -n net.inet.ip.portrange.reservedhigh) 99870c2f7aSEnji Coopersuser_exempt=$(sysctl -n security.mac.portacl.suser_exempt) 100870c2f7aSEnji Cooperport_high=$(sysctl -n security.mac.portacl.port_high) 101870c2f7aSEnji Cooper 102870c2f7aSEnji Cooperrestore_settings() { 103870c2f7aSEnji Cooper sysctl -n net.inet.ip.portrange.reservedhigh=${reserved_high} >/dev/null 104870c2f7aSEnji Cooper sysctl -n security.mac.portacl.suser_exempt=${suser_exempt} >/dev/null 105870c2f7aSEnji Cooper sysctl -n security.mac.portacl.port_high=${port_high} >/dev/null 106870c2f7aSEnji Cooper} 107