Path: blob/main/tests/sys/mac/bsdextended/matches_test.sh
39604 views
#!/bin/sh1#2#34uidrange="60000:100000"5gidrange="60000:100000"6uidinrange="nobody"7uidoutrange="daemon"8gidinrange="nobody" # We expect $uidinrange in this group9gidoutrange="daemon" # We expect $uidinrange in this group101112check_ko()13{14if [ $(sysctl -n security.mac.bsdextended.enabled) = "0" ]; then15# The kernel module is loaded but disabled. Enable it for the16# duration of the test.17touch enabled_bsdextended18sysctl security.mac.bsdextended.enabled=119fi20}2122setup()23{24check_ko25mkdir mnt26[ -c /dev/mdctl ] || atf_skip "no /dev/mdctl to create md devices"27mdmfs -s 25m md mnt \28|| atf_fail "failed to mount md device"29chmod a+rwx mnt30md_device=$(mount -p | grep "$PWD/mnt" | awk '{ gsub(/^\/dev\//, "", $1); print $1 }')31if [ -z "$md_device" ]; then32atf_fail "md device not properly attached to the system"33fi34echo $md_device > md_device3536ugidfw remove 13738cat > mnt/test-script.sh <<'EOF'39#!/bin/sh40: > $141EOF42if [ $? -ne 0 ]; then43atf_fail "failed to create test script"44fi4546file1=mnt/test-$uidinrange47file2=mnt/test-$uidoutrange48command1="sh mnt/test-script.sh $file1"49command2="sh mnt/test-script.sh $file2"5051# $uidinrange file52atf_check -s exit:0 su -m $uidinrange -c "$command1"5354chown "$uidinrange":"$gidinrange" $file155chmod a+w $file15657# $uidoutrange file58if ! $command2; then59atf_fail $desc60fi6162chown "$uidoutrange":"$gidoutrange" $file263chmod a+w $file264}6566cleanup()67{68ugidfw remove 16970umount -f mnt71if [ -f md_device ]; then72mdconfig -d -u $( cat md_device )73fi74if [ -f enabled_bsdextended ]; then75sysctl security.mac.bsdextended.enabled=076fi77}7879atf_test_case no_rules cleanup80no_rules_head()81{82atf_set "require.user" "root"83}84no_rules_body()85{86setup8788# no rules $uidinrange89atf_check -s exit:0 su -fm $uidinrange -c "$command1"9091# no rules $uidoutrange92atf_check -s exit:0 su -fm $uidoutrange -c "$command1"93}94no_rules_cleanup()95{96cleanup97}9899atf_test_case subject_match_on_uid cleanup100subject_match_on_uid_head()101{102atf_set "require.user" "root"103}104subject_match_on_uid_body()105{106setup107108atf_check -s exit:0 ugidfw set 1 subject uid $uidrange object mode rasx109# subject uid in range110atf_check -s not-exit:0 -e match:"Permission denied" \111su -fm $uidinrange -c "$command1"112113# subject uid out range114atf_check -s exit:0 su -fm $uidoutrange -c "$command1"115116}117subject_match_on_uid_cleanup()118{119cleanup120}121122atf_test_case subject_match_on_gid cleanup123subject_match_on_gid_head()124{125atf_set "require.user" "root"126}127subject_match_on_gid_body()128{129setup130131atf_check -s exit:0 ugidfw set 1 subject gid $gidrange object mode rasx132133# subject gid in range134atf_check -s not-exit:0 -e match:"Permission denied" \135su -fm $uidinrange -c "$command1"136137# subject gid out range138atf_check -s exit:0 su -fm $uidoutrange -c "$command1"139}140subject_match_on_gid_cleanup()141{142cleanup143}144145atf_test_case subject_match_on_jail cleanup146subject_match_on_jail_head()147{148atf_set "require.progs" "jail"149atf_set "require.user" "root"150}151subject_match_on_jail_body()152{153setup154155atf_expect_fail "this testcase fails (see bug # 205481)"156# subject matching jailid157jailid=`jail -i / localhost 127.0.0.1 /usr/sbin/daemon -f /bin/sh -c "(sleep 5; touch mnt/test-jail) &"`158atf_check -s exit:0 ugidfw set 1 subject jailid $jailid object mode rasx159sleep 10160161if [ -f mnt/test-jail ]; then162atf_fail "$desc"163fi164165rm -f mnt/test-jail166# subject nonmatching jailid167jailid=`jail -i / localhost 127.0.0.1 /usr/sbin/daemon -f /bin/sh -c "(sleep 5; touch mnt/test-jail) &"`168sleep 10169if ! [ -f mnt/test-jail ]; then170atf_fail $desc171fi172}173subject_match_on_jail_cleanup()174{175cleanup176}177178atf_test_case object_uid cleanup179object_uid_head()180{181atf_set "require.user" "root"182}183object_uid_body()184{185setup186187atf_check -s exit:0 ugidfw set 1 subject object uid $uidrange mode rasx188189# object uid in range190atf_check -s not-exit:0 -e match:"Permission denied" \191su -fm $uidinrange -c "$command1"192193# object uid out range194atf_check -s exit:0 su -fm $uidinrange -c "$command2"195atf_check -s exit:0 ugidfw set 1 subject object uid $uidrange mode rasx196197# object uid in range (different subject)198atf_check -s not-exit:0 -e match:"Permission denied" \199su -fm $uidoutrange -c "$command1"200201# object uid out range (different subject)202atf_check -s exit:0 su -fm $uidoutrange -c "$command2"203204}205object_uid_cleanup()206{207cleanup208}209210atf_test_case object_gid cleanup211object_gid_head()212{213atf_set "require.user" "root"214}215object_gid_body()216{217setup218219atf_check -s exit:0 ugidfw set 1 subject object gid $uidrange mode rasx220221# object gid in range222atf_check -s not-exit:0 -e match:"Permission denied" \223su -fm $uidinrange -c "$command1"224225# object gid out range226atf_check -s exit:0 su -fm $uidinrange -c "$command2"227# object gid in range (different subject)228atf_check -s not-exit:0 -e match:"Permission denied" \229su -fm $uidoutrange -c "$command1"230231# object gid out range (different subject)232atf_check -s exit:0 su -fm $uidoutrange -c "$command2"233}234object_gid_cleanup()235{236cleanup237}238239atf_test_case object_filesys cleanup240object_filesys_head()241{242atf_set "require.user" "root"243}244object_filesys_body()245{246setup247248atf_check -s exit:0 ugidfw set 1 subject uid $uidrange object filesys / mode rasx249# object out of filesys250atf_check -s exit:0 su -fm $uidinrange -c "$command1"251252atf_check -s exit:0 ugidfw set 1 subject uid $uidrange object filesys mnt mode rasx253# object in filesys254atf_check -s not-exit:0 -e match:"Permission denied" \255su -fm $uidinrange -c "$command1"256}257object_filesys_cleanup()258{259cleanup260}261262atf_test_case object_suid cleanup263object_suid_head()264{265atf_set "require.user" "root"266}267object_suid_body()268{269setup270271atf_check -s exit:0 ugidfw set 1 subject uid $uidrange object suid mode rasx272# object notsuid273atf_check -s exit:0 su -fm $uidinrange -c "$command1"274275chmod u+s $file1276# object suid277atf_check -s not-exit:0 -e match:"Permission denied" \278su -fm $uidinrange -c "$command1"279chmod u-s $file1280281}282object_suid_cleanup()283{284cleanup285}286287atf_test_case object_sgid cleanup288object_sgid_head()289{290atf_set "require.user" "root"291}292object_sgid_body()293{294setup295296atf_check -s exit:0 ugidfw set 1 subject uid $uidrange object sgid mode rasx297# object notsgid298atf_check -s exit:0 su -fm $uidinrange -c "$command1"299300chmod g+s $file1301# object sgid302atf_check -s not-exit:0 -e match:"Permission denied" \303su -fm $uidinrange -c "$command1"304chmod g-s $file1305}306object_sgid_cleanup()307{308cleanup309}310311atf_test_case object_uid_matches_subject cleanup312object_uid_matches_subject_head()313{314atf_set "require.user" "root"315}316object_uid_matches_subject_body()317{318setup319320atf_check -s exit:0 ugidfw set 1 subject uid $uidrange object uid_of_subject mode rasx321322# object uid notmatches subject323atf_check -s exit:0 su -fm $uidinrange -c "$command2"324325# object uid matches subject326atf_check -s not-exit:0 -e match:"Permission denied" \327su -fm $uidinrange -c "$command1"328}329object_uid_matches_subject_cleanup()330{331cleanup332}333334atf_test_case object_gid_matches_subject cleanup335object_gid_matches_subject_head()336{337atf_set "require.user" "root"338}339object_gid_matches_subject_body()340{341setup342343atf_check -s exit:0 ugidfw set 1 subject uid $uidrange object gid_of_subject mode rasx344345# object gid notmatches subject346atf_check -s exit:0 su -fm $uidinrange -c "$command2"347348# object gid matches subject349atf_check -s not-exit:0 -e match:"Permission denied" \350su -fm $uidinrange -c "$command1"351352}353object_gid_matches_subject_cleanup()354{355cleanup356}357358atf_test_case object_type cleanup359object_type_head()360{361atf_set "require.user" "root"362}363object_type_body()364{365setup366367# object not type368atf_check -s exit:0 ugidfw set 1 subject uid $uidrange object type dbclsp mode rasx369atf_check -s exit:0 su -fm $uidinrange -c "$command1"370371# object type372atf_check -s exit:0 ugidfw set 1 subject uid $uidrange object type r mode rasx373atf_check -s not-exit:0 -e match:"Permission denied" \374su -fm $uidinrange -c "$command1"375}376object_type_cleanup()377{378cleanup379}380381atf_init_test_cases()382{383atf_add_test_case no_rules384atf_add_test_case subject_match_on_uid385atf_add_test_case subject_match_on_gid386atf_add_test_case subject_match_on_jail387atf_add_test_case object_uid388atf_add_test_case object_gid389atf_add_test_case object_filesys390atf_add_test_case object_suid391atf_add_test_case object_sgid392atf_add_test_case object_uid_matches_subject393atf_add_test_case object_gid_matches_subject394atf_add_test_case object_type395}396397398