xref: /freebsd/sys/security/mac_biba/mac_biba.c (revision c4f6a2a9e1b1879b618c436ab4f56ff75c73a0f5)
1 /*-
2  * Copyright (c) 1999, 2000, 2001, 2002 Robert N. M. Watson
3  * Copyright (c) 2001, 2002 Networks Associates Technology, Inc.
4  * All rights reserved.
5  *
6  * This software was developed by Robert Watson for the TrustedBSD Project.
7  *
8  * This software was developed for the FreeBSD Project in part by NAI Labs,
9  * the Security Research Division of Network Associates, Inc. under
10  * DARPA/SPAWAR contract N66001-01-C-8035 ("CBOSS"), as part of the DARPA
11  * CHATS research program.
12  *
13  * Redistribution and use in source and binary forms, with or without
14  * modification, are permitted provided that the following conditions
15  * are met:
16  * 1. Redistributions of source code must retain the above copyright
17  *    notice, this list of conditions and the following disclaimer.
18  * 2. Redistributions in binary form must reproduce the above copyright
19  *    notice, this list of conditions and the following disclaimer in the
20  *    documentation and/or other materials provided with the distribution.
21  * 3. The names of the authors may not be used to endorse or promote
22  *    products derived from this software without specific prior written
23  *    permission.
24  *
25  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
26  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
29  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
30  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
31  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
32  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
34  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35  * SUCH DAMAGE.
36  *
37  * $FreeBSD$
38  */
39 
40 /*
41  * Developed by the TrustedBSD Project.
42  * Biba fixed label mandatory integrity policy.
43  */
44 
45 #include <sys/types.h>
46 #include <sys/param.h>
47 #include <sys/acl.h>
48 #include <sys/conf.h>
49 #include <sys/kernel.h>
50 #include <sys/mac.h>
51 #include <sys/mount.h>
52 #include <sys/proc.h>
53 #include <sys/systm.h>
54 #include <sys/sysproto.h>
55 #include <sys/sysent.h>
56 #include <sys/vnode.h>
57 #include <sys/file.h>
58 #include <sys/socket.h>
59 #include <sys/socketvar.h>
60 #include <sys/pipe.h>
61 #include <sys/sysctl.h>
62 
63 #include <fs/devfs/devfs.h>
64 
65 #include <net/bpfdesc.h>
66 #include <net/if.h>
67 #include <net/if_types.h>
68 #include <net/if_var.h>
69 
70 #include <netinet/in.h>
71 #include <netinet/ip_var.h>
72 
73 #include <vm/vm.h>
74 
75 #include <sys/mac_policy.h>
76 
77 #include <security/mac_biba/mac_biba.h>
78 
79 SYSCTL_DECL(_security_mac);
80 
81 SYSCTL_NODE(_security_mac, OID_AUTO, biba, CTLFLAG_RW, 0,
82     "TrustedBSD mac_biba policy controls");
83 
84 static int	mac_biba_enabled = 0;
85 SYSCTL_INT(_security_mac_biba, OID_AUTO, enabled, CTLFLAG_RW,
86     &mac_biba_enabled, 0, "Enforce MAC/Biba policy");
87 
88 static int	destroyed_not_inited;
89 SYSCTL_INT(_security_mac_biba, OID_AUTO, destroyed_not_inited, CTLFLAG_RD,
90     &destroyed_not_inited, 0, "Count of labels destroyed but not inited");
91 
92 static int	trust_all_interfaces = 0;
93 SYSCTL_INT(_security_mac_biba, OID_AUTO, trust_all_interfaces, CTLFLAG_RD,
94     &trust_all_interfaces, 0, "Consider all interfaces 'trusted' by MAC/Biba");
95 TUNABLE_INT("security.mac.biba.trust_all_interfaces", &trust_all_interfaces);
96 
97 static char	trusted_interfaces[128];
98 SYSCTL_STRING(_security_mac_biba, OID_AUTO, trusted_interfaces, CTLFLAG_RD,
99     trusted_interfaces, 0, "Interfaces considered 'trusted' by MAC/Biba");
100 TUNABLE_STR("security.mac.biba.trusted_interfaces", trusted_interfaces,
101     sizeof(trusted_interfaces));
102 
103 static int	mac_biba_revocation_enabled = 0;
104 SYSCTL_INT(_security_mac_biba, OID_AUTO, revocation_enabled, CTLFLAG_RW,
105     &mac_biba_revocation_enabled, 0, "Revoke access to objects on relabel");
106 TUNABLE_INT("security.mac.biba.revocation_enabled",
107     &mac_biba_revocation_enabled);
108 
109 static int	mac_biba_slot;
110 #define	SLOT(l)	((struct mac_biba *)LABEL_TO_SLOT((l), mac_biba_slot).l_ptr)
111 
112 MALLOC_DEFINE(M_MACBIBA, "biba label", "MAC/Biba labels");
113 
114 static int	mac_biba_check_vnode_open(struct ucred *cred, struct vnode *vp,
115 		    struct label *vnodelabel, mode_t acc_mode);
116 
117 static struct mac_biba *
118 biba_alloc(int how)
119 {
120 	struct mac_biba *mac_biba;
121 
122 	mac_biba = malloc(sizeof(struct mac_biba), M_MACBIBA, M_ZERO | how);
123 
124 	return (mac_biba);
125 }
126 
127 static void
128 biba_free(struct mac_biba *mac_biba)
129 {
130 
131 	if (mac_biba != NULL)
132 		free(mac_biba, M_MACBIBA);
133 	else
134 		atomic_add_int(&destroyed_not_inited, 1);
135 }
136 
137 static int
138 mac_biba_dominate_element(struct mac_biba_element *a,
139     struct mac_biba_element *b)
140 {
141 
142 	switch(a->mbe_type) {
143 	case MAC_BIBA_TYPE_EQUAL:
144 	case MAC_BIBA_TYPE_HIGH:
145 		return (1);
146 
147 	case MAC_BIBA_TYPE_LOW:
148 		switch (b->mbe_type) {
149 		case MAC_BIBA_TYPE_GRADE:
150 		case MAC_BIBA_TYPE_HIGH:
151 			return (0);
152 
153 		case MAC_BIBA_TYPE_EQUAL:
154 		case MAC_BIBA_TYPE_LOW:
155 			return (1);
156 
157 		default:
158 			panic("mac_biba_dominate_element: b->mbe_type invalid");
159 		}
160 
161 	case MAC_BIBA_TYPE_GRADE:
162 		switch (b->mbe_type) {
163 		case MAC_BIBA_TYPE_EQUAL:
164 		case MAC_BIBA_TYPE_LOW:
165 			return (1);
166 
167 		case MAC_BIBA_TYPE_HIGH:
168 			return (0);
169 
170 		case MAC_BIBA_TYPE_GRADE:
171 			return (a->mbe_grade >= b->mbe_grade);
172 
173 		default:
174 			panic("mac_biba_dominate_element: b->mbe_type invalid");
175 		}
176 
177 	default:
178 		panic("mac_biba_dominate_element: a->mbe_type invalid");
179 	}
180 
181 	return (0);
182 }
183 
184 static int
185 mac_biba_range_in_range(struct mac_biba *rangea, struct mac_biba *rangeb)
186 {
187 
188 	return (mac_biba_dominate_element(&rangeb->mb_rangehigh,
189 	    &rangea->mb_rangehigh) &&
190 	    mac_biba_dominate_element(&rangea->mb_rangelow,
191 	    &rangeb->mb_rangelow));
192 }
193 
194 static int
195 mac_biba_single_in_range(struct mac_biba *single, struct mac_biba *range)
196 {
197 
198 	KASSERT((single->mb_flag & MAC_BIBA_FLAG_SINGLE) != 0,
199 	    ("mac_biba_single_in_range: a not single"));
200 	KASSERT((range->mb_flag & MAC_BIBA_FLAG_RANGE) != 0,
201 	    ("mac_biba_single_in_range: b not range"));
202 
203 	return (mac_biba_dominate_element(&range->mb_rangehigh,
204 	    &single->mb_single) &&
205 	    mac_biba_dominate_element(&single->mb_single,
206 	    &range->mb_rangelow));
207 
208 	return (1);
209 }
210 
211 static int
212 mac_biba_dominate_single(struct mac_biba *a, struct mac_biba *b)
213 {
214 	KASSERT((a->mb_flags & MAC_BIBA_FLAG_SINGLE) != 0,
215 	    ("mac_biba_dominate_single: a not single"));
216 	KASSERT((b->mb_flags & MAC_BIBA_FLAG_SINGLE) != 0,
217 	    ("mac_biba_dominate_single: b not single"));
218 
219 	return (mac_biba_dominate_element(&a->mb_single, &b->mb_single));
220 }
221 
222 static int
223 mac_biba_equal_element(struct mac_biba_element *a, struct mac_biba_element *b)
224 {
225 
226 	if (a->mbe_type == MAC_BIBA_TYPE_EQUAL ||
227 	    b->mbe_type == MAC_BIBA_TYPE_EQUAL)
228 		return (1);
229 
230 	return (a->mbe_type == b->mbe_type && a->mbe_grade == b->mbe_grade);
231 }
232 
233 static int
234 mac_biba_equal_range(struct mac_biba *a, struct mac_biba *b)
235 {
236 
237 	KASSERT((a->mb_flags & MAC_BIBA_FLAG_RANGE) != 0,
238 	    ("mac_biba_equal_range: a not range"));
239 	KASSERT((b->mb_flags & MAC_BIBA_FLAG_RANGE) != 0,
240 	    ("mac_biba_equal_range: b not range"));
241 
242 	return (mac_biba_equal_element(&a->mb_rangelow, &b->mb_rangelow) &&
243 	    mac_biba_equal_element(&a->mb_rangehigh, &b->mb_rangehigh));
244 }
245 
246 static int
247 mac_biba_equal_single(struct mac_biba *a, struct mac_biba *b)
248 {
249 
250 	KASSERT((a->mb_flags & MAC_BIBA_FLAG_SINGLE) != 0,
251 	    ("mac_biba_equal_single: a not single"));
252 	KASSERT((b->mb_flags & MAC_BIBA_FLAG_SINGLE) != 0,
253 	    ("mac_biba_equal_single: b not single"));
254 
255 	return (mac_biba_equal_element(&a->mb_single, &b->mb_single));
256 }
257 
258 static int
259 mac_biba_high_single(struct mac_biba *mac_biba)
260 {
261 
262 	return (mac_biba->mb_single.mbe_type == MAC_BIBA_TYPE_HIGH);
263 }
264 
265 static int
266 mac_biba_valid(struct mac_biba *mac_biba)
267 {
268 
269 	if (mac_biba->mb_flags & MAC_BIBA_FLAG_SINGLE) {
270 		switch (mac_biba->mb_single.mbe_type) {
271 		case MAC_BIBA_TYPE_GRADE:
272 			break;
273 
274 		case MAC_BIBA_TYPE_EQUAL:
275 		case MAC_BIBA_TYPE_HIGH:
276 		case MAC_BIBA_TYPE_LOW:
277 			if (mac_biba->mb_single.mbe_grade != 0)
278 				return (EINVAL);
279 			break;
280 
281 		default:
282 			return (EINVAL);
283 		}
284 	} else {
285 		if (mac_biba->mb_single.mbe_type != MAC_BIBA_TYPE_UNDEF)
286 			return (EINVAL);
287 	}
288 
289 	if (mac_biba->mb_flags & MAC_BIBA_FLAG_RANGE) {
290 		switch (mac_biba->mb_rangelow.mbe_type) {
291 		case MAC_BIBA_TYPE_GRADE:
292 			break;
293 
294 		case MAC_BIBA_TYPE_EQUAL:
295 		case MAC_BIBA_TYPE_HIGH:
296 		case MAC_BIBA_TYPE_LOW:
297 			if (mac_biba->mb_rangelow.mbe_grade != 0)
298 				return (EINVAL);
299 			break;
300 
301 		default:
302 			return (EINVAL);
303 		}
304 
305 		switch (mac_biba->mb_rangehigh.mbe_type) {
306 		case MAC_BIBA_TYPE_GRADE:
307 			break;
308 
309 		case MAC_BIBA_TYPE_EQUAL:
310 		case MAC_BIBA_TYPE_HIGH:
311 		case MAC_BIBA_TYPE_LOW:
312 			if (mac_biba->mb_rangehigh.mbe_grade != 0)
313 				return (EINVAL);
314 			break;
315 
316 		default:
317 			return (EINVAL);
318 		}
319 		if (!mac_biba_dominate_element(&mac_biba->mb_rangehigh,
320 		    &mac_biba->mb_rangelow))
321 			return (EINVAL);
322 	} else {
323 		if (mac_biba->mb_rangelow.mbe_type != MAC_BIBA_TYPE_UNDEF ||
324 		    mac_biba->mb_rangehigh.mbe_type != MAC_BIBA_TYPE_UNDEF)
325 			return (EINVAL);
326 	}
327 
328 	return (0);
329 }
330 
331 static void
332 mac_biba_set_range(struct mac_biba *mac_biba, u_short typelow,
333     u_short gradelow, u_short typehigh, u_short gradehigh)
334 {
335 
336 	mac_biba->mb_rangelow.mbe_type = typelow;
337 	mac_biba->mb_rangelow.mbe_grade = gradelow;
338 	mac_biba->mb_rangehigh.mbe_type = typehigh;
339 	mac_biba->mb_rangehigh.mbe_grade = gradehigh;
340 	mac_biba->mb_flags |= MAC_BIBA_FLAG_RANGE;
341 }
342 
343 static void
344 mac_biba_set_single(struct mac_biba *mac_biba, u_short type, u_short grade)
345 {
346 
347 	mac_biba->mb_single.mbe_type = type;
348 	mac_biba->mb_single.mbe_grade = grade;
349 	mac_biba->mb_flags |= MAC_BIBA_FLAG_SINGLE;
350 }
351 
352 static void
353 mac_biba_copy_range(struct mac_biba *labelfrom, struct mac_biba *labelto)
354 {
355 	KASSERT((labelfrom->mb_flags & MAC_BIBA_FLAG_RANGE) != 0,
356 	    ("mac_biba_copy_range: labelfrom not range"));
357 
358 	labelto->mb_rangelow = labelfrom->mb_rangelow;
359 	labelto->mb_rangehigh = labelfrom->mb_rangehigh;
360 	labelto->mb_flags |= MAC_BIBA_FLAG_RANGE;
361 }
362 
363 static void
364 mac_biba_copy_single(struct mac_biba *labelfrom, struct mac_biba *labelto)
365 {
366 
367 	KASSERT((labelfrom->mb_flags & MAC_BIBA_FLAG_SINGLE) != 0,
368 	    ("mac_biba_copy_single: labelfrom not single"));
369 
370 	labelto->mb_single = labelfrom->mb_single;
371 	labelto->mb_flags |= MAC_BIBA_FLAG_SINGLE;
372 }
373 
374 static void
375 mac_biba_copy_single_to_range(struct mac_biba *labelfrom,
376     struct mac_biba *labelto)
377 {
378 
379 	KASSERT((labelfrom->mb_flags & MAC_BIBA_FLAG_SINGLE) != 0,
380 	    ("mac_biba_copy_single_to_range: labelfrom not single"));
381 
382 	labelto->mb_rangelow = labelfrom->mb_single;
383 	labelto->mb_rangehigh = labelfrom->mb_single;
384 	labelto->mb_flags |= MAC_BIBA_FLAG_RANGE;
385 }
386 
387 /*
388  * Policy module operations.
389  */
390 static void
391 mac_biba_destroy(struct mac_policy_conf *conf)
392 {
393 
394 }
395 
396 static void
397 mac_biba_init(struct mac_policy_conf *conf)
398 {
399 
400 }
401 
402 /*
403  * Label operations.
404  */
405 static void
406 mac_biba_init_bpfdesc(struct bpf_d *bpf_d, struct label *label)
407 {
408 
409 	SLOT(label) = biba_alloc(M_WAITOK);
410 }
411 
412 static void
413 mac_biba_init_cred(struct ucred *ucred, struct label *label)
414 {
415 
416 	SLOT(label) = biba_alloc(M_WAITOK);
417 }
418 
419 static void
420 mac_biba_init_devfsdirent(struct devfs_dirent *devfs_dirent,
421     struct label *label)
422 {
423 
424 	SLOT(label) = biba_alloc(M_WAITOK);
425 }
426 
427 static void
428 mac_biba_init_ifnet(struct ifnet *ifnet, struct label *label)
429 {
430 
431 	SLOT(label) = biba_alloc(M_WAITOK);
432 }
433 
434 static void
435 mac_biba_init_ipq(struct ipq *ipq, struct label *label)
436 {
437 
438 	SLOT(label) = biba_alloc(M_WAITOK);
439 }
440 
441 static int
442 mac_biba_init_mbuf(struct mbuf *mbuf, int how, struct label *label)
443 {
444 
445 	SLOT(label) = biba_alloc(how);
446 	if (SLOT(label) == NULL)
447 		return (ENOMEM);
448 
449 	return (0);
450 }
451 
452 static void
453 mac_biba_init_mount(struct mount *mount, struct label *mntlabel,
454     struct label *fslabel)
455 {
456 
457 	SLOT(mntlabel) = biba_alloc(M_WAITOK);
458 	SLOT(fslabel) = biba_alloc(M_WAITOK);
459 }
460 
461 static void
462 mac_biba_init_socket(struct socket *socket, struct label *label,
463     struct label *peerlabel)
464 {
465 
466 	SLOT(label) = biba_alloc(M_WAITOK);
467 	SLOT(peerlabel) = biba_alloc(M_WAITOK);
468 }
469 
470 static void
471 mac_biba_init_pipe(struct pipe *pipe, struct label *label)
472 {
473 
474 	SLOT(label) = biba_alloc(M_WAITOK);
475 }
476 
477 static void
478 mac_biba_init_temp(struct label *label)
479 {
480 
481 	SLOT(label) = biba_alloc(M_WAITOK);
482 }
483 
484 static void
485 mac_biba_init_vnode(struct vnode *vp, struct label *label)
486 {
487 
488 	SLOT(label) = biba_alloc(M_WAITOK);
489 }
490 
491 static void
492 mac_biba_destroy_bpfdesc(struct bpf_d *bpf_d, struct label *label)
493 {
494 
495 	biba_free(SLOT(label));
496 	SLOT(label) = NULL;
497 }
498 
499 static void
500 mac_biba_destroy_cred(struct ucred *ucred, struct label *label)
501 {
502 
503 	biba_free(SLOT(label));
504 	SLOT(label) = NULL;
505 }
506 
507 static void
508 mac_biba_destroy_devfsdirent(struct devfs_dirent *devfs_dirent,
509     struct label *label)
510 {
511 
512 	biba_free(SLOT(label));
513 	SLOT(label) = NULL;
514 }
515 
516 static void
517 mac_biba_destroy_ifnet(struct ifnet *ifnet, struct label *label)
518 {
519 
520 	biba_free(SLOT(label));
521 	SLOT(label) = NULL;
522 }
523 
524 static void
525 mac_biba_destroy_ipq(struct ipq *ipq, struct label *label)
526 {
527 
528 	biba_free(SLOT(label));
529 	SLOT(label) = NULL;
530 }
531 
532 static void
533 mac_biba_destroy_mbuf(struct mbuf *mbuf, struct label *label)
534 {
535 
536 	biba_free(SLOT(label));
537 	SLOT(label) = NULL;
538 }
539 
540 static void
541 mac_biba_destroy_mount(struct mount *mount, struct label *mntlabel,
542     struct label *fslabel)
543 {
544 
545 	biba_free(SLOT(mntlabel));
546 	SLOT(mntlabel) = NULL;
547 	biba_free(SLOT(fslabel));
548 	SLOT(fslabel) = NULL;
549 }
550 
551 static void
552 mac_biba_destroy_socket(struct socket *socket, struct label *label,
553     struct label *peerlabel)
554 {
555 
556 	biba_free(SLOT(label));
557 	SLOT(label) = NULL;
558 	biba_free(SLOT(peerlabel));
559 	SLOT(peerlabel) = NULL;
560 }
561 
562 static void
563 mac_biba_destroy_pipe(struct pipe *pipe, struct label *label)
564 {
565 
566 	biba_free(SLOT(label));
567 	SLOT(label) = NULL;
568 }
569 
570 static void
571 mac_biba_destroy_temp(struct label *label)
572 {
573 
574 	biba_free(SLOT(label));
575 	SLOT(label) = NULL;
576 }
577 
578 static void
579 mac_biba_destroy_vnode(struct vnode *vp, struct label *label)
580 {
581 
582 	biba_free(SLOT(label));
583 	SLOT(label) = NULL;
584 }
585 
586 static int
587 mac_biba_externalize(struct label *label, struct mac *extmac)
588 {
589 	struct mac_biba *mac_biba;
590 
591 	mac_biba = SLOT(label);
592 
593 	if (mac_biba == NULL) {
594 		printf("mac_biba_externalize: NULL pointer\n");
595 		return (0);
596 	}
597 
598 	extmac->m_biba = *mac_biba;
599 
600 	return (0);
601 }
602 
603 static int
604 mac_biba_internalize(struct label *label, struct mac *extmac)
605 {
606 	struct mac_biba *mac_biba;
607 	int error;
608 
609 	mac_biba = SLOT(label);
610 
611 	error = mac_biba_valid(mac_biba);
612 	if (error)
613 		return (error);
614 
615 	*mac_biba = extmac->m_biba;
616 
617 	return (0);
618 }
619 
620 /*
621  * Labeling event operations: file system objects, and things that look
622  * a lot like file system objects.
623  */
624 static void
625 mac_biba_create_devfs_device(dev_t dev, struct devfs_dirent *devfs_dirent,
626     struct label *label)
627 {
628 	struct mac_biba *mac_biba;
629 	int biba_type;
630 
631 	mac_biba = SLOT(label);
632 	if (strcmp(dev->si_name, "null") == 0 ||
633 	    strcmp(dev->si_name, "zero") == 0 ||
634 	    strcmp(dev->si_name, "random") == 0 ||
635 	    strncmp(dev->si_name, "fd/", strlen("fd/")) == 0)
636 		biba_type = MAC_BIBA_TYPE_EQUAL;
637 	else
638 		biba_type = MAC_BIBA_TYPE_HIGH;
639 	mac_biba_set_single(mac_biba, biba_type, 0);
640 }
641 
642 static void
643 mac_biba_create_devfs_directory(char *dirname, int dirnamelen,
644     struct devfs_dirent *devfs_dirent, struct label *label)
645 {
646 	struct mac_biba *mac_biba;
647 
648 	mac_biba = SLOT(label);
649 	mac_biba_set_single(mac_biba, MAC_BIBA_TYPE_HIGH, 0);
650 }
651 
652 static void
653 mac_biba_create_devfs_vnode(struct devfs_dirent *devfs_dirent,
654     struct label *direntlabel, struct vnode *vp, struct label *vnodelabel)
655 {
656 	struct mac_biba *source, *dest;
657 
658 	source = SLOT(direntlabel);
659 	dest = SLOT(vnodelabel);
660 	mac_biba_copy_single(source, dest);
661 }
662 
663 static void
664 mac_biba_create_vnode(struct ucred *cred, struct vnode *parent,
665     struct label *parentlabel, struct vnode *child, struct label *childlabel)
666 {
667 	struct mac_biba *source, *dest;
668 
669 	source = SLOT(&cred->cr_label);
670 	dest = SLOT(childlabel);
671 
672 	mac_biba_copy_single(source, dest);
673 }
674 
675 static void
676 mac_biba_create_mount(struct ucred *cred, struct mount *mp,
677     struct label *mntlabel, struct label *fslabel)
678 {
679 	struct mac_biba *source, *dest;
680 
681 	source = SLOT(&cred->cr_label);
682 	dest = SLOT(mntlabel);
683 	mac_biba_copy_single(source, dest);
684 	dest = SLOT(fslabel);
685 	mac_biba_copy_single(source, dest);
686 }
687 
688 static void
689 mac_biba_create_root_mount(struct ucred *cred, struct mount *mp,
690     struct label *mntlabel, struct label *fslabel)
691 {
692 	struct mac_biba *mac_biba;
693 
694 	/* Always mount root as high integrity. */
695 	mac_biba = SLOT(fslabel);
696 	mac_biba_set_single(mac_biba, MAC_BIBA_TYPE_HIGH, 0);
697 	mac_biba = SLOT(mntlabel);
698 	mac_biba_set_single(mac_biba, MAC_BIBA_TYPE_HIGH, 0);
699 }
700 
701 static void
702 mac_biba_relabel_vnode(struct ucred *cred, struct vnode *vp,
703     struct label *vnodelabel, struct label *label)
704 {
705 	struct mac_biba *source, *dest;
706 
707 	source = SLOT(label);
708 	dest = SLOT(vnodelabel);
709 
710 	mac_biba_copy_single(source, dest);
711 }
712 
713 static void
714 mac_biba_update_devfsdirent(struct devfs_dirent *devfs_dirent,
715     struct label *direntlabel, struct vnode *vp, struct label *vnodelabel)
716 {
717 	struct mac_biba *source, *dest;
718 
719 	source = SLOT(vnodelabel);
720 	dest = SLOT(direntlabel);
721 
722 	mac_biba_copy_single(source, dest);
723 }
724 
725 static void
726 mac_biba_update_procfsvnode(struct vnode *vp, struct label *vnodelabel,
727     struct ucred *cred)
728 {
729 	struct mac_biba *source, *dest;
730 
731 	source = SLOT(&cred->cr_label);
732 	dest = SLOT(vnodelabel);
733 
734 	/*
735 	 * Only copy the single, not the range, since vnodes only have
736 	 * a single.
737 	 */
738 	mac_biba_copy_single(source, dest);
739 }
740 
741 static int
742 mac_biba_update_vnode_from_externalized(struct vnode *vp,
743     struct label *vnodelabel, struct mac *extmac)
744 {
745 	struct mac_biba *source, *dest;
746 	int error;
747 
748 	source = &extmac->m_biba;
749 	dest = SLOT(vnodelabel);
750 
751 	error = mac_biba_valid(source);
752 	if (error)
753 		return (error);
754 
755 	if ((source->mb_flags & MAC_BIBA_FLAGS_BOTH) != MAC_BIBA_FLAG_SINGLE)
756 		return (EINVAL);
757 
758 	mac_biba_copy_single(source, dest);
759 
760 	return (0);
761 }
762 
763 static void
764 mac_biba_update_vnode_from_mount(struct vnode *vp, struct label *vnodelabel,
765     struct mount *mp, struct label *fslabel)
766 {
767 	struct mac_biba *source, *dest;
768 
769 	source = SLOT(fslabel);
770 	dest = SLOT(vnodelabel);
771 
772 	mac_biba_copy_single(source, dest);
773 }
774 
775 /*
776  * Labeling event operations: IPC object.
777  */
778 static void
779 mac_biba_create_mbuf_from_socket(struct socket *so, struct label *socketlabel,
780     struct mbuf *m, struct label *mbuflabel)
781 {
782 	struct mac_biba *source, *dest;
783 
784 	source = SLOT(socketlabel);
785 	dest = SLOT(mbuflabel);
786 
787 	mac_biba_copy_single(source, dest);
788 }
789 
790 static void
791 mac_biba_create_socket(struct ucred *cred, struct socket *socket,
792     struct label *socketlabel)
793 {
794 	struct mac_biba *source, *dest;
795 
796 	source = SLOT(&cred->cr_label);
797 	dest = SLOT(socketlabel);
798 
799 	mac_biba_copy_single(source, dest);
800 	mac_biba_copy_single_to_range(source, dest);
801 }
802 
803 static void
804 mac_biba_create_pipe(struct ucred *cred, struct pipe *pipe,
805     struct label *pipelabel)
806 {
807 	struct mac_biba *source, *dest;
808 
809 	source = SLOT(&cred->cr_label);
810 	dest = SLOT(pipelabel);
811 
812 	mac_biba_copy_single(source, dest);
813 }
814 
815 static void
816 mac_biba_create_socket_from_socket(struct socket *oldsocket,
817     struct label *oldsocketlabel, struct socket *newsocket,
818     struct label *newsocketlabel)
819 {
820 	struct mac_biba *source, *dest;
821 
822 	source = SLOT(oldsocketlabel);
823 	dest = SLOT(newsocketlabel);
824 
825 	mac_biba_copy_single(source, dest);
826 	mac_biba_copy_range(source, dest);
827 }
828 
829 static void
830 mac_biba_relabel_socket(struct ucred *cred, struct socket *socket,
831     struct label *socketlabel, struct label *newlabel)
832 {
833 	struct mac_biba *source, *dest;
834 
835 	source = SLOT(newlabel);
836 	dest = SLOT(socketlabel);
837 
838 	mac_biba_copy_single(source, dest);
839 	mac_biba_copy_range(source, dest);
840 }
841 
842 static void
843 mac_biba_relabel_pipe(struct ucred *cred, struct pipe *pipe,
844     struct label *pipelabel, struct label *newlabel)
845 {
846 	struct mac_biba *source, *dest;
847 
848 	source = SLOT(newlabel);
849 	dest = SLOT(pipelabel);
850 
851 	mac_biba_copy_single(source, dest);
852 }
853 
854 static void
855 mac_biba_set_socket_peer_from_mbuf(struct mbuf *mbuf, struct label *mbuflabel,
856     struct socket *socket, struct label *socketpeerlabel)
857 {
858 	struct mac_biba *source, *dest;
859 
860 	source = SLOT(mbuflabel);
861 	dest = SLOT(socketpeerlabel);
862 
863 	mac_biba_copy_single(source, dest);
864 }
865 
866 /*
867  * Labeling event operations: network objects.
868  */
869 static void
870 mac_biba_set_socket_peer_from_socket(struct socket *oldsocket,
871     struct label *oldsocketlabel, struct socket *newsocket,
872     struct label *newsocketpeerlabel)
873 {
874 	struct mac_biba *source, *dest;
875 
876 	source = SLOT(oldsocketlabel);
877 	dest = SLOT(newsocketpeerlabel);
878 
879 	mac_biba_copy_single(source, dest);
880 }
881 
882 static void
883 mac_biba_create_bpfdesc(struct ucred *cred, struct bpf_d *bpf_d,
884     struct label *bpflabel)
885 {
886 	struct mac_biba *source, *dest;
887 
888 	source = SLOT(&cred->cr_label);
889 	dest = SLOT(bpflabel);
890 
891 	mac_biba_copy_single(source, dest);
892 }
893 
894 static void
895 mac_biba_create_ifnet(struct ifnet *ifnet, struct label *ifnetlabel)
896 {
897 	char tifname[IFNAMSIZ], ifname[IFNAMSIZ], *p, *q;
898 	char tiflist[sizeof(trusted_interfaces)];
899 	struct mac_biba *dest;
900 	int len, grade;
901 
902 	dest = SLOT(ifnetlabel);
903 
904 	if (ifnet->if_type == IFT_LOOP) {
905 		grade = MAC_BIBA_TYPE_EQUAL;
906 		goto set;
907 	}
908 
909 	if (trust_all_interfaces) {
910 		grade = MAC_BIBA_TYPE_HIGH;
911 		goto set;
912 	}
913 
914 	grade = MAC_BIBA_TYPE_LOW;
915 
916 	if (trusted_interfaces[0] == '\0' ||
917 	    !strvalid(trusted_interfaces, sizeof(trusted_interfaces)))
918 		goto set;
919 
920 	for (p = trusted_interfaces, q = tiflist; *p != '\0'; p++, q++)
921 		if(*p != ' ' && *p != '\t')
922 			*q = *p;
923 
924 	snprintf(ifname, IFNAMSIZ, "%s%d", ifnet->if_name, ifnet->if_unit);
925 
926 	for (p = q = tiflist;; p++) {
927 		if (*p == ',' || *p == '\0') {
928 			len = p - q;
929 			if (len < IFNAMSIZ) {
930 				bzero(tifname, sizeof(tifname));
931 				bcopy(q, tifname, len);
932 				if (strcmp(tifname, ifname) == 0) {
933 					grade = MAC_BIBA_TYPE_HIGH;
934 					break;
935 				}
936 			}
937 			if (*p == '\0')
938 				break;
939 			q = p + 1;
940 		}
941 	}
942 set:
943 	mac_biba_set_single(dest, grade, 0);
944 	mac_biba_set_range(dest, grade, 0, grade, 0);
945 }
946 
947 static void
948 mac_biba_create_ipq(struct mbuf *fragment, struct label *fragmentlabel,
949     struct ipq *ipq, struct label *ipqlabel)
950 {
951 	struct mac_biba *source, *dest;
952 
953 	source = SLOT(fragmentlabel);
954 	dest = SLOT(ipqlabel);
955 
956 	mac_biba_copy_single(source, dest);
957 }
958 
959 static void
960 mac_biba_create_datagram_from_ipq(struct ipq *ipq, struct label *ipqlabel,
961     struct mbuf *datagram, struct label *datagramlabel)
962 {
963 	struct mac_biba *source, *dest;
964 
965 	source = SLOT(ipqlabel);
966 	dest = SLOT(datagramlabel);
967 
968 	/* Just use the head, since we require them all to match. */
969 	mac_biba_copy_single(source, dest);
970 }
971 
972 static void
973 mac_biba_create_fragment(struct mbuf *datagram, struct label *datagramlabel,
974     struct mbuf *fragment, struct label *fragmentlabel)
975 {
976 	struct mac_biba *source, *dest;
977 
978 	source = SLOT(datagramlabel);
979 	dest = SLOT(fragmentlabel);
980 
981 	mac_biba_copy_single(source, dest);
982 }
983 
984 static void
985 mac_biba_create_mbuf_from_mbuf(struct mbuf *oldmbuf,
986     struct label *oldmbuflabel, struct mbuf *newmbuf,
987     struct label *newmbuflabel)
988 {
989 	struct mac_biba *source, *dest;
990 
991 	source = SLOT(oldmbuflabel);
992 	dest = SLOT(newmbuflabel);
993 
994 	mac_biba_copy_single(source, dest);
995 }
996 
997 static void
998 mac_biba_create_mbuf_linklayer(struct ifnet *ifnet, struct label *ifnetlabel,
999     struct mbuf *mbuf, struct label *mbuflabel)
1000 {
1001 	struct mac_biba *dest;
1002 
1003 	dest = SLOT(mbuflabel);
1004 
1005 	mac_biba_set_single(dest, MAC_BIBA_TYPE_EQUAL, 0);
1006 }
1007 
1008 static void
1009 mac_biba_create_mbuf_from_bpfdesc(struct bpf_d *bpf_d, struct label *bpflabel,
1010     struct mbuf *mbuf, struct label *mbuflabel)
1011 {
1012 	struct mac_biba *source, *dest;
1013 
1014 	source = SLOT(bpflabel);
1015 	dest = SLOT(mbuflabel);
1016 
1017 	mac_biba_copy_single(source, dest);
1018 }
1019 
1020 static void
1021 mac_biba_create_mbuf_from_ifnet(struct ifnet *ifnet, struct label *ifnetlabel,
1022     struct mbuf *m, struct label *mbuflabel)
1023 {
1024 	struct mac_biba *source, *dest;
1025 
1026 	source = SLOT(ifnetlabel);
1027 	dest = SLOT(mbuflabel);
1028 
1029 	mac_biba_copy_single(source, dest);
1030 }
1031 
1032 static void
1033 mac_biba_create_mbuf_multicast_encap(struct mbuf *oldmbuf,
1034     struct label *oldmbuflabel, struct ifnet *ifnet, struct label *ifnetlabel,
1035     struct mbuf *newmbuf, struct label *newmbuflabel)
1036 {
1037 	struct mac_biba *source, *dest;
1038 
1039 	source = SLOT(oldmbuflabel);
1040 	dest = SLOT(newmbuflabel);
1041 
1042 	mac_biba_copy_single(source, dest);
1043 }
1044 
1045 static void
1046 mac_biba_create_mbuf_netlayer(struct mbuf *oldmbuf, struct label *oldmbuflabel,
1047     struct mbuf *newmbuf, struct label *newmbuflabel)
1048 {
1049 	struct mac_biba *source, *dest;
1050 
1051 	source = SLOT(oldmbuflabel);
1052 	dest = SLOT(newmbuflabel);
1053 
1054 	mac_biba_copy_single(source, dest);
1055 }
1056 
1057 static int
1058 mac_biba_fragment_match(struct mbuf *fragment, struct label *fragmentlabel,
1059     struct ipq *ipq, struct label *ipqlabel)
1060 {
1061 	struct mac_biba *a, *b;
1062 
1063 	a = SLOT(ipqlabel);
1064 	b = SLOT(fragmentlabel);
1065 
1066 	return (mac_biba_equal_single(a, b));
1067 }
1068 
1069 static void
1070 mac_biba_relabel_ifnet(struct ucred *cred, struct ifnet *ifnet,
1071     struct label *ifnetlabel, struct label *newlabel)
1072 {
1073 	struct mac_biba *source, *dest;
1074 
1075 	source = SLOT(newlabel);
1076 	dest = SLOT(ifnetlabel);
1077 
1078 	mac_biba_copy_single(source, dest);
1079 	mac_biba_copy_range(source, dest);
1080 }
1081 
1082 static void
1083 mac_biba_update_ipq(struct mbuf *fragment, struct label *fragmentlabel,
1084     struct ipq *ipq, struct label *ipqlabel)
1085 {
1086 
1087 	/* NOOP: we only accept matching labels, so no need to update */
1088 }
1089 
1090 /*
1091  * Labeling event operations: processes.
1092  */
1093 static void
1094 mac_biba_create_cred(struct ucred *cred_parent, struct ucred *cred_child)
1095 {
1096 	struct mac_biba *source, *dest;
1097 
1098 	source = SLOT(&cred_parent->cr_label);
1099 	dest = SLOT(&cred_child->cr_label);
1100 
1101 	mac_biba_copy_single(source, dest);
1102 	mac_biba_copy_range(source, dest);
1103 }
1104 
1105 static void
1106 mac_biba_execve_transition(struct ucred *old, struct ucred *new,
1107     struct vnode *vp, struct mac *vnodelabel)
1108 {
1109 	struct mac_biba *source, *dest;
1110 
1111 	source = SLOT(&old->cr_label);
1112 	dest = SLOT(&new->cr_label);
1113 
1114 	mac_biba_copy_single(source, dest);
1115 	mac_biba_copy_range(source, dest);
1116 }
1117 
1118 static int
1119 mac_biba_execve_will_transition(struct ucred *old, struct vnode *vp,
1120     struct mac *vnodelabel)
1121 {
1122 
1123 	return (0);
1124 }
1125 
1126 static void
1127 mac_biba_create_proc0(struct ucred *cred)
1128 {
1129 	struct mac_biba *dest;
1130 
1131 	dest = SLOT(&cred->cr_label);
1132 
1133 	mac_biba_set_single(dest, MAC_BIBA_TYPE_EQUAL, 0);
1134 	mac_biba_set_range(dest, MAC_BIBA_TYPE_LOW, 0, MAC_BIBA_TYPE_HIGH, 0);
1135 }
1136 
1137 static void
1138 mac_biba_create_proc1(struct ucred *cred)
1139 {
1140 	struct mac_biba *dest;
1141 
1142 	dest = SLOT(&cred->cr_label);
1143 
1144 	mac_biba_set_single(dest, MAC_BIBA_TYPE_HIGH, 0);
1145 	mac_biba_set_range(dest, MAC_BIBA_TYPE_LOW, 0, MAC_BIBA_TYPE_HIGH, 0);
1146 }
1147 
1148 static void
1149 mac_biba_relabel_cred(struct ucred *cred, struct label *newlabel)
1150 {
1151 	struct mac_biba *source, *dest;
1152 
1153 	source = SLOT(newlabel);
1154 	dest = SLOT(&cred->cr_label);
1155 
1156 	mac_biba_copy_single(source, dest);
1157 	mac_biba_copy_range(source, dest);
1158 }
1159 
1160 /*
1161  * Access control checks.
1162  */
1163 static int
1164 mac_biba_check_bpfdesc_receive(struct bpf_d *bpf_d, struct label *bpflabel,
1165     struct ifnet *ifnet, struct label *ifnetlabel)
1166 {
1167 	struct mac_biba *a, *b;
1168 
1169 	if (!mac_biba_enabled)
1170 		return (0);
1171 
1172 	a = SLOT(bpflabel);
1173 	b = SLOT(ifnetlabel);
1174 
1175 	if (mac_biba_equal_single(a, b))
1176 		return (0);
1177 	return (EACCES);
1178 }
1179 
1180 static int
1181 mac_biba_check_cred_relabel(struct ucred *cred, struct label *newlabel)
1182 {
1183 	struct mac_biba *subj, *new;
1184 
1185 	subj = SLOT(&cred->cr_label);
1186 	new = SLOT(newlabel);
1187 
1188 	if ((new->mb_flags & MAC_BIBA_FLAGS_BOTH) != MAC_BIBA_FLAGS_BOTH)
1189 		return (EINVAL);
1190 
1191 	/*
1192 	 * XXX: Allow processes with root privilege to set labels outside
1193 	 * their range, so suid things like "su" work.  This WILL go away
1194 	 * when we figure out the 'correct' solution...
1195 	 */
1196 	if (!suser_cred(cred, 0))
1197 		return (0);
1198 
1199 	/*
1200 	 * The new single must be in the old range.
1201 	 */
1202 	if (!mac_biba_single_in_range(new, subj))
1203 		return (EPERM);
1204 
1205 	/*
1206 	 * The new range must be in the old range.
1207 	 */
1208 	if (!mac_biba_range_in_range(new, subj))
1209 		return (EPERM);
1210 
1211 	/*
1212 	 * XXX: Don't permit EQUAL in a label unless the subject has EQUAL.
1213 	 */
1214 
1215 	return (0);
1216 }
1217 
1218 static int
1219 mac_biba_check_cred_visible(struct ucred *u1, struct ucred *u2)
1220 {
1221 	struct mac_biba *subj, *obj;
1222 
1223 	if (!mac_biba_enabled)
1224 		return (0);
1225 
1226 	subj = SLOT(&u1->cr_label);
1227 	obj = SLOT(&u2->cr_label);
1228 
1229 	/* XXX: range */
1230 	if (!mac_biba_dominate_single(obj, subj))
1231 		return (ESRCH);
1232 
1233 	return (0);
1234 }
1235 
1236 static int
1237 mac_biba_check_ifnet_relabel(struct ucred *cred, struct ifnet *ifnet,
1238     struct label *ifnetlabel, struct label *newlabel)
1239 {
1240 	struct mac_biba *subj, *new;
1241 
1242 	subj = SLOT(&cred->cr_label);
1243 	new = SLOT(newlabel);
1244 
1245 	if ((new->mb_flags & MAC_BIBA_FLAGS_BOTH) != MAC_BIBA_FLAGS_BOTH)
1246 		return (EINVAL);
1247 
1248 	/*
1249 	 * XXX: Only Biba HIGH subjects may relabel interfaces. */
1250 	if (!mac_biba_high_single(subj))
1251 		return (EPERM);
1252 
1253 	return (suser_cred(cred, 0));
1254 }
1255 
1256 static int
1257 mac_biba_check_ifnet_transmit(struct ifnet *ifnet, struct label *ifnetlabel,
1258     struct mbuf *m, struct label *mbuflabel)
1259 {
1260 	struct mac_biba *p, *i;
1261 
1262 	if (!mac_biba_enabled)
1263 		return (0);
1264 
1265 	p = SLOT(mbuflabel);
1266 	i = SLOT(ifnetlabel);
1267 
1268 	return (mac_biba_single_in_range(p, i) ? 0 : EACCES);
1269 }
1270 
1271 static int
1272 mac_biba_check_mount_stat(struct ucred *cred, struct mount *mp,
1273     struct label *mntlabel)
1274 {
1275 	struct mac_biba *subj, *obj;
1276 
1277 	if (!mac_biba_enabled)
1278 		return (0);
1279 
1280 	subj = SLOT(&cred->cr_label);
1281 	obj = SLOT(mntlabel);
1282 
1283 	if (!mac_biba_dominate_single(obj, subj))
1284 		return (EACCES);
1285 
1286 	return (0);
1287 }
1288 
1289 static int
1290 mac_biba_check_pipe_ioctl(struct ucred *cred, struct pipe *pipe,
1291     struct label *pipelabel, unsigned long cmd, void /* caddr_t */ *data)
1292 {
1293 
1294 	if(!mac_biba_enabled)
1295 		return (0);
1296 
1297 	/* XXX: This will be implemented soon... */
1298 
1299 	return (0);
1300 }
1301 
1302 static int
1303 mac_biba_check_pipe_poll(struct ucred *cred, struct pipe *pipe,
1304     struct label *pipelabel)
1305 {
1306 	struct mac_biba *subj, *obj;
1307 
1308 	if (!mac_biba_enabled)
1309 		return (0);
1310 
1311 	subj = SLOT(&cred->cr_label);
1312 	obj = SLOT((pipelabel));
1313 
1314 	if (!mac_biba_dominate_single(obj, subj))
1315 		return (EACCES);
1316 
1317 	return (0);
1318 }
1319 
1320 static int
1321 mac_biba_check_pipe_read(struct ucred *cred, struct pipe *pipe,
1322     struct label *pipelabel)
1323 {
1324 	struct mac_biba *subj, *obj;
1325 
1326 	if (!mac_biba_enabled)
1327 		return (0);
1328 
1329 	subj = SLOT(&cred->cr_label);
1330 	obj = SLOT((pipelabel));
1331 
1332 	if (!mac_biba_dominate_single(obj, subj))
1333 		return (EACCES);
1334 
1335 	return (0);
1336 }
1337 
1338 static int
1339 mac_biba_check_pipe_relabel(struct ucred *cred, struct pipe *pipe,
1340     struct label *pipelabel, struct label *newlabel)
1341 {
1342 	struct mac_biba *subj, *obj, *new;
1343 
1344 	new = SLOT(newlabel);
1345 	subj = SLOT(&cred->cr_label);
1346 	obj = SLOT(pipelabel);
1347 
1348 	if ((new->mb_flags & MAC_BIBA_FLAGS_BOTH) != MAC_BIBA_FLAG_SINGLE)
1349 		return (EINVAL);
1350 
1351 	/*
1352 	 * To relabel a pipe, the old pipe label must be in the subject
1353 	 * range.
1354 	 */
1355 	if (!mac_biba_single_in_range(obj, subj))
1356 		return (EPERM);
1357 
1358 	/*
1359 	 * To relabel a pipe, the new pipe label must be in the subject
1360 	 * range.
1361 	 */
1362 	if (!mac_biba_single_in_range(new, subj))
1363 		return (EPERM);
1364 
1365 	/*
1366 	 * XXX: Don't permit EQUAL in a label unless the subject has EQUAL.
1367 	 */
1368 
1369 	return (0);
1370 }
1371 
1372 static int
1373 mac_biba_check_pipe_stat(struct ucred *cred, struct pipe *pipe,
1374     struct label *pipelabel)
1375 {
1376 	struct mac_biba *subj, *obj;
1377 
1378 	if (!mac_biba_enabled)
1379 		return (0);
1380 
1381 	subj = SLOT(&cred->cr_label);
1382 	obj = SLOT((pipelabel));
1383 
1384 	if (!mac_biba_dominate_single(obj, subj))
1385 		return (EACCES);
1386 
1387 	return (0);
1388 }
1389 
1390 static int
1391 mac_biba_check_pipe_write(struct ucred *cred, struct pipe *pipe,
1392     struct label *pipelabel)
1393 {
1394 	struct mac_biba *subj, *obj;
1395 
1396 	if (!mac_biba_enabled)
1397 		return (0);
1398 
1399 	subj = SLOT(&cred->cr_label);
1400 	obj = SLOT((pipelabel));
1401 
1402 	if (!mac_biba_dominate_single(subj, obj))
1403 		return (EACCES);
1404 
1405 	return (0);
1406 }
1407 
1408 static int
1409 mac_biba_check_proc_debug(struct ucred *cred, struct proc *proc)
1410 {
1411 	struct mac_biba *subj, *obj;
1412 
1413 	if (!mac_biba_enabled)
1414 		return (0);
1415 
1416 	subj = SLOT(&cred->cr_label);
1417 	obj = SLOT(&proc->p_ucred->cr_label);
1418 
1419 	/* XXX: range checks */
1420 	if (!mac_biba_dominate_single(obj, subj))
1421 		return (ESRCH);
1422 	if (!mac_biba_dominate_single(subj, obj))
1423 		return (EACCES);
1424 
1425 	return (0);
1426 }
1427 
1428 static int
1429 mac_biba_check_proc_sched(struct ucred *cred, struct proc *proc)
1430 {
1431 	struct mac_biba *subj, *obj;
1432 
1433 	if (!mac_biba_enabled)
1434 		return (0);
1435 
1436 	subj = SLOT(&cred->cr_label);
1437 	obj = SLOT(&proc->p_ucred->cr_label);
1438 
1439 	/* XXX: range checks */
1440 	if (!mac_biba_dominate_single(obj, subj))
1441 		return (ESRCH);
1442 	if (!mac_biba_dominate_single(subj, obj))
1443 		return (EACCES);
1444 
1445 	return (0);
1446 }
1447 
1448 static int
1449 mac_biba_check_proc_signal(struct ucred *cred, struct proc *proc, int signum)
1450 {
1451 	struct mac_biba *subj, *obj;
1452 
1453 	if (!mac_biba_enabled)
1454 		return (0);
1455 
1456 	subj = SLOT(&cred->cr_label);
1457 	obj = SLOT(&proc->p_ucred->cr_label);
1458 
1459 	/* XXX: range checks */
1460 	if (!mac_biba_dominate_single(obj, subj))
1461 		return (ESRCH);
1462 	if (!mac_biba_dominate_single(subj, obj))
1463 		return (EACCES);
1464 
1465 	return (0);
1466 }
1467 
1468 static int
1469 mac_biba_check_socket_deliver(struct socket *so, struct label *socketlabel,
1470     struct mbuf *m, struct label *mbuflabel)
1471 {
1472 	struct mac_biba *p, *s;
1473 
1474 	if (!mac_biba_enabled)
1475 		return (0);
1476 
1477 	p = SLOT(mbuflabel);
1478 	s = SLOT(socketlabel);
1479 
1480 	return (mac_biba_equal_single(p, s) ? 0 : EACCES);
1481 }
1482 
1483 static int
1484 mac_biba_check_socket_relabel(struct ucred *cred, struct socket *socket,
1485     struct label *socketlabel, struct label *newlabel)
1486 {
1487 	struct mac_biba *subj, *obj, *new;
1488 
1489 	new = SLOT(newlabel);
1490 	subj = SLOT(&cred->cr_label);
1491 	obj = SLOT(socketlabel);
1492 
1493 	if ((new->mb_flags & MAC_BIBA_FLAGS_BOTH) != MAC_BIBA_FLAG_SINGLE)
1494 		return (EINVAL);
1495 
1496 	/*
1497 	 * To relabel a socket, the old socket label must be in the subject
1498 	 * range.
1499 	 */
1500 	if (!mac_biba_single_in_range(obj, subj))
1501 		return (EPERM);
1502 
1503 	/*
1504 	 * To relabel a socket, the new socket label must be in the subject
1505 	 * range.
1506 	 */
1507 	if (!mac_biba_single_in_range(new, subj))
1508 		return (EPERM);
1509 
1510 	/*
1511 	 * XXX: Don't permit EQUAL in a label unless the subject has EQUAL.
1512 	 */
1513 
1514 	return (0);
1515 }
1516 
1517 static int
1518 mac_biba_check_socket_visible(struct ucred *cred, struct socket *socket,
1519     struct label *socketlabel)
1520 {
1521 	struct mac_biba *subj, *obj;
1522 
1523 	subj = SLOT(&cred->cr_label);
1524 	obj = SLOT(socketlabel);
1525 
1526 	if (!mac_biba_dominate_single(obj, subj))
1527 		return (ENOENT);
1528 
1529 	return (0);
1530 }
1531 
1532 static int
1533 mac_biba_check_vnode_access(struct ucred *cred, struct vnode *vp,
1534     struct label *label, mode_t flags)
1535 {
1536 
1537 	return (mac_biba_check_vnode_open(cred, vp, label, flags));
1538 }
1539 
1540 static int
1541 mac_biba_check_vnode_chdir(struct ucred *cred, struct vnode *dvp,
1542     struct label *dlabel)
1543 {
1544 	struct mac_biba *subj, *obj;
1545 
1546 	if (!mac_biba_enabled)
1547 		return (0);
1548 
1549 	subj = SLOT(&cred->cr_label);
1550 	obj = SLOT(dlabel);
1551 
1552 	if (!mac_biba_dominate_single(obj, subj))
1553 		return (EACCES);
1554 
1555 	return (0);
1556 }
1557 
1558 static int
1559 mac_biba_check_vnode_chroot(struct ucred *cred, struct vnode *dvp,
1560     struct label *dlabel)
1561 {
1562 	struct mac_biba *subj, *obj;
1563 
1564 	if (!mac_biba_enabled)
1565 		return (0);
1566 
1567 	subj = SLOT(&cred->cr_label);
1568 	obj = SLOT(dlabel);
1569 
1570 	if (!mac_biba_dominate_single(obj, subj))
1571 		return (EACCES);
1572 
1573 	return (0);
1574 }
1575 
1576 static int
1577 mac_biba_check_vnode_create(struct ucred *cred, struct vnode *dvp,
1578     struct label *dlabel, struct componentname *cnp, struct vattr *vap)
1579 {
1580 	struct mac_biba *subj, *obj;
1581 
1582 	if (!mac_biba_enabled)
1583 		return (0);
1584 
1585 	subj = SLOT(&cred->cr_label);
1586 	obj = SLOT(dlabel);
1587 
1588 	if (!mac_biba_dominate_single(subj, obj))
1589 		return (EACCES);
1590 
1591 	return (0);
1592 }
1593 
1594 static int
1595 mac_biba_check_vnode_delete(struct ucred *cred, struct vnode *dvp,
1596     struct label *dlabel, struct vnode *vp, struct label *label,
1597     struct componentname *cnp)
1598 {
1599 	struct mac_biba *subj, *obj;
1600 
1601 	if (!mac_biba_enabled)
1602 		return (0);
1603 
1604 	subj = SLOT(&cred->cr_label);
1605 	obj = SLOT(dlabel);
1606 
1607 	if (!mac_biba_dominate_single(subj, obj))
1608 		return (EACCES);
1609 
1610 	obj = SLOT(label);
1611 
1612 	if (!mac_biba_dominate_single(subj, obj))
1613 		return (EACCES);
1614 
1615 	return (0);
1616 }
1617 
1618 static int
1619 mac_biba_check_vnode_deleteacl(struct ucred *cred, struct vnode *vp,
1620     struct label *label, acl_type_t type)
1621 {
1622 	struct mac_biba *subj, *obj;
1623 
1624 	if (!mac_biba_enabled)
1625 		return (0);
1626 
1627 	subj = SLOT(&cred->cr_label);
1628 	obj = SLOT(label);
1629 
1630 	if (!mac_biba_dominate_single(subj, obj))
1631 		return (EACCES);
1632 
1633 	return (0);
1634 }
1635 
1636 static int
1637 mac_biba_check_vnode_exec(struct ucred *cred, struct vnode *vp,
1638     struct label *label)
1639 {
1640 	struct mac_biba *subj, *obj;
1641 
1642 	if (!mac_biba_enabled)
1643 		return (0);
1644 
1645 	subj = SLOT(&cred->cr_label);
1646 	obj = SLOT(label);
1647 
1648 	if (!mac_biba_dominate_single(obj, subj))
1649 		return (EACCES);
1650 
1651 	return (0);
1652 }
1653 
1654 static int
1655 mac_biba_check_vnode_getacl(struct ucred *cred, struct vnode *vp,
1656     struct label *label, acl_type_t type)
1657 {
1658 	struct mac_biba *subj, *obj;
1659 
1660 	if (!mac_biba_enabled)
1661 		return (0);
1662 
1663 	subj = SLOT(&cred->cr_label);
1664 	obj = SLOT(label);
1665 
1666 	if (!mac_biba_dominate_single(obj, subj))
1667 		return (EACCES);
1668 
1669 	return (0);
1670 }
1671 
1672 static int
1673 mac_biba_check_vnode_getextattr(struct ucred *cred, struct vnode *vp,
1674     struct label *label, int attrnamespace, const char *name, struct uio *uio)
1675 {
1676 	struct mac_biba *subj, *obj;
1677 
1678 	if (!mac_biba_enabled)
1679 		return (0);
1680 
1681 	subj = SLOT(&cred->cr_label);
1682 	obj = SLOT(label);
1683 
1684 	if (!mac_biba_dominate_single(obj, subj))
1685 		return (EACCES);
1686 
1687 	return (0);
1688 }
1689 
1690 static int
1691 mac_biba_check_vnode_lookup(struct ucred *cred, struct vnode *dvp,
1692     struct label *dlabel, struct componentname *cnp)
1693 {
1694 	struct mac_biba *subj, *obj;
1695 
1696 	if (!mac_biba_enabled)
1697 		return (0);
1698 
1699 	subj = SLOT(&cred->cr_label);
1700 	obj = SLOT(dlabel);
1701 
1702 	if (!mac_biba_dominate_single(obj, subj))
1703 		return (EACCES);
1704 
1705 	return (0);
1706 }
1707 
1708 static int
1709 mac_biba_check_vnode_open(struct ucred *cred, struct vnode *vp,
1710     struct label *vnodelabel, mode_t acc_mode)
1711 {
1712 	struct mac_biba *subj, *obj;
1713 
1714 	if (!mac_biba_enabled)
1715 		return (0);
1716 
1717 	subj = SLOT(&cred->cr_label);
1718 	obj = SLOT(vnodelabel);
1719 
1720 	/* XXX privilege override for admin? */
1721 	if (acc_mode & (VREAD | VEXEC | VSTAT)) {
1722 		if (!mac_biba_dominate_single(obj, subj))
1723 			return (EACCES);
1724 	}
1725 	if (acc_mode & (VWRITE | VAPPEND | VADMIN)) {
1726 		if (!mac_biba_dominate_single(subj, obj))
1727 			return (EACCES);
1728 	}
1729 
1730 	return (0);
1731 }
1732 
1733 static int
1734 mac_biba_check_vnode_poll(struct ucred *active_cred, struct ucred *file_cred,
1735     struct vnode *vp, struct label *label)
1736 {
1737 	struct mac_biba *subj, *obj;
1738 
1739 	if (!mac_biba_enabled || !mac_biba_revocation_enabled)
1740 		return (0);
1741 
1742 	subj = SLOT(&active_cred->cr_label);
1743 	obj = SLOT(label);
1744 
1745 	if (!mac_biba_dominate_single(obj, subj))
1746 		return (EACCES);
1747 
1748 	return (0);
1749 }
1750 
1751 static int
1752 mac_biba_check_vnode_read(struct ucred *active_cred, struct ucred *file_cred,
1753     struct vnode *vp, struct label *label)
1754 {
1755 	struct mac_biba *subj, *obj;
1756 
1757 	if (!mac_biba_enabled || !mac_biba_revocation_enabled)
1758 		return (0);
1759 
1760 	subj = SLOT(&active_cred->cr_label);
1761 	obj = SLOT(label);
1762 
1763 	if (!mac_biba_dominate_single(obj, subj))
1764 		return (EACCES);
1765 
1766 	return (0);
1767 }
1768 
1769 static int
1770 mac_biba_check_vnode_readdir(struct ucred *cred, struct vnode *dvp,
1771     struct label *dlabel)
1772 {
1773 	struct mac_biba *subj, *obj;
1774 
1775 	if (!mac_biba_enabled)
1776 		return (0);
1777 
1778 	subj = SLOT(&cred->cr_label);
1779 	obj = SLOT(dlabel);
1780 
1781 	if (!mac_biba_dominate_single(obj, subj))
1782 		return (EACCES);
1783 
1784 	return (0);
1785 }
1786 
1787 static int
1788 mac_biba_check_vnode_readlink(struct ucred *cred, struct vnode *vp,
1789     struct label *label)
1790 {
1791 	struct mac_biba *subj, *obj;
1792 
1793 	if (!mac_biba_enabled)
1794 		return (0);
1795 
1796 	subj = SLOT(&cred->cr_label);
1797 	obj = SLOT(label);
1798 
1799 	if (!mac_biba_dominate_single(obj, subj))
1800 		return (EACCES);
1801 
1802 	return (0);
1803 }
1804 
1805 static int
1806 mac_biba_check_vnode_relabel(struct ucred *cred, struct vnode *vp,
1807     struct label *vnodelabel, struct label *newlabel)
1808 {
1809 	struct mac_biba *old, *new, *subj;
1810 
1811 	old = SLOT(vnodelabel);
1812 	new = SLOT(newlabel);
1813 	subj = SLOT(&cred->cr_label);
1814 
1815 	if ((new->mb_flags & MAC_BIBA_FLAGS_BOTH) != MAC_BIBA_FLAG_SINGLE)
1816 		return (EINVAL);
1817 
1818 	/*
1819 	 * To relabel a vnode, the old vnode label must be in the subject
1820 	 * range.
1821 	 */
1822 	if (!mac_biba_single_in_range(old, subj))
1823 		return (EPERM);
1824 
1825 	/*
1826 	 * To relabel a vnode, the new vnode label must be in the subject
1827 	 * range.
1828 	 */
1829 	if (!mac_biba_single_in_range(new, subj))
1830 		return (EPERM);
1831 
1832 	/*
1833 	 * XXX: Don't permit EQUAL in a label unless the subject has EQUAL.
1834 	 */
1835 
1836 	return (suser_cred(cred, 0));
1837 }
1838 
1839 static int
1840 mac_biba_check_vnode_rename_from(struct ucred *cred, struct vnode *dvp,
1841     struct label *dlabel, struct vnode *vp, struct label *label,
1842     struct componentname *cnp)
1843 {
1844 	struct mac_biba *subj, *obj;
1845 
1846 	if (!mac_biba_enabled)
1847 		return (0);
1848 
1849 	subj = SLOT(&cred->cr_label);
1850 	obj = SLOT(dlabel);
1851 
1852 	if (!mac_biba_dominate_single(subj, obj))
1853 		return (EACCES);
1854 
1855 	obj = SLOT(label);
1856 
1857 	if (!mac_biba_dominate_single(subj, obj))
1858 		return (EACCES);
1859 
1860 	return (0);
1861 }
1862 
1863 static int
1864 mac_biba_check_vnode_rename_to(struct ucred *cred, struct vnode *dvp,
1865     struct label *dlabel, struct vnode *vp, struct label *label, int samedir,
1866     struct componentname *cnp)
1867 {
1868 	struct mac_biba *subj, *obj;
1869 
1870 	if (!mac_biba_enabled)
1871 		return (0);
1872 
1873 	subj = SLOT(&cred->cr_label);
1874 	obj = SLOT(dlabel);
1875 
1876 	if (!mac_biba_dominate_single(subj, obj))
1877 		return (EACCES);
1878 
1879 	if (vp != NULL) {
1880 		obj = SLOT(label);
1881 
1882 		if (!mac_biba_dominate_single(subj, obj))
1883 			return (EACCES);
1884 	}
1885 
1886 	return (0);
1887 }
1888 
1889 static int
1890 mac_biba_check_vnode_revoke(struct ucred *cred, struct vnode *vp,
1891     struct label *label)
1892 {
1893 	struct mac_biba *subj, *obj;
1894 
1895 	if (!mac_biba_enabled)
1896 		return (0);
1897 
1898 	subj = SLOT(&cred->cr_label);
1899 	obj = SLOT(label);
1900 
1901 	if (!mac_biba_dominate_single(subj, obj))
1902 		return (EACCES);
1903 
1904 	return (0);
1905 }
1906 
1907 static int
1908 mac_biba_check_vnode_setacl(struct ucred *cred, struct vnode *vp,
1909     struct label *label, acl_type_t type, struct acl *acl)
1910 {
1911 	struct mac_biba *subj, *obj;
1912 
1913 	if (!mac_biba_enabled)
1914 		return (0);
1915 
1916 	subj = SLOT(&cred->cr_label);
1917 	obj = SLOT(label);
1918 
1919 	if (!mac_biba_dominate_single(subj, obj))
1920 		return (EACCES);
1921 
1922 	return (0);
1923 }
1924 
1925 static int
1926 mac_biba_check_vnode_setextattr(struct ucred *cred, struct vnode *vp,
1927     struct label *vnodelabel, int attrnamespace, const char *name,
1928     struct uio *uio)
1929 {
1930 	struct mac_biba *subj, *obj;
1931 
1932 	if (!mac_biba_enabled)
1933 		return (0);
1934 
1935 	subj = SLOT(&cred->cr_label);
1936 	obj = SLOT(vnodelabel);
1937 
1938 	if (!mac_biba_dominate_single(subj, obj))
1939 		return (EACCES);
1940 
1941 	/* XXX: protect the MAC EA in a special way? */
1942 
1943 	return (0);
1944 }
1945 
1946 static int
1947 mac_biba_check_vnode_setflags(struct ucred *cred, struct vnode *vp,
1948     struct label *vnodelabel, u_long flags)
1949 {
1950 	struct mac_biba *subj, *obj;
1951 
1952 	if (!mac_biba_enabled)
1953 		return (0);
1954 
1955 	subj = SLOT(&cred->cr_label);
1956 	obj = SLOT(vnodelabel);
1957 
1958 	if (!mac_biba_dominate_single(subj, obj))
1959 		return (EACCES);
1960 
1961 	return (0);
1962 }
1963 
1964 static int
1965 mac_biba_check_vnode_setmode(struct ucred *cred, struct vnode *vp,
1966     struct label *vnodelabel, mode_t mode)
1967 {
1968 	struct mac_biba *subj, *obj;
1969 
1970 	if (!mac_biba_enabled)
1971 		return (0);
1972 
1973 	subj = SLOT(&cred->cr_label);
1974 	obj = SLOT(vnodelabel);
1975 
1976 	if (!mac_biba_dominate_single(subj, obj))
1977 		return (EACCES);
1978 
1979 	return (0);
1980 }
1981 
1982 static int
1983 mac_biba_check_vnode_setowner(struct ucred *cred, struct vnode *vp,
1984     struct label *vnodelabel, uid_t uid, gid_t gid)
1985 {
1986 	struct mac_biba *subj, *obj;
1987 
1988 	if (!mac_biba_enabled)
1989 		return (0);
1990 
1991 	subj = SLOT(&cred->cr_label);
1992 	obj = SLOT(vnodelabel);
1993 
1994 	if (!mac_biba_dominate_single(subj, obj))
1995 		return (EACCES);
1996 
1997 	return (0);
1998 }
1999 
2000 static int
2001 mac_biba_check_vnode_setutimes(struct ucred *cred, struct vnode *vp,
2002     struct label *vnodelabel, struct timespec atime, struct timespec mtime)
2003 {
2004 	struct mac_biba *subj, *obj;
2005 
2006 	if (!mac_biba_enabled)
2007 		return (0);
2008 
2009 	subj = SLOT(&cred->cr_label);
2010 	obj = SLOT(vnodelabel);
2011 
2012 	if (!mac_biba_dominate_single(subj, obj))
2013 		return (EACCES);
2014 
2015 	return (0);
2016 }
2017 
2018 static int
2019 mac_biba_check_vnode_stat(struct ucred *active_cred, struct ucred *file_cred,
2020     struct vnode *vp, struct label *vnodelabel)
2021 {
2022 	struct mac_biba *subj, *obj;
2023 
2024 	if (!mac_biba_enabled)
2025 		return (0);
2026 
2027 	subj = SLOT(&active_cred->cr_label);
2028 	obj = SLOT(vnodelabel);
2029 
2030 	if (!mac_biba_dominate_single(obj, subj))
2031 		return (EACCES);
2032 
2033 	return (0);
2034 }
2035 
2036 static int
2037 mac_biba_check_vnode_write(struct ucred *active_cred,
2038     struct ucred *file_cred, struct vnode *vp, struct label *label)
2039 {
2040 	struct mac_biba *subj, *obj;
2041 
2042 	if (!mac_biba_enabled || !mac_biba_revocation_enabled)
2043 		return (0);
2044 
2045 	subj = SLOT(&active_cred->cr_label);
2046 	obj = SLOT(label);
2047 
2048 	if (!mac_biba_dominate_single(subj, obj))
2049 		return (EACCES);
2050 
2051 	return (0);
2052 }
2053 
2054 static vm_prot_t
2055 mac_biba_check_vnode_mmap_perms(struct ucred *cred, struct vnode *vp,
2056     struct label *label, int newmapping)
2057 {
2058 	struct mac_biba *subj, *obj;
2059 	vm_prot_t prot = 0;
2060 
2061 	if (!mac_biba_enabled || (!mac_biba_revocation_enabled && !newmapping))
2062 		return (VM_PROT_ALL);
2063 
2064 	subj = SLOT(&cred->cr_label);
2065 	obj = SLOT(label);
2066 
2067 	if (mac_biba_dominate_single(obj, subj))
2068 		prot |= VM_PROT_READ | VM_PROT_EXECUTE;
2069 	if (mac_biba_dominate_single(subj, obj))
2070 		prot |= VM_PROT_WRITE;
2071 	return (prot);
2072 }
2073 
2074 static struct mac_policy_op_entry mac_biba_ops[] =
2075 {
2076 	{ MAC_DESTROY,
2077 	    (macop_t)mac_biba_destroy },
2078 	{ MAC_INIT,
2079 	    (macop_t)mac_biba_init },
2080 	{ MAC_INIT_BPFDESC,
2081 	    (macop_t)mac_biba_init_bpfdesc },
2082 	{ MAC_INIT_CRED,
2083 	    (macop_t)mac_biba_init_cred },
2084 	{ MAC_INIT_DEVFSDIRENT,
2085 	    (macop_t)mac_biba_init_devfsdirent },
2086 	{ MAC_INIT_IFNET,
2087 	    (macop_t)mac_biba_init_ifnet },
2088 	{ MAC_INIT_IPQ,
2089 	    (macop_t)mac_biba_init_ipq },
2090 	{ MAC_INIT_MBUF,
2091 	    (macop_t)mac_biba_init_mbuf },
2092 	{ MAC_INIT_MOUNT,
2093 	    (macop_t)mac_biba_init_mount },
2094 	{ MAC_INIT_PIPE,
2095 	    (macop_t)mac_biba_init_pipe },
2096 	{ MAC_INIT_SOCKET,
2097 	    (macop_t)mac_biba_init_socket },
2098 	{ MAC_INIT_TEMP,
2099 	    (macop_t)mac_biba_init_temp },
2100 	{ MAC_INIT_VNODE,
2101 	    (macop_t)mac_biba_init_vnode },
2102 	{ MAC_DESTROY_BPFDESC,
2103 	    (macop_t)mac_biba_destroy_bpfdesc },
2104 	{ MAC_DESTROY_CRED,
2105 	    (macop_t)mac_biba_destroy_cred },
2106 	{ MAC_DESTROY_DEVFSDIRENT,
2107 	    (macop_t)mac_biba_destroy_devfsdirent },
2108 	{ MAC_DESTROY_IFNET,
2109 	    (macop_t)mac_biba_destroy_ifnet },
2110 	{ MAC_DESTROY_IPQ,
2111 	    (macop_t)mac_biba_destroy_ipq },
2112 	{ MAC_DESTROY_MBUF,
2113 	    (macop_t)mac_biba_destroy_mbuf },
2114 	{ MAC_DESTROY_MOUNT,
2115 	    (macop_t)mac_biba_destroy_mount },
2116 	{ MAC_DESTROY_PIPE,
2117 	    (macop_t)mac_biba_destroy_pipe },
2118 	{ MAC_DESTROY_SOCKET,
2119 	    (macop_t)mac_biba_destroy_socket },
2120 	{ MAC_DESTROY_TEMP,
2121 	    (macop_t)mac_biba_destroy_temp },
2122 	{ MAC_DESTROY_VNODE,
2123 	    (macop_t)mac_biba_destroy_vnode },
2124 	{ MAC_EXTERNALIZE,
2125 	    (macop_t)mac_biba_externalize },
2126 	{ MAC_INTERNALIZE,
2127 	    (macop_t)mac_biba_internalize },
2128 	{ MAC_CREATE_DEVFS_DEVICE,
2129 	    (macop_t)mac_biba_create_devfs_device },
2130 	{ MAC_CREATE_DEVFS_DIRECTORY,
2131 	    (macop_t)mac_biba_create_devfs_directory },
2132 	{ MAC_CREATE_DEVFS_VNODE,
2133 	    (macop_t)mac_biba_create_devfs_vnode },
2134 	{ MAC_CREATE_VNODE,
2135 	    (macop_t)mac_biba_create_vnode },
2136 	{ MAC_CREATE_MOUNT,
2137 	    (macop_t)mac_biba_create_mount },
2138 	{ MAC_CREATE_ROOT_MOUNT,
2139 	    (macop_t)mac_biba_create_root_mount },
2140 	{ MAC_RELABEL_VNODE,
2141 	    (macop_t)mac_biba_relabel_vnode },
2142 	{ MAC_UPDATE_DEVFSDIRENT,
2143 	    (macop_t)mac_biba_update_devfsdirent },
2144 	{ MAC_UPDATE_PROCFSVNODE,
2145 	    (macop_t)mac_biba_update_procfsvnode },
2146 	{ MAC_UPDATE_VNODE_FROM_EXTERNALIZED,
2147 	    (macop_t)mac_biba_update_vnode_from_externalized },
2148 	{ MAC_UPDATE_VNODE_FROM_MOUNT,
2149 	    (macop_t)mac_biba_update_vnode_from_mount },
2150 	{ MAC_CREATE_MBUF_FROM_SOCKET,
2151 	    (macop_t)mac_biba_create_mbuf_from_socket },
2152 	{ MAC_CREATE_PIPE,
2153 	    (macop_t)mac_biba_create_pipe },
2154 	{ MAC_CREATE_SOCKET,
2155 	    (macop_t)mac_biba_create_socket },
2156 	{ MAC_CREATE_SOCKET_FROM_SOCKET,
2157 	    (macop_t)mac_biba_create_socket_from_socket },
2158 	{ MAC_RELABEL_PIPE,
2159 	    (macop_t)mac_biba_relabel_pipe },
2160 	{ MAC_RELABEL_SOCKET,
2161 	    (macop_t)mac_biba_relabel_socket },
2162 	{ MAC_SET_SOCKET_PEER_FROM_MBUF,
2163 	    (macop_t)mac_biba_set_socket_peer_from_mbuf },
2164 	{ MAC_SET_SOCKET_PEER_FROM_SOCKET,
2165 	    (macop_t)mac_biba_set_socket_peer_from_socket },
2166 	{ MAC_CREATE_BPFDESC,
2167 	    (macop_t)mac_biba_create_bpfdesc },
2168 	{ MAC_CREATE_DATAGRAM_FROM_IPQ,
2169 	    (macop_t)mac_biba_create_datagram_from_ipq },
2170 	{ MAC_CREATE_FRAGMENT,
2171 	    (macop_t)mac_biba_create_fragment },
2172 	{ MAC_CREATE_IFNET,
2173 	    (macop_t)mac_biba_create_ifnet },
2174 	{ MAC_CREATE_IPQ,
2175 	    (macop_t)mac_biba_create_ipq },
2176 	{ MAC_CREATE_MBUF_FROM_MBUF,
2177 	    (macop_t)mac_biba_create_mbuf_from_mbuf },
2178 	{ MAC_CREATE_MBUF_LINKLAYER,
2179 	    (macop_t)mac_biba_create_mbuf_linklayer },
2180 	{ MAC_CREATE_MBUF_FROM_BPFDESC,
2181 	    (macop_t)mac_biba_create_mbuf_from_bpfdesc },
2182 	{ MAC_CREATE_MBUF_FROM_IFNET,
2183 	    (macop_t)mac_biba_create_mbuf_from_ifnet },
2184 	{ MAC_CREATE_MBUF_MULTICAST_ENCAP,
2185 	    (macop_t)mac_biba_create_mbuf_multicast_encap },
2186 	{ MAC_CREATE_MBUF_NETLAYER,
2187 	    (macop_t)mac_biba_create_mbuf_netlayer },
2188 	{ MAC_FRAGMENT_MATCH,
2189 	    (macop_t)mac_biba_fragment_match },
2190 	{ MAC_RELABEL_IFNET,
2191 	    (macop_t)mac_biba_relabel_ifnet },
2192 	{ MAC_UPDATE_IPQ,
2193 	    (macop_t)mac_biba_update_ipq },
2194 	{ MAC_CREATE_CRED,
2195 	    (macop_t)mac_biba_create_cred },
2196 	{ MAC_EXECVE_TRANSITION,
2197 	    (macop_t)mac_biba_execve_transition },
2198 	{ MAC_EXECVE_WILL_TRANSITION,
2199 	    (macop_t)mac_biba_execve_will_transition },
2200 	{ MAC_CREATE_PROC0,
2201 	    (macop_t)mac_biba_create_proc0 },
2202 	{ MAC_CREATE_PROC1,
2203 	    (macop_t)mac_biba_create_proc1 },
2204 	{ MAC_RELABEL_CRED,
2205 	    (macop_t)mac_biba_relabel_cred },
2206 	{ MAC_CHECK_BPFDESC_RECEIVE,
2207 	    (macop_t)mac_biba_check_bpfdesc_receive },
2208 	{ MAC_CHECK_CRED_RELABEL,
2209 	    (macop_t)mac_biba_check_cred_relabel },
2210 	{ MAC_CHECK_CRED_VISIBLE,
2211 	    (macop_t)mac_biba_check_cred_visible },
2212 	{ MAC_CHECK_IFNET_RELABEL,
2213 	    (macop_t)mac_biba_check_ifnet_relabel },
2214 	{ MAC_CHECK_IFNET_TRANSMIT,
2215 	    (macop_t)mac_biba_check_ifnet_transmit },
2216 	{ MAC_CHECK_MOUNT_STAT,
2217 	    (macop_t)mac_biba_check_mount_stat },
2218 	{ MAC_CHECK_PIPE_IOCTL,
2219 	    (macop_t)mac_biba_check_pipe_ioctl },
2220 	{ MAC_CHECK_PIPE_POLL,
2221 	    (macop_t)mac_biba_check_pipe_poll },
2222 	{ MAC_CHECK_PIPE_READ,
2223 	    (macop_t)mac_biba_check_pipe_read },
2224 	{ MAC_CHECK_PIPE_RELABEL,
2225 	    (macop_t)mac_biba_check_pipe_relabel },
2226 	{ MAC_CHECK_PIPE_STAT,
2227 	    (macop_t)mac_biba_check_pipe_stat },
2228 	{ MAC_CHECK_PIPE_WRITE,
2229 	    (macop_t)mac_biba_check_pipe_write },
2230 	{ MAC_CHECK_PROC_DEBUG,
2231 	    (macop_t)mac_biba_check_proc_debug },
2232 	{ MAC_CHECK_PROC_SCHED,
2233 	    (macop_t)mac_biba_check_proc_sched },
2234 	{ MAC_CHECK_PROC_SIGNAL,
2235 	    (macop_t)mac_biba_check_proc_signal },
2236 	{ MAC_CHECK_SOCKET_DELIVER,
2237 	    (macop_t)mac_biba_check_socket_deliver },
2238 	{ MAC_CHECK_SOCKET_RELABEL,
2239 	    (macop_t)mac_biba_check_socket_relabel },
2240 	{ MAC_CHECK_SOCKET_VISIBLE,
2241 	    (macop_t)mac_biba_check_socket_visible },
2242 	{ MAC_CHECK_VNODE_ACCESS,
2243 	    (macop_t)mac_biba_check_vnode_access },
2244 	{ MAC_CHECK_VNODE_CHDIR,
2245 	    (macop_t)mac_biba_check_vnode_chdir },
2246 	{ MAC_CHECK_VNODE_CHROOT,
2247 	    (macop_t)mac_biba_check_vnode_chroot },
2248 	{ MAC_CHECK_VNODE_CREATE,
2249 	    (macop_t)mac_biba_check_vnode_create },
2250 	{ MAC_CHECK_VNODE_DELETE,
2251 	    (macop_t)mac_biba_check_vnode_delete },
2252 	{ MAC_CHECK_VNODE_DELETEACL,
2253 	    (macop_t)mac_biba_check_vnode_deleteacl },
2254 	{ MAC_CHECK_VNODE_EXEC,
2255 	    (macop_t)mac_biba_check_vnode_exec },
2256 	{ MAC_CHECK_VNODE_GETACL,
2257 	    (macop_t)mac_biba_check_vnode_getacl },
2258 	{ MAC_CHECK_VNODE_GETEXTATTR,
2259 	    (macop_t)mac_biba_check_vnode_getextattr },
2260 	{ MAC_CHECK_VNODE_LOOKUP,
2261 	    (macop_t)mac_biba_check_vnode_lookup },
2262 	{ MAC_CHECK_VNODE_OPEN,
2263 	    (macop_t)mac_biba_check_vnode_open },
2264 	{ MAC_CHECK_VNODE_POLL,
2265 	    (macop_t)mac_biba_check_vnode_poll },
2266 	{ MAC_CHECK_VNODE_READ,
2267 	    (macop_t)mac_biba_check_vnode_read },
2268 	{ MAC_CHECK_VNODE_READDIR,
2269 	    (macop_t)mac_biba_check_vnode_readdir },
2270 	{ MAC_CHECK_VNODE_READLINK,
2271 	    (macop_t)mac_biba_check_vnode_readlink },
2272 	{ MAC_CHECK_VNODE_RELABEL,
2273 	    (macop_t)mac_biba_check_vnode_relabel },
2274 	{ MAC_CHECK_VNODE_RENAME_FROM,
2275 	    (macop_t)mac_biba_check_vnode_rename_from },
2276 	{ MAC_CHECK_VNODE_RENAME_TO,
2277 	    (macop_t)mac_biba_check_vnode_rename_to },
2278 	{ MAC_CHECK_VNODE_REVOKE,
2279 	    (macop_t)mac_biba_check_vnode_revoke },
2280 	{ MAC_CHECK_VNODE_SETACL,
2281 	    (macop_t)mac_biba_check_vnode_setacl },
2282 	{ MAC_CHECK_VNODE_SETEXTATTR,
2283 	    (macop_t)mac_biba_check_vnode_setextattr },
2284 	{ MAC_CHECK_VNODE_SETFLAGS,
2285 	    (macop_t)mac_biba_check_vnode_setflags },
2286 	{ MAC_CHECK_VNODE_SETMODE,
2287 	    (macop_t)mac_biba_check_vnode_setmode },
2288 	{ MAC_CHECK_VNODE_SETOWNER,
2289 	    (macop_t)mac_biba_check_vnode_setowner },
2290 	{ MAC_CHECK_VNODE_SETUTIMES,
2291 	    (macop_t)mac_biba_check_vnode_setutimes },
2292 	{ MAC_CHECK_VNODE_STAT,
2293 	    (macop_t)mac_biba_check_vnode_stat },
2294 	{ MAC_CHECK_VNODE_WRITE,
2295 	    (macop_t)mac_biba_check_vnode_write },
2296 	{ MAC_CHECK_VNODE_MMAP_PERMS,
2297 	    (macop_t)mac_biba_check_vnode_mmap_perms },
2298 	{ MAC_OP_LAST, NULL }
2299 };
2300 
2301 MAC_POLICY_SET(mac_biba_ops, trustedbsd_mac_biba, "TrustedBSD MAC/Biba",
2302     MPC_LOADTIME_FLAG_NOTLATE, &mac_biba_slot);
2303