xref: /freebsd/tests/sys/mac/bsdextended/matches_test.sh (revision ea82362219ee715cfbb195b2114e73fdc8599fa5)
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