1870c2f7aSEnji Cooper#!/bin/sh 2870c2f7aSEnji Cooper# 3870c2f7aSEnji Cooper# 4870c2f7aSEnji Cooper 5870c2f7aSEnji Cooperuidrange="60000:100000" 6870c2f7aSEnji Coopergidrange="60000:100000" 7870c2f7aSEnji Cooperuidinrange="nobody" 8870c2f7aSEnji Cooperuidoutrange="daemon" 9870c2f7aSEnji Coopergidinrange="nobody" # We expect $uidinrange in this group 10870c2f7aSEnji Coopergidoutrange="daemon" # We expect $uidinrange in this group 11870c2f7aSEnji Cooper 12db20acc0SAlan Somers 13db20acc0SAlan Somerscheck_ko() 14870c2f7aSEnji Cooper{ 15870c2f7aSEnji Cooper if ! sysctl -N security.mac.bsdextended >/dev/null 2>&1; then 16db20acc0SAlan Somers atf_skip "mac_bsdextended(4) support isn't available" 17870c2f7aSEnji Cooper fi 18b43a935cSAlan Somers if [ $(sysctl -n security.mac.bsdextended.enabled) = "0" ]; then 19b43a935cSAlan Somers # The kernel module is loaded but disabled. Enable it for the 20b43a935cSAlan Somers # duration of the test. 21b43a935cSAlan Somers touch enabled_bsdextended 22b43a935cSAlan Somers sysctl security.mac.bsdextended.enabled=1 23b43a935cSAlan Somers fi 24db20acc0SAlan Somers} 25db20acc0SAlan Somers 26db20acc0SAlan Somerssetup() 27db20acc0SAlan Somers{ 28db20acc0SAlan Somers check_ko 29db20acc0SAlan Somers mkdir mnt 30*ea823622SWarner Losh [ -c /dev/mdctl ] || atf_skip "no /dev/mdctl to create md devices" 31db20acc0SAlan Somers mdmfs -s 25m md mnt \ 32db20acc0SAlan Somers || atf_fail "failed to mount md device" 33db20acc0SAlan Somers chmod a+rwx mnt 34db20acc0SAlan Somers md_device=$(mount -p | grep "$PWD/mnt" | awk '{ gsub(/^\/dev\//, "", $1); print $1 }') 35870c2f7aSEnji Cooper if [ -z "$md_device" ]; then 36db20acc0SAlan Somers atf_fail "md device not properly attached to the system" 37870c2f7aSEnji Cooper fi 38db20acc0SAlan Somers echo $md_device > md_device 39870c2f7aSEnji Cooper 40870c2f7aSEnji Cooper ugidfw remove 1 41870c2f7aSEnji Cooper 42db20acc0SAlan Somers cat > mnt/test-script.sh <<'EOF' 43870c2f7aSEnji Cooper#!/bin/sh 44870c2f7aSEnji Cooper: > $1 45870c2f7aSEnji CooperEOF 46870c2f7aSEnji Cooper if [ $? -ne 0 ]; then 47db20acc0SAlan Somers atf_fail "failed to create test script" 48870c2f7aSEnji Cooper fi 49870c2f7aSEnji Cooper 50db20acc0SAlan Somers file1=mnt/test-$uidinrange 51db20acc0SAlan Somers file2=mnt/test-$uidoutrange 52db20acc0SAlan Somers command1="sh mnt/test-script.sh $file1" 53db20acc0SAlan Somers command2="sh mnt/test-script.sh $file2" 54870c2f7aSEnji Cooper 55db20acc0SAlan Somers # $uidinrange file 56db20acc0SAlan Somers atf_check -s exit:0 su -m $uidinrange -c "$command1" 57870c2f7aSEnji Cooper 58870c2f7aSEnji Cooper chown "$uidinrange":"$gidinrange" $file1 59870c2f7aSEnji Cooper chmod a+w $file1 60870c2f7aSEnji Cooper 61db20acc0SAlan Somers # $uidoutrange file 62db20acc0SAlan Somers if ! $command2; then 63db20acc0SAlan Somers atf_fail $desc 64870c2f7aSEnji Cooper fi 65870c2f7aSEnji Cooper 66870c2f7aSEnji Cooper chown "$uidoutrange":"$gidoutrange" $file2 67870c2f7aSEnji Cooper chmod a+w $file2 68db20acc0SAlan Somers} 69870c2f7aSEnji Cooper 70db20acc0SAlan Somerscleanup() 71db20acc0SAlan Somers{ 72db20acc0SAlan Somers ugidfw remove 1 73db20acc0SAlan Somers 74db20acc0SAlan Somers umount -f mnt 75db20acc0SAlan Somers if [ -f md_device ]; then 76db20acc0SAlan Somers mdconfig -d -u $( cat md_device ) 77870c2f7aSEnji Cooper fi 78b43a935cSAlan Somers if [ -f enabled_bsdextended ]; then 79b43a935cSAlan Somers sysctl security.mac.bsdextended.enabled=0 80b43a935cSAlan Somers fi 81db20acc0SAlan Somers} 82870c2f7aSEnji Cooper 83db20acc0SAlan Somersatf_test_case no_rules cleanup 84db20acc0SAlan Somersno_rules_head() 85db20acc0SAlan Somers{ 86db20acc0SAlan Somers atf_set "require.user" "root" 87db20acc0SAlan Somers} 88db20acc0SAlan Somersno_rules_body() 89db20acc0SAlan Somers{ 90db20acc0SAlan Somers setup 91870c2f7aSEnji Cooper 92db20acc0SAlan Somers # no rules $uidinrange 93db20acc0SAlan Somers atf_check -s exit:0 su -fm $uidinrange -c "$command1" 94870c2f7aSEnji Cooper 95db20acc0SAlan Somers # no rules $uidoutrange 96db20acc0SAlan Somers atf_check -s exit:0 su -fm $uidoutrange -c "$command1" 97db20acc0SAlan Somers} 98db20acc0SAlan Somersno_rules_cleanup() 99db20acc0SAlan Somers{ 100db20acc0SAlan Somers cleanup 101db20acc0SAlan Somers} 102870c2f7aSEnji Cooper 103db20acc0SAlan Somersatf_test_case subject_match_on_uid cleanup 104db20acc0SAlan Somerssubject_match_on_uid_head() 105db20acc0SAlan Somers{ 106db20acc0SAlan Somers atf_set "require.user" "root" 107db20acc0SAlan Somers} 108db20acc0SAlan Somerssubject_match_on_uid_body() 109db20acc0SAlan Somers{ 110db20acc0SAlan Somers setup 111870c2f7aSEnji Cooper 112db20acc0SAlan Somers atf_check -s exit:0 ugidfw set 1 subject uid $uidrange object mode rasx 113db20acc0SAlan Somers # subject uid in range 114db20acc0SAlan Somers atf_check -s not-exit:0 -e match:"Permission denied" \ 115db20acc0SAlan Somers su -fm $uidinrange -c "$command1" 116870c2f7aSEnji Cooper 117db20acc0SAlan Somers # subject uid out range 118db20acc0SAlan Somers atf_check -s exit:0 su -fm $uidoutrange -c "$command1" 119870c2f7aSEnji Cooper 120db20acc0SAlan Somers} 121db20acc0SAlan Somerssubject_match_on_uid_cleanup() 122db20acc0SAlan Somers{ 123db20acc0SAlan Somers cleanup 124db20acc0SAlan Somers} 125870c2f7aSEnji Cooper 126db20acc0SAlan Somersatf_test_case subject_match_on_gid cleanup 127db20acc0SAlan Somerssubject_match_on_gid_head() 128db20acc0SAlan Somers{ 129db20acc0SAlan Somers atf_set "require.user" "root" 130db20acc0SAlan Somers} 131db20acc0SAlan Somerssubject_match_on_gid_body() 132db20acc0SAlan Somers{ 133db20acc0SAlan Somers setup 134db20acc0SAlan Somers 135db20acc0SAlan Somers atf_check -s exit:0 ugidfw set 1 subject gid $gidrange object mode rasx 136db20acc0SAlan Somers 137db20acc0SAlan Somers # subject gid in range 138db20acc0SAlan Somers atf_check -s not-exit:0 -e match:"Permission denied" \ 139db20acc0SAlan Somers su -fm $uidinrange -c "$command1" 140db20acc0SAlan Somers 141db20acc0SAlan Somers # subject gid out range 142db20acc0SAlan Somers atf_check -s exit:0 su -fm $uidoutrange -c "$command1" 143db20acc0SAlan Somers} 144db20acc0SAlan Somerssubject_match_on_gid_cleanup() 145db20acc0SAlan Somers{ 146db20acc0SAlan Somers cleanup 147db20acc0SAlan Somers} 148db20acc0SAlan Somers 149db20acc0SAlan Somersatf_test_case subject_match_on_jail cleanup 150db20acc0SAlan Somerssubject_match_on_jail_head() 151db20acc0SAlan Somers{ 152db20acc0SAlan Somers atf_set "require.progs" "jail" 153db20acc0SAlan Somers atf_set "require.user" "root" 154db20acc0SAlan Somers} 155db20acc0SAlan Somerssubject_match_on_jail_body() 156db20acc0SAlan Somers{ 157db20acc0SAlan Somers setup 158db20acc0SAlan Somers 159db20acc0SAlan Somers atf_expect_fail "this testcase fails (see bug # 205481)" 160db20acc0SAlan Somers # subject matching jailid 161db20acc0SAlan Somers jailid=`jail -i / localhost 127.0.0.1 /usr/sbin/daemon -f /bin/sh -c "(sleep 5; touch mnt/test-jail) &"` 162db20acc0SAlan Somers atf_check -s exit:0 ugidfw set 1 subject jailid $jailid object mode rasx 163870c2f7aSEnji Cooper sleep 10 164870c2f7aSEnji Cooper 165db20acc0SAlan Somers if [ -f mnt/test-jail ]; then 166db20acc0SAlan Somers atf_fail "$desc" 167870c2f7aSEnji Cooper fi 168870c2f7aSEnji Cooper 169db20acc0SAlan Somers rm -f mnt/test-jail 170db20acc0SAlan Somers # subject nonmatching jailid 171db20acc0SAlan Somers jailid=`jail -i / localhost 127.0.0.1 /usr/sbin/daemon -f /bin/sh -c "(sleep 5; touch mnt/test-jail) &"` 172870c2f7aSEnji Cooper sleep 10 173db20acc0SAlan Somers if ! [ -f mnt/test-jail ]; then 174db20acc0SAlan Somers atf_fail $desc 175870c2f7aSEnji Cooper fi 176db20acc0SAlan Somers} 177db20acc0SAlan Somerssubject_match_on_jail_cleanup() 178db20acc0SAlan Somers{ 179db20acc0SAlan Somers cleanup 180db20acc0SAlan Somers} 181870c2f7aSEnji Cooper 182db20acc0SAlan Somersatf_test_case object_uid cleanup 183db20acc0SAlan Somersobject_uid_head() 184db20acc0SAlan Somers{ 185db20acc0SAlan Somers atf_set "require.user" "root" 186db20acc0SAlan Somers} 187db20acc0SAlan Somersobject_uid_body() 188db20acc0SAlan Somers{ 189db20acc0SAlan Somers setup 190870c2f7aSEnji Cooper 191db20acc0SAlan Somers atf_check -s exit:0 ugidfw set 1 subject object uid $uidrange mode rasx 192870c2f7aSEnji Cooper 193db20acc0SAlan Somers # object uid in range 194db20acc0SAlan Somers atf_check -s not-exit:0 -e match:"Permission denied" \ 195db20acc0SAlan Somers su -fm $uidinrange -c "$command1" 196870c2f7aSEnji Cooper 197db20acc0SAlan Somers # object uid out range 198db20acc0SAlan Somers atf_check -s exit:0 su -fm $uidinrange -c "$command2" 199db20acc0SAlan Somers atf_check -s exit:0 ugidfw set 1 subject object uid $uidrange mode rasx 200870c2f7aSEnji Cooper 201db20acc0SAlan Somers # object uid in range (different subject) 202db20acc0SAlan Somers atf_check -s not-exit:0 -e match:"Permission denied" \ 203db20acc0SAlan Somers su -fm $uidoutrange -c "$command1" 204870c2f7aSEnji Cooper 205db20acc0SAlan Somers # object uid out range (different subject) 206db20acc0SAlan Somers atf_check -s exit:0 su -fm $uidoutrange -c "$command2" 207870c2f7aSEnji Cooper 208db20acc0SAlan Somers} 209db20acc0SAlan Somersobject_uid_cleanup() 210db20acc0SAlan Somers{ 211db20acc0SAlan Somers cleanup 212db20acc0SAlan Somers} 213870c2f7aSEnji Cooper 214db20acc0SAlan Somersatf_test_case object_gid cleanup 215db20acc0SAlan Somersobject_gid_head() 216db20acc0SAlan Somers{ 217db20acc0SAlan Somers atf_set "require.user" "root" 218db20acc0SAlan Somers} 219db20acc0SAlan Somersobject_gid_body() 220db20acc0SAlan Somers{ 221db20acc0SAlan Somers setup 222870c2f7aSEnji Cooper 223db20acc0SAlan Somers atf_check -s exit:0 ugidfw set 1 subject object gid $uidrange mode rasx 224870c2f7aSEnji Cooper 225db20acc0SAlan Somers # object gid in range 226db20acc0SAlan Somers atf_check -s not-exit:0 -e match:"Permission denied" \ 227db20acc0SAlan Somers su -fm $uidinrange -c "$command1" 228870c2f7aSEnji Cooper 229db20acc0SAlan Somers # object gid out range 230db20acc0SAlan Somers atf_check -s exit:0 su -fm $uidinrange -c "$command2" 231db20acc0SAlan Somers # object gid in range (different subject) 232db20acc0SAlan Somers atf_check -s not-exit:0 -e match:"Permission denied" \ 233db20acc0SAlan Somers su -fm $uidoutrange -c "$command1" 234870c2f7aSEnji Cooper 235db20acc0SAlan Somers # object gid out range (different subject) 236db20acc0SAlan Somers atf_check -s exit:0 su -fm $uidoutrange -c "$command2" 237db20acc0SAlan Somers} 238db20acc0SAlan Somersobject_gid_cleanup() 239db20acc0SAlan Somers{ 240db20acc0SAlan Somers cleanup 241db20acc0SAlan Somers} 242db20acc0SAlan Somers 243db20acc0SAlan Somersatf_test_case object_filesys cleanup 244db20acc0SAlan Somersobject_filesys_head() 245db20acc0SAlan Somers{ 246db20acc0SAlan Somers atf_set "require.user" "root" 247db20acc0SAlan Somers} 248db20acc0SAlan Somersobject_filesys_body() 249db20acc0SAlan Somers{ 250db20acc0SAlan Somers setup 251db20acc0SAlan Somers 252db20acc0SAlan Somers atf_check -s exit:0 ugidfw set 1 subject uid $uidrange object filesys / mode rasx 253db20acc0SAlan Somers # object out of filesys 254db20acc0SAlan Somers atf_check -s exit:0 su -fm $uidinrange -c "$command1" 255db20acc0SAlan Somers 256db20acc0SAlan Somers atf_check -s exit:0 ugidfw set 1 subject uid $uidrange object filesys mnt mode rasx 257db20acc0SAlan Somers # object in filesys 258db20acc0SAlan Somers atf_check -s not-exit:0 -e match:"Permission denied" \ 259db20acc0SAlan Somers su -fm $uidinrange -c "$command1" 260db20acc0SAlan Somers} 261db20acc0SAlan Somersobject_filesys_cleanup() 262db20acc0SAlan Somers{ 263db20acc0SAlan Somers cleanup 264db20acc0SAlan Somers} 265db20acc0SAlan Somers 266db20acc0SAlan Somersatf_test_case object_suid cleanup 267db20acc0SAlan Somersobject_suid_head() 268db20acc0SAlan Somers{ 269db20acc0SAlan Somers atf_set "require.user" "root" 270db20acc0SAlan Somers} 271db20acc0SAlan Somersobject_suid_body() 272db20acc0SAlan Somers{ 273db20acc0SAlan Somers setup 274db20acc0SAlan Somers 275db20acc0SAlan Somers atf_check -s exit:0 ugidfw set 1 subject uid $uidrange object suid mode rasx 276db20acc0SAlan Somers # object notsuid 277db20acc0SAlan Somers atf_check -s exit:0 su -fm $uidinrange -c "$command1" 278870c2f7aSEnji Cooper 279870c2f7aSEnji Cooper chmod u+s $file1 280db20acc0SAlan Somers # object suid 281db20acc0SAlan Somers atf_check -s not-exit:0 -e match:"Permission denied" \ 282db20acc0SAlan Somers su -fm $uidinrange -c "$command1" 283870c2f7aSEnji Cooper chmod u-s $file1 284870c2f7aSEnji Cooper 285db20acc0SAlan Somers} 286db20acc0SAlan Somersobject_suid_cleanup() 287db20acc0SAlan Somers{ 288db20acc0SAlan Somers cleanup 289db20acc0SAlan Somers} 290db20acc0SAlan Somers 291db20acc0SAlan Somersatf_test_case object_sgid cleanup 292db20acc0SAlan Somersobject_sgid_head() 293db20acc0SAlan Somers{ 294db20acc0SAlan Somers atf_set "require.user" "root" 295db20acc0SAlan Somers} 296db20acc0SAlan Somersobject_sgid_body() 297db20acc0SAlan Somers{ 298db20acc0SAlan Somers setup 299db20acc0SAlan Somers 300db20acc0SAlan Somers atf_check -s exit:0 ugidfw set 1 subject uid $uidrange object sgid mode rasx 301db20acc0SAlan Somers # object notsgid 302db20acc0SAlan Somers atf_check -s exit:0 su -fm $uidinrange -c "$command1" 303870c2f7aSEnji Cooper 304870c2f7aSEnji Cooper chmod g+s $file1 305db20acc0SAlan Somers # object sgid 306db20acc0SAlan Somers atf_check -s not-exit:0 -e match:"Permission denied" \ 307db20acc0SAlan Somers su -fm $uidinrange -c "$command1" 308870c2f7aSEnji Cooper chmod g-s $file1 309db20acc0SAlan Somers} 310db20acc0SAlan Somersobject_sgid_cleanup() 311db20acc0SAlan Somers{ 312db20acc0SAlan Somers cleanup 313db20acc0SAlan Somers} 314870c2f7aSEnji Cooper 315db20acc0SAlan Somersatf_test_case object_uid_matches_subject cleanup 316db20acc0SAlan Somersobject_uid_matches_subject_head() 317db20acc0SAlan Somers{ 318db20acc0SAlan Somers atf_set "require.user" "root" 319db20acc0SAlan Somers} 320db20acc0SAlan Somersobject_uid_matches_subject_body() 321db20acc0SAlan Somers{ 322db20acc0SAlan Somers setup 323870c2f7aSEnji Cooper 324db20acc0SAlan Somers atf_check -s exit:0 ugidfw set 1 subject uid $uidrange object uid_of_subject mode rasx 325870c2f7aSEnji Cooper 326db20acc0SAlan Somers # object uid notmatches subject 327db20acc0SAlan Somers atf_check -s exit:0 su -fm $uidinrange -c "$command2" 328870c2f7aSEnji Cooper 329db20acc0SAlan Somers # object uid matches subject 330db20acc0SAlan Somers atf_check -s not-exit:0 -e match:"Permission denied" \ 331db20acc0SAlan Somers su -fm $uidinrange -c "$command1" 332db20acc0SAlan Somers} 333db20acc0SAlan Somersobject_uid_matches_subject_cleanup() 334db20acc0SAlan Somers{ 335db20acc0SAlan Somers cleanup 336db20acc0SAlan Somers} 337870c2f7aSEnji Cooper 338db20acc0SAlan Somersatf_test_case object_gid_matches_subject cleanup 339db20acc0SAlan Somersobject_gid_matches_subject_head() 340db20acc0SAlan Somers{ 341db20acc0SAlan Somers atf_set "require.user" "root" 342db20acc0SAlan Somers} 343db20acc0SAlan Somersobject_gid_matches_subject_body() 344db20acc0SAlan Somers{ 345db20acc0SAlan Somers setup 346870c2f7aSEnji Cooper 347db20acc0SAlan Somers atf_check -s exit:0 ugidfw set 1 subject uid $uidrange object gid_of_subject mode rasx 348870c2f7aSEnji Cooper 349db20acc0SAlan Somers # object gid notmatches subject 350db20acc0SAlan Somers atf_check -s exit:0 su -fm $uidinrange -c "$command2" 351870c2f7aSEnji Cooper 352db20acc0SAlan Somers # object gid matches subject 353db20acc0SAlan Somers atf_check -s not-exit:0 -e match:"Permission denied" \ 354db20acc0SAlan Somers su -fm $uidinrange -c "$command1" 355db20acc0SAlan Somers 356db20acc0SAlan Somers} 357db20acc0SAlan Somersobject_gid_matches_subject_cleanup() 358db20acc0SAlan Somers{ 359db20acc0SAlan Somers cleanup 360db20acc0SAlan Somers} 361db20acc0SAlan Somers 362db20acc0SAlan Somersatf_test_case object_type cleanup 363db20acc0SAlan Somersobject_type_head() 364db20acc0SAlan Somers{ 365db20acc0SAlan Somers atf_set "require.user" "root" 366db20acc0SAlan Somers} 367db20acc0SAlan Somersobject_type_body() 368db20acc0SAlan Somers{ 369db20acc0SAlan Somers setup 370db20acc0SAlan Somers 371db20acc0SAlan Somers # object not type 372db20acc0SAlan Somers atf_check -s exit:0 ugidfw set 1 subject uid $uidrange object type dbclsp mode rasx 373db20acc0SAlan Somers atf_check -s exit:0 su -fm $uidinrange -c "$command1" 374db20acc0SAlan Somers 375db20acc0SAlan Somers # object type 376db20acc0SAlan Somers atf_check -s exit:0 ugidfw set 1 subject uid $uidrange object type r mode rasx 377db20acc0SAlan Somers atf_check -s not-exit:0 -e match:"Permission denied" \ 378db20acc0SAlan Somers su -fm $uidinrange -c "$command1" 379db20acc0SAlan Somers} 380db20acc0SAlan Somersobject_type_cleanup() 381db20acc0SAlan Somers{ 382db20acc0SAlan Somers cleanup 383db20acc0SAlan Somers} 384db20acc0SAlan Somers 385db20acc0SAlan Somersatf_init_test_cases() 386db20acc0SAlan Somers{ 387db20acc0SAlan Somers atf_add_test_case no_rules 388db20acc0SAlan Somers atf_add_test_case subject_match_on_uid 389db20acc0SAlan Somers atf_add_test_case subject_match_on_gid 390db20acc0SAlan Somers atf_add_test_case subject_match_on_jail 391db20acc0SAlan Somers atf_add_test_case object_uid 392db20acc0SAlan Somers atf_add_test_case object_gid 393db20acc0SAlan Somers atf_add_test_case object_filesys 394db20acc0SAlan Somers atf_add_test_case object_suid 395db20acc0SAlan Somers atf_add_test_case object_sgid 396db20acc0SAlan Somers atf_add_test_case object_uid_matches_subject 397db20acc0SAlan Somers atf_add_test_case object_gid_matches_subject 398db20acc0SAlan Somers atf_add_test_case object_type 399db20acc0SAlan Somers} 400