]> CyberLeo.Net >> Repos - FreeBSD/stable/10.git/blob - tests/sys/mac/bsdextended/matches_test.sh
MFstable/11 r307715:
[FreeBSD/stable/10.git] / tests / sys / mac / bsdextended / matches_test.sh
1 #!/bin/sh
2 #
3 # $FreeBSD$
4 #
5
6 uidrange="60000:100000"
7 gidrange="60000:100000"
8 uidinrange="nobody"
9 uidoutrange="daemon"
10 gidinrange="nobody" # We expect $uidinrange in this group
11 gidoutrange="daemon" # We expect $uidinrange in this group
12
13 test_num=1
14 pass()
15 {
16         echo "ok $test_num # $@"
17         : $(( test_num += 1 ))
18 }
19
20 fail()
21 {
22         echo "not ok $test_num # $@"
23         : $(( test_num += 1 ))
24 }
25
26 #
27 # Setup
28 #
29
30 : ${TMPDIR=/tmp}
31 if [ $(id -u) -ne 0 ]; then
32         echo "1..0 # SKIP test must be run as root"
33         exit 0
34 fi
35 if ! sysctl -N security.mac.bsdextended >/dev/null 2>&1; then
36         echo "1..0 # SKIP mac_bsdextended(4) support isn't available"
37         exit 0
38 fi
39 if [ "$TMPDIR" != "/tmp" ]; then
40         if ! chmod -Rf 0755 $TMPDIR; then
41                 echo "1..0 # SKIP failed to chmod $TMPDIR"
42                 exit 0
43         fi
44 fi
45 if ! playground=$(mktemp -d $TMPDIR/tmp.XXXXXXX); then
46         echo "1..0 # SKIP failed to create temporary directory"
47         exit 0
48 fi
49 trap "rmdir $playground" EXIT INT TERM
50 if ! mdmfs -s 25m md $playground; then
51         echo "1..0 # SKIP failed to mount md device"
52         exit 0
53 fi
54 chmod a+rwx $playground
55 md_device=$(mount -p | grep "$playground" | awk '{ gsub(/^\/dev\//, "", $1); print $1 }')
56 trap "umount -f $playground; mdconfig -d -u $md_device; rmdir $playground" EXIT INT TERM
57 if [ -z "$md_device" ]; then
58         mount -p | grep $playground
59         echo "1..0 # SKIP md device not properly attached to the system"
60 fi
61
62 ugidfw remove 1
63
64 file1=$playground/test-$uidinrange
65 file2=$playground/test-$uidoutrange
66 cat > $playground/test-script.sh <<'EOF'
67 #!/bin/sh
68 : > $1
69 EOF
70 if [ $? -ne 0 ]; then
71         echo "1..0 # SKIP failed to create test script"
72         exit 0
73 fi
74 echo "1..30"
75
76 command1="sh $playground/test-script.sh $file1"
77 command2="sh $playground/test-script.sh $file2"
78
79 desc="$uidinrange file"
80 if su -m $uidinrange -c "$command1"; then
81         pass $desc
82 else
83         fail $desc
84 fi
85
86 chown "$uidinrange":"$gidinrange" $file1
87 chmod a+w $file1
88
89 desc="$uidoutrange file"
90 if $command2; then
91         pass $desc
92 else
93         fail $desc
94 fi
95
96 chown "$uidoutrange":"$gidoutrange" $file2
97 chmod a+w $file2
98
99 #
100 # No rules
101 #
102 desc="no rules $uidinrange"
103 if su -fm $uidinrange -c "$command1"; then
104         pass $desc
105 else
106         fail $desc
107 fi
108
109 desc="no rules $uidoutrange"
110 if su -fm $uidoutrange -c "$command1"; then
111         pass $desc
112 else
113         fail $desc
114 fi
115
116 #
117 # Subject Match on uid
118 #
119 ugidfw set 1 subject uid $uidrange object mode rasx
120 desc="subject uid in range"
121 if su -fm $uidinrange -c "$command1"; then
122         fail $desc
123 else
124         pass $desc
125 fi
126
127 desc="subject uid out range"
128 if su -fm $uidoutrange -c "$command1"; then
129         pass $desc
130 else
131         fail $desc
132 fi
133
134 #
135 # Subject Match on gid
136 #
137 ugidfw set 1 subject gid $gidrange object mode rasx
138
139 desc="subject gid in range"
140 if su -fm $uidinrange -c "$command1"; then
141         fail $desc
142 else
143         pass $desc
144 fi
145
146 desc="subject gid out range"
147 if su -fm $uidoutrange -c "$command1"; then
148         pass $desc
149 else
150         fail $desc
151 fi
152
153 if which jail >/dev/null; then
154         #
155         # Subject Match on jail
156         #
157         rm -f $playground/test-jail
158
159         desc="subject matching jailid"
160         jailid=`jail -i / localhost 127.0.0.1 /usr/sbin/daemon -f /bin/sh -c "(sleep 5; touch $playground/test-jail) &"`
161         ugidfw set 1 subject jailid $jailid object mode rasx
162         sleep 10
163
164         if [ -f $playground/test-jail ]; then
165                 fail "TODO $desc: this testcase fails (see bug # 205481)"
166         else
167                 pass $desc
168         fi
169
170         rm -f $playground/test-jail
171         desc="subject nonmatching jailid"
172         jailid=`jail -i / localhost 127.0.0.1 /usr/sbin/daemon -f /bin/sh -c "(sleep 5; touch $playground/test-jail) &"`
173         sleep 10
174         if [ -f $playground/test-jail ]; then
175                 pass $desc
176         else
177                 fail $desc
178         fi
179 else
180         # XXX: kyua is too dumb to parse skip ranges, still..
181         pass "skip jail(8) not installed"
182         pass "skip jail(8) not installed"
183 fi
184
185 #
186 # Object uid
187 #
188 ugidfw set 1 subject object uid $uidrange mode rasx
189
190 desc="object uid in range"
191 if su -fm $uidinrange -c "$command1"; then
192         fail $desc
193 else
194         pass $desc
195 fi
196
197 desc="object uid out range"
198 if su -fm $uidinrange -c "$command2"; then
199         pass $desc
200 else
201         fail $desc
202 fi
203 ugidfw set 1 subject object uid $uidrange mode rasx
204
205 desc="object uid in range (different subject)"
206 if su -fm $uidoutrange -c "$command1"; then
207         fail $desc
208 else
209         pass $desc
210 fi
211
212 desc="object uid out range (different subject)"
213 if su -fm $uidoutrange -c "$command2"; then
214         pass $desc
215 else
216         fail $desc
217 fi
218
219 #
220 # Object gid
221 #
222 ugidfw set 1 subject object gid $uidrange mode rasx
223
224 desc="object gid in range"
225 if su -fm $uidinrange -c "$command1"; then
226         fail $desc
227 else
228         pass $desc
229 fi
230
231 desc="object gid out range"
232 if su -fm $uidinrange -c "$command2"; then
233         pass $desc
234 else
235         fail $desc
236 fi
237 desc="object gid in range (different subject)"
238 if su -fm $uidoutrange -c "$command1"; then
239         fail $desc
240 else
241         pass $desc
242 fi
243
244 desc="object gid out range (different subject)"
245 if su -fm $uidoutrange -c "$command2"; then
246         pass $desc
247 else
248         fail $desc
249 fi
250
251 #
252 # Object filesys
253 #
254 ugidfw set 1 subject uid $uidrange object filesys / mode rasx
255 desc="object out of filesys"
256 if su -fm $uidinrange -c "$command1"; then
257         pass $desc
258 else
259         fail $desc
260 fi
261
262 ugidfw set 1 subject uid $uidrange object filesys $playground mode rasx
263 desc="object in filesys"
264 if su -fm $uidinrange -c "$command1"; then
265         fail $desc
266 else
267         pass $desc
268 fi
269
270 #
271 # Object suid
272 #
273 ugidfw set 1 subject uid $uidrange object suid mode rasx
274 desc="object notsuid"
275 if su -fm $uidinrange -c "$command1"; then
276         pass $desc
277 else
278         fail $desc
279 fi
280
281 chmod u+s $file1
282 desc="object suid"
283 if su -fm $uidinrange -c "$command1"; then
284         fail $desc
285 else
286         pass $desc
287 fi
288 chmod u-s $file1
289
290 #
291 # Object sgid
292 #
293 ugidfw set 1 subject uid $uidrange object sgid mode rasx
294 desc="object notsgid"
295 if su -fm $uidinrange -c "$command1"; then
296         pass $desc
297 else
298         fail $desc
299 fi
300
301 chmod g+s $file1
302 desc="object sgid"
303 if su -fm $uidinrange -c "$command1"; then
304         fail $desc
305 else
306         pass $desc
307 fi
308 chmod g-s $file1
309
310 #
311 # Object uid matches subject
312 #
313 ugidfw set 1 subject uid $uidrange object uid_of_subject mode rasx
314
315 desc="object uid notmatches subject"
316 if su -fm $uidinrange -c "$command2"; then
317         pass $desc
318 else
319         fail $desc
320 fi
321
322 desc="object uid matches subject"
323 if su -fm $uidinrange -c "$command1"; then
324         fail $desc
325 else
326         pass $desc
327 fi
328
329 #
330 # Object gid matches subject
331 #
332 ugidfw set 1 subject uid $uidrange object gid_of_subject mode rasx
333
334 desc="object gid notmatches subject"
335 if su -fm $uidinrange -c "$command2"; then
336         pass $desc
337 else
338         fail $desc
339 fi
340
341 desc="object gid matches subject"
342 if su -fm $uidinrange -c "$command1"; then
343         fail $desc
344 else
345         pass $desc
346 fi
347
348 #
349 # Object type
350 #
351 desc="object not type"
352 ugidfw set 1 subject uid $uidrange object type dbclsp mode rasx
353 if su -fm $uidinrange -c "$command1"; then
354         pass $desc
355 else
356         fail $desc
357 fi
358
359 desc="object type"
360 ugidfw set 1 subject uid $uidrange object type r mode rasx
361 if su -fm $uidinrange -c "$command1"; then
362         fail $desc
363 else
364         pass $desc
365 fi