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