]> git.saurik.com Git - apple/xnu.git/blob - security/mac_policy.h
xnu-1504.7.4.tar.gz
[apple/xnu.git] / security / mac_policy.h
1 /*
2 * Copyright (c) 2007-2008 Apple Inc. All rights reserved.
3 *
4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. The rights granted to you under the License
10 * may not be used to create, or enable the creation or redistribution of,
11 * unlawful or unlicensed copies of an Apple operating system, or to
12 * circumvent, violate, or enable the circumvention or violation of, any
13 * terms of an Apple operating system software license agreement.
14 *
15 * Please obtain a copy of the License at
16 * http://www.opensource.apple.com/apsl/ and read it before using this file.
17 *
18 * The Original Code and all software distributed under the License are
19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23 * Please see the License for the specific language governing rights and
24 * limitations under the License.
25 *
26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27 */
28 /*-
29 * Copyright (c) 1999-2002 Robert N. M. Watson
30 * Copyright (c) 2001-2005 Networks Associates Technology, Inc.
31 * Copyright (c) 2005-2007 SPARTA, Inc.
32 * All rights reserved.
33 *
34 * This software was developed by Robert Watson for the TrustedBSD Project.
35 *
36 * This software was developed for the FreeBSD Project in part by Network
37 * Associates Laboratories, the Security Research Division of Network
38 * Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035 ("CBOSS"),
39 * as part of the DARPA CHATS research program.
40 *
41 * This software was enhanced by SPARTA ISSO under SPAWAR contract
42 * N66001-04-C-6019 ("SEFOS").
43 *
44 * Redistribution and use in source and binary forms, with or without
45 * modification, are permitted provided that the following conditions
46 * are met:
47 * 1. Redistributions of source code must retain the above copyright
48 * notice, this list of conditions and the following disclaimer.
49 * 2. Redistributions in binary form must reproduce the above copyright
50 * notice, this list of conditions and the following disclaimer in the
51 * documentation and/or other materials provided with the distribution.
52 *
53 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
54 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
55 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
56 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
57 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
58 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
59 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
60 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
61 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
62 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
63 * SUCH DAMAGE.
64 *
65 * $FreeBSD: src/sys/sys/mac_policy.h,v 1.39 2003/04/18 19:57:37 rwatson Exp $
66 */
67
68 /**
69 @file mac_policy.h
70 @brief Kernel Interfaces for MAC policy modules
71
72 This header defines the list of operations that are defined by the
73 TrustedBSD MAC Framwork on Darwin. MAC Policy modules register
74 with the framework to declare interest in a specific set of
75 operations. If interest in an entry point is not declared, then
76 the policy will be ignored when the Framework evaluates that entry
77 point.
78 */
79
80 #ifndef _SECURITY_MAC_POLICY_H_
81 #define _SECURITY_MAC_POLICY_H_
82
83 #include <security/_label.h>
84
85 struct attrlist;
86 struct auditinfo;
87 struct bpf_d;
88 struct devnode;
89 struct fileglob;
90 struct ifnet;
91 struct inpcb;
92 struct ipq;
93 struct label;
94 struct lctx;
95 struct mac_module_data;
96 struct mac_policy_conf;
97 struct mbuf;
98 struct mount;
99 struct pipe;
100 struct pseminfo;
101 struct pshminfo;
102 struct sbuf;
103 struct semid_kernel;
104 struct shmid_kernel;
105 struct task;
106 struct thread;
107 struct ucred;
108 struct vnode;
109 /** @struct dummy */
110
111
112
113 #ifndef _KAUTH_CRED_T
114 #define _KAUTH_CRED_T
115 typedef struct ucred *kauth_cred_t;
116 #endif /* !_KAUTH_CRED_T */
117
118
119 /*-
120 * MAC entry points are generally named using the following template:
121 *
122 * mpo_<object>_<operation>()
123 *
124 * or:
125 *
126 * mpo_<object>_check_<operation>()
127 *
128 * Entry points are sorted by object type.
129 *
130 * It may be desirable also to consider some subsystems as "objects", such
131 * as system, iokit, etc.
132 */
133
134 /**
135 @name Entry Points for Label Management
136
137 These are the entry points corresponding to the life cycle events for
138 kernel objects, such as initialization, creation, and destruction.
139
140 Most policies (that use labels) will initialize labels by allocating
141 space for policy-specific data. In most cases, it is permitted to
142 sleep during label initialization operations; it will be noted when
143 it is not permitted.
144
145 Initialization usually will not require doing more than allocating a
146 generic label for the given object. What follows initialization is
147 creation, where a label is made specific to the object it is associated
148 with. Destruction occurs when the label is no longer needed, such as
149 when the corresponding object is destroyed. All necessary cleanup should
150 be performed in label destroy operations.
151
152 Where possible, the label entry points have identical parameters. If
153 the policy module does not require structure-specific label
154 information, the same function may be registered in the policy
155 operation vector. Many policies will implement two such generic
156 allocation calls: one to handle sleepable requests, and one to handle
157 potentially non-sleepable requests.
158 */
159
160
161 /**
162 @brief Audit event postselection
163 @param cred Subject credential
164 @param syscode Syscall number
165 @param args Syscall arguments
166 @param error Syscall errno
167 @param retval Syscall return value
168
169 This is the MAC Framework audit postselect, which is called before
170 exiting a syscall to determine if an audit event should be committed.
171 A return value of MAC_AUDIT_NO forces the audit record to be suppressed.
172 Any other return value results in the audit record being committed.
173
174 @warning The suppression behavior will probably go away in Apple's
175 future version of the audit implementation.
176
177 @return Return MAC_AUDIT_NO to force suppression of the audit record.
178 Any other value results in the audit record being committed.
179
180 */
181 typedef int mpo_audit_check_postselect_t(
182 kauth_cred_t cred,
183 unsigned short syscode,
184 void *args,
185 int error,
186 int retval
187 );
188 /**
189 @brief Audit event preselection
190 @param cred Subject credential
191 @param syscode Syscall number
192 @param args Syscall arguments
193
194 This is the MAC Framework audit preselect, which is called before a
195 syscall is entered to determine if an audit event should be created.
196 If the MAC policy forces the syscall to be audited, MAC_AUDIT_YES should be
197 returned. A return value of MAC_AUDIT_NO causes the audit record to
198 be suppressed. Returning MAC_POLICY_DEFAULT indicates that the policy wants
199 to defer to the system's existing preselection mechanism.
200
201 When policies return different preferences, the Framework decides what action
202 to take based on the following policy. If any policy returns MAC_AUDIT_YES,
203 then create an audit record, else if any policy returns MAC_AUDIT_NO, then
204 suppress the creations of an audit record, else defer to the system's
205 existing preselection mechanism.
206
207 @warning The audit implementation in Apple's current version is
208 incomplete, so the MAC policies have priority over the system's existing
209 mechanisms. This will probably change in the future version where
210 the audit implementation is more complete.
211
212 @return Return MAC_AUDIT_YES to force auditing of the syscall,
213 MAC_AUDIT_NO to force no auditing of the syscall, MAC_AUDIT_DEFAULT
214 to allow auditing mechanisms to determine if the syscall is audited.
215
216 */
217 typedef int mpo_audit_check_preselect_t(
218 kauth_cred_t cred,
219 unsigned short syscode,
220 void *args
221 );
222 /**
223 @brief Initialize BPF descriptor label
224 @param label New label to initialize
225
226 Initialize the label for a newly instantiated BPF descriptor.
227 Sleeping is permitted.
228 */
229 typedef void mpo_bpfdesc_label_init_t(
230 struct label *label
231 );
232 /**
233 @brief Destroy BPF descriptor label
234 @param label The label to be destroyed
235
236 Destroy a BPF descriptor label. Since the BPF descriptor
237 is going out of scope, policy modules should free any internal
238 storage associated with the label so that it may be destroyed.
239 */
240 typedef void mpo_bpfdesc_label_destroy_t(
241 struct label *label
242 );
243 /**
244 @brief Associate a BPF descriptor with a label
245 @param cred User credential creating the BPF descriptor
246 @param bpf_d The BPF descriptor
247 @param bpflabel The new label
248
249 Set the label on a newly created BPF descriptor from the passed
250 subject credential. This call will be made when a BPF device node
251 is opened by a process with the passed subject credential.
252 */
253 typedef void mpo_bpfdesc_label_associate_t(
254 kauth_cred_t cred,
255 struct bpf_d *bpf_d,
256 struct label *bpflabel
257 );
258 /**
259 @brief Check whether BPF can read from a network interface
260 @param bpf_d Subject; the BPF descriptor
261 @param bpflabel Policy label for bpf_d
262 @param ifp Object; the network interface
263 @param ifnetlabel Policy label for ifp
264
265 Determine whether the MAC framework should permit datagrams from
266 the passed network interface to be delivered to the buffers of
267 the passed BPF descriptor. Return (0) for success, or an errno
268 value for failure. Suggested failure: EACCES for label mismatches,
269 EPERM for lack of privilege.
270 */
271 typedef int mpo_bpfdesc_check_receive_t(
272 struct bpf_d *bpf_d,
273 struct label *bpflabel,
274 struct ifnet *ifp,
275 struct label *ifnetlabel
276 );
277 /**
278 @brief Indicate desire to change the process label at exec time
279 @param old Existing subject credential
280 @param vp File being executed
281 @param vnodelabel Label corresponding to vp
282 @param scriptvnodelabel Script vnode label
283 @param execlabel Userspace provided execution label
284 @param proc Object process
285 @see mac_execve
286 @see mpo_cred_label_update_execve_t
287 @see mpo_vnode_check_exec_t
288
289 Indicate whether this policy intends to update the label of a newly
290 created credential from the existing subject credential (old). This
291 call occurs when a process executes the passed vnode. If a policy
292 returns success from this entry point, the mpo_cred_label_update_execve
293 entry point will later be called with the same parameters. Access
294 has already been checked via the mpo_vnode_check_exec entry point,
295 this entry point is necessary to preserve kernel locking constraints
296 during program execution.
297
298 The supplied vnode and vnodelabel correspond with the file actually
299 being executed; in the case that the file is interpreted (for
300 example, a script), the label of the original exec-time vnode has
301 been preserved in scriptvnodelabel.
302
303 The final label, execlabel, corresponds to a label supplied by a
304 user space application through the use of the mac_execve system call.
305
306 The vnode lock is held during this operation. No changes should be
307 made to the old credential structure.
308
309 @warning Even if a policy returns 0, it should behave correctly in
310 the presence of an invocation of mpo_cred_label_update_execve, as that
311 call may happen as a result of another policy requesting a transition.
312
313 @return Non-zero if a transition is required, 0 otherwise.
314 */
315 typedef int mpo_cred_check_label_update_execve_t(
316 kauth_cred_t old,
317 struct vnode *vp,
318 struct label *vnodelabel,
319 struct label *scriptvnodelabel,
320 struct label *execlabel,
321 struct proc *proc
322 );
323 /**
324 @brief Access control check for relabelling processes
325 @param cred Subject credential
326 @param newlabel New label to apply to the user credential
327 @see mpo_cred_label_update_t
328 @see mac_set_proc
329
330 Determine whether the subject identified by the credential can relabel
331 itself to the supplied new label (newlabel). This access control check
332 is called when the mac_set_proc system call is invoked. A user space
333 application will supply a new value, the value will be internalized
334 and provided in newlabel.
335
336 @return Return 0 if access is granted, otherwise an appropriate value for
337 errno should be returned.
338 */
339 typedef int mpo_cred_check_label_update_t(
340 kauth_cred_t cred,
341 struct label *newlabel
342 );
343 /**
344 @brief Access control check for visibility of other subjects
345 @param u1 Subject credential
346 @param u2 Object credential
347
348 Determine whether the subject identified by the credential u1 can
349 "see" other subjects with the passed subject credential u2. This call
350 may be made in a number of situations, including inter-process status
351 sysctls used by ps, and in procfs lookups.
352
353 @return Return 0 if access is granted, otherwise an appropriate value for
354 errno should be returned. Suggested failure: EACCES for label mismatch,
355 EPERM for lack of privilege, or ESRCH to hide visibility.
356 */
357 typedef int mpo_cred_check_visible_t(
358 kauth_cred_t u1,
359 kauth_cred_t u2
360 );
361 /**
362 @brief Associate a credential with a new process at fork
363 @param cred credential to inherited by new process
364 @param proc the new process
365
366 Allow a process to associate the credential with a new
367 process for reference countng purposes.
368 NOTE: the credential can be dis-associated in ways other
369 than exit - so this strategy is flawed - should just
370 catch label destroy callback.
371 */
372 typedef void mpo_cred_label_associate_fork_t(
373 kauth_cred_t cred,
374 proc_t proc
375 );
376 /**
377 @brief Create the first process
378 @param cred Subject credential to be labeled
379
380 Create the subject credential of process 0, the parent of all BSD
381 kernel processes. Policies should update the label in the
382 previously initialized credential structure.
383 */
384 typedef void mpo_cred_label_associate_kernel_t(
385 kauth_cred_t cred
386 );
387 /**
388 @brief Create a credential label
389 @param parent_cred Parent credential
390 @param child_cred Child credential
391
392 Set the label of a newly created credential, most likely using the
393 information in the supplied parent credential.
394
395 @warning This call is made when crcopy or crdup is invoked on a
396 newly created struct ucred, and should not be confused with a
397 process fork or creation event.
398 */
399 typedef void mpo_cred_label_associate_t(
400 kauth_cred_t parent_cred,
401 kauth_cred_t child_cred
402 );
403 /**
404 @brief Create the first process
405 @param cred Subject credential to be labeled
406
407 Create the subject credential of process 1, the parent of all BSD
408 user processes. Policies should update the label in the previously
409 initialized credential structure. This is the 'init' process.
410 */
411 typedef void mpo_cred_label_associate_user_t(
412 kauth_cred_t cred
413 );
414 /**
415 @brief Destroy credential label
416 @param label The label to be destroyed
417
418 Destroy a user credential label. Since the user credential
419 is going out of scope, policy modules should free any internal
420 storage associated with the label so that it may be destroyed.
421 */
422 typedef void mpo_cred_label_destroy_t(
423 struct label *label
424 );
425 /**
426 @brief Externalize a user credential label for auditing
427 @param label Label to be externalized
428 @param element_name Name of the label namespace for which labels should be
429 externalized
430 @param sb String buffer to be filled with a text representation of the label
431
432 Produce an external representation of the label on a user credential for
433 inclusion in an audit record. An externalized label consists of a text
434 representation of the label contents that will be added to the audit record
435 as part of a text token. Policy-agnostic user space tools will display
436 this externalized version.
437
438 @return 0 on success, return non-zero if an error occurs while
439 externalizing the label data.
440
441 */
442 typedef int mpo_cred_label_externalize_audit_t(
443 struct label *label,
444 char *element_name,
445 struct sbuf *sb
446 );
447 /**
448 @brief Externalize a user credential label
449 @param label Label to be externalized
450 @param element_name Name of the label namespace for which labels should be
451 externalized
452 @param sb String buffer to be filled with a text representation of the label
453
454 Produce an external representation of the label on a user
455 credential. An externalized label consists of a text representation
456 of the label contents that can be used with user applications.
457 Policy-agnostic user space tools will display this externalized
458 version.
459
460 @return 0 on success, return non-zero if an error occurs while
461 externalizing the label data.
462
463 */
464 typedef int mpo_cred_label_externalize_t(
465 struct label *label,
466 char *element_name,
467 struct sbuf *sb
468 );
469 /**
470 @brief Initialize user credential label
471 @param label New label to initialize
472
473 Initialize the label for a newly instantiated user credential.
474 Sleeping is permitted.
475 */
476 typedef void mpo_cred_label_init_t(
477 struct label *label
478 );
479 /**
480 @brief Internalize a user credential label
481 @param label Label to be internalized
482 @param element_name Name of the label namespace for which the label should
483 be internalized
484 @param element_data Text data to be internalized
485
486 Produce a user credential label from an external representation. An
487 externalized label consists of a text representation of the label
488 contents that can be used with user applications. Policy-agnostic
489 user space tools will forward text version to the kernel for
490 processing by individual policy modules.
491
492 The policy's internalize entry points will be called only if the
493 policy has registered interest in the label namespace.
494
495 @return 0 on success, Otherwise, return non-zero if an error occurs
496 while internalizing the label data.
497
498 */
499 typedef int mpo_cred_label_internalize_t(
500 struct label *label,
501 char *element_name,
502 char *element_data
503 );
504 /**
505 @brief Update credential at exec time
506 @param old_cred Existing subject credential
507 @param new_cred New subject credential to be labeled
508 @param vp File being executed
509 @param vnodelabel Label corresponding to vp
510 @param scriptvnodelabel Script vnode label
511 @param execlabel Userspace provided execution label
512 @see mac_execve
513 @see mpo_cred_check_label_update_execve_t
514 @see mpo_vnode_check_exec_t
515
516 Update the label of a newly created credential (new) from the
517 existing subject credential (old). This call occurs when a process
518 executes the passed vnode and one of the loaded policy modules has
519 returned success from the mpo_cred_check_label_update_execve entry point.
520 Access has already been checked via the mpo_vnode_check_exec entry
521 point, this entry point is only used to update any policy state.
522
523 The supplied vnode and vnodelabel correspond with the file actually
524 being executed; in the case that the file is interpreted (for
525 example, a script), the label of the original exec-time vnode has
526 been preserved in scriptvnodelabel.
527
528 The final label, execlabel, corresponds to a label supplied by a
529 user space application through the use of the mac_execve system call.
530
531 If non-NULL, the value pointed to by disjointp will be set to 0 to
532 indicate that the old and new credentials are not disjoint, or 1 to
533 indicate that they are.
534
535 The vnode lock is held during this operation. No changes should be
536 made to the old credential structure.
537 */
538 typedef void mpo_cred_label_update_execve_t(
539 kauth_cred_t old_cred,
540 kauth_cred_t new_cred,
541 struct vnode *vp,
542 struct label *vnodelabel,
543 struct label *scriptvnodelabel,
544 struct label *execlabel,
545 int *disjointp
546 );
547 /**
548 @brief Update a credential label
549 @param cred The existing credential
550 @param newlabel A new label to apply to the credential
551 @see mpo_cred_check_label_update_t
552 @see mac_set_proc
553
554 Update the label on a user credential, using the supplied new label.
555 This is called as a result of a process relabel operation. Access
556 control was already confirmed by mpo_cred_check_label_update.
557 */
558 typedef void mpo_cred_label_update_t(
559 kauth_cred_t cred,
560 struct label *newlabel
561 );
562 /**
563 @brief Create a new devfs device
564 @param dev Major and minor numbers of special file
565 @param de "inode" of new device file
566 @param label Destination label
567 @param fullpath Path relative to mount (e.g. /dev) of new device file
568
569 This entry point labels a new devfs device. The label will likely be based
570 on the path to the device, or the major and minor numbers.
571 The policy should store an appropriate label into 'label'.
572 */
573 typedef void mpo_devfs_label_associate_device_t(
574 dev_t dev,
575 struct devnode *de,
576 struct label *label,
577 const char *fullpath
578 );
579 /**
580 @brief Create a new devfs directory
581 @param dirname Name of new directory
582 @param dirnamelen Length of 'dirname'
583 @param de "inode" of new directory
584 @param label Destination label
585 @param fullpath Path relative to mount (e.g. /dev) of new directory
586
587 This entry point labels a new devfs directory. The label will likely be
588 based on the path of the new directory. The policy should store an appropriate
589 label into 'label'. The devfs root directory is labelled in this way.
590 */
591 typedef void mpo_devfs_label_associate_directory_t(
592 const char *dirname,
593 int dirnamelen,
594 struct devnode *de,
595 struct label *label,
596 const char *fullpath
597 );
598 /**
599 @brief Copy a devfs label
600 @param src Source devfs label
601 @param dest Destination devfs label
602
603 Copy the label information from src to dest. The devfs file system
604 often duplicates (splits) existing device nodes rather than creating
605 new ones.
606 */
607 typedef void mpo_devfs_label_copy_t(
608 struct label *src,
609 struct label *dest
610 );
611 /**
612 @brief Destroy devfs label
613 @param label The label to be destroyed
614
615 Destroy a devfs entry label. Since the object is going out
616 of scope, policy modules should free any internal storage associated
617 with the label so that it may be destroyed.
618 */
619 typedef void mpo_devfs_label_destroy_t(
620 struct label *label
621 );
622 /**
623 @brief Initialize devfs label
624 @param label New label to initialize
625
626 Initialize the label for a newly instantiated devfs entry. Sleeping
627 is permitted.
628 */
629 typedef void mpo_devfs_label_init_t(
630 struct label *label
631 );
632 /**
633 @brief Update a devfs label after relabelling its vnode
634 @param mp Devfs mount point
635 @param de Affected devfs directory entry
636 @param delabel Label of devfs directory entry
637 @param vp Vnode associated with de
638 @param vnodelabel New label of vnode
639
640 Update a devfs label when its vnode is manually relabelled,
641 for example with setfmac(1). Typically, this will simply copy
642 the vnode label into the devfs label.
643 */
644 typedef void mpo_devfs_label_update_t(
645 struct mount *mp,
646 struct devnode *de,
647 struct label *delabel,
648 struct vnode *vp,
649 struct label *vnodelabel
650 );
651 /**
652 @brief Access control for changing the offset of a file descriptor
653 @param cred Subject credential
654 @param fg Fileglob structure
655 @param label Policy label for fg
656
657 Determine whether the subject identified by the credential can
658 change the offset of the file represented by fg.
659
660 @return Return 0 if access if granted, otherwise an appropriate
661 value for errno should be returned.
662 */
663 typedef int mpo_file_check_change_offset_t(
664 kauth_cred_t cred,
665 struct fileglob *fg,
666 struct label *label
667 );
668 /**
669 @brief Access control for creating a file descriptor
670 @param cred Subject credential
671
672 Determine whether the subject identified by the credential can
673 allocate a new file descriptor.
674
675 @return Return 0 if access if granted, otherwise an appropriate
676 value for errno should be returned.
677 */
678 typedef int mpo_file_check_create_t(
679 kauth_cred_t cred
680 );
681 /**
682 @brief Access control for duplicating a file descriptor
683 @param cred Subject credential
684 @param fg Fileglob structure
685 @param label Policy label for fg
686 @param newfd New file descriptor number
687
688 Determine whether the subject identified by the credential can
689 duplicate the fileglob structure represented by fg and as file
690 descriptor number newfd.
691
692 @return Return 0 if access if granted, otherwise an appropriate
693 value for errno should be returned.
694 */
695 typedef int mpo_file_check_dup_t(
696 kauth_cred_t cred,
697 struct fileglob *fg,
698 struct label *label,
699 int newfd
700 );
701 /**
702 @brief Access control check for fcntl
703 @param cred Subject credential
704 @param fg Fileglob structure
705 @param label Policy label for fg
706 @param cmd Control operation to be performed; see fcntl(2)
707 @param arg fcnt arguments; see fcntl(2)
708
709 Determine whether the subject identified by the credential can perform
710 the file control operation indicated by cmd.
711
712 @return Return 0 if access is granted, otherwise an appropriate value for
713 errno should be returned.
714 */
715 typedef int mpo_file_check_fcntl_t(
716 kauth_cred_t cred,
717 struct fileglob *fg,
718 struct label *label,
719 int cmd,
720 user_long_t arg
721 );
722 /**
723 @brief Access control check for mac_get_fd
724 @param cred Subject credential
725 @param fg Fileglob structure
726 @param elements Element buffer
727 @param len Length of buffer
728
729 Determine whether the subject identified by the credential should be allowed
730 to get an externalized version of the label on the object indicated by fd.
731
732 @return Return 0 if access is granted, otherwise an appropriate value for
733 errno should be returned.
734 */
735 typedef int mpo_file_check_get_t(
736 kauth_cred_t cred,
737 struct fileglob *fg,
738 char *elements,
739 int len
740 );
741 /**
742 @brief Access control for getting the offset of a file descriptor
743 @param cred Subject credential
744 @param fg Fileglob structure
745 @param label Policy label for fg
746
747 Determine whether the subject identified by the credential can
748 get the offset of the file represented by fg.
749
750 @return Return 0 if access if granted, otherwise an appropriate
751 value for errno should be returned.
752 */
753 typedef int mpo_file_check_get_offset_t(
754 kauth_cred_t cred,
755 struct fileglob *fg,
756 struct label *label
757 );
758 /**
759 @brief Access control for inheriting a file descriptor
760 @param cred Subject credential
761 @param fg Fileglob structure
762 @param label Policy label for fg
763
764 Determine whether the subject identified by the credential can
765 inherit the fileglob structure represented by fg.
766
767 @return Return 0 if access if granted, otherwise an appropriate
768 value for errno should be returned.
769 */
770 typedef int mpo_file_check_inherit_t(
771 kauth_cred_t cred,
772 struct fileglob *fg,
773 struct label *label
774 );
775 /**
776 @brief Access control check for file ioctl
777 @param cred Subject credential
778 @param fg Fileglob structure
779 @param label Policy label for fg
780 @param cmd The ioctl command; see ioctl(2)
781
782 Determine whether the subject identified by the credential can perform
783 the ioctl operation indicated by cmd.
784
785 @warning Since ioctl data is opaque from the standpoint of the MAC
786 framework, policies must exercise extreme care when implementing
787 access control checks.
788
789 @return Return 0 if access is granted, otherwise an appropriate value for
790 errno should be returned.
791
792 */
793 typedef int mpo_file_check_ioctl_t(
794 kauth_cred_t cred,
795 struct fileglob *fg,
796 struct label *label,
797 unsigned int cmd
798 );
799 /**
800 @brief Access control check for file locking
801 @param cred Subject credential
802 @param fg Fileglob structure
803 @param label Policy label for fg
804 @param op The lock operation (F_GETLK, F_SETLK, F_UNLK)
805 @param fl The flock structure
806
807 Determine whether the subject identified by the credential can perform
808 the lock operation indicated by op and fl on the file represented by fg.
809
810 @return Return 0 if access is granted, otherwise an appropriate value for
811 errno should be returned.
812
813 */
814 typedef int mpo_file_check_lock_t(
815 kauth_cred_t cred,
816 struct fileglob *fg,
817 struct label *label,
818 int op,
819 struct flock *fl
820 );
821 /**
822 @brief Access control check for mapping a file
823 @param cred Subject credential
824 @param fg fileglob representing file to map
825 @param label Policy label associated with vp
826 @param prot mmap protections; see mmap(2)
827 @param flags Type of mapped object; see mmap(2)
828 @param maxprot Maximum rights
829
830 Determine whether the subject identified by the credential should be
831 allowed to map the file represented by fg with the protections specified
832 in prot. The maxprot field holds the maximum permissions on the new
833 mapping, a combination of VM_PROT_READ, VM_PROT_WRITE, and VM_PROT_EXECUTE.
834 To avoid overriding prior access control checks, a policy should only
835 remove flags from maxprot.
836
837 @return Return 0 if access is granted, otherwise an appropriate value for
838 errno should be returned. Suggested failure: EACCES for label mismatch or
839 EPERM for lack of privilege.
840 */
841 typedef int mpo_file_check_mmap_t(
842 kauth_cred_t cred,
843 struct fileglob *fg,
844 struct label *label,
845 int prot,
846 int flags,
847 int *maxprot
848 );
849 /**
850 @brief Downgrade the mmap protections
851 @param cred Subject credential
852 @param fg file to map
853 @param label Policy label associated with vp
854 @param prot mmap protections to be downgraded
855
856 Downgrade the mmap protections based on the subject and object labels.
857 */
858 typedef void mpo_file_check_mmap_downgrade_t(
859 kauth_cred_t cred,
860 struct fileglob *fg,
861 struct label *label,
862 int *prot
863 );
864 /**
865 @brief Access control for receiving a file descriptor
866 @param cred Subject credential
867 @param fg Fileglob structure
868 @param label Policy label for fg
869
870 Determine whether the subject identified by the credential can
871 receive the fileglob structure represented by fg.
872
873 @return Return 0 if access if granted, otherwise an appropriate
874 value for errno should be returned.
875 */
876 typedef int mpo_file_check_receive_t(
877 kauth_cred_t cred,
878 struct fileglob *fg,
879 struct label *label
880 );
881 /**
882 @brief Access control check for mac_set_fd
883 @param cred Subject credential
884 @param fg Fileglob structure
885 @param elements Elements buffer
886 @param len Length of elements buffer
887
888 Determine whether the subject identified by the credential can
889 perform the mac_set_fd operation. The mac_set_fd operation is used
890 to associate a MAC label with a file.
891
892 @return Return 0 if access is granted, otherwise an appropriate value for
893 errno should be returned.
894 */
895 typedef int mpo_file_check_set_t(
896 kauth_cred_t cred,
897 struct fileglob *fg,
898 char *elements,
899 int len
900 );
901 /**
902 @brief Create file label
903 @param cred Subject credential
904 @param fg Fileglob structure
905 @param label Policy label for fg
906 */
907 typedef void mpo_file_label_associate_t(
908 kauth_cred_t cred,
909 struct fileglob *fg,
910 struct label *label
911 );
912 /**
913 @brief Destroy file label
914 @param label The label to be destroyed
915
916 Destroy the label on a file descriptor. In this entry point, a
917 policy module should free any internal storage associated with
918 label so that it may be destroyed.
919 */
920 typedef void mpo_file_label_destroy_t(
921 struct label *label
922 );
923 /**
924 @brief Initialize file label
925 @param label New label to initialize
926 */
927 typedef void mpo_file_label_init_t(
928 struct label *label
929 );
930 /**
931 @brief Access control check for relabeling network interfaces
932 @param cred Subject credential
933 @param ifp network interface being relabeled
934 @param ifnetlabel Current label of the network interfaces
935 @param newlabel New label to apply to the network interfaces
936 @see mpo_ifnet_label_update_t
937
938 Determine whether the subject identified by the credential can
939 relabel the network interface represented by ifp to the supplied
940 new label (newlabel).
941
942 @return Return 0 if access is granted, otherwise an appropriate value for
943 errno should be returned.
944 */
945 typedef int mpo_ifnet_check_label_update_t(
946 kauth_cred_t cred,
947 struct ifnet *ifp,
948 struct label *ifnetlabel,
949 struct label *newlabel
950 );
951 /**
952 @brief Access control check for relabeling network interfaces
953 @param ifp Network interface mbuf will be transmitted through
954 @param ifnetlabel Label of the network interfaces
955 @param m The mbuf to be transmitted
956 @param mbuflabel Label of the mbuf to be transmitted
957 @param family Address Family, AF_*
958 @param type Type of socket, SOCK_{STREAM,DGRAM,RAW}
959
960 Determine whether the mbuf with label mbuflabel may be transmitted
961 through the network interface represented by ifp that has the
962 label ifnetlabel.
963
964 @return Return 0 if access is granted, otherwise an appropriate value for
965 errno should be returned.
966 */
967 typedef int mpo_ifnet_check_transmit_t(
968 struct ifnet *ifp,
969 struct label *ifnetlabel,
970 struct mbuf *m,
971 struct label *mbuflabel,
972 int family,
973 int type
974 );
975 /**
976 @brief Create a network interface label
977 @param ifp Network interface labeled
978 @param ifnetlabel Label for the network interface
979
980 Set the label of a newly created network interface, most likely
981 using the information in the supplied network interface struct.
982 */
983 typedef void mpo_ifnet_label_associate_t(
984 struct ifnet *ifp,
985 struct label *ifnetlabel
986 );
987 /**
988 @brief Copy an ifnet label
989 @param src Source ifnet label
990 @param dest Destination ifnet label
991
992 Copy the label information from src to dest.
993 */
994 typedef void mpo_ifnet_label_copy_t(
995 struct label *src,
996 struct label *dest
997 );
998 /**
999 @brief Destroy ifnet label
1000 @param label The label to be destroyed
1001
1002 Destroy the label on an ifnet label. In this entry point, a
1003 policy module should free any internal storage associated with
1004 label so that it may be destroyed.
1005 */
1006 typedef void mpo_ifnet_label_destroy_t(
1007 struct label *label
1008 );
1009 /**
1010 @brief Externalize an ifnet label
1011 @param label Label to be externalized
1012 @param element_name Name of the label namespace for which labels should be
1013 externalized
1014 @param sb String buffer to be filled with a text representation of the label
1015
1016 Produce an external representation of the label on an interface.
1017 An externalized label consists of a text representation of the
1018 label contents that can be used with user applications.
1019 Policy-agnostic user space tools will display this externalized
1020 version.
1021
1022 @return 0 on success, return non-zero if an error occurs while
1023 externalizing the label data.
1024
1025 */
1026 typedef int mpo_ifnet_label_externalize_t(
1027 struct label *label,
1028 char *element_name,
1029 struct sbuf *sb
1030 );
1031 /**
1032 @brief Initialize ifnet label
1033 @param label New label to initialize
1034 */
1035 typedef void mpo_ifnet_label_init_t(
1036 struct label *label
1037 );
1038 /**
1039 @brief Internalize an interface label
1040 @param label Label to be internalized
1041 @param element_name Name of the label namespace for which the label should
1042 be internalized
1043 @param element_data Text data to be internalized
1044
1045 Produce an interface label from an external representation. An
1046 externalized label consists of a text representation of the label
1047 contents that can be used with user applications. Policy-agnostic
1048 user space tools will forward text version to the kernel for
1049 processing by individual policy modules.
1050
1051 The policy's internalize entry points will be called only if the
1052 policy has registered interest in the label namespace.
1053
1054 @return 0 on success, Otherwise, return non-zero if an error occurs
1055 while internalizing the label data.
1056
1057 */
1058 typedef int mpo_ifnet_label_internalize_t(
1059 struct label *label,
1060 char *element_name,
1061 char *element_data
1062 );
1063 /**
1064 @brief Recycle up a network interface label
1065 @param label The label to be recycled
1066
1067 Recycle a network interface label. Darwin caches the struct ifnet
1068 of detached ifnets in a "free pool". Before ifnets are returned
1069 to the "free pool", policies can cleanup or overwrite any information
1070 present in the label.
1071 */
1072 typedef void mpo_ifnet_label_recycle_t(
1073 struct label *label
1074 );
1075 /**
1076 @brief Update a network interface label
1077 @param cred Subject credential
1078 @param ifp The network interface to be relabeled
1079 @param ifnetlabel The current label of the network interface
1080 @param newlabel A new label to apply to the network interface
1081 @see mpo_ifnet_check_label_update_t
1082
1083 Update the label on a network interface, using the supplied new label.
1084 */
1085 typedef void mpo_ifnet_label_update_t(
1086 kauth_cred_t cred,
1087 struct ifnet *ifp,
1088 struct label *ifnetlabel,
1089 struct label *newlabel
1090 );
1091 /**
1092 @brief Access control check for delivering a packet to a socket
1093 @param inp inpcb the socket is associated with
1094 @param inplabel Label of the inpcb
1095 @param m The mbuf being received
1096 @param mbuflabel Label of the mbuf being received
1097 @param family Address family, AF_*
1098 @param type Type of socket, SOCK_{STREAM,DGRAM,RAW}
1099
1100 Determine whether the mbuf with label mbuflabel may be received
1101 by the socket associated with inpcb that has the label inplabel.
1102
1103 @return Return 0 if access is granted, otherwise an appropriate value for
1104 errno should be returned.
1105 */
1106 typedef int mpo_inpcb_check_deliver_t(
1107 struct inpcb *inp,
1108 struct label *inplabel,
1109 struct mbuf *m,
1110 struct label *mbuflabel,
1111 int family,
1112 int type
1113 );
1114 /**
1115 @brief Create an inpcb label
1116 @param so Socket containing the inpcb to be labeled
1117 @param solabel Label of the socket
1118 @param inp inpcb to be labeled
1119 @param inplabel Label for the inpcb
1120
1121 Set the label of a newly created inpcb, most likely
1122 using the information in the socket and/or socket label.
1123 */
1124 typedef void mpo_inpcb_label_associate_t(
1125 struct socket *so,
1126 struct label *solabel,
1127 struct inpcb *inp,
1128 struct label *inplabel
1129 );
1130 /**
1131 @brief Destroy inpcb label
1132 @param label The label to be destroyed
1133
1134 Destroy the label on an inpcb label. In this entry point, a
1135 policy module should free any internal storage associated with
1136 label so that it may be destroyed.
1137 */
1138 typedef void mpo_inpcb_label_destroy_t(
1139 struct label *label
1140 );
1141 /**
1142 @brief Initialize inpcb label
1143 @param label New label to initialize
1144 @param flag M_WAITOK or M_NOWAIT
1145 */
1146 typedef int mpo_inpcb_label_init_t(
1147 struct label *label,
1148 int flag
1149 );
1150 /**
1151 @brief Recycle up an inpcb label
1152 @param label The label to be recycled
1153
1154 Recycle an inpcb label. Darwin allocates the inpcb as part of
1155 the socket structure in some cases. For this case we must recycle
1156 rather than destroy the inpcb as it will be reused later.
1157 */
1158 typedef void mpo_inpcb_label_recycle_t(
1159 struct label *label
1160 );
1161 /**
1162 @brief Update an inpcb label from a socket label
1163 @param so Socket containing the inpcb to be relabeled
1164 @param solabel New label of the socket
1165 @param inp inpcb to be labeled
1166 @param inplabel Label for the inpcb
1167
1168 Set the label of a newly created inpcb due to a change in the
1169 underlying socket label.
1170 */
1171 typedef void mpo_inpcb_label_update_t(
1172 struct socket *so,
1173 struct label *solabel,
1174 struct inpcb *inp,
1175 struct label *inplabel
1176 );
1177 /**
1178 @brief Device hardware access control
1179 @param devtype Type of device connected
1180 @param properties XML-formatted property list
1181 @param proplen Length of the property list
1182
1183 This is the MAC Framework device access control, which is called by the I/O
1184 Kit when a new device is connected to the system to determine whether that
1185 device should be trusted. A list of properties associated with the device
1186 is passed as an XML-formatted string. The routine should examine these
1187 properties to determine the trustworthiness of the device. A return value
1188 of EPERM forces the device to be claimed by a special device driver that
1189 will prevent its operation.
1190
1191 @warning This is an experimental interface and may change in the future.
1192
1193 @return Return EPERM to indicate that the device is untrusted and should
1194 not be allowed to operate. Return zero to indicate that the device is
1195 trusted and should be allowed to operate normally.
1196
1197 */
1198 typedef int mpo_iokit_check_device_t(
1199 char *devtype,
1200 struct mac_module_data *mdata
1201 );
1202 /**
1203 @brief Create an IP reassembly queue label
1204 @param fragment First received IP fragment
1205 @param fragmentlabel Policy label for fragment
1206 @param ipq IP reassembly queue to be labeled
1207 @param ipqlabel Policy label to be filled in for ipq
1208
1209 Set the label on a newly created IP reassembly queue from
1210 the mbuf header of the first received fragment.
1211 */
1212 typedef void mpo_ipq_label_associate_t(
1213 struct mbuf *fragment,
1214 struct label *fragmentlabel,
1215 struct ipq *ipq,
1216 struct label *ipqlabel
1217 );
1218 /**
1219 @brief Compare an mbuf header label to an ipq label
1220 @param fragment IP datagram fragment
1221 @param fragmentlabel Policy label for fragment
1222 @param ipq IP fragment reassembly queue
1223 @param ipqlabel Policy label for ipq
1224
1225 Compare the label of the mbuf header containing an IP datagram
1226 (fragment) fragment with the label of the passed IP fragment
1227 reassembly queue (ipq). Return (1) for a successful match, or (0)
1228 for no match. This call is made when the IP stack attempts to
1229 find an existing fragment reassembly queue for a newly received
1230 fragment; if this fails, a new fragment reassembly queue may be
1231 instantiated for the fragment. Policies may use this entry point
1232 to prevent the reassembly of otherwise matching IP fragments if
1233 policy does not permit them to be reassembled based on the label
1234 or other information.
1235 */
1236 typedef int mpo_ipq_label_compare_t(
1237 struct mbuf *fragment,
1238 struct label *fragmentlabel,
1239 struct ipq *ipq,
1240 struct label *ipqlabel
1241 );
1242 /**
1243 @brief Destroy IP reassembly queue label
1244 @param label The label to be destroyed
1245
1246 Destroy the label on an IP fragment queue. In this entry point, a
1247 policy module should free any internal storage associated with
1248 label so that it may be destroyed.
1249 */
1250 typedef void mpo_ipq_label_destroy_t(
1251 struct label *label
1252 );
1253 /**
1254 @brief Initialize IP reassembly queue label
1255 @param label New label to initialize
1256 @param flag M_WAITOK or M_NOWAIT
1257
1258 Initialize the label on a newly instantiated IP fragment reassembly
1259 queue. The flag field may be one of M_WAITOK and M_NOWAIT, and
1260 should be employed to avoid performing a sleeping malloc(9) during
1261 this initialization call. IP fragment reassembly queue allocation
1262 frequently occurs in performance sensitive environments, and the
1263 implementation should be careful to avoid sleeping or long-lived
1264 operations. This entry point is permitted to fail resulting in
1265 the failure to allocate the IP fragment reassembly queue.
1266 */
1267 typedef int mpo_ipq_label_init_t(
1268 struct label *label,
1269 int flag
1270 );
1271 /**
1272 @brief Update the label on an IP fragment reassembly queue
1273 @param fragment IP fragment
1274 @param fragmentlabel Policy label for fragment
1275 @param ipq IP fragment reassembly queue
1276 @param ipqlabel Policy label to be updated for ipq
1277
1278 Update the label on an IP fragment reassembly queue (ipq) based
1279 on the acceptance of the passed IP fragment mbuf header (fragment).
1280 */
1281 typedef void mpo_ipq_label_update_t(
1282 struct mbuf *fragment,
1283 struct label *fragmentlabel,
1284 struct ipq *ipq,
1285 struct label *ipqlabel
1286 );
1287 /**
1288 @brief Access control check for relabelling Login Context
1289 @param l Subject credential
1290 @param newlabel New label to apply to the Login Context
1291 @see mpo_lctx_label_update_t
1292 @see mac_set_lcid
1293 @see mac_set_lctx
1294
1295 Determine whether the subject identified by the credential can relabel
1296 itself to the supplied new label (newlabel). This access control check
1297 is called when the mac_set_lctx/lcid system call is invoked. A user space
1298 application will supply a new value, the value will be internalized
1299 and provided in newlabel.
1300
1301 @return Return 0 if access is granted, otherwise an appropriate value for
1302 errno should be returned.
1303 */
1304 typedef int mpo_lctx_check_label_update_t(
1305 struct lctx *l,
1306 struct label *newlabel
1307 );
1308 /**
1309 @brief Destroy Login Context label
1310 @param label The label to be destroyed
1311 */
1312 typedef void mpo_lctx_label_destroy_t(
1313 struct label *label
1314 );
1315 /**
1316 @brief Externalize a Login Context label
1317 @param label Label to be externalized
1318 @param element_name Name of the label namespace for which labels should be
1319 externalized
1320 @param sb String buffer to be filled with a text representation of the label
1321
1322 Produce an external representation of the label on a Login Context.
1323 An externalized label consists of a text representation
1324 of the label contents that can be used with user applications.
1325 Policy-agnostic user space tools will display this externalized
1326 version.
1327
1328 @return 0 on success, return non-zero if an error occurs while
1329 externalizing the label data.
1330
1331 */
1332 typedef int mpo_lctx_label_externalize_t(
1333 struct label *label,
1334 char *element_name,
1335 struct sbuf *sb
1336 );
1337 /**
1338 @brief Initialize Login Context label
1339 @param label New label to initialize
1340 */
1341 typedef void mpo_lctx_label_init_t(
1342 struct label *label
1343 );
1344 /**
1345 @brief Internalize a Login Context label
1346 @param label Label to be internalized
1347 @param element_name Name of the label namespace for which the label should
1348 be internalized
1349 @param element_data Text data to be internalized
1350
1351 Produce a Login Context label from an external representation. An
1352 externalized label consists of a text representation of the label
1353 contents that can be used with user applications. Policy-agnostic
1354 user space tools will forward text version to the kernel for
1355 processing by individual policy modules.
1356
1357 The policy's internalize entry points will be called only if the
1358 policy has registered interest in the label namespace.
1359
1360 @return 0 on success, Otherwise, return non-zero if an error occurs
1361 while internalizing the label data.
1362
1363 */
1364 typedef int mpo_lctx_label_internalize_t(
1365 struct label *label,
1366 char *element_name,
1367 char *element_data
1368 );
1369 /**
1370 @brief Update a Login Context label
1371 @param l
1372 @param newlabel A new label to apply to the Login Context
1373 @see mpo_lctx_check_label_update_t
1374 @see mac_set_lcid
1375 @see mac_set_lctx
1376
1377 Update the label on a login context, using the supplied new label.
1378 This is called as a result of a login context relabel operation. Access
1379 control was already confirmed by mpo_lctx_check_label_update.
1380 */
1381 typedef void mpo_lctx_label_update_t(
1382 struct lctx *l,
1383 struct label *newlabel
1384 );
1385 /**
1386 @brief A process has created a login context
1387 @param p Subject
1388 @param l Login Context
1389
1390 When a process creates a login context (via setlcid()) this entrypoint
1391 is called to notify the policy that the process 'p' has created login
1392 context 'l'.
1393 */
1394 typedef void mpo_lctx_notify_create_t(
1395 struct proc *p,
1396 struct lctx *l
1397 );
1398 /**
1399 @brief A process has joined a login context
1400 @param p Subject
1401 @param l Login Context
1402
1403 When a process joins a login context, either via setlcid() or via
1404 fork() this entrypoint is called to notify the policy that process
1405 'p' is now a member of login context 'l'.
1406 */
1407 typedef void mpo_lctx_notify_join_t(
1408 struct proc *p,
1409 struct lctx *l
1410 );
1411 /**
1412 @brief A process has left a login context
1413 @param p Subject
1414 @param l Login Context
1415
1416 When a process leaves a login context either via setlcid() or as a
1417 result of the process exiting this entrypoint is called to notify
1418 the policy that the process 'p' is no longer a member of login context 'l'.
1419 */
1420 typedef void mpo_lctx_notify_leave_t(
1421 struct proc *p,
1422 struct lctx *l
1423 );
1424 /**
1425 @brief Assign a label to a new mbuf
1426 @param bpf_d BPF descriptor
1427 @param b_label Policy label for bpf_d
1428 @param m Object; mbuf
1429 @param m_label Policy label to fill in for m
1430
1431 Set the label on the mbuf header of a newly created datagram
1432 generated using the passed BPF descriptor. This call is made when
1433 a write is performed to the BPF device associated with the passed
1434 BPF descriptor.
1435 */
1436 typedef void mpo_mbuf_label_associate_bpfdesc_t(
1437 struct bpf_d *bpf_d,
1438 struct label *b_label,
1439 struct mbuf *m,
1440 struct label *m_label
1441 );
1442 /**
1443 @brief Assign a label to a new mbuf
1444 @param ifp Interface descriptor
1445 @param i_label Existing label of ifp
1446 @param m Object; mbuf
1447 @param m_label Policy label to fill in for m
1448
1449 Label an mbuf based on the interface from which it was received.
1450 */
1451 typedef void mpo_mbuf_label_associate_ifnet_t(
1452 struct ifnet *ifp,
1453 struct label *i_label,
1454 struct mbuf *m,
1455 struct label *m_label
1456 );
1457 /**
1458 @brief Assign a label to a new mbuf
1459 @param inp inpcb structure
1460 @param i_label Existing label of inp
1461 @param m Object; mbuf
1462 @param m_label Policy label to fill in for m
1463
1464 Label an mbuf based on the inpcb from which it was derived.
1465 */
1466 typedef void mpo_mbuf_label_associate_inpcb_t(
1467 struct inpcb *inp,
1468 struct label *i_label,
1469 struct mbuf *m,
1470 struct label *m_label
1471 );
1472 /**
1473 @brief Set the label on a newly reassembled IP datagram
1474 @param ipq IP fragment reassembly queue
1475 @param ipqlabel Policy label for ipq
1476 @param mbuf IP datagram to be labeled
1477 @param mbuflabel Policy label to be filled in for mbuf
1478
1479 Set the label on a newly reassembled IP datagram (mbuf) from the IP
1480 fragment reassembly queue (ipq) from which it was generated.
1481 */
1482 typedef void mpo_mbuf_label_associate_ipq_t(
1483 struct ipq *ipq,
1484 struct label *ipqlabel,
1485 struct mbuf *mbuf,
1486 struct label *mbuflabel
1487 );
1488 /**
1489 @brief Assign a label to a new mbuf
1490 @param ifp Subject; network interface
1491 @param i_label Existing label of ifp
1492 @param m Object; mbuf
1493 @param m_label Policy label to fill in for m
1494
1495 Set the label on the mbuf header of a newly created datagram
1496 generated for the purposes of a link layer response for the passed
1497 interface. This call may be made in a number of situations, including
1498 for ARP or ND6 responses in the IPv4 and IPv6 stacks.
1499 */
1500 typedef void mpo_mbuf_label_associate_linklayer_t(
1501 struct ifnet *ifp,
1502 struct label *i_label,
1503 struct mbuf *m,
1504 struct label *m_label
1505 );
1506 /**
1507 @brief Assign a label to a new mbuf
1508 @param oldmbuf mbuf headerder for existing datagram for existing datagram
1509 @param oldmbuflabel Policy label for oldmbuf
1510 @param ifp Network interface
1511 @param ifplabel Policy label for ifp
1512 @param newmbuf mbuf header to be labeled for new datagram
1513 @param newmbuflabel Policy label for newmbuf
1514
1515 Set the label on the mbuf header of a newly created datagram
1516 generated from the existing passed datagram when it is processed
1517 by the passed multicast encapsulation interface. This call is made
1518 when an mbuf is to be delivered using the virtual interface.
1519 */
1520 typedef void mpo_mbuf_label_associate_multicast_encap_t(
1521 struct mbuf *oldmbuf,
1522 struct label *oldmbuflabel,
1523 struct ifnet *ifp,
1524 struct label *ifplabel,
1525 struct mbuf *newmbuf,
1526 struct label *newmbuflabel
1527 );
1528 /**
1529 @brief Assign a label to a new mbuf
1530 @param oldmbuf Received datagram
1531 @param oldmbuflabel Policy label for oldmbuf
1532 @param newmbuf Newly created datagram
1533 @param newmbuflabel Policy label for newmbuf
1534
1535 Set the label on the mbuf header of a newly created datagram generated
1536 by the IP stack in response to an existing received datagram (oldmbuf).
1537 This call may be made in a number of situations, including when responding
1538 to ICMP request datagrams.
1539 */
1540 typedef void mpo_mbuf_label_associate_netlayer_t(
1541 struct mbuf *oldmbuf,
1542 struct label *oldmbuflabel,
1543 struct mbuf *newmbuf,
1544 struct label *newmbuflabel
1545 );
1546 /**
1547 @brief Assign a label to a new mbuf
1548 @param so Socket to label
1549 @param so_label Policy label for socket
1550 @param m Object; mbuf
1551 @param m_label Policy label to fill in for m
1552
1553 An mbuf structure is used to store network traffic in transit.
1554 When an application sends data to a socket or a pipe, it is wrapped
1555 in an mbuf first. This function sets the label on a newly created mbuf header
1556 based on the socket sending the data. The contents of the label should be
1557 suitable for performing an access check on the receiving side of the
1558 communication.
1559
1560 Only labeled MBUFs will be presented to the policy via this entrypoint.
1561 */
1562 typedef void mpo_mbuf_label_associate_socket_t(
1563 socket_t so,
1564 struct label *so_label,
1565 struct mbuf *m,
1566 struct label *m_label
1567 );
1568 /**
1569 @brief Copy a mbuf label
1570 @param src Source label
1571 @param dest Destination label
1572
1573 Copy the mbuf label information in src into dest.
1574
1575 Only called when both source and destination mbufs have labels.
1576 */
1577 typedef void mpo_mbuf_label_copy_t(
1578 struct label *src,
1579 struct label *dest
1580 );
1581 /**
1582 @brief Destroy mbuf label
1583 @param label The label to be destroyed
1584
1585 Destroy a mbuf label. Since the
1586 object is going out of scope, policy modules should free any
1587 internal storage associated with the label so that it may be
1588 destroyed.
1589 */
1590 typedef void mpo_mbuf_label_destroy_t(
1591 struct label *label
1592 );
1593 /**
1594 @brief Initialize mbuf label
1595 @param label New label to initialize
1596 @param flag Malloc flags
1597
1598 Initialize the label for a newly instantiated mbuf.
1599
1600 @warning Since it is possible for the flags to be set to
1601 M_NOWAIT, the malloc operation may fail.
1602
1603 @return On success, 0, otherwise, an appropriate errno return value.
1604 */
1605 typedef int mpo_mbuf_label_init_t(
1606 struct label *label,
1607 int flag
1608 );
1609 /**
1610 @brief Access control check for fsctl
1611 @param cred Subject credential
1612 @param mp The mount point
1613 @param label Label associated with the mount point
1614 @param com Filesystem-dependent request code; see fsctl(2)
1615
1616 Determine whether the subject identified by the credential can perform
1617 the volume operation indicated by com.
1618
1619 @warning The fsctl() system call is directly analogous to ioctl(); since
1620 the associated data is opaque from the standpoint of the MAC framework
1621 and since these operations can affect many aspects of system operation,
1622 policies must exercise extreme care when implementing access control checks.
1623
1624 @return Return 0 if access is granted, otherwise an appropriate value for
1625 errno should be returned.
1626 */
1627 typedef int mpo_mount_check_fsctl_t(
1628 kauth_cred_t cred,
1629 struct mount *mp,
1630 struct label *label,
1631 unsigned int cmd
1632 );
1633 /**
1634 @brief Access control check for the retrieval of file system attributes
1635 @param cred Subject credential
1636 @param mp The mount structure of the file system
1637 @param vfa The attributes requested
1638
1639 This entry point determines whether given subject can get information
1640 about the given file system. This check happens during statfs() syscalls,
1641 but is also used by other parts within the kernel such as the audit system.
1642
1643 @return Return 0 if access is granted, otherwise an appropriate value for
1644 errno should be returned.
1645 */
1646
1647 typedef int mpo_mount_check_getattr_t(
1648 kauth_cred_t cred,
1649 struct mount *mp,
1650 struct label *mp_label,
1651 struct vfs_attr *vfa
1652 );
1653 /**
1654 @brief Access control check for mount point relabeling
1655 @param cred Subject credential
1656 @param mp Object file system mount point
1657 @param mntlabel Policy label for fle system mount point
1658
1659 Determine whether the subject identified by the credential can relabel
1660 the mount point. This call is made when a file system mount is updated.
1661
1662 @return Return 0 if access is granted, otherwise an appropriate value for
1663 errno should be returned. Suggested failure: EACCES for label mismatch
1664 or EPERM for lack of privilege.
1665 */
1666 typedef int mpo_mount_check_label_update_t(
1667 kauth_cred_t cred,
1668 struct mount *mp,
1669 struct label *mntlabel
1670 );
1671 /**
1672 @brief Access control check for mounting a file system
1673 @param cred Subject credential
1674 @param vp Vnode that is to be the mount point
1675 @param vlabel Label associated with the vnode
1676 @param cnp Component name for vp
1677 @param vfc_name Filesystem type name
1678
1679 Determine whether the subject identified by the credential can perform
1680 the mount operation on the target vnode.
1681
1682 @return Return 0 if access is granted, otherwise an appropriate value for
1683 errno should be returned.
1684 */
1685 typedef int mpo_mount_check_mount_t(
1686 kauth_cred_t cred,
1687 struct vnode *vp,
1688 struct label *vlabel,
1689 struct componentname *cnp,
1690 const char *vfc_name
1691 );
1692 /**
1693 @brief Access control check remounting a filesystem
1694 @param cred Subject credential
1695 @param mp The mount point
1696 @param mlabel Label currently associated with the mount point
1697
1698 Determine whether the subject identified by the credential can perform
1699 the remount operation on the target vnode.
1700
1701 @return Return 0 if access is granted, otherwise an appropriate value for
1702 errno should be returned.
1703 */
1704 typedef int mpo_mount_check_remount_t(
1705 kauth_cred_t cred,
1706 struct mount *mp,
1707 struct label *mlabel
1708 );
1709 /**
1710 @brief Access control check for the settting of file system attributes
1711 @param cred Subject credential
1712 @param mp The mount structure of the file system
1713 @param vfa The attributes requested
1714
1715 This entry point determines whether given subject can set information
1716 about the given file system, for example the volume name.
1717
1718 @return Return 0 if access is granted, otherwise an appropriate value for
1719 errno should be returned.
1720 */
1721
1722 typedef int mpo_mount_check_setattr_t(
1723 kauth_cred_t cred,
1724 struct mount *mp,
1725 struct label *mp_label,
1726 struct vfs_attr *vfa
1727 );
1728 /**
1729 @brief Access control check for file system statistics
1730 @param cred Subject credential
1731 @param mp Object file system mount
1732 @param mntlabel Policy label for mp
1733
1734 Determine whether the subject identified by the credential can see
1735 the results of a statfs performed on the file system. This call may
1736 be made in a number of situations, including during invocations of
1737 statfs(2) and related calls, as well as to determine what file systems
1738 to exclude from listings of file systems, such as when getfsstat(2)
1739 is invoked.
1740
1741 @return Return 0 if access is granted, otherwise an appropriate value for
1742 errno should be returned. Suggested failure: EACCES for label mismatch
1743 or EPERM for lack of privilege.
1744 */
1745 typedef int mpo_mount_check_stat_t(
1746 kauth_cred_t cred,
1747 struct mount *mp,
1748 struct label *mntlabel
1749 );
1750 /**
1751 @brief Access control check for unmounting a filesystem
1752 @param cred Subject credential
1753 @param mp The mount point
1754 @param mlabel Label associated with the mount point
1755
1756 Determine whether the subject identified by the credential can perform
1757 the unmount operation on the target vnode.
1758
1759 @return Return 0 if access is granted, otherwise an appropriate value for
1760 errno should be returned.
1761 */
1762 typedef int mpo_mount_check_umount_t(
1763 kauth_cred_t cred,
1764 struct mount *mp,
1765 struct label *mlabel
1766 );
1767 /**
1768 @brief Create mount labels
1769 @param cred Subject credential
1770 @param mp Mount point of file system being mounted
1771 @param mntlabel Label to associate with the new mount point
1772 @see mpo_mount_label_init_t
1773
1774 Fill out the labels on the mount point being created by the supplied
1775 user credential. This call is made when file systems are first mounted.
1776 */
1777 typedef void mpo_mount_label_associate_t(
1778 kauth_cred_t cred,
1779 struct mount *mp,
1780 struct label *mntlabel
1781 );
1782 /**
1783 @brief Destroy mount label
1784 @param label The label to be destroyed
1785
1786 Destroy a file system mount label. Since the
1787 object is going out of scope, policy modules should free any
1788 internal storage associated with the label so that it may be
1789 destroyed.
1790 */
1791 typedef void mpo_mount_label_destroy_t(
1792 struct label *label
1793 );
1794 /**
1795 @brief Externalize a mount point label
1796 @param label Label to be externalized
1797 @param element_name Name of the label namespace for which labels should be
1798 externalized
1799 @param sb String buffer to be filled with a text representation of the label
1800
1801 Produce an external representation of the mount point label. An
1802 externalized label consists of a text representation of the label
1803 contents that can be used with user applications. Policy-agnostic
1804 user space tools will display this externalized version.
1805
1806 The policy's externalize entry points will be called only if the
1807 policy has registered interest in the label namespace.
1808
1809 @return 0 on success, return non-zero if an error occurs while
1810 externalizing the label data.
1811
1812 */
1813 typedef int mpo_mount_label_externalize_t(
1814 struct label *label,
1815 char *element_name,
1816 struct sbuf *sb
1817 );
1818 /**
1819 @brief Initialize mount point label
1820 @param label New label to initialize
1821
1822 Initialize the label for a newly instantiated mount structure.
1823 This label is typically used to store a default label in the case
1824 that the file system has been mounted singlelabel. Since some
1825 file systems do not support persistent labels (extended attributes)
1826 or are read-only (such as CD-ROMs), it is often necessary to store
1827 a default label separately from the label of the mount point
1828 itself. Sleeping is permitted.
1829 */
1830 typedef void mpo_mount_label_init_t(
1831 struct label *label
1832 );
1833 /**
1834 @brief Internalize a mount point label
1835 @param label Label to be internalized
1836 @param element_name Name of the label namespace for which the label should
1837 be internalized
1838 @param element_data Text data to be internalized
1839
1840 Produce a mount point file system label from an external representation.
1841 An externalized label consists of a text representation of the label
1842 contents that can be used with user applications. Policy-agnostic
1843 user space tools will forward text version to the kernel for
1844 processing by individual policy modules.
1845
1846 The policy's internalize entry points will be called only if the
1847 policy has registered interest in the label namespace.
1848
1849 @return 0 on success, Otherwise, return non-zero if an error occurs
1850 while internalizing the label data.
1851
1852 */
1853 typedef int mpo_mount_label_internalize_t(
1854 struct label *label,
1855 char *element_name,
1856 char *element_data
1857 );
1858 /**
1859 @brief Set the label on an IPv4 datagram fragment
1860 @param datagram Datagram being fragmented
1861 @param datagramlabel Policy label for datagram
1862 @param fragment New fragment
1863 @param fragmentlabel Policy label for fragment
1864
1865 Called when an IPv4 datagram is fragmented into several smaller datagrams.
1866 Policies implementing mbuf labels will typically copy the label from the
1867 source datagram to the new fragment.
1868 */
1869 typedef void mpo_netinet_fragment_t(
1870 struct mbuf *datagram,
1871 struct label *datagramlabel,
1872 struct mbuf *fragment,
1873 struct label *fragmentlabel
1874 );
1875 /**
1876 @brief Set the label on an ICMP reply
1877 @param m mbuf containing the ICMP reply
1878 @param mlabel Policy label for m
1879
1880 A policy may wish to update the label of an mbuf that refers to
1881 an ICMP packet being sent in response to an IP packet. This may
1882 be called in response to a bad packet or an ICMP request.
1883 */
1884 typedef void mpo_netinet_icmp_reply_t(
1885 struct mbuf *m,
1886 struct label *mlabel
1887 );
1888 /**
1889 @brief Set the label on a TCP reply
1890 @param m mbuf containing the TCP reply
1891 @param mlabel Policy label for m
1892
1893 Called for outgoing TCP packets not associated with an actual socket.
1894 */
1895 typedef void mpo_netinet_tcp_reply_t(
1896 struct mbuf *m,
1897 struct label *mlabel
1898 );
1899 /**
1900 @brief Access control check for pipe ioctl
1901 @param cred Subject credential
1902 @param cpipe Object to be accessed
1903 @param pipelabel The label on the pipe
1904 @param cmd The ioctl command; see ioctl(2)
1905
1906 Determine whether the subject identified by the credential can perform
1907 the ioctl operation indicated by cmd.
1908
1909 @warning Since ioctl data is opaque from the standpoint of the MAC
1910 framework, policies must exercise extreme care when implementing
1911 access control checks.
1912
1913 @return Return 0 if access is granted, otherwise an appropriate value for
1914 errno should be returned.
1915
1916 */
1917 typedef int mpo_pipe_check_ioctl_t(
1918 kauth_cred_t cred,
1919 struct pipe *cpipe,
1920 struct label *pipelabel,
1921 unsigned int cmd
1922 );
1923 /**
1924 @brief Access control check for pipe kqfilter
1925 @param cred Subject credential
1926 @param kn Object knote
1927 @param cpipe Object to be accessed
1928 @param pipelabel Policy label for the pipe
1929
1930 Determine whether the subject identified by the credential can
1931 receive the knote on the passed pipe.
1932
1933 @return Return 0 if access if granted, otherwise an appropriate
1934 value for errno should be returned.
1935 */
1936 typedef int mpo_pipe_check_kqfilter_t(
1937 kauth_cred_t cred,
1938 struct knote *kn,
1939 struct pipe *cpipe,
1940 struct label *pipelabel
1941 );
1942 /**
1943 @brief Access control check for pipe relabel
1944 @param cred Subject credential
1945 @param cpipe Object to be accessed
1946 @param pipelabel The current label on the pipe
1947 @param newlabel The new label to be used
1948
1949 Determine whether the subject identified by the credential can
1950 perform a relabel operation on the passed pipe. The cred object holds
1951 the credentials of the subject performing the operation.
1952
1953 @return Return 0 if access is granted, otherwise an appropriate value for
1954 errno should be returned.
1955
1956 */
1957 typedef int mpo_pipe_check_label_update_t(
1958 kauth_cred_t cred,
1959 struct pipe *cpipe,
1960 struct label *pipelabel,
1961 struct label *newlabel
1962 );
1963 /**
1964 @brief Access control check for pipe read
1965 @param cred Subject credential
1966 @param cpipe Object to be accessed
1967 @param pipelabel The label on the pipe
1968
1969 Determine whether the subject identified by the credential can
1970 perform a read operation on the passed pipe. The cred object holds
1971 the credentials of the subject performing the operation.
1972
1973 @return Return 0 if access is granted, otherwise an appropriate value for
1974 errno should be returned.
1975
1976 */
1977 typedef int mpo_pipe_check_read_t(
1978 kauth_cred_t cred,
1979 struct pipe *cpipe,
1980 struct label *pipelabel
1981 );
1982 /**
1983 @brief Access control check for pipe select
1984 @param cred Subject credential
1985 @param cpipe Object to be accessed
1986 @param pipelabel The label on the pipe
1987 @param which The operation selected on: FREAD or FWRITE
1988
1989 Determine whether the subject identified by the credential can
1990 perform a select operation on the passed pipe. The cred object holds
1991 the credentials of the subject performing the operation.
1992
1993 @return Return 0 if access is granted, otherwise an appropriate value for
1994 errno should be returned.
1995
1996 */
1997 typedef int mpo_pipe_check_select_t(
1998 kauth_cred_t cred,
1999 struct pipe *cpipe,
2000 struct label *pipelabel,
2001 int which
2002 );
2003 /**
2004 @brief Access control check for pipe stat
2005 @param cred Subject credential
2006 @param cpipe Object to be accessed
2007 @param pipelabel The label on the pipe
2008
2009 Determine whether the subject identified by the credential can
2010 perform a stat operation on the passed pipe. The cred object holds
2011 the credentials of the subject performing the operation.
2012
2013 @return Return 0 if access is granted, otherwise an appropriate value for
2014 errno should be returned.
2015
2016 */
2017 typedef int mpo_pipe_check_stat_t(
2018 kauth_cred_t cred,
2019 struct pipe *cpipe,
2020 struct label *pipelabel
2021 );
2022 /**
2023 @brief Access control check for pipe write
2024 @param cred Subject credential
2025 @param cpipe Object to be accessed
2026 @param pipelabel The label on the pipe
2027
2028 Determine whether the subject identified by the credential can
2029 perform a write operation on the passed pipe. The cred object holds
2030 the credentials of the subject performing the operation.
2031
2032 @return Return 0 if access is granted, otherwise an appropriate value for
2033 errno should be returned.
2034
2035 */
2036 typedef int mpo_pipe_check_write_t(
2037 kauth_cred_t cred,
2038 struct pipe *cpipe,
2039 struct label *pipelabel
2040 );
2041 /**
2042 @brief Create a pipe label
2043 @param cred Subject credential
2044 @param cpipe object to be labeled
2045 @param label Label for the pipe object
2046
2047 Create a label for the pipe object being created by the supplied
2048 user credential. This call is made when the pipe is being created
2049 XXXPIPE(for one or both sides of the pipe?).
2050
2051 */
2052 typedef void mpo_pipe_label_associate_t(
2053 kauth_cred_t cred,
2054 struct pipe *cpipe,
2055 struct label *pipelabel
2056 );
2057 /**
2058 @brief Copy a pipe label
2059 @param src Source pipe label
2060 @param dest Destination pipe label
2061
2062 Copy the pipe label associated with src to dest.
2063 XXXPIPE Describe when this is used: most likely during pipe creation to
2064 copy from rpipe to wpipe.
2065 */
2066 typedef void mpo_pipe_label_copy_t(
2067 struct label *src,
2068 struct label *dest
2069 );
2070 /**
2071 @brief Destroy pipe label
2072 @param label The label to be destroyed
2073
2074 Destroy a pipe label. Since the object is going out of scope,
2075 policy modules should free any internal storage associated with the
2076 label so that it may be destroyed.
2077 */
2078 typedef void mpo_pipe_label_destroy_t(
2079 struct label *label
2080 );
2081 /**
2082 @brief Externalize a pipe label
2083 @param label Label to be externalized
2084 @param element_name Name of the label namespace for which labels should be
2085 externalized
2086 @param sb String buffer to be filled with a text representation of the label
2087
2088 Produce an external representation of the label on a pipe.
2089 An externalized label consists of a text representation
2090 of the label contents that can be used with user applications.
2091 Policy-agnostic user space tools will display this externalized
2092 version.
2093
2094 The policy's externalize entry points will be called only if the
2095 policy has registered interest in the label namespace.
2096
2097 @return 0 on success, return non-zero if an error occurs while
2098 externalizing the label data.
2099
2100 */
2101 typedef int mpo_pipe_label_externalize_t(
2102 struct label *label,
2103 char *element_name,
2104 struct sbuf *sb
2105 );
2106 /**
2107 @brief Initialize pipe label
2108 @param label New label to initialize
2109
2110 Initialize label storage for use with a newly instantiated pipe object.
2111 Sleeping is permitted.
2112 */
2113 typedef void mpo_pipe_label_init_t(
2114 struct label *label
2115 );
2116 /**
2117 @brief Internalize a pipe label
2118 @param label Label to be internalized
2119 @param element_name Name of the label namespace for which the label should
2120 be internalized
2121 @param element_data Text data to be internalized
2122
2123 Produce a pipe label from an external representation. An
2124 externalized label consists of a text representation of the label
2125 contents that can be used with user applications. Policy-agnostic
2126 user space tools will forward text version to the kernel for
2127 processing by individual policy modules.
2128
2129 The policy's internalize entry points will be called only if the
2130 policy has registered interest in the label namespace.
2131
2132 @return 0 on success, Otherwise, return non-zero if an error occurs
2133 while internalizing the label data.
2134
2135 */
2136 typedef int mpo_pipe_label_internalize_t(
2137 struct label *label,
2138 char *element_name,
2139 char *element_data
2140 );
2141 /**
2142 @brief Update a pipe label
2143 @param cred Subject credential
2144 @param cpipe Object to be labeled
2145 @param oldlabel Existing pipe label
2146 @param newlabel New label to replace existing label
2147 @see mpo_pipe_check_label_update_t
2148
2149 The subject identified by the credential has previously requested
2150 and was authorized to relabel the pipe; this entry point allows
2151 policies to perform the actual relabel operation. Policies should
2152 update oldlabel using the label stored in the newlabel parameter.
2153
2154 */
2155 typedef void mpo_pipe_label_update_t(
2156 kauth_cred_t cred,
2157 struct pipe *cpipe,
2158 struct label *oldlabel,
2159 struct label *newlabel
2160 );
2161 /**
2162 @brief Policy unload event
2163 @param mpc MAC policy configuration
2164
2165 This is the MAC Framework policy unload event. This entry point will
2166 only be called if the module's policy configuration allows unload (if
2167 the MPC_LOADTIME_FLAG_UNLOADOK is set). Most security policies won't
2168 want to be unloaded; they should set their flags to prevent this
2169 entry point from being called.
2170
2171 @warning During this call, the mac policy list mutex is held, so
2172 sleep operations cannot be performed, and calls out to other kernel
2173 subsystems must be made with caution.
2174
2175 @see MPC_LOADTIME_FLAG_UNLOADOK
2176 */
2177 typedef void mpo_policy_destroy_t(
2178 struct mac_policy_conf *mpc
2179 );
2180 /**
2181 @brief Policy initialization event
2182 @param mpc MAC policy configuration
2183 @see mac_policy_register
2184 @see mpo_policy_initbsd_t
2185
2186 This is the MAC Framework policy initialization event. This entry
2187 point is called during mac_policy_register, when the policy module
2188 is first registered with the MAC Framework. This is often done very
2189 early in the boot process, after the kernel Mach subsystem has been
2190 initialized, but prior to the BSD subsystem being initialized.
2191 Since the kernel BSD services are not yet available, it is possible
2192 that some initialization must occur later, possibly in the
2193 mpo_policy_initbsd_t policy entry point, such as registering BSD system
2194 controls (sysctls). Policy modules loaded at boot time will be
2195 registered and initialized before labeled Mach objects are created.
2196
2197 @warning During this call, the mac policy list mutex is held, so
2198 sleep operations cannot be performed, and calls out to other kernel
2199 subsystems must be made with caution.
2200 */
2201 typedef void mpo_policy_init_t(
2202 struct mac_policy_conf *mpc
2203 );
2204 /**
2205 @brief Policy BSD initialization event
2206 @param mpc MAC policy configuration
2207 @see mpo_policy_init_t
2208
2209 This entry point is called after the kernel BSD subsystem has been
2210 initialized. By this point, the module should already be loaded,
2211 registered, and initialized. Since policy modules are initialized
2212 before kernel BSD services are available, this second initialization
2213 phase is necessary. At this point, BSD services (memory management,
2214 synchronization primitives, vfs, etc.) are available, but the first
2215 process has not yet been created. Mach-related objects and tasks
2216 will already be fully initialized and may be in use--policies requiring
2217 ubiquitous labeling may also want to implement mpo_policy_init_t.
2218
2219 @warning During this call, the mac policy list mutex is held, so
2220 sleep operations cannot be performed, and calls out to other kernel
2221 subsystems must be made with caution.
2222 */
2223 typedef void mpo_policy_initbsd_t(
2224 struct mac_policy_conf *mpc
2225 );
2226 /**
2227 @brief Policy extension service
2228 @param p Calling process
2229 @param call Policy-specific syscall number
2230 @param arg Pointer to syscall arguments
2231
2232 This entry point provides a policy-multiplexed system call so that
2233 policies may provide additional services to user processes without
2234 registering specific system calls. The policy name provided during
2235 registration is used to demux calls from userland, and the arguments
2236 will be forwarded to this entry point. When implementing new
2237 services, security modules should be sure to invoke appropriate
2238 access control checks from the MAC framework as needed. For
2239 example, if a policy implements an augmented signal functionality,
2240 it should call the necessary signal access control checks to invoke
2241 the MAC framework and other registered policies.
2242
2243 @warning Since the format and contents of the policy-specific
2244 arguments are unknown to the MAC Framework, modules must perform the
2245 required copyin() of the syscall data on their own. No policy
2246 mediation is performed, so policies must perform any necessary
2247 access control checks themselves. If multiple policies are loaded,
2248 they will currently be unable to mediate calls to other policies.
2249
2250 @return In the event of an error, an appropriate value for errno
2251 should be returned, otherwise return 0 upon success.
2252 */
2253 typedef int mpo_policy_syscall_t(
2254 struct proc *p,
2255 int call,
2256 user_addr_t arg
2257 );
2258 /**
2259 @brief Access control check for copying a send right to another task
2260 @param task Label of the sender task
2261 @param port Label of the affected port
2262
2263 Access control check for copying send rights to the port from the
2264 specified task. A complementary entry point, mpo_port_check_hold_send,
2265 handles the receiving task. port_check_copy_send is called as part of
2266 a group of policy invocations when messages with port rights are sent.
2267 All access control checks made for a particular message must be successful
2268 for the message to be sent.
2269
2270 The task label and the port are locked. Sleeping is permitted.
2271
2272 @return Return 0 if access is granted, non-zero otherwise.
2273 */
2274 typedef int mpo_port_check_copy_send_t(
2275 struct label *task,
2276 struct label *port
2277 );
2278 /**
2279 @brief Access control check for obtaining a receive right
2280 @param task Label of the receiving task
2281 @param port Label of the affected port
2282
2283 Access control check for a task obtaining receive rights to a
2284 port. Usually, these are port rights that were obtained with a call
2285 to mach_port_allocate. This entry point is called as part of a
2286 group of policy invocations when messages with port rights are
2287 received. All of these access control checks must succeed in order
2288 to receive the message.
2289
2290 The task label and the port are locked. Sleeping is permitted.
2291
2292 @return Return 0 if access is granted, non-zero otherwise.
2293 */
2294 typedef int mpo_port_check_hold_receive_t(
2295 struct label *task,
2296 struct label *port
2297 );
2298 /**
2299 @brief Access control check for obtaining a send once right
2300 @param task Label of the receiving task
2301 @param port Label of the affected port
2302
2303 Access control check for a task obtaining send once rights to a port. Usually,
2304 these are port rights that were part of a message sent by another userspace
2305 task. port_check_hold_send_once is called as part of a group of policy
2306 invocations when messages with port rights are received. All of these access
2307 control checks must succeed in order to receive the message.
2308
2309 The task label and the port are locked. Sleeping is permitted.
2310
2311 @return Return 0 if access is granted, non-zero otherwise.
2312 */
2313 typedef int mpo_port_check_hold_send_once_t(
2314 struct label *task,
2315 struct label *port
2316 );
2317 /**
2318 @brief Access control check for obtaining a send right
2319 @param task Label of the receiving task
2320 @param port Label of the affected port
2321
2322 Access control check for a task obtaining send rights to a port. Usually,
2323 these are port rights that were part of a message sent by another userspace
2324 task. port_check_hold_send is called as part of a group of policy
2325 invocations when messages with port rights are received. All of these access
2326 control checks must succeed in order to receive the message.
2327
2328 The task label and the port are locked. Sleeping is permitted.
2329
2330 @return Return 0 if access is granted, non-zero otherwise.
2331 */
2332 typedef int mpo_port_check_hold_send_t(
2333 struct label *task,
2334 struct label *port
2335 );
2336 /**
2337 @brief Access control check for relabelling ports
2338 @param task Subject's task label
2339 @param oldlabel Original label of port
2340 @param newlabel New label for port
2341
2342 Access control check for relabelling ports. The policy should
2343 indicate whether the subject is permitted to change the label
2344 of a port from oldlabel to newlabel. The port is locked, but
2345 the subject's task label is not locked.
2346
2347 @warning XXX In future releases, the task label lock will likely
2348 also be held.
2349
2350 @return Return 0 if access is granted, non-zero otherwise.
2351 */
2352 typedef int mpo_port_check_label_update_t(
2353 struct label *task,
2354 struct label *oldlabel,
2355 struct label *newlabel
2356 );
2357 /**
2358 @brief Access control check for producing a send once right from a receive right
2359 @param task Label of the sender task
2360 @param port Label of the affected port
2361
2362 Access control check for obtaining send once rights from receive rights.
2363 The new send once right may be destined for the calling task, or a different
2364 task. In either case the mpo_port_check_hold_send_once entry point handles
2365 the receiving task. port_check_make_send_once may be called as part of a
2366 group of policy invocations when messages with port rights are sent.
2367 All access control checks made for a particular message must be successful
2368 for the message to be sent.
2369
2370 The task label and the port are locked. Sleeping is permitted.
2371
2372 @return Return 0 if access is granted, non-zero otherwise.
2373 */
2374 typedef int mpo_port_check_make_send_once_t(
2375 struct label *task,
2376 struct label *port
2377 );
2378 /**
2379 @brief Access control check for producing a send right from a receive right
2380 @param task Label of the sender task
2381 @param port Label of the affected port
2382
2383 Access control check for obtaining send rights from receive rights. The new
2384 send right may be destined for the calling task, or a different task.
2385 In either case the mpo_port_check_hold_send entry point
2386 handles the receiving task. port_check_make_send may be called as part of
2387 a group of policy invocations when messages with port rights are sent.
2388 All access control checks made for a particular message must be successful
2389 for the message to be sent.
2390
2391 The task label and the port are locked. Sleeping is permitted.
2392
2393 @return Return 0 if access is granted, non-zero otherwise.
2394 */
2395 typedef int mpo_port_check_make_send_t(
2396 struct label *task,
2397 struct label *port
2398 );
2399 /**
2400 @brief Compute access control check for a Mach message-based service
2401 @param proc Sender's process structure (may be NULL)
2402 @param task Sender's task label
2403 @param port Destination port label
2404 @param msgid Message id
2405
2406 Access control computation for message-based services. This entry point
2407 computes permission to the service requested by the specified port and message
2408 id, for example a single MiG server routine, and is unrelated to the access
2409 check for sending messages to ports (but that check must succeed for the
2410 message to be sent to the destination). The result of this access computation
2411 is stored in the message trailer field msgh_ad (only if requested by the
2412 recipient); it does not actually inhibit the message from being sent or
2413 received.
2414
2415 @return 0 for access granted, nonzero for access denied.
2416 */
2417
2418 typedef int mpo_port_check_method_t(
2419 struct proc *proc,
2420 struct label *task,
2421 struct label *port,
2422 int msgid
2423 );
2424 /**
2425 @brief Access control check for transferring a receive right
2426 @param task Label of the sender task
2427 @param port Label of the affected port
2428
2429 Access control check for transferring the receive right to a port out
2430 of the specified task. A complementary entry point,
2431 mpo_port_check_hold_receive, handles the receiving task.
2432 port_check_move_receive is called as part of
2433 a group of policy invocations when messages with port rights are sent.
2434 All access control checks made for a particular message must be successful
2435 for the message to be sent.
2436
2437 The task label and the port are locked. Sleeping is permitted.
2438
2439 @return Return 0 if access is granted, non-zero otherwise.
2440 */
2441 typedef int mpo_port_check_move_receive_t(
2442 struct label *task,
2443 struct label *port
2444 );
2445 /**
2446 @brief Access control check for transferring a send once right
2447 @param task Label of the sender task
2448 @param port Label of the affected port
2449
2450 Access control check for transferring a send once right from one task to
2451 the task listening to the specified port. A complementary entry point,
2452 mpo_port_check_hold_send_once, handles the receiving task.
2453 port_check_move_send_once is called as part of a group of policy invocations
2454 when messages with port rights are sent. All access control checks made
2455 for a particular message must be successful for the message to be sent.
2456
2457 The task label and the port are locked. Sleeping is permitted.
2458
2459 @return Return 0 if access is granted, non-zero otherwise.
2460 */
2461 typedef int mpo_port_check_move_send_once_t(
2462 struct label *task,
2463 struct label *port
2464 );
2465 /**
2466 @brief Access control check for transferring a send right
2467 @param task Label of the sender task
2468 @param port Label of the affected port
2469
2470 Access control check for transferring a send right from one task to the
2471 task listening to the specified port. A complementary entry point,
2472 mpo_port_check_hold_send, handles the receiving task.
2473 port_check_move_send is called as part of a group of policy invocations
2474 when messages with port rights are sent. All access control checks made
2475 for a particular message must be successful for the message to be sent.
2476
2477 The task label and the port are locked. Sleeping is permitted.
2478
2479 @return Return 0 if access is granted, non-zero otherwise.
2480 */
2481 typedef int mpo_port_check_move_send_t(
2482 struct label *task,
2483 struct label *port
2484 );
2485 /**
2486 @brief Access control check for receiving Mach messsages
2487 @param task Label of the receiving task
2488 @param sender Label of the sending task
2489
2490 Access control check for receiving messages. The two labels are locked.
2491
2492 @warning This entry point can be invoked from many places inside the
2493 kernel, with arbitrary other locks held. The implementation of this
2494 entry point must not cause page faults, as those are handled by mach
2495 messages.
2496
2497 @return Return 0 if access is granted, non-zero otherwise.
2498 */
2499 typedef int mpo_port_check_receive_t(
2500 struct label *task,
2501 struct label *sender
2502 );
2503 /**
2504 @brief Access control check for sending Mach messsages
2505 @param task Label of the sender task
2506 @param port Label of the destination port
2507
2508 Access control check for sending messages. The task label and the
2509 port are locked.
2510
2511 @warning This entry point can be invoked from many places inside the
2512 kernel, with arbitrary other locks held. The implementation of this
2513 entry point must not cause page faults, as those are handled by mach
2514 messages.
2515
2516 @return Return 0 if access is granted, non-zero otherwise.
2517 */
2518 typedef int mpo_port_check_send_t(
2519 struct label *task,
2520 struct label *port
2521 );
2522 /**
2523 @brief Generic access control check
2524 @param subj Caller-provided subject label
2525 @param obj Caller-provided object label
2526 @param serv Service or object class name
2527 @param perm Permission, or method, within the specified service
2528
2529 This function provides a general way for a user process to query
2530 an arbitrary access control decision from the system's security policies.
2531 Currently, there are no standards for the format of the service and
2532 permission names. Labels may be either cred or port labels; the policy
2533 must accept either. The userspace interfaces to this entry point allow
2534 label strings or label handles (ports) to be provided.
2535
2536 @return Return 0 if access is granted, non-zero otherwise.
2537 */
2538 typedef int mpo_port_check_service_t(
2539 struct label *subj,
2540 struct label *obj,
2541 const char *serv,
2542 const char *perm
2543 );
2544 /**
2545 @brief Assign a label to a new Mach port created by the kernel
2546 @param portlabel Label for the new port
2547 @param isreply True if the port is for a reply message from the kernel
2548
2549 Assign a label to a new port created by the kernel. If the port is being
2550 used to reply to a message, isreply is 1 (0 otherwise). The port is locked.
2551 */
2552 typedef void mpo_port_label_associate_kernel_t(
2553 struct label *portlabel,
2554 int isreply
2555 );
2556 /**
2557 @brief Assign a label to a new Mach port
2558 @param it Task label of issuer
2559 @param st Task label of target
2560 @param portlabel Label for the new port
2561
2562 Assign a label to a new port. The policy can base this label on
2563 the label of the calling task, as well as the label of the target task.
2564 The target task is the one which recieves the first right for this port.
2565 Both task labels and the port are locked.
2566 */
2567 typedef void mpo_port_label_associate_t(
2568 struct label *it,
2569 struct label *st,
2570 struct label *portlabel
2571 );
2572 /**
2573 @brief Request label for new (userspace) object
2574 @param subj Subject label
2575 @param obj Parent or existing object label
2576 @param serv Name of service
2577 @param out Computed label
2578
2579 Ask the loaded policies to compute a label based on the two input labels
2580 and the service name. There is currently no standard for the service name,
2581 or even what the input labels represent (Subject and parent object are only
2582 a suggestion). If successful, the computed label is stored in out. All labels
2583 must be port (or task) labels. The userspace interfaces to this entry point
2584 allow label handles (ports) to be provided.
2585
2586 @return 0 on success, or an errno value for failure.
2587 */
2588 typedef int mpo_port_label_compute_t(
2589 struct label *subj,
2590 struct label *obj,
2591 const char *serv,
2592 struct label *out
2593 );
2594 /**
2595 @brief Copy a Mach port label
2596 @param src Source port label
2597 @param dest Destination port label
2598
2599 Copy the Mach port label information from src to dest. This is used
2600 to copy user-suplied labels into an existing port.
2601 */
2602 typedef void mpo_port_label_copy_t(
2603 struct label *src,
2604 struct label *dest
2605 );
2606 /**
2607 @brief Destroy Mach port label
2608 @param label The label to be destroyed
2609
2610 Destroy a Mach port label. Since the object is going out of
2611 scope, policy modules should free any internal storage associated
2612 with the label so that it may be destroyed.
2613 */
2614 typedef void mpo_port_label_destroy_t(
2615 struct label *label
2616 );
2617 /**
2618 @brief Initialize Mach port label
2619 @param label New label to initialize
2620
2621 Initialize the label for a newly instantiated Mach port. Sleeping
2622 is permitted.
2623 */
2624 typedef void mpo_port_label_init_t(
2625 struct label *label
2626 );
2627 /**
2628 @brief Update a Mach task port label
2629 @param cred User credential label to be used as the source
2630 @param task Mach port label to be used as the destination
2631 @see mpo_cred_label_update_t
2632 @see mpo_cred_label_update_execve_t
2633
2634 Update the label on a Mach task port, using the supplied user
2635 credential label. When a mac_cred_label_update_execve or a mac_cred_label_update
2636 operation causes the label on a user credential to change, the Mach
2637 task port label also needs to be updated to reflect the change.
2638 Both labels are already valid (initialized and created).
2639 */
2640 typedef void mpo_port_label_update_cred_t(
2641 struct label *cred,
2642 struct label *task
2643 );
2644 /**
2645 @brief Assign a label to a Mach port connected to a kernel object
2646 @param portlabel Label for the port
2647 @param kotype Type of kernel object
2648
2649 Label a kernel port based on the type of object behind it. The
2650 kotype parameter is one of the IKOT constants in
2651 <kern/ipc_kobject.h>. The port already has a valid label from either
2652 mpo_port_label_associate_kernel, or because it is a task port and has a label
2653 derived from the process and task labels. The port is locked.
2654 */
2655 typedef void mpo_port_label_update_kobject_t(
2656 struct label *portlabel,
2657 int kotype
2658 );
2659 /**
2660 @brief Access control check for POSIX semaphore create
2661 @param cred Subject credential
2662 @param name String name of the semaphore
2663
2664 Determine whether the subject identified by the credential can create
2665 a POSIX semaphore specified by name.
2666
2667 @return Return 0 if access is granted, otherwise an appropriate value for
2668 errno should be returned.
2669 */
2670 typedef int mpo_posixsem_check_create_t(
2671 kauth_cred_t cred,
2672 const char *name
2673 );
2674 /**
2675 @brief Access control check for POSIX semaphore open
2676 @param cred Subject credential
2677 @param ps Pointer to semaphore information structure
2678 @param semlabel Label associated with the semaphore
2679
2680 Determine whether the subject identified by the credential can open
2681 the named POSIX semaphore with label semlabel.
2682
2683 @return Return 0 if access is granted, otherwise an appropriate value for
2684 errno should be returned.
2685 */
2686 typedef int mpo_posixsem_check_open_t(
2687 kauth_cred_t cred,
2688 struct pseminfo *ps,
2689 struct label *semlabel
2690 );
2691 /**
2692 @brief Access control check for POSIX semaphore post
2693 @param cred Subject credential
2694 @param ps Pointer to semaphore information structure
2695 @param semlabel Label associated with the semaphore
2696
2697 Determine whether the subject identified by the credential can unlock
2698 the named POSIX semaphore with label semlabel.
2699
2700 @return Return 0 if access is granted, otherwise an appropriate value for
2701 errno should be returned.
2702 */
2703 typedef int mpo_posixsem_check_post_t(
2704 kauth_cred_t cred,
2705 struct pseminfo *ps,
2706 struct label *semlabel
2707 );
2708 /**
2709 @brief Access control check for POSIX semaphore unlink
2710 @param cred Subject credential
2711 @param ps Pointer to semaphore information structure
2712 @param semlabel Label associated with the semaphore
2713 @param name String name of the semaphore
2714
2715 Determine whether the subject identified by the credential can remove
2716 the named POSIX semaphore with label semlabel.
2717
2718 @return Return 0 if access is granted, otherwise an appropriate value for
2719 errno should be returned.
2720 */
2721 typedef int mpo_posixsem_check_unlink_t(
2722 kauth_cred_t cred,
2723 struct pseminfo *ps,
2724 struct label *semlabel,
2725 const char *name
2726 );
2727 /**
2728 @brief Access control check for POSIX semaphore wait
2729 @param cred Subject credential
2730 @param ps Pointer to semaphore information structure
2731 @param semlabel Label associated with the semaphore
2732
2733 Determine whether the subject identified by the credential can lock
2734 the named POSIX semaphore with label semlabel.
2735
2736 @return Return 0 if access is granted, otherwise an appropriate value for
2737 errno should be returned.
2738 */
2739 typedef int mpo_posixsem_check_wait_t(
2740 kauth_cred_t cred,
2741 struct pseminfo *ps,
2742 struct label *semlabel
2743 );
2744 /**
2745 @brief Create a POSIX semaphore label
2746 @param cred Subject credential
2747 @param ps Pointer to semaphore information structure
2748 @param semlabel Label to associate with the new semaphore
2749 @param name String name of the semaphore
2750
2751 Label a new POSIX semaphore. The label was previously
2752 initialized and associated with the semaphore. At this time, an
2753 appropriate initial label value should be assigned to the object and
2754 stored in semalabel.
2755 */
2756 typedef void mpo_posixsem_label_associate_t(
2757 kauth_cred_t cred,
2758 struct pseminfo *ps,
2759 struct label *semlabel,
2760 const char *name
2761 );
2762 /**
2763 @brief Destroy POSIX semaphore label
2764 @param label The label to be destroyed
2765
2766 Destroy a POSIX semaphore label. Since the object is
2767 going out of scope, policy modules should free any internal storage
2768 associated with the label so that it may be destroyed.
2769 */
2770 typedef void mpo_posixsem_label_destroy_t(
2771 struct label *label
2772 );
2773 /**
2774 @brief Initialize POSIX semaphore label
2775 @param label New label to initialize
2776
2777 Initialize the label for a newly instantiated POSIX semaphore. Sleeping
2778 is permitted.
2779 */
2780 typedef void mpo_posixsem_label_init_t(
2781 struct label *label
2782 );
2783 /**
2784 @brief Access control check for POSIX shared memory region create
2785 @param cred Subject credential
2786 @param name String name of the shared memory region
2787
2788 Determine whether the subject identified by the credential can create
2789 the POSIX shared memory region referenced by name.
2790
2791 @return Return 0 if access is granted, otherwise an appropriate value for
2792 errno should be returned.
2793 */
2794 typedef int mpo_posixshm_check_create_t(
2795 kauth_cred_t cred,
2796 const char *name
2797 );
2798 /**
2799 @brief Access control check for mapping POSIX shared memory
2800 @param cred Subject credential
2801 @param ps Pointer to shared memory information structure
2802 @param shmlabel Label associated with the shared memory region
2803 @param prot mmap protections; see mmap(2)
2804 @param flags shmat flags; see shmat(2)
2805
2806 Determine whether the subject identified by the credential can map
2807 the POSIX shared memory segment associated with shmlabel.
2808
2809 @return Return 0 if access is granted, otherwise an appropriate value for
2810 errno should be returned.
2811 */
2812 typedef int mpo_posixshm_check_mmap_t(
2813 kauth_cred_t cred,
2814 struct pshminfo *ps,
2815 struct label *shmlabel,
2816 int prot,
2817 int flags
2818 );
2819 /**
2820 @brief Access control check for POSIX shared memory region open
2821 @param cred Subject credential
2822 @param ps Pointer to shared memory information structure
2823 @param shmlabel Label associated with the shared memory region
2824
2825 Determine whether the subject identified by the credential can open
2826 the POSIX shared memory region.
2827
2828 @return Return 0 if access is granted, otherwise an appropriate value for
2829 errno should be returned.
2830 */
2831 typedef int mpo_posixshm_check_open_t(
2832 kauth_cred_t cred,
2833 struct pshminfo *ps,
2834 struct label *shmlabel
2835 );
2836 /**
2837 @brief Access control check for POSIX shared memory stat
2838 @param cred Subject credential
2839 @param ps Pointer to shared memory information structure
2840 @param shmlabel Label associated with the shared memory region
2841
2842 Determine whether the subject identified by the credential can obtain
2843 status for the POSIX shared memory segment associated with shmlabel.
2844
2845 @return Return 0 if access is granted, otherwise an appropriate value for
2846 errno should be returned.
2847 */
2848 typedef int mpo_posixshm_check_stat_t(
2849 kauth_cred_t cred,
2850 struct pshminfo *ps,
2851 struct label *shmlabel
2852 );
2853 /**
2854 @brief Access control check for POSIX shared memory truncate
2855 @param cred Subject credential
2856 @param ps Pointer to shared memory information structure
2857 @param shmlabel Label associated with the shared memory region
2858 @param len Length to truncate or extend shared memory segment
2859
2860 Determine whether the subject identified by the credential can truncate
2861 or extend (to len) the POSIX shared memory segment associated with shmlabel.
2862
2863 @return Return 0 if access is granted, otherwise an appropriate value for
2864 errno should be returned.
2865 */
2866 typedef int mpo_posixshm_check_truncate_t(
2867 kauth_cred_t cred,
2868 struct pshminfo *ps,
2869 struct label *shmlabel,
2870 size_t len
2871 );
2872 /**
2873 @brief Access control check for POSIX shared memory unlink
2874 @param cred Subject credential
2875 @param ps Pointer to shared memory information structure
2876 @param shmlabel Label associated with the shared memory region
2877 @param name String name of the shared memory region
2878
2879 Determine whether the subject identified by the credential can delete
2880 the POSIX shared memory segment associated with shmlabel.
2881
2882 @return Return 0 if access is granted, otherwise an appropriate value for
2883 errno should be returned.
2884 */
2885 typedef int mpo_posixshm_check_unlink_t(
2886 kauth_cred_t cred,
2887 struct pshminfo *ps,
2888 struct label *shmlabel,
2889 const char *name
2890 );
2891 /**
2892 @brief Create a POSIX shared memory region label
2893 @param cred Subject credential
2894 @param ps Pointer to shared memory information structure
2895 @param shmlabel Label to associate with the new shared memory region
2896 @param name String name of the shared memory region
2897
2898 Label a new POSIX shared memory region. The label was previously
2899 initialized and associated with the shared memory region. At this
2900 time, an appropriate initial label value should be assigned to the
2901 object and stored in shmlabel.
2902 */
2903 typedef void mpo_posixshm_label_associate_t(
2904 kauth_cred_t cred,
2905 struct pshminfo *ps,
2906 struct label *shmlabel,
2907 const char *name
2908 );
2909 /**
2910 @brief Destroy POSIX shared memory label
2911 @param label The label to be destroyed
2912
2913 Destroy a POSIX shared memory region label. Since the
2914 object is going out of scope, policy modules should free any
2915 internal storage associated with the label so that it may be
2916 destroyed.
2917 */
2918 typedef void mpo_posixshm_label_destroy_t(
2919 struct label *label
2920 );
2921 /**
2922 @brief Initialize POSIX Shared Memory region label
2923 @param label New label to initialize
2924
2925 Initialize the label for newly a instantiated POSIX Shared Memory
2926 region. Sleeping is permitted.
2927 */
2928 typedef void mpo_posixshm_label_init_t(
2929 struct label *label
2930 );
2931 /**
2932 @brief Access control check for debugging process
2933 @param cred Subject credential
2934 @param proc Object process
2935
2936 Determine whether the subject identified by the credential can debug
2937 the passed process. This call may be made in a number of situations,
2938 including use of the ptrace(2) and ktrace(2) APIs, as well as for some
2939 types of procfs operations.
2940
2941 @return Return 0 if access is granted, otherwise an appropriate value for
2942 errno should be returned. Suggested failure: EACCES for label mismatch,
2943 EPERM for lack of privilege, or ESRCH to hide visibility of the target.
2944 */
2945 typedef int mpo_proc_check_debug_t(
2946 kauth_cred_t cred,
2947 struct proc *proc
2948 );
2949 /**
2950 @brief Access control over fork
2951 @param cred Subject credential
2952 @param proc Subject process trying to fork
2953
2954 Determine whether the subject identified is allowed to fork.
2955
2956 @return Return 0 if access is granted, otherwise an appropriate value for
2957 errno should be returned.
2958 */
2959 typedef int mpo_proc_check_fork_t(
2960 kauth_cred_t cred,
2961 struct proc *proc
2962 );
2963 /**
2964 @brief Access control over pid_suspend and pid_resume
2965 @param cred Subject credential
2966 @param proc Subject process trying to run pid_suspend or pid_resume
2967 @param sr Call is suspend (0) or resume (1)
2968
2969 Determine whether the subject identified is allowed to suspend or resume
2970 other processes.
2971
2972 @return Return 0 if access is granted, otherwise an appropriate value for
2973 errno should be returned.
2974 */
2975 typedef int mpo_proc_check_suspend_resume_t(
2976 kauth_cred_t cred,
2977 struct proc *proc,
2978 int sr
2979 );
2980 /**
2981 @brief Access control check for retrieving audit information
2982 @param cred Subject credential
2983
2984 Determine whether the subject identified by the credential can get
2985 audit information such as the audit user ID, the preselection mask,
2986 the terminal ID and the audit session ID, using the getaudit() system call.
2987
2988 @return Return 0 if access is granted, otherwise an appropriate value for
2989 errno should be returned.
2990 */
2991 typedef int mpo_proc_check_getaudit_t(
2992 kauth_cred_t cred
2993 );
2994 /**
2995 @brief Access control check for retrieving audit user ID
2996 @param cred Subject credential
2997
2998 Determine whether the subject identified by the credential can get
2999 the user identity being used by the auditing system, using the getauid()
3000 system call.
3001
3002 @return Return 0 if access is granted, otherwise an appropriate value for
3003 errno should be returned.
3004 */
3005 typedef int mpo_proc_check_getauid_t(
3006 kauth_cred_t cred
3007 );
3008 /**
3009 @brief Access control check for retrieving Login Context ID
3010 @param p0 Calling process
3011 @param p Effected process
3012 @param pid syscall PID argument
3013
3014 Determine if getlcid(2) system call is permitted.
3015
3016 Information returned by this system call is similar to that returned via
3017 process listings etc.
3018
3019 @return Return 0 if access is granted, otherwise an appropriate value for
3020 errno should be returned.
3021 */
3022 typedef int mpo_proc_check_getlcid_t(
3023 struct proc *p0,
3024 struct proc *p,
3025 pid_t pid
3026 );
3027 /**
3028 @brief Access control check for setting memory protections
3029 @param cred Subject credential
3030 @param proc User process requesting the change
3031 @param addr Start address of the memory range
3032 @param size Length address of the memory range
3033 @param prot Memory protections, see mmap(2)
3034
3035 Determine whether the subject identified by the credential should
3036 be allowed to set the specified memory protections on memory mapped
3037 in the process proc.
3038
3039 @return Return 0 if access is granted, otherwise an appropriate value for
3040 errno should be returned.
3041 */
3042 typedef int mpo_proc_check_mprotect_t(
3043 kauth_cred_t cred,
3044 struct proc *proc,
3045 user_addr_t addr,
3046 user_size_t size,
3047 int prot
3048 );
3049 /**
3050 @brief Access control check for changing scheduling parameters
3051 @param cred Subject credential
3052 @param proc Object process
3053
3054 Determine whether the subject identified by the credential can change
3055 the scheduling parameters of the passed process.
3056
3057 @return Return 0 if access is granted, otherwise an appropriate value for
3058 errno should be returned. Suggested failure: EACCES for label mismatch,
3059 EPERM for lack of privilege, or ESRCH to limit visibility.
3060 */
3061 typedef int mpo_proc_check_sched_t(
3062 kauth_cred_t cred,
3063 struct proc *proc
3064 );
3065 /**
3066 @brief Access control check for setting audit information
3067 @param cred Subject credential
3068 @param ai Audit information
3069
3070 Determine whether the subject identified by the credential can set
3071 audit information such as the the preselection mask, the terminal ID
3072 and the audit session ID, using the setaudit() system call.
3073
3074 @return Return 0 if access is granted, otherwise an appropriate value for
3075 errno should be returned.
3076 */
3077 typedef int mpo_proc_check_setaudit_t(
3078 kauth_cred_t cred,
3079 struct auditinfo_addr *ai
3080 );
3081 /**
3082 @brief Access control check for setting audit user ID
3083 @param cred Subject credential
3084 @param auid Audit user ID
3085
3086 Determine whether the subject identified by the credential can set
3087 the user identity used by the auditing system, using the setauid()
3088 system call.
3089
3090 @return Return 0 if access is granted, otherwise an appropriate value for
3091 errno should be returned.
3092 */
3093 typedef int mpo_proc_check_setauid_t(
3094 kauth_cred_t cred,
3095 uid_t auid
3096 );
3097 /**
3098 @brief Access control check for setting the Login Context
3099 @param p0 Calling process
3100 @param p Effected process
3101 @param pid syscall PID argument
3102 @param lcid syscall LCID argument
3103
3104 Determine if setlcid(2) system call is permitted.
3105
3106 See xnu/bsd/kern/kern_prot.c:setlcid() implementation for example of
3107 decoding syscall arguments to determine action desired by caller.
3108
3109 Five distinct actions are possible: CREATE JOIN LEAVE ADOPT ORPHAN
3110
3111 @return Return 0 if access is granted, otherwise an appropriate value for
3112 errno should be returned.
3113 */
3114 typedef int mpo_proc_check_setlcid_t(
3115 struct proc *p0,
3116 struct proc *p,
3117 pid_t pid,
3118 pid_t lcid
3119 );
3120 /**
3121 @brief Access control check for delivering signal
3122 @param cred Subject credential
3123 @param proc Object process
3124 @param signum Signal number; see kill(2)
3125
3126 Determine whether the subject identified by the credential can deliver
3127 the passed signal to the passed process.
3128
3129 @warning Programs typically expect to be able to send and receive
3130 signals as part or their normal process lifecycle; caution should be
3131 exercised when implementing access controls over signal events.
3132
3133 @return Return 0 if access is granted, otherwise an appropriate value for
3134 errno should be returned. Suggested failure: EACCES for label mismatch,
3135 EPERM for lack of privilege, or ESRCH to limit visibility.
3136 */
3137 typedef int mpo_proc_check_signal_t(
3138 kauth_cred_t cred,
3139 struct proc *proc,
3140 int signum
3141 );
3142 /**
3143 @brief Access control check for wait
3144 @param cred Subject credential
3145 @param proc Object process
3146
3147 Determine whether the subject identified by the credential can wait
3148 for process termination.
3149
3150 @warning Caution should be exercised when implementing access
3151 controls for wait, since programs often wait for child processes to
3152 exit. Failure to be notified of a child process terminating may
3153 cause the parent process to hang, or may produce zombie processes.
3154
3155 @return Return 0 if access is granted, otherwise an appropriate value for
3156 errno should be returned.
3157 */
3158 typedef int mpo_proc_check_wait_t(
3159 kauth_cred_t cred,
3160 struct proc *proc
3161 );
3162 /**
3163 @brief Destroy process label
3164 @param label The label to be destroyed
3165
3166 Destroy a process label. Since the object is going
3167 out of scope, policy modules should free any internal storage
3168 associated with the label so that it may be destroyed.
3169 */
3170 typedef void mpo_proc_label_destroy_t(
3171 struct label *label
3172 );
3173 /**
3174 @brief Initialize process label
3175 @param label New label to initialize
3176 @see mpo_cred_label_init_t
3177
3178 Initialize the label for a newly instantiated BSD process structure.
3179 Normally, security policies will store the process label in the user
3180 credential rather than here in the process structure. However,
3181 there are some floating label policies that may need to temporarily
3182 store a label in the process structure until it is safe to update
3183 the user credential label. Sleeping is permitted.
3184 */
3185 typedef void mpo_proc_label_init_t(
3186 struct label *label
3187 );
3188 /**
3189 @brief Access control check for socket accept
3190 @param cred Subject credential
3191 @param socket Object socket
3192 @param socklabel Policy label for socket
3193
3194 Determine whether the subject identified by the credential can accept()
3195 a new connection on the socket from the host specified by addr.
3196
3197 @return Return 0 if access if granted, otherwise an appropriate
3198 value for errno should be returned.
3199 */
3200 typedef int mpo_socket_check_accept_t(
3201 kauth_cred_t cred,
3202 socket_t so,
3203 struct label *socklabel
3204 );
3205 /**
3206 @brief Access control check for a pending socket accept
3207 @param cred Subject credential
3208 @param so Object socket
3209 @param socklabel Policy label for socket
3210 @param addr Address of the listening socket (coming soon)
3211
3212 Determine whether the subject identified by the credential can accept()
3213 a pending connection on the socket from the host specified by addr.
3214
3215 @return Return 0 if access if granted, otherwise an appropriate
3216 value for errno should be returned.
3217 */
3218 typedef int mpo_socket_check_accepted_t(
3219 kauth_cred_t cred,
3220 socket_t so,
3221 struct label *socklabel,
3222 struct sockaddr *addr
3223 );
3224 /**
3225 @brief Access control check for socket bind
3226 @param cred Subject credential
3227 @param so Object socket
3228 @param socklabel Policy label for socket
3229 @param addr Name to assign to the socket
3230
3231 Determine whether the subject identified by the credential can bind()
3232 the name (addr) to the socket.
3233
3234 @return Return 0 if access if granted, otherwise an appropriate
3235 value for errno should be returned.
3236 */
3237 typedef int mpo_socket_check_bind_t(
3238 kauth_cred_t cred,
3239 socket_t so,
3240 struct label *socklabel,
3241 struct sockaddr *addr
3242 );
3243 /**
3244 @brief Access control check for socket connect
3245 @param cred Subject credential
3246 @param so Object socket
3247 @param socklabel Policy label for socket
3248 @param addr Name to assign to the socket
3249
3250 Determine whether the subject identified by the credential can
3251 connect() the passed socket to the remote host specified by addr.
3252
3253 @return Return 0 if access if granted, otherwise an appropriate
3254 value for errno should be returned.
3255 */
3256 typedef int mpo_socket_check_connect_t(
3257 kauth_cred_t cred,
3258 socket_t so,
3259 struct label *socklabel,
3260 struct sockaddr *addr
3261 );
3262 /**
3263 @brief Access control check for socket() system call.
3264 @param cred Subject credential
3265 @param domain communication domain
3266 @param type socket type
3267 @param protocol socket protocol
3268
3269 Determine whether the subject identified by the credential can
3270 make the socket() call.
3271
3272 @return Return 0 if access if granted, otherwise an appropriate
3273 value for errno should be returned.
3274 */
3275 typedef int mpo_socket_check_create_t(
3276 kauth_cred_t cred,
3277 int domain,
3278 int type,
3279 int protocol
3280 );
3281 /**
3282 @brief Access control check for delivering data to a user's receieve queue
3283 @param so The socket data is being delivered to
3284 @param so_label The label of so
3285 @param m The mbuf whose data will be deposited into the receive queue
3286 @param m_label The label of the sender of the data.
3287
3288 A socket has a queue for receiving incoming data. When a packet arrives
3289 on the wire, it eventually gets deposited into this queue, which the
3290 owner of the socket drains when they read from the socket's file descriptor.
3291
3292 This function determines whether the socket can receive data from
3293 the sender specified by m_label.
3294
3295 @warning There is an outstanding design issue surrounding the placement
3296 of this function. The check must be placed either before or after the
3297 TCP sequence and ACK counters are updated. Placing the check before
3298 the counters are updated causes the incoming packet to be resent by
3299 the remote if the check rejects it. Placing the check after the counters
3300 are updated results in a completely silent drop. As far as each TCP stack
3301 is concerned the packet was received, however, the data will not be in the
3302 socket's receive queue. Another consideration is that the current design
3303 requires using the "failed label" occasionally. In that case, on rejection,
3304 we want the remote TCP to resend the data. Because of this, we chose to
3305 place this check before the counters are updated, so rejected packets will be
3306 resent by the remote host.
3307
3308 If a policy keeps rejecting the same packet, eventually the connection will
3309 be dropped. Policies have several options if this design causes problems.
3310 For example, one options is to sanitize the mbuf such that it is acceptable,
3311 then accept it. That may require negotiation between policies as the
3312 Framework will not know to re-check the packet.
3313
3314 The policy must handle NULL MBUF labels. This will likely be the case
3315 for non-local TCP sockets for example.
3316
3317 @return Return 0 if access if granted, otherwise an appropriate
3318 value for errno should be returned.
3319 */
3320 typedef int mpo_socket_check_deliver_t(
3321 socket_t so,
3322 struct label *so_label,
3323 struct mbuf *m,
3324 struct label *m_label
3325 );
3326 /**
3327 @brief Access control check for socket kqfilter
3328 @param cred Subject credential
3329 @param kn Object knote
3330 @param so Object socket
3331 @param socklabel Policy label for socket
3332
3333 Determine whether the subject identified by the credential can
3334 receive the knote on the passed socket.
3335
3336 @return Return 0 if access if granted, otherwise an appropriate
3337 value for errno should be returned.
3338 */
3339 typedef int mpo_socket_check_kqfilter_t(
3340 kauth_cred_t cred,
3341 struct knote *kn,
3342 socket_t so,
3343 struct label *socklabel
3344 );
3345 /**
3346 @brief Access control check for socket relabel
3347 @param cred Subject credential
3348 @param so Object socket
3349 @param so_label The current label of so
3350 @param newlabel The label to be assigned to so
3351
3352 Determine whether the subject identified by the credential can
3353 change the label on the socket.
3354
3355 @return Return 0 if access if granted, otherwise an appropriate
3356 value for errno should be returned.
3357 */
3358 typedef int mpo_socket_check_label_update_t(
3359 kauth_cred_t cred,
3360 socket_t so,
3361 struct label *so_label,
3362 struct label *newlabel
3363 );
3364 /**
3365 @brief Access control check for socket listen
3366 @param cred Subject credential
3367 @param so Object socket
3368 @param socklabel Policy label for socket
3369
3370 Determine whether the subject identified by the credential can
3371 listen() on the passed socket.
3372
3373 @return Return 0 if access if granted, otherwise an appropriate
3374 value for errno should be returned.
3375 */
3376 typedef int mpo_socket_check_listen_t(
3377 kauth_cred_t cred,
3378 socket_t so,
3379 struct label *socklabel
3380 );
3381 /**
3382 @brief Access control check for socket receive
3383 @param cred Subject credential
3384 @param so Object socket
3385 @param socklabel Policy label for socket
3386
3387 Determine whether the subject identified by the credential can
3388 receive data from the socket.
3389
3390 @return Return 0 if access if granted, otherwise an appropriate
3391 value for errno should be returned.
3392 */
3393 typedef int mpo_socket_check_receive_t(
3394 kauth_cred_t cred,
3395 socket_t so,
3396 struct label *socklabel
3397 );
3398
3399 /**
3400 @brief Access control check for socket receive
3401 @param cred Subject credential
3402 @param socket Object socket
3403 @param socklabel Policy label for socket
3404 @param addr Name of the remote socket
3405
3406 Determine whether the subject identified by the credential can
3407 receive data from the remote host specified by addr.
3408
3409 @return Return 0 if access if granted, otherwise an appropriate
3410 value for errno should be returned.
3411 */
3412 typedef int mpo_socket_check_received_t(
3413 kauth_cred_t cred,
3414 struct socket *sock,
3415 struct label *socklabel,
3416 struct sockaddr *saddr
3417 );
3418
3419
3420 /**
3421 @brief Access control check for socket select
3422 @param cred Subject credential
3423 @param so Object socket
3424 @param socklabel Policy label for socket
3425 @param which The operation selected on: FREAD or FWRITE
3426
3427 Determine whether the subject identified by the credential can use the
3428 socket in a call to select().
3429
3430 @return Return 0 if access if granted, otherwise an appropriate
3431 value for errno should be returned.
3432 */
3433 typedef int mpo_socket_check_select_t(
3434 kauth_cred_t cred,
3435 socket_t so,
3436 struct label *socklabel,
3437 int which
3438 );
3439 /**
3440 @brief Access control check for socket send
3441 @param cred Subject credential
3442 @param so Object socket
3443 @param socklabel Policy label for socket
3444 @param addr Address being sent to
3445
3446 Determine whether the subject identified by the credential can send
3447 data to the socket.
3448
3449 @return Return 0 if access if granted, otherwise an appropriate
3450 value for errno should be returned.
3451 */
3452 typedef int mpo_socket_check_send_t(
3453 kauth_cred_t cred,
3454 socket_t so,
3455 struct label *socklabel,
3456 struct sockaddr *addr
3457 );
3458 /**
3459 @brief Access control check for retrieving socket status
3460 @param cred Subject credential
3461 @param so Object socket
3462 @param socklabel Policy label for so
3463
3464 Determine whether the subject identified by the credential can
3465 execute the stat() system call on the given socket.
3466
3467 @return Return 0 if access if granted, otherwise an appropriate
3468 value for errno should be returned.
3469 */
3470 typedef int mpo_socket_check_stat_t(
3471 kauth_cred_t cred,
3472 socket_t so,
3473 struct label *socklabel
3474 );
3475 /**
3476 @brief Access control check for setting socket options
3477 @param cred Subject credential
3478 @param so Object socket
3479 @param socklabel Policy label for so
3480 @param sopt The options being set
3481
3482 Determine whether the subject identified by the credential can
3483 execute the setsockopt system call on the given socket.
3484
3485 @return Return 0 if access if granted, otherwise an appropriate
3486 value for errno should be returned.
3487 */
3488 typedef int mpo_socket_check_setsockopt_t(
3489 kauth_cred_t cred,
3490 socket_t so,
3491 struct label *socklabel,
3492 struct sockopt *sopt
3493 );
3494 /**
3495 @brief Access control check for getting socket options
3496 @param cred Subject credential
3497 @param so Object socket
3498 @param socklabel Policy label for so
3499 @param sopt The options to get
3500
3501 Determine whether the subject identified by the credential can
3502 execute the getsockopt system call on the given socket.
3503
3504 @return Return 0 if access if granted, otherwise an appropriate
3505 value for errno should be returned.
3506 */
3507 typedef int mpo_socket_check_getsockopt_t(
3508 kauth_cred_t cred,
3509 socket_t so,
3510 struct label *socklabel,
3511 struct sockopt *sopt
3512 );
3513 /**
3514 @brief Label a socket
3515 @param oldsock Listening socket
3516 @param oldlabel Policy label associated with oldsock
3517 @param newsock New socket
3518 @param newlabel Policy label associated with newsock
3519
3520 A new socket is created when a connection is accept(2)ed. This
3521 function labels the new socket based on the existing listen(2)ing
3522 socket.
3523 */
3524 typedef void mpo_socket_label_associate_accept_t(
3525 socket_t oldsock,
3526 struct label *oldlabel,
3527 socket_t newsock,
3528 struct label *newlabel
3529 );
3530 /**
3531 @brief Assign a label to a new socket
3532 @param cred Credential of the owning process
3533 @param so The socket being labeled
3534 @param solabel The label
3535 @warning cred can be NULL
3536
3537 Set the label on a newly created socket from the passed subject
3538 credential. This call is made when a socket is created. The
3539 credentials may be null if the socket is being created by the
3540 kernel.
3541 */
3542 typedef void mpo_socket_label_associate_t(
3543 kauth_cred_t cred,
3544 socket_t so,
3545 struct label *solabel
3546 );
3547 /**
3548 @brief Copy a socket label
3549 @param src Source label
3550 @param dest Destination label
3551
3552 Copy the socket label information in src into dest.
3553 */
3554 typedef void mpo_socket_label_copy_t(
3555 struct label *src,
3556 struct label *dest
3557 );
3558 /**
3559 @brief Destroy socket label
3560 @param label The label to be destroyed
3561
3562 Destroy a socket label. Since the object is going out of
3563 scope, policy modules should free any internal storage associated
3564 with the label so that it may be destroyed.
3565 */
3566 typedef void mpo_socket_label_destroy_t(
3567 struct label *label
3568 );
3569 /**
3570 @brief Externalize a socket label
3571 @param label Label to be externalized
3572 @param element_name Name of the label namespace for which labels should be
3573 externalized
3574 @param sb String buffer to be filled with a text representation of label
3575
3576 Produce an externalized socket label based on the label structure passed.
3577 An externalized label consists of a text representation of the label
3578 contents that can be used with userland applications and read by the
3579 user. If element_name does not match a namespace managed by the policy,
3580 simply return 0. Only return nonzero if an error occurs while externalizing
3581 the label data.
3582
3583 @return In the event of an error, an appropriate value for errno
3584 should be returned, otherwise return 0 upon success.
3585 */
3586 typedef int mpo_socket_label_externalize_t(
3587 struct label *label,
3588 char *element_name,
3589 struct sbuf *sb
3590 );
3591 /**
3592 @brief Initialize socket label
3593 @param label New label to initialize
3594 @param waitok Malloc flags
3595
3596 Initialize the label of a newly instantiated socket. The waitok
3597 field may be one of M_WAITOK and M_NOWAIT, and should be employed to
3598 avoid performing a sleeping malloc(9) during this initialization
3599 call. It it not always safe to sleep during this entry point.
3600
3601 @warning Since it is possible for the waitok flags to be set to
3602 M_NOWAIT, the malloc operation may fail.
3603
3604 @return In the event of an error, an appropriate value for errno
3605 should be returned, otherwise return 0 upon success.
3606 */
3607 typedef int mpo_socket_label_init_t(
3608 struct label *label,
3609 int waitok
3610 );
3611 /**
3612 @brief Internalize a socket label
3613 @param label Label to be filled in
3614 @param element_name Name of the label namespace for which the label should
3615 be internalized
3616 @param element_data Text data to be internalized
3617
3618 Produce an internal socket label structure based on externalized label
3619 data in text format.
3620
3621 The policy's internalize entry points will be called only if the
3622 policy has registered interest in the label namespace.
3623
3624 @return In the event of an error, an appropriate value for errno
3625 should be returned, otherwise return 0 upon success.
3626 */
3627 typedef int mpo_socket_label_internalize_t(
3628 struct label *label,
3629 char *element_name,
3630 char *element_data
3631 );
3632 /**
3633 @brief Relabel socket
3634 @param cred Subject credential
3635 @param so Object; socket
3636 @param so_label Current label of the socket
3637 @param newlabel The label to be assigned to so
3638
3639 The subject identified by the credential has previously requested
3640 and was authorized to relabel the socket; this entry point allows
3641 policies to perform the actual label update operation.
3642
3643 @warning XXX This entry point will likely change in future versions.
3644 */
3645 typedef void mpo_socket_label_update_t(
3646 kauth_cred_t cred,
3647 socket_t so,
3648 struct label *so_label,
3649 struct label *newlabel
3650 );
3651 /**
3652 @brief Set the peer label on a socket from mbuf
3653 @param m Mbuf chain received on socket so
3654 @param m_label Label for m
3655 @param so Current label for the socket
3656 @param so_label Policy label to be filled out for the socket
3657
3658 Set the peer label of a socket based on the label of the sender of the
3659 mbuf.
3660
3661 This is called for every TCP/IP packet received. The first call for a given
3662 socket operates on a newly initialized label, and subsequent calls operate
3663 on existing label data.
3664
3665 @warning Because this can affect performance significantly, it has
3666 different sematics than other 'set' operations. Typically, 'set' operations
3667 operate on newly initialzed labels and policies do not need to worry about
3668 clobbering existing values. In this case, it is too inefficient to
3669 initialize and destroy a label every time data is received for the socket.
3670 Instead, it is up to the policies to determine how to replace the label data.
3671 Most policies should be able to replace the data inline.
3672 */
3673 typedef void mpo_socketpeer_label_associate_mbuf_t(
3674 struct mbuf *m,
3675 struct label *m_label,
3676 socket_t so,
3677 struct label *so_label
3678 );
3679 /**
3680 @brief Set the peer label on a socket from socket
3681 @param source Local socket
3682 @param sourcelabel Policy label for source
3683 @param target Peer socket
3684 @param targetlabel Policy label to fill in for target
3685
3686 Set the peer label on a stream UNIX domain socket from the passed
3687 remote socket endpoint. This call will be made when the socket pair
3688 is connected, and will be made for both endpoints.
3689
3690 Note that this call is only made on connection; it is currently not updated
3691 during communication.
3692 */
3693 typedef void mpo_socketpeer_label_associate_socket_t(
3694 socket_t source,
3695 struct label *sourcelabel,
3696 socket_t target,
3697 struct label *targetlabel
3698 );
3699 /**
3700 @brief Destroy socket peer label
3701 @param label The peer label to be destroyed
3702
3703 Destroy a socket peer label. Since the object is going out of
3704 scope, policy modules should free any internal storage associated
3705 with the label so that it may be destroyed.
3706 */
3707 typedef void mpo_socketpeer_label_destroy_t(
3708 struct label *label
3709 );
3710 /**
3711 @brief Externalize a socket peer label
3712 @param label Label to be externalized
3713 @param element_name Name of the label namespace for which labels should be
3714 externalized
3715 @param sb String buffer to be filled with a text representation of label
3716
3717 Produce an externalized socket peer label based on the label structure
3718 passed. An externalized label consists of a text representation of the
3719 label contents that can be used with userland applications and read by the
3720 user. If element_name does not match a namespace managed by the policy,
3721 simply return 0. Only return nonzero if an error occurs while externalizing
3722 the label data.
3723
3724 @return In the event of an error, an appropriate value for errno
3725 should be returned, otherwise return 0 upon success.
3726 */
3727 typedef int mpo_socketpeer_label_externalize_t(
3728 struct label *label,
3729 char *element_name,
3730 struct sbuf *sb
3731 );
3732 /**
3733 @brief Initialize socket peer label
3734 @param label New label to initialize
3735 @param waitok Malloc flags
3736
3737 Initialize the peer label of a newly instantiated socket. The
3738 waitok field may be one of M_WAITOK and M_NOWAIT, and should be
3739 employed to avoid performing a sleeping malloc(9) during this
3740 initialization call. It it not always safe to sleep during this
3741 entry point.
3742
3743 @warning Since it is possible for the waitok flags to be set to
3744 M_NOWAIT, the malloc operation may fail.
3745
3746 @return In the event of an error, an appropriate value for errno
3747 should be returned, otherwise return 0 upon success.
3748 */
3749 typedef int mpo_socketpeer_label_init_t(
3750 struct label *label,
3751 int waitok
3752 );
3753 /**
3754 @brief Access control check for enabling accounting
3755 @param cred Subject credential
3756 @param vp Accounting file
3757 @param vlabel Label associated with vp
3758
3759 Determine whether the subject should be allowed to enable accounting,
3760 based on its label and the label of the accounting log file. See
3761 acct(5) for more information.
3762
3763 As accounting is disabled by passing NULL to the acct(2) system call,
3764 the policy should be prepared for both 'vp' and 'vlabel' to be NULL.
3765
3766 @return Return 0 if access is granted, otherwise an appropriate value for
3767 errno should be returned.
3768 */
3769 typedef int mpo_system_check_acct_t(
3770 kauth_cred_t cred,
3771 struct vnode *vp,
3772 struct label *vlabel
3773 );
3774 /**
3775 @brief Access control check for audit
3776 @param cred Subject credential
3777 @param record Audit record
3778 @param length Audit record length
3779
3780 Determine whether the subject identified by the credential can submit
3781 an audit record for inclusion in the audit log via the audit() system call.
3782
3783 @return Return 0 if access is granted, otherwise an appropriate value for
3784 errno should be returned.
3785 */
3786 typedef int mpo_system_check_audit_t(
3787 kauth_cred_t cred,
3788 void *record,
3789 int length
3790 );
3791 /**
3792 @brief Access control check for controlling audit
3793 @param cred Subject credential
3794 @param vp Audit file
3795 @param vl Label associated with vp
3796
3797 Determine whether the subject should be allowed to enable auditing using
3798 the auditctl() system call, based on its label and the label of the proposed
3799 audit file.
3800
3801 @return Return 0 if access is granted, otherwise an appropriate value for
3802 errno should be returned.
3803 */
3804 typedef int mpo_system_check_auditctl_t(
3805 kauth_cred_t cred,
3806 struct vnode *vp,
3807 struct label *vl
3808 );
3809 /**
3810 @brief Access control check for manipulating auditing
3811 @param cred Subject credential
3812 @param cmd Audit control command
3813
3814 Determine whether the subject identified by the credential can perform
3815 the audit subsystem control operation cmd via the auditon() system call.
3816
3817 @return Return 0 if access is granted, otherwise an appropriate value for
3818 errno should be returned.
3819 */
3820 typedef int mpo_system_check_auditon_t(
3821 kauth_cred_t cred,
3822 int cmd
3823 );
3824 /**
3825 @brief Access control check for obtaining the host control port
3826 @param cred Subject credential
3827
3828 Determine whether the subject identified by the credential can
3829 obtain the host control port.
3830
3831 @return Return 0 if access is granted, or non-zero otherwise.
3832 */
3833 typedef int mpo_system_check_host_priv_t(
3834 kauth_cred_t cred
3835 );
3836 /**
3837 @brief Access control check for calling NFS services
3838 @param cred Subject credential
3839
3840 Determine whether the subject identified by the credential should be
3841 allowed to call nfssrv(2).
3842
3843 @return Return 0 if access is granted, otherwise an appropriate value for
3844 errno should be returned.
3845 */
3846 typedef int mpo_system_check_nfsd_t(
3847 kauth_cred_t cred
3848 );
3849 /**
3850 @brief Access control check for reboot
3851 @param cred Subject credential
3852 @param howto howto parameter from reboot(2)
3853
3854 Determine whether the subject identified by the credential should be
3855 allowed to reboot the system in the specified manner.
3856
3857 @return Return 0 if access is granted, otherwise an appropriate value for
3858 errno should be returned.
3859 */
3860 typedef int mpo_system_check_reboot_t(
3861 kauth_cred_t cred,
3862 int howto
3863 );
3864 /**
3865 @brief Access control check for setting system clock
3866 @param cred Subject credential
3867
3868 Determine whether the subject identified by the credential should be
3869 allowed to set the system clock.
3870
3871 @return Return 0 if access is granted, otherwise an appropriate value for
3872 errno should be returned.
3873 */
3874 typedef int mpo_system_check_settime_t(
3875 kauth_cred_t cred
3876 );
3877 /**
3878 @brief Access control check for removing swap devices
3879 @param cred Subject credential
3880 @param vp Swap device
3881 @param label Label associated with vp
3882
3883 Determine whether the subject identified by the credential should be
3884 allowed to remove vp as a swap device.
3885
3886 @return Return 0 if access is granted, otherwise an appropriate value for
3887 errno should be returned.
3888 */
3889 typedef int mpo_system_check_swapoff_t(
3890 kauth_cred_t cred,
3891 struct vnode *vp,
3892 struct label *label
3893 );
3894 /**
3895 @brief Access control check for adding swap devices
3896 @param cred Subject credential
3897 @param vp Swap device
3898 @param label Label associated with vp
3899
3900 Determine whether the subject identified by the credential should be
3901 allowed to add vp as a swap device.
3902
3903 @return Return 0 if access is granted, otherwise an appropriate value for
3904 errno should be returned.
3905 */
3906 typedef int mpo_system_check_swapon_t(
3907 kauth_cred_t cred,
3908 struct vnode *vp,
3909 struct label *label
3910 );
3911 /**
3912 @brief Access control check for sysctl
3913 @param cred Subject credential
3914 @param name Integer name; see sysctl(3)
3915 @param namelen Length of name array of integers; see sysctl(3)
3916 @param old 0 or address where to store old value; see sysctl(3)
3917 @param oldlenp Pointer to length of old buffer; see sysctl(3)
3918 @param inkernel Boolean; 1 if called from kernel
3919 @param newvalue 0 or address of new value; see sysctl(3)
3920 @param newlen Length of new buffer; see sysctl(3)
3921
3922 Determine whether the subject identified by the credential should be
3923 allowed to make the specified sysctl(3) transaction.
3924
3925 The sysctl(3) call specifies that if the old value is not desired,
3926 oldp and oldlenp should be set to NULL. Likewise, if a new value is
3927 not to be set, newp should be set to NULL and newlen set to 0.
3928
3929 @return Return 0 if access is granted, otherwise an appropriate value for
3930 errno should be returned.
3931 */
3932 typedef int mpo_system_check_sysctl_t(
3933 kauth_cred_t cred,
3934 int *name,
3935 u_int namelen,
3936 user_addr_t old, /* NULLOK */
3937 user_addr_t oldlenp, /* NULLOK */
3938 int inkernel,
3939 user_addr_t newvalue, /* NULLOK */
3940 size_t newlen
3941 );
3942 /**
3943 @brief Create a System V message label
3944 @param cred Subject credential
3945 @param msqkptr The message queue the message will be placed in
3946 @param msqlabel The label of the message queue
3947 @param msgptr The message
3948 @param msglabel The label of the message
3949
3950 Label the message as its placed in the message queue.
3951 */
3952 typedef void mpo_sysvmsg_label_associate_t(
3953 kauth_cred_t cred,
3954 struct msqid_kernel *msqptr,
3955 struct label *msqlabel,
3956 struct msg *msgptr,
3957 struct label *msglabel
3958 );
3959 /**
3960 @brief Destroy System V message label
3961 @param label The label to be destroyed
3962
3963 Destroy a System V message label. Since the object is
3964 going out of scope, policy modules should free any internal storage
3965 associated with the label so that it may be destroyed.
3966 */
3967 typedef void mpo_sysvmsg_label_destroy_t(
3968 struct label *label
3969 );
3970 /**
3971 @brief Initialize System V message label
3972 @param label New label to initialize
3973
3974 Initialize the label for a newly instantiated System V message.
3975 */
3976 typedef void mpo_sysvmsg_label_init_t(
3977 struct label *label
3978 );
3979 /**
3980 @brief Clean up a System V message label
3981 @param label The label to be destroyed
3982
3983 Clean up a System V message label. Darwin pre-allocates
3984 messages at system boot time and re-uses them rather than
3985 allocating new ones. Before messages are returned to the "free
3986 pool", policies can cleanup or overwrite any information present in
3987 the label.
3988 */
3989 typedef void mpo_sysvmsg_label_recycle_t(
3990 struct label *label
3991 );
3992 /**
3993 @brief Access control check for System V message enqueuing
3994 @param cred Subject credential
3995 @param msgptr The message
3996 @param msglabel The message's label
3997 @param msqkptr The message queue
3998 @param msqlabel The message queue's label
3999
4000 Determine whether the subject identified by the credential can add the
4001 given message to the given message queue.
4002
4003 @return Return 0 if access is granted, otherwise an appropriate value for
4004 errno should be returned.
4005 */
4006 typedef int mpo_sysvmsq_check_enqueue_t(
4007 kauth_cred_t cred,
4008 struct msg *msgptr,
4009 struct label *msglabel,
4010 struct msqid_kernel *msqptr,
4011 struct label *msqlabel
4012 );
4013 /**
4014 @brief Access control check for System V message reception
4015 @param cred The credential of the intended recipient
4016 @param msgptr The message
4017 @param msglabel The message's label
4018
4019 Determine whether the subject identified by the credential can receive
4020 the given message.
4021
4022 @return Return 0 if access is granted, otherwise an appropriate value for
4023 errno should be returned.
4024 */
4025 typedef int mpo_sysvmsq_check_msgrcv_t(
4026 kauth_cred_t cred,
4027 struct msg *msgptr,
4028 struct label *msglabel
4029 );
4030 /**
4031 @brief Access control check for System V message queue removal
4032 @param cred The credential of the caller
4033 @param msgptr The message
4034 @param msglabel The message's label
4035
4036 System V message queues are removed using the msgctl() system call.
4037 The system will iterate over each messsage in the queue, calling this
4038 function for each, to determine whether the caller has the appropriate
4039 credentials.
4040
4041 @return Return 0 if access is granted, otherwise an appropriate value for
4042 errno should be returned.
4043 */
4044 typedef int mpo_sysvmsq_check_msgrmid_t(
4045 kauth_cred_t cred,
4046 struct msg *msgptr,
4047 struct label *msglabel
4048 );
4049 /**
4050 @brief Access control check for msgctl()
4051 @param cred The credential of the caller
4052 @param msqptr The message queue
4053 @param msqlabel The message queue's label
4054
4055 This access check is performed to validate calls to msgctl().
4056
4057 @return Return 0 if access is granted, otherwise an appropriate value for
4058 errno should be returned.
4059 */
4060 typedef int mpo_sysvmsq_check_msqctl_t(
4061 kauth_cred_t cred,
4062 struct msqid_kernel *msqptr,
4063 struct label *msqlabel,
4064 int cmd
4065 );
4066 /**
4067 @brief Access control check to get a System V message queue
4068 @param cred The credential of the caller
4069 @param msqptr The message queue requested
4070 @param msqlabel The message queue's label
4071
4072 On a call to msgget(), if the queue requested already exists,
4073 and it is a public queue, this check will be performed before the
4074 queue's ID is returned to the user.
4075
4076 @return Return 0 if access is granted, otherwise an appropriate value for
4077 errno should be returned.
4078 */
4079 typedef int mpo_sysvmsq_check_msqget_t(
4080 kauth_cred_t cred,
4081 struct msqid_kernel *msqptr,
4082 struct label *msqlabel
4083 );
4084 /**
4085 @brief Access control check to receive a System V message from the given queue
4086 @param cred The credential of the caller
4087 @param msqptr The message queue to receive from
4088 @param msqlabel The message queue's label
4089
4090 On a call to msgrcv(), this check is performed to determine whether the
4091 caller has receive rights on the given queue.
4092
4093 @return Return 0 if access is granted, otherwise an appropriate value for
4094 errno should be returned.
4095 */
4096 typedef int mpo_sysvmsq_check_msqrcv_t(
4097 kauth_cred_t cred,
4098 struct msqid_kernel *msqptr,
4099 struct label *msqlabel
4100 );
4101 /**
4102 @brief Access control check to send a System V message to the given queue
4103 @param cred The credential of the caller
4104 @param msqptr The message queue to send to
4105 @param msqlabel The message queue's label
4106
4107 On a call to msgsnd(), this check is performed to determine whether the
4108 caller has send rights on the given queue.
4109
4110 @return Return 0 if access is granted, otherwise an appropriate value for
4111 errno should be returned.
4112 */
4113 typedef int mpo_sysvmsq_check_msqsnd_t(
4114 kauth_cred_t cred,
4115 struct msqid_kernel *msqptr,
4116 struct label *msqlabel
4117 );
4118 /**
4119 @brief Create a System V message queue label
4120 @param cred Subject credential
4121 @param msqkptr The message queue
4122 @param msqlabel The label of the message queue
4123
4124 */
4125 typedef void mpo_sysvmsq_label_associate_t(
4126 kauth_cred_t cred,
4127 struct msqid_kernel *msqptr,
4128 struct label *msqlabel
4129 );
4130 /**
4131 @brief Destroy System V message queue label
4132 @param label The label to be destroyed
4133
4134 Destroy a System V message queue label. Since the object is
4135 going out of scope, policy modules should free any internal storage
4136 associated with the label so that it may be destroyed.
4137 */
4138 typedef void mpo_sysvmsq_label_destroy_t(
4139 struct label *label
4140 );
4141 /**
4142 @brief Initialize System V message queue label
4143 @param label New label to initialize
4144
4145 Initialize the label for a newly instantiated System V message queue.
4146 */
4147 typedef void mpo_sysvmsq_label_init_t(
4148 struct label *label
4149 );
4150 /**
4151 @brief Clean up a System V message queue label
4152 @param label The label to be destroyed
4153
4154 Clean up a System V message queue label. Darwin pre-allocates
4155 message queues at system boot time and re-uses them rather than
4156 allocating new ones. Before message queues are returned to the "free
4157 pool", policies can cleanup or overwrite any information present in
4158 the label.
4159 */
4160 typedef void mpo_sysvmsq_label_recycle_t(
4161 struct label *label
4162 );
4163 /**
4164 @brief Access control check for System V semaphore control operation
4165 @param cred Subject credential
4166 @param semakptr Pointer to semaphore identifier
4167 @param semaklabel Label associated with semaphore
4168 @param cmd Control operation to be performed; see semctl(2)
4169
4170 Determine whether the subject identified by the credential can perform
4171 the operation indicated by cmd on the System V semaphore semakptr.
4172
4173 @return Return 0 if access is granted, otherwise an appropriate value for
4174 errno should be returned.
4175 */
4176 typedef int mpo_sysvsem_check_semctl_t(
4177 kauth_cred_t cred,
4178 struct semid_kernel *semakptr,
4179 struct label *semaklabel,
4180 int cmd
4181 );
4182 /**
4183 @brief Access control check for obtaining a System V semaphore
4184 @param cred Subject credential
4185 @param semakptr Pointer to semaphore identifier
4186 @param semaklabel Label to associate with the semaphore
4187
4188 Determine whether the subject identified by the credential can
4189 obtain a System V semaphore.
4190
4191 @return Return 0 if access is granted, otherwise an appropriate value for
4192 errno should be returned.
4193 */
4194 typedef int mpo_sysvsem_check_semget_t(
4195 kauth_cred_t cred,
4196 struct semid_kernel *semakptr,
4197 struct label *semaklabel
4198 );
4199 /**
4200 @brief Access control check for System V semaphore operations
4201 @param cred Subject credential
4202 @param semakptr Pointer to semaphore identifier
4203 @param semaklabel Label associated with the semaphore
4204 @param accesstype Flags to indicate access (read and/or write)
4205
4206 Determine whether the subject identified by the credential can
4207 perform the operations on the System V semaphore indicated by
4208 semakptr. The accesstype flags hold the maximum set of permissions
4209 from the sem_op array passed to the semop system call. It may
4210 contain SEM_R for read-only operations or SEM_A for read/write
4211 operations.
4212
4213 @return Return 0 if access is granted, otherwise an appropriate value for
4214 errno should be returned.
4215 */
4216 typedef int mpo_sysvsem_check_semop_t(
4217 kauth_cred_t cred,
4218 struct semid_kernel *semakptr,
4219 struct label *semaklabel,
4220 size_t accesstype
4221 );
4222 /**
4223 @brief Create a System V semaphore label
4224 @param cred Subject credential
4225 @param semakptr The semaphore being created
4226 @param semalabel Label to associate with the new semaphore
4227
4228 Label a new System V semaphore. The label was previously
4229 initialized and associated with the semaphore. At this time, an
4230 appropriate initial label value should be assigned to the object and
4231 stored in semalabel.
4232 */
4233 typedef void mpo_sysvsem_label_associate_t(
4234 kauth_cred_t cred,
4235 struct semid_kernel *semakptr,
4236 struct label *semalabel
4237 );
4238 /**
4239 @brief Destroy System V semaphore label
4240 @param label The label to be destroyed
4241
4242 Destroy a System V semaphore label. Since the object is
4243 going out of scope, policy modules should free any internal storage
4244 associated with the label so that it may be destroyed.
4245 */
4246 typedef void mpo_sysvsem_label_destroy_t(
4247 struct label *label
4248 );
4249 /**
4250 @brief Initialize System V semaphore label
4251 @param label New label to initialize
4252
4253 Initialize the label for a newly instantiated System V semaphore. Sleeping
4254 is permitted.
4255 */
4256 typedef void mpo_sysvsem_label_init_t(
4257 struct label *label
4258 );
4259 /**
4260 @brief Clean up a System V semaphore label
4261 @param label The label to be cleaned
4262
4263 Clean up a System V semaphore label. Darwin pre-allocates
4264 semaphores at system boot time and re-uses them rather than
4265 allocating new ones. Before semaphores are returned to the "free
4266 pool", policies can cleanup or overwrite any information present in
4267 the label.
4268 */
4269 typedef void mpo_sysvsem_label_recycle_t(
4270 struct label *label
4271 );
4272 /**
4273 @brief Access control check for mapping System V shared memory
4274 @param cred Subject credential
4275 @param shmsegptr Pointer to shared memory segment identifier
4276 @param shmseglabel Label associated with the shared memory segment
4277 @param shmflg shmat flags; see shmat(2)
4278
4279 Determine whether the subject identified by the credential can map
4280 the System V shared memory segment associated with shmsegptr.
4281
4282 @return Return 0 if access is granted, otherwise an appropriate value for
4283 errno should be returned.
4284 */
4285 typedef int mpo_sysvshm_check_shmat_t(
4286 kauth_cred_t cred,
4287 struct shmid_kernel *shmsegptr,
4288 struct label *shmseglabel,
4289 int shmflg
4290 );
4291 /**
4292 @brief Access control check for System V shared memory control operation
4293 @param cred Subject credential
4294 @param shmsegptr Pointer to shared memory segment identifier
4295 @param shmseglabel Label associated with the shared memory segment
4296 @param cmd Control operation to be performed; see shmctl(2)
4297
4298 Determine whether the subject identified by the credential can perform
4299 the operation indicated by cmd on the System V shared memory segment
4300 shmsegptr.
4301
4302 @return Return 0 if access is granted, otherwise an appropriate value for
4303 errno should be returned.
4304 */
4305 typedef int mpo_sysvshm_check_shmctl_t(
4306 kauth_cred_t cred,
4307 struct shmid_kernel *shmsegptr,
4308 struct label *shmseglabel,
4309 int cmd
4310 );
4311 /**
4312 @brief Access control check for unmapping System V shared memory
4313 @param cred Subject credential
4314 @param shmsegptr Pointer to shared memory segment identifier
4315 @param shmseglabel Label associated with the shared memory segment
4316
4317 Determine whether the subject identified by the credential can unmap
4318 the System V shared memory segment associated with shmsegptr.
4319
4320 @return Return 0 if access is granted, otherwise an appropriate value for
4321 errno should be returned.
4322 */
4323 typedef int mpo_sysvshm_check_shmdt_t(
4324 kauth_cred_t cred,
4325 struct shmid_kernel *shmsegptr,
4326 struct label *shmseglabel
4327 );
4328 /**
4329 @brief Access control check obtaining System V shared memory identifier
4330 @param cred Subject credential
4331 @param shmsegptr Pointer to shared memory segment identifier
4332 @param shmseglabel Label associated with the shared memory segment
4333 @param shmflg shmget flags; see shmget(2)
4334
4335 Determine whether the subject identified by the credential can get
4336 the System V shared memory segment address.
4337
4338 @return Return 0 if access is granted, otherwise an appropriate value for
4339 errno should be returned.
4340 */
4341 typedef int mpo_sysvshm_check_shmget_t(
4342 kauth_cred_t cred,
4343 struct shmid_kernel *shmsegptr,
4344 struct label *shmseglabel,
4345 int shmflg
4346 );
4347 /**
4348 @brief Create a System V shared memory region label
4349 @param cred Subject credential
4350 @param shmsegptr The shared memory region being created
4351 @param shmlabel Label to associate with the new shared memory region
4352
4353 Label a new System V shared memory region. The label was previously
4354 initialized and associated with the shared memory region. At this
4355 time, an appropriate initial label value should be assigned to the
4356 object and stored in shmlabel.
4357 */
4358 typedef void mpo_sysvshm_label_associate_t(
4359 kauth_cred_t cred,
4360 struct shmid_kernel *shmsegptr,
4361 struct label *shmlabel
4362 );
4363 /**
4364 @brief Destroy System V shared memory label
4365 @param label The label to be destroyed
4366
4367 Destroy a System V shared memory region label. Since the
4368 object is going out of scope, policy modules should free any
4369 internal storage associated with the label so that it may be
4370 destroyed.
4371 */
4372 typedef void mpo_sysvshm_label_destroy_t(
4373 struct label *label
4374 );
4375 /**
4376 @brief Initialize System V Shared Memory region label
4377 @param label New label to initialize
4378
4379 Initialize the label for a newly instantiated System V Shared Memory
4380 region. Sleeping is permitted.
4381 */
4382 typedef void mpo_sysvshm_label_init_t(
4383 struct label *label
4384 );
4385 /**
4386 @brief Clean up a System V Share Memory Region label
4387 @param shmlabel The label to be cleaned
4388
4389 Clean up a System V Shared Memory Region label. Darwin
4390 pre-allocates these objects at system boot time and re-uses them
4391 rather than allocating new ones. Before the memory regions are
4392 returned to the "free pool", policies can cleanup or overwrite any
4393 information present in the label.
4394 */
4395 typedef void mpo_sysvshm_label_recycle_t(
4396 struct label *shmlabel
4397 );
4398 /**
4399 @brief Access control check for getting a process's task name
4400 @param cred Subject credential
4401 @param proc Object process
4402
4403 Determine whether the subject identified by the credential can get
4404 the passed process's task name port.
4405 This call is used by the task_name_for_pid(2) API.
4406
4407 @return Return 0 if access is granted, otherwise an appropriate value for
4408 errno should be returned. Suggested failure: EACCES for label mismatch,
4409 EPERM for lack of privilege, or ESRCH to hide visibility of the target.
4410 */
4411 typedef int mpo_proc_check_get_task_name_t(
4412 kauth_cred_t cred,
4413 struct proc *p
4414 );
4415 /**
4416 @brief Access control check for getting a process's task port
4417 @param cred Subject credential
4418 @param proc Object process
4419
4420 Determine whether the subject identified by the credential can get
4421 the passed process's task control port.
4422 This call is used by the task_for_pid(2) API.
4423
4424 @return Return 0 if access is granted, otherwise an appropriate value for
4425 errno should be returned. Suggested failure: EACCES for label mismatch,
4426 EPERM for lack of privilege, or ESRCH to hide visibility of the target.
4427 */
4428 typedef int mpo_proc_check_get_task_t(
4429 kauth_cred_t cred,
4430 struct proc *p
4431 );
4432 /**
4433 @brief Privilege check for a process to run invalid
4434 @param proc Object process
4435
4436 Determine whether the process may execute even though the system determined
4437 that it is untrusted (eg unidentified / modified code).
4438
4439 @return Return 0 if access is granted, otherwise an appropriate value for
4440 errno should be returned.
4441 */
4442 typedef int mac_proc_check_run_cs_invalid_t(
4443 struct proc *p
4444 );
4445
4446
4447 /**
4448 @brief Assign a label to a new kernelspace Mach task
4449 @param kproc New task
4450 @param tasklabel Label for new task
4451 @param portlabel Label for new task port
4452 @see mpo_cred_label_associate_kernel_t
4453
4454 Assign labels to a new kernel task and its task port. Both the task and
4455 task port labels should be specified. Both new labels are initialized.
4456 If there is an associated BSD process structure, it will be labelled
4457 with calls to mpo_cred_label_associate_kernel.
4458 */
4459 typedef void mpo_task_label_associate_kernel_t(
4460 struct task *kproc,
4461 struct label *tasklabel,
4462 struct label *portlabel
4463 );
4464 /**
4465 @brief Assign a label to a new (userspace) Mach task
4466 @param parent Parent task
4467 @param child New (child) task
4468 @param parentlabel Label of parent task
4469 @param childlabel Label for new task
4470 @param childportlabel Label for new task's task port
4471
4472 Assign labels to a new task and its task port. Both the task and task port
4473 labels should be specified. Both new labels are initialized. If the task
4474 will have an associated BSD process, that information will be made available
4475 by the task_label_update and port_label_update_cred entry points.
4476 */
4477 typedef void mpo_task_label_associate_t(
4478 struct task *parent,
4479 struct task *child,
4480 struct label *parentlabel,
4481 struct label *childlabel,
4482 struct label *childportlabel
4483 );
4484 /**
4485 @brief Copy a Mach task label
4486 @param src Source task label
4487 @param dest Destination task label
4488
4489 Copy the Mach task label information from src to dest. This is used
4490 when duplicating label handles to implement copy-on-write semantics.
4491 */
4492 typedef void mpo_task_label_copy_t(
4493 struct label *src,
4494 struct label *dest
4495 );
4496 /**
4497 @brief Destroy Mach task label
4498 @param label The label to be destroyed
4499
4500 Destroy a Mach task label. Since the object is going out of
4501 scope, policy modules should free any internal storage associated
4502 with the label so that it may be destroyed.
4503 */
4504 typedef void mpo_task_label_destroy_t(
4505 struct label *label
4506 );
4507 /**
4508 @brief Externalize a task label
4509 @param label Label to be externalized
4510 @param element_name Name of the label namespace for which labels should be
4511 externalized
4512 @param sb String buffer to be filled with a text representation of the label
4513
4514 Produce an external representation of the label on a task. An
4515 externalized label consists of a text representation of the label
4516 contents that can be used with user applications. Policy-agnostic
4517 user space tools will display this externalized version.
4518
4519 @return 0 on success, return non-zero if an error occurs while
4520 externalizing the label data.
4521
4522 */
4523 typedef int mpo_task_label_externalize_t(
4524 struct label *label,
4525 char *element_name,
4526 struct sbuf *sb
4527 );
4528 /**
4529 @brief Initialize Mach task label
4530 @param label New label to initialize
4531
4532 Initialize the label for a newly instantiated Mach task. Sleeping
4533 is permitted.
4534 */
4535 typedef void mpo_task_label_init_t(
4536 struct label *label
4537 );
4538 /**
4539 @brief Internalize a task label
4540 @param label Label to be internalized
4541 @param element_name Name of the label namespace for which the label should
4542 be internalized
4543 @param element_data Text data to be internalized
4544
4545 Produce a task label from an external representation. An
4546 externalized label consists of a text representation of the label
4547 contents that can be used with user applications. Policy-agnostic
4548 user space tools will forward text version to the kernel for
4549 processing by individual policy modules.
4550
4551 The policy's internalize entry points will be called only if the
4552 policy has registered interest in the label namespace.
4553
4554 @return 0 on success, Otherwise, return non-zero if an error occurs
4555 while internalizing the label data.
4556
4557 */
4558 typedef int mpo_task_label_internalize_t(
4559 struct label *label,
4560 char *element_name,
4561 char *element_data
4562 );
4563 /**
4564 @brief Update a Mach task label
4565 @param cred User credential label to be used as the source
4566 @param task Mach task label to be used as the destination
4567 @see mpo_cred_label_update_t
4568 @see mpo_cred_label_update_execve_t
4569
4570 Update the label on a Mach task, using the supplied user credential
4571 label. When a mac_cred_label_update_execve or a mac_cred_label_update operation
4572 causes the label on a user credential to change, the Mach task label
4573 also needs to be updated to reflect the change. Both labels are
4574 already valid (initialized and created).
4575
4576 @warning XXX We may change the name of this entry point in a future
4577 version of the MAC framework.
4578 */
4579 typedef void mpo_task_label_update_t(
4580 struct label *cred,
4581 struct label *task
4582 );
4583 /**
4584 @brief Perform MAC-related events when a thread returns to user space
4585 @param code The number of the syscall/trap that has finished
4586 @param error The error code that will be returned to user space
4587 @param thread Mach (not BSD) thread that is returning
4588
4589 This entry point permits policy modules to perform MAC-related
4590 events when a thread returns to user space, via a system call
4591 return, trap return, or otherwise.
4592 */
4593 typedef void mpo_thread_userret_t(
4594 int code,
4595 int error,
4596 struct thread *thread
4597 );
4598 /**
4599 @brief Check vnode access
4600 @param cred Subject credential
4601 @param vp Object vnode
4602 @param label Label for vp
4603 @param acc_mode access(2) flags
4604
4605 Determine how invocations of access(2) and related calls by the
4606 subject identified by the credential should return when performed
4607 on the passed vnode using the passed access flags. This should
4608 generally be implemented using the same semantics used in
4609 mpo_vnode_check_open.
4610
4611 @return Return 0 if access is granted, otherwise an appropriate value for
4612 errno should be returned. Suggested failure: EACCES for label mismatch or
4613 EPERM for lack of privilege.
4614 */
4615 typedef int mpo_vnode_check_access_t(
4616 kauth_cred_t cred,
4617 struct vnode *vp,
4618 struct label *label,
4619 int acc_mode
4620 );
4621 /**
4622 @brief Access control check for changing working directory
4623 @param cred Subject credential
4624 @param dvp Object; vnode to chdir(2) into
4625 @param dlabel Policy label for dvp
4626
4627 Determine whether the subject identified by the credential can change
4628 the process working directory to the passed vnode.
4629
4630 @return Return 0 if access is granted, otherwise an appropriate value for
4631 errno should be returned. Suggested failure: EACCES for label mismatch or
4632 EPERM for lack of privilege.
4633 */
4634 typedef int mpo_vnode_check_chdir_t(
4635 kauth_cred_t cred,
4636 struct vnode *dvp,
4637 struct label *dlabel
4638 );
4639 /**
4640 @brief Access control check for changing root directory
4641 @param cred Subject credential
4642 @param dvp Directory vnode
4643 @param dlabel Policy label associated with dvp
4644 @param cnp Component name for dvp
4645
4646 Determine whether the subject identified by the credential should be
4647 allowed to chroot(2) into the specified directory (dvp).
4648
4649 @return In the event of an error, an appropriate value for errno
4650 should be returned, otherwise return 0 upon success.
4651 */
4652 typedef int mpo_vnode_check_chroot_t(
4653 kauth_cred_t cred,
4654 struct vnode *dvp,
4655 struct label *dlabel,
4656 struct componentname *cnp
4657 );
4658 /**
4659 @brief Access control check for creating vnode
4660 @param cred Subject credential
4661 @param dvp Directory vnode
4662 @param dlabel Policy label for dvp
4663 @param cnp Component name for dvp
4664 @param vap vnode attributes for vap
4665
4666 Determine whether the subject identified by the credential can create
4667 a vnode with the passed parent directory, passed name information,
4668 and passed attribute information. This call may be made in a number of
4669 situations, including as a result of calls to open(2) with O_CREAT,
4670 mknod(2), mkfifo(2), and others.
4671
4672 @return Return 0 if access is granted, otherwise an appropriate value for
4673 errno should be returned. Suggested failure: EACCES for label mismatch or
4674 EPERM for lack of privilege.
4675 */
4676 typedef int mpo_vnode_check_create_t(
4677 kauth_cred_t cred,
4678 struct vnode *dvp,
4679 struct label *dlabel,
4680 struct componentname *cnp,
4681 struct vnode_attr *vap
4682 );
4683 /**
4684 @brief Access control check for deleting extended attribute
4685 @param cred Subject credential
4686 @param vp Object vnode
4687 @param vlabel Label associated with vp
4688 @param name Extended attribute name
4689
4690 Determine whether the subject identified by the credential can delete
4691 the extended attribute from the passed vnode.
4692
4693 @return Return 0 if access is granted, otherwise an appropriate value for
4694 errno should be returned. Suggested failure: EACCES for label mismatch or
4695 EPERM for lack of privilege.
4696 */
4697 typedef int mpo_vnode_check_deleteextattr_t(
4698 kauth_cred_t cred,
4699 struct vnode *vp,
4700 struct label *vlabel,
4701 const char *name
4702 );
4703 /**
4704 @brief Access control check for exchanging file data
4705 @param cred Subject credential
4706 @param v1 vnode 1 to swap
4707 @param vl1 Policy label for v1
4708 @param v2 vnode 2 to swap
4709 @param vl2 Policy label for v2
4710
4711 Determine whether the subject identified by the credential can swap the data
4712 in the two supplied vnodes.
4713
4714 @return Return 0 if access is granted, otherwise an appropriate value for
4715 errno should be returned. Suggested failure: EACCES for label mismatch or
4716 EPERM for lack of privilege.
4717 */
4718 typedef int mpo_vnode_check_exchangedata_t(
4719 kauth_cred_t cred,
4720 struct vnode *v1,
4721 struct label *vl1,
4722 struct vnode *v2,
4723 struct label *vl2
4724 );
4725 /**
4726 @brief Access control check for executing the vnode
4727 @param cred Subject credential
4728 @param vp Object vnode to execute
4729 @param label Policy label for vp
4730 @param execlabel Userspace provided execution label
4731 @param cnp Component name for file being executed
4732
4733 Determine whether the subject identified by the credential can execute
4734 the passed vnode. Determination of execute privilege is made separately
4735 from decisions about any process label transitioning event.
4736
4737 The final label, execlabel, corresponds to a label supplied by a
4738 user space application through the use of the mac_execve system call.
4739 This label will be NULL if the user application uses the the vendor
4740 execve(2) call instead of the MAC Framework mac_execve() call.
4741
4742 @return Return 0 if access is granted, otherwise an appropriate value for
4743 errno should be returned. Suggested failure: EACCES for label mismatch or
4744 EPERM for lack of privilege.
4745 */
4746 typedef int mpo_vnode_check_exec_t(
4747 kauth_cred_t cred,
4748 struct vnode *vp,
4749 struct label *label,
4750 struct label *execlabel, /* NULLOK */
4751 struct componentname *cnp,
4752 u_int *csflags
4753 );
4754 /**
4755 @brief Access control check after determining the code directory hash
4756 */
4757 typedef int mpo_vnode_check_signature_t(struct vnode *vp, struct label *label,
4758 unsigned char *sha1, void *signature,
4759 int size);
4760
4761 /**
4762 @brief Access control check for retrieving file attributes
4763 @param cred Subject credential
4764 @param vp Object vnode
4765 @param vlabel Policy label for vp
4766 @param alist List of attributes to retrieve
4767
4768 Determine whether the subject identified by the credential can read
4769 various attributes of the specified vnode, or the filesystem or volume on
4770 which that vnode resides. See <sys/attr.h> for definitions of the
4771 attributes.
4772
4773 @return Return 0 if access is granted, otherwise an appropriate value for
4774 errno should be returned. Suggested failure: EACCES for label mismatch or
4775 EPERM for lack of privilege. Access control covers all attributes requested
4776 with this call; the security policy is not permitted to change the set of
4777 attributes requested.
4778 */
4779 typedef int mpo_vnode_check_getattrlist_t(
4780 kauth_cred_t cred,
4781 struct vnode *vp,
4782 struct label *vlabel,
4783 struct attrlist *alist
4784 );
4785 /**
4786 @brief Access control check for retrieving an extended attribute
4787 @param cred Subject credential
4788 @param vp Object vnode
4789 @param label Policy label for vp
4790 @param name Extended attribute name
4791 @param uio I/O structure pointer
4792
4793 Determine whether the subject identified by the credential can retrieve
4794 the extended attribute from the passed vnode. The uio parameter
4795 will be NULL when the getxattr(2) call has been made with a NULL data
4796 value; this is done to request the size of the data only.
4797
4798 @return Return 0 if access is granted, otherwise an appropriate value for
4799 errno should be returned. Suggested failure: EACCES for label mismatch or
4800 EPERM for lack of privilege.
4801 */
4802 typedef int mpo_vnode_check_getextattr_t(
4803 kauth_cred_t cred,
4804 struct vnode *vp,
4805 struct label *label, /* NULLOK */
4806 const char *name,
4807 struct uio *uio /* NULLOK */
4808 );
4809 /**
4810 @brief Access control check for ioctl
4811 @param cred Subject credential
4812 @param vp Object vnode
4813 @param label Policy label for vp
4814 @param com Device-dependent request code; see ioctl(2)
4815
4816 Determine whether the subject identified by the credential can perform
4817 the ioctl operation indicated by com.
4818
4819 @warning Since ioctl data is opaque from the standpoint of the MAC
4820 framework, and since ioctls can affect many aspects of system
4821 operation, policies must exercise extreme care when implementing
4822 access control checks.
4823
4824 @return Return 0 if access is granted, otherwise an appropriate value for
4825 errno should be returned.
4826 */
4827 typedef int mpo_vnode_check_ioctl_t(
4828 kauth_cred_t cred,
4829 struct vnode *vp,
4830 struct label *label,
4831 unsigned int cmd
4832 );
4833 /**
4834 @brief Access control check for vnode kqfilter
4835 @param cred Subject credential
4836 @param kn Object knote
4837 @param vp Object vnode
4838 @param label Policy label for vp
4839
4840 Determine whether the subject identified by the credential can
4841 receive the knote on the passed vnode.
4842
4843 @return Return 0 if access if granted, otherwise an appropriate
4844 value for errno should be returned.
4845 */
4846 typedef int mpo_vnode_check_kqfilter_t(
4847 kauth_cred_t active_cred,
4848 kauth_cred_t file_cred, /* NULLOK */
4849 struct knote *kn,
4850 struct vnode *vp,
4851 struct label *label
4852 );
4853 /**
4854 @brief Access control check for relabel
4855 @param cred Subject credential
4856 @param vp Object vnode
4857 @param vnodelabel Existing policy label for vp
4858 @param newlabel Policy label update to later be applied to vp
4859 @see mpo_relable_vnode_t
4860
4861 Determine whether the subject identified by the credential can relabel
4862 the passed vnode to the passed label update. If all policies permit
4863 the label change, the actual relabel entry point (mpo_vnode_label_update)
4864 will follow.
4865
4866 @return Return 0 if access is granted, otherwise an appropriate value for
4867 errno should be returned.
4868 */
4869 typedef int mpo_vnode_check_label_update_t(
4870 struct ucred *cred,
4871 struct vnode *vp,
4872 struct label *vnodelabel,
4873 struct label *newlabel
4874 );
4875 /**
4876 @brief Access control check for creating link
4877 @param cred Subject credential
4878 @param dvp Directory vnode
4879 @param dlabel Policy label associated with dvp
4880 @param vp Link destination vnode
4881 @param label Policy label associated with vp
4882 @param cnp Component name for the link being created
4883
4884 Determine whether the subject identified by the credential should be
4885 allowed to create a link to the vnode vp with the name specified by cnp.
4886
4887 @return Return 0 if access is granted, otherwise an appropriate value for
4888 errno should be returned.
4889 */
4890 typedef int mpo_vnode_check_link_t(
4891 kauth_cred_t cred,
4892 struct vnode *dvp,
4893 struct label *dlabel,
4894 struct vnode *vp,
4895 struct label *label,
4896 struct componentname *cnp
4897 );
4898 /**
4899 @brief Access control check for listing extended attributes
4900 @param cred Subject credential
4901 @param vp Object vnode
4902 @param vlabel Policy label associated with vp
4903
4904 Determine whether the subject identified by the credential can retrieve
4905 a list of named extended attributes from a vnode.
4906
4907 @return Return 0 if access is granted, otherwise an appropriate value for
4908 errno should be returned.
4909 */
4910 typedef int mpo_vnode_check_listextattr_t(
4911 kauth_cred_t cred,
4912 struct vnode *vp,
4913 struct label *vlabel
4914 );
4915 /**
4916 @brief Access control check for lookup
4917 @param cred Subject credential
4918 @param dvp Object vnode
4919 @param dlabel Policy label for dvp
4920 @param cnp Component name being looked up
4921
4922 Determine whether the subject identified by the credential can perform
4923 a lookup in the passed directory vnode for the passed name (cnp).
4924
4925 @return Return 0 if access is granted, otherwise an appropriate value for
4926 errno should be returned. Suggested failure: EACCES for label mismatch or
4927 EPERM for lack of privilege.
4928 */
4929 typedef int mpo_vnode_check_lookup_t(
4930 kauth_cred_t cred,
4931 struct vnode *dvp,
4932 struct label *dlabel,
4933 struct componentname *cnp
4934 );
4935 /**
4936 @brief Access control check for open
4937 @param cred Subject credential
4938 @param vp Object vnode
4939 @param label Policy label associated with vp
4940 @param acc_mode open(2) access mode
4941
4942 Determine whether the subject identified by the credential can perform
4943 an open operation on the passed vnode with the passed access mode.
4944
4945 @return Return 0 if access is granted, otherwise an appropriate value for
4946 errno should be returned. Suggested failure: EACCES for label mismatch or
4947 EPERM for lack of privilege.
4948 */
4949 typedef int mpo_vnode_check_open_t(
4950 kauth_cred_t cred,
4951 struct vnode *vp,
4952 struct label *label,
4953 int acc_mode
4954 );
4955 /**
4956 @brief Access control check for read
4957 @param active_cred Subject credential
4958 @param file_cred Credential associated with the struct fileproc
4959 @param vp Object vnode
4960 @param label Policy label for vp
4961
4962 Determine whether the subject identified by the credential can perform
4963 a read operation on the passed vnode. The active_cred hold the credentials
4964 of the subject performing the operation, and file_cred holds the
4965 credentials of the subject that originally opened the file.
4966
4967 @return Return 0 if access is granted, otherwise an appropriate value for
4968 errno should be returned. Suggested failure: EACCES for label mismatch or
4969 EPERM for lack of privilege.
4970 */
4971 typedef int mpo_vnode_check_read_t(
4972 kauth_cred_t active_cred, /* SUBJECT */
4973 kauth_cred_t file_cred, /* NULLOK */
4974 struct vnode *vp, /* OBJECT */
4975 struct label *label /* LABEL */
4976 );
4977 /**
4978 @brief Access control check for read directory
4979 @param cred Subject credential
4980 @param dvp Object directory vnode
4981 @param dlabel Policy label for dvp
4982
4983 Determine whether the subject identified by the credential can
4984 perform a readdir operation on the passed directory vnode.
4985
4986 @return Return 0 if access is granted, otherwise an appropriate value for
4987 errno should be returned. Suggested failure: EACCES for label mismatch or
4988 EPERM for lack of privilege.
4989 */
4990 typedef int mpo_vnode_check_readdir_t(
4991 kauth_cred_t cred, /* SUBJECT */
4992 struct vnode *dvp, /* OBJECT */
4993 struct label *dlabel /* LABEL */
4994 );
4995 /**
4996 @brief Access control check for read link
4997 @param cred Subject credential
4998 @param vp Object vnode
4999 @param label Policy label for vp
5000
5001 Determine whether the subject identified by the credential can perform
5002 a readlink operation on the passed symlink vnode. This call can be made
5003 in a number of situations, including an explicit readlink call by the
5004 user process, or as a result of an implicit readlink during a name
5005 lookup by the process.
5006
5007 @return Return 0 if access is granted, otherwise an appropriate value for
5008 errno should be returned. Suggested failure: EACCES for label mismatch or
5009 EPERM for lack of privilege.
5010 */
5011 typedef int mpo_vnode_check_readlink_t(
5012 kauth_cred_t cred,
5013 struct vnode *vp,
5014 struct label *label
5015 );
5016 /**
5017 @brief Access control check for rename from
5018 @param cred Subject credential
5019 @param dvp Directory vnode
5020 @param dlabel Policy label associated with dvp
5021 @param vp vnode to be renamed
5022 @param label Policy label associated with vp
5023 @param cnp Component name for vp
5024 @see mpo_vnode_check_rename_to_t
5025
5026 Determine whether the subject identified by the credential should be
5027 allowed to rename the vnode vp to something else.
5028
5029 Due to VFS locking constraints (to make sure proper vnode locks are
5030 held during this entry point), the vnode relabel checks had to be
5031 split into two parts: relabel_from and relabel to.
5032
5033 @return Return 0 if access is granted, otherwise an appropriate value for
5034 errno should be returned.
5035 */
5036 typedef int mpo_vnode_check_rename_from_t(
5037 kauth_cred_t cred,
5038 struct vnode *dvp,
5039 struct label *dlabel,
5040 struct vnode *vp,
5041 struct label *label,
5042 struct componentname *cnp
5043 );
5044 /**
5045 @brief Access control check for rename to
5046 @param cred Subject credential
5047 @param dvp Directory vnode
5048 @param dlabel Policy label associated with dvp
5049 @param vp Overwritten vnode
5050 @param label Policy label associated with vp
5051 @param samedir Boolean; 1 if the source and destination directories are the same
5052 @param cnp Destination component name
5053 @see mpo_vnode_check_rename_from_t
5054
5055 Determine whether the subject identified by the credential should be
5056 allowed to rename to the vnode vp, into the directory dvp, or to the
5057 name represented by cnp. If there is no existing file to overwrite,
5058 vp and label will be NULL.
5059
5060 Due to VFS locking constraints (to make sure proper vnode locks are
5061 held during this entry point), the vnode relabel checks had to be
5062 split into two parts: relabel_from and relabel to.
5063
5064 @return Return 0 if access is granted, otherwise an appropriate value for
5065 errno should be returned.
5066 */
5067 typedef int mpo_vnode_check_rename_to_t(
5068 kauth_cred_t cred,
5069 struct vnode *dvp,
5070 struct label *dlabel,
5071 struct vnode *vp, /* NULLOK */
5072 struct label *label, /* NULLOK */
5073 int samedir,
5074 struct componentname *cnp
5075 );
5076 /**
5077 @brief Access control check for revoke
5078 @param cred Subject credential
5079 @param vp Object vnode
5080 @param label Policy label for vp
5081
5082 Determine whether the subject identified by the credential can revoke
5083 access to the passed vnode.
5084
5085 @return Return 0 if access is granted, otherwise an appropriate value for
5086 errno should be returned. Suggested failure: EACCES for label mismatch or
5087 EPERM for lack of privilege.
5088 */
5089 typedef int mpo_vnode_check_revoke_t(
5090 kauth_cred_t cred,
5091 struct vnode *vp,
5092 struct label *label
5093 );
5094 /**
5095 @brief Access control check for select
5096 @param cred Subject credential
5097 @param vp Object vnode
5098 @param label Policy label for vp
5099 @param which The operation selected on: FREAD or FWRITE
5100
5101 Determine whether the subject identified by the credential can select
5102 the vnode.
5103
5104 @return Return 0 if access is granted, otherwise an appropriate value for
5105 errno should be returned.
5106 */
5107 typedef int mpo_vnode_check_select_t(
5108 kauth_cred_t cred,
5109 struct vnode *vp,
5110 struct label *label,
5111 int which
5112 );
5113 /**
5114 @brief Access control check for setting file attributes
5115 @param cred Subject credential
5116 @param vp Object vnode
5117 @param vlabel Policy label for vp
5118 @param alist List of attributes to set
5119
5120 Determine whether the subject identified by the credential can set
5121 various attributes of the specified vnode, or the filesystem or volume on
5122 which that vnode resides. See <sys/attr.h> for definitions of the
5123 attributes.
5124
5125 @return Return 0 if access is granted, otherwise an appropriate value for
5126 errno should be returned. Suggested failure: EACCES for label mismatch or
5127 EPERM for lack of privilege. Access control covers all attributes requested
5128 with this call.
5129 */
5130 typedef int mpo_vnode_check_setattrlist_t(
5131 kauth_cred_t cred,
5132 struct vnode *vp,
5133 struct label *vlabel,
5134 struct attrlist *alist
5135 );
5136 /**
5137 @brief Access control check for setting extended attribute
5138 @param cred Subject credential
5139 @param vp Object vnode
5140 @param label Policy label for vp
5141 @param name Extended attribute name
5142 @param uio I/O structure pointer
5143
5144 Determine whether the subject identified by the credential can set the
5145 extended attribute of passed name and passed namespace on the passed
5146 vnode. Policies implementing security labels backed into extended
5147 attributes may want to provide additional protections for those
5148 attributes. Additionally, policies should avoid making decisions based
5149 on the data referenced from uio, as there is a potential race condition
5150 between this check and the actual operation. The uio may also be NULL
5151 if a delete operation is being performed.
5152
5153 @return Return 0 if access is granted, otherwise an appropriate value for
5154 errno should be returned. Suggested failure: EACCES for label mismatch or
5155 EPERM for lack of privilege.
5156 */
5157 typedef int mpo_vnode_check_setextattr_t(
5158 kauth_cred_t cred,
5159 struct vnode *vp,
5160 struct label *label,
5161 const char *name,
5162 struct uio *uio
5163 );
5164 /**
5165 @brief Access control check for setting flags
5166 @param cred Subject credential
5167 @param vp Object vnode
5168 @param label Policy label for vp
5169 @param flags File flags; see chflags(2)
5170
5171 Determine whether the subject identified by the credential can set
5172 the passed flags on the passed vnode.
5173
5174 @return Return 0 if access is granted, otherwise an appropriate value for
5175 errno should be returned. Suggested failure: EACCES for label mismatch or
5176 EPERM for lack of privilege.
5177 */
5178 typedef int mpo_vnode_check_setflags_t(
5179 kauth_cred_t cred,
5180 struct vnode *vp,
5181 struct label *label,
5182 u_long flags
5183 );
5184 /**
5185 @brief Access control check for setting mode
5186 @param cred Subject credential
5187 @param vp Object vnode
5188 @param label Policy label for vp
5189 @param mode File mode; see chmod(2)
5190
5191 Determine whether the subject identified by the credential can set
5192 the passed mode on the passed vnode.
5193
5194 @return Return 0 if access is granted, otherwise an appropriate value for
5195 errno should be returned. Suggested failure: EACCES for label mismatch or
5196 EPERM for lack of privilege.
5197 */
5198 typedef int mpo_vnode_check_setmode_t(
5199 kauth_cred_t cred,
5200 struct vnode *vp,
5201 struct label *label,
5202 mode_t mode
5203 );
5204 /**
5205 @brief Access control check for setting uid and gid
5206 @param cred Subject credential
5207 @param vp Object vnode
5208 @param label Policy label for vp
5209 @param uid User ID
5210 @param gid Group ID
5211
5212 Determine whether the subject identified by the credential can set
5213 the passed uid and passed gid as file uid and file gid on the passed
5214 vnode. The IDs may be set to (-1) to request no update.
5215
5216 @return Return 0 if access is granted, otherwise an appropriate value for
5217 errno should be returned. Suggested failure: EACCES for label mismatch or
5218 EPERM for lack of privilege.
5219 */
5220 typedef int mpo_vnode_check_setowner_t(
5221 kauth_cred_t cred,
5222 struct vnode *vp,
5223 struct label *label,
5224 uid_t uid,
5225 gid_t gid
5226 );
5227 /**
5228 @brief Access control check for setting timestamps
5229 @param cred Subject credential
5230 @param vp Object vnode
5231 @param label Policy label for vp
5232 @param atime Access time; see utimes(2)
5233 @param mtime Modification time; see utimes(2)
5234
5235 Determine whether the subject identified by the credential can set
5236 the passed access timestamps on the passed vnode.
5237
5238 @return Return 0 if access is granted, otherwise an appropriate value for
5239 errno should be returned. Suggested failure: EACCES for label mismatch or
5240 EPERM for lack of privilege.
5241 */
5242 typedef int mpo_vnode_check_setutimes_t(
5243 kauth_cred_t cred,
5244 struct vnode *vp,
5245 struct label *label,
5246 struct timespec atime,
5247 struct timespec mtime
5248 );
5249 /**
5250 @brief Access control check for stat
5251 @param active_cred Subject credential
5252 @param file_cred Credential associated with the struct fileproc
5253 @param vp Object vnode
5254 @param label Policy label for vp
5255
5256 Determine whether the subject identified by the credential can stat
5257 the passed vnode. See stat(2) for more information. The active_cred
5258 hold the credentials of the subject performing the operation, and
5259 file_cred holds the credentials of the subject that originally
5260 opened the file.
5261
5262 @return Return 0 if access is granted, otherwise an appropriate value for
5263 errno should be returned. Suggested failure: EACCES for label mismatch or
5264 EPERM for lack of privilege.
5265 */
5266 typedef int mpo_vnode_check_stat_t(
5267 struct ucred *active_cred,
5268 struct ucred *file_cred, /* NULLOK */
5269 struct vnode *vp,
5270 struct label *label
5271 );
5272 /**
5273 @brief Access control check for truncate/ftruncate
5274 @param active_cred Subject credential
5275 @param file_cred Credential associated with the struct fileproc
5276 @param vp Object vnode
5277 @param label Policy label for vp
5278
5279 Determine whether the subject identified by the credential can
5280 perform a truncate operation on the passed vnode. The active_cred hold
5281 the credentials of the subject performing the operation, and
5282 file_cred holds the credentials of the subject that originally
5283 opened the file.
5284
5285 @return Return 0 if access is granted, otherwise an appropriate value for
5286 errno should be returned. Suggested failure: EACCES for label mismatch or
5287 EPERM for lack of privilege.
5288 */
5289 typedef int mpo_vnode_check_truncate_t(
5290 kauth_cred_t active_cred,
5291 kauth_cred_t file_cred, /* NULLOK */
5292 struct vnode *vp,
5293 struct label *label
5294 );
5295 /**
5296 @brief Access control check for binding UNIX domain socket
5297 @param cred Subject credential
5298 @param dvp Directory vnode
5299 @param dlabel Policy label for dvp
5300 @param cnp Component name for dvp
5301 @param vap vnode attributes for vap
5302
5303 Determine whether the subject identified by the credential can perform a
5304 bind operation on a UNIX domain socket with the passed parent directory,
5305 passed name information, and passed attribute information.
5306
5307 @return Return 0 if access is granted, otherwise an appropriate value for
5308 errno should be returned. Suggested failure: EACCES for label mismatch or
5309 EPERM for lack of privilege.
5310 */
5311 typedef int mpo_vnode_check_uipc_bind_t(
5312 kauth_cred_t cred,
5313 struct vnode *dvp,
5314 struct label *dlabel,
5315 struct componentname *cnp,
5316 struct vnode_attr *vap
5317 );
5318 /**
5319 @brief Access control check for connecting UNIX domain socket
5320 @param cred Subject credential
5321 @param vp Object vnode
5322 @param label Policy label associated with vp
5323
5324 Determine whether the subject identified by the credential can perform a
5325 connect operation on the passed UNIX domain socket vnode.
5326
5327 @return Return 0 if access is granted, otherwise an appropriate value for
5328 errno should be returned. Suggested failure: EACCES for label mismatch or
5329 EPERM for lack of privilege.
5330 */
5331 typedef int mpo_vnode_check_uipc_connect_t(
5332 kauth_cred_t cred,
5333 struct vnode *vp,
5334 struct label *label
5335 );
5336 /**
5337 @brief Access control check for deleting vnode
5338 @param cred Subject credential
5339 @param dvp Parent directory vnode
5340 @param dlabel Policy label for dvp
5341 @param vp Object vnode to delete
5342 @param label Policy label for vp
5343 @param cnp Component name for vp
5344 @see mpo_check_rename_to_t
5345
5346 Determine whether the subject identified by the credential can delete
5347 a vnode from the passed parent directory and passed name information.
5348 This call may be made in a number of situations, including as a
5349 results of calls to unlink(2) and rmdir(2). Policies implementing
5350 this entry point should also implement mpo_check_rename_to to
5351 authorize deletion of objects as a result of being the target of a rename.
5352
5353 @return Return 0 if access is granted, otherwise an appropriate value for
5354 errno should be returned. Suggested failure: EACCES for label mismatch or
5355 EPERM for lack of privilege.
5356 */
5357 typedef int mpo_vnode_check_unlink_t(
5358 kauth_cred_t cred,
5359 struct vnode *dvp,
5360 struct label *dlabel,
5361 struct vnode *vp,
5362 struct label *label,
5363 struct componentname *cnp
5364 );
5365 /**
5366 @brief Access control check for write
5367 @param active_cred Subject credential
5368 @param file_cred Credential associated with the struct fileproc
5369 @param vp Object vnode
5370 @param label Policy label for vp
5371
5372 Determine whether the subject identified by the credential can
5373 perform a write operation on the passed vnode. The active_cred hold
5374 the credentials of the subject performing the operation, and
5375 file_cred holds the credentials of the subject that originally
5376 opened the file.
5377
5378 @return Return 0 if access is granted, otherwise an appropriate value for
5379 errno should be returned. Suggested failure: EACCES for label mismatch or
5380 EPERM for lack of privilege.
5381 */
5382 typedef int mpo_vnode_check_write_t(
5383 kauth_cred_t active_cred,
5384 kauth_cred_t file_cred, /* NULLOK */
5385 struct vnode *vp,
5386 struct label *label
5387 );
5388 /**
5389 @brief Associate a vnode with a devfs entry
5390 @param mp Devfs mount point
5391 @param mntlabel Devfs mount point label
5392 @param de Devfs directory entry
5393 @param delabel Label associated with de
5394 @param vp vnode associated with de
5395 @param vlabel Label associated with vp
5396
5397 Fill in the label (vlabel) for a newly created devfs vnode. The
5398 label is typically derived from the label on the devfs directory
5399 entry or the label on the filesystem, supplied as parameters.
5400 */
5401 typedef void mpo_vnode_label_associate_devfs_t(
5402 struct mount *mp,
5403 struct label *mntlabel,
5404 struct devnode *de,
5405 struct label *delabel,
5406 struct vnode *vp,
5407 struct label *vlabel
5408 );
5409 /**
5410 @brief Associate a label with a vnode
5411 @param mp File system mount point
5412 @param mntlabel File system mount point label
5413 @param vp Vnode to label
5414 @param vlabel Label associated with vp
5415
5416 Attempt to retrieve label information for the vnode, vp, from the
5417 file system extended attribute store. The label should be stored in
5418 the supplied vlabel parameter. If a policy cannot retrieve an
5419 extended attribute, sometimes it is acceptible to fallback to using
5420 the mntlabel.
5421
5422 If the policy requires vnodes to have a valid label elsewhere it
5423 MUST NOT return other than temporary errors, and must always provide
5424 a valid label of some sort. Returning an error will cause vnode
5425 labeling to be retried at a later access. Failure to handle policy
5426 centric errors internally (corrupt labels etc.) will result in
5427 inaccessible files.
5428
5429 @return In the event of an error, an appropriate value for errno
5430 should be returned, otherwise return 0 upon success.
5431 */
5432 typedef int mpo_vnode_label_associate_extattr_t(
5433 struct mount *mp,
5434 struct label *mntlabel,
5435 struct vnode *vp,
5436 struct label *vlabel
5437 );
5438 /**
5439 @brief Associate a file label with a vnode
5440 @param cred User credential
5441 @param mp Fdesc mount point
5442 @param mntlabel Fdesc mount point label
5443 @param fg Fileglob structure
5444 @param label Policy label for fg
5445 @param vp Vnode to label
5446 @param vlabel Label associated with vp
5447
5448 Associate label information for the vnode, vp, with the label of
5449 the open file descriptor described by fg.
5450 The label should be stored in the supplied vlabel parameter.
5451 */
5452 typedef void mpo_vnode_label_associate_file_t(
5453 struct ucred *cred,
5454 struct mount *mp,
5455 struct label *mntlabel,
5456 struct fileglob *fg,
5457 struct label *label,
5458 struct vnode *vp,
5459 struct label *vlabel
5460 );
5461 /**
5462 @brief Associate a pipe label with a vnode
5463 @param cred User credential for the process that opened the pipe
5464 @param cpipe Pipe structure
5465 @param pipelabel Label associated with pipe
5466 @param vp Vnode to label
5467 @param vlabel Label associated with vp
5468
5469 Associate label information for the vnode, vp, with the label of
5470 the pipe described by the pipe structure cpipe.
5471 The label should be stored in the supplied vlabel parameter.
5472 */
5473 typedef void mpo_vnode_label_associate_pipe_t(
5474 struct ucred *cred,
5475 struct pipe *cpipe,
5476 struct label *pipelabel,
5477 struct vnode *vp,
5478 struct label *vlabel
5479 );
5480 /**
5481 @brief Associate a POSIX semaphore label with a vnode
5482 @param cred User credential for the process that create psem
5483 @param psem POSIX semaphore structure
5484 @param psemlabel Label associated with psem
5485 @param vp Vnode to label
5486 @param vlabel Label associated with vp
5487
5488 Associate label information for the vnode, vp, with the label of
5489 the POSIX semaphore described by psem.
5490 The label should be stored in the supplied vlabel parameter.
5491 */
5492 typedef void mpo_vnode_label_associate_posixsem_t(
5493 struct ucred *cred,
5494 struct pseminfo *psem,
5495 struct label *psemlabel,
5496 struct vnode *vp,
5497 struct label *vlabel
5498 );
5499 /**
5500 @brief Associate a POSIX shared memory label with a vnode
5501 @param cred User credential for the process that created pshm
5502 @param pshm POSIX shared memory structure
5503 @param pshmlabel Label associated with pshm
5504 @param vp Vnode to label
5505 @param vlabel Label associated with vp
5506
5507 Associate label information for the vnode, vp, with the label of
5508 the POSIX shared memory region described by pshm.
5509 The label should be stored in the supplied vlabel parameter.
5510 */
5511 typedef void mpo_vnode_label_associate_posixshm_t(
5512 struct ucred *cred,
5513 struct pshminfo *pshm,
5514 struct label *pshmlabel,
5515 struct vnode *vp,
5516 struct label *vlabel
5517 );
5518 /**
5519 @brief Associate a label with a vnode
5520 @param mp File system mount point
5521 @param mntlabel File system mount point label
5522 @param vp Vnode to label
5523 @param vlabel Label associated with vp
5524
5525 On non-multilabel file systems, set the label for a vnode. The
5526 label will most likely be based on the file system label.
5527 */
5528 typedef void mpo_vnode_label_associate_singlelabel_t(
5529 struct mount *mp,
5530 struct label *mntlabel,
5531 struct vnode *vp,
5532 struct label *vlabel
5533 );
5534 /**
5535 @brief Associate a socket label with a vnode
5536 @param cred User credential for the process that opened the socket
5537 @param so Socket structure
5538 @param solabel Label associated with so
5539 @param vp Vnode to label
5540 @param vlabel Label associated with vp
5541
5542 Associate label information for the vnode, vp, with the label of
5543 the open socket described by the socket structure so.
5544 The label should be stored in the supplied vlabel parameter.
5545 */
5546 typedef void mpo_vnode_label_associate_socket_t(
5547 kauth_cred_t cred,
5548 socket_t so,
5549 struct label *solabel,
5550 struct vnode *vp,
5551 struct label *vlabel
5552 );
5553 /**
5554 @brief Copy a vnode label
5555 @param src Source vnode label
5556 @param dest Destination vnode label
5557
5558 Copy the vnode label information from src to dest. On Darwin, this
5559 is currently only necessary when executing interpreted scripts, but
5560 will later be used if vnode label externalization cannot be an
5561 atomic operation.
5562 */
5563 typedef void mpo_vnode_label_copy_t(
5564 struct label *src,
5565 struct label *dest
5566 );
5567 /**
5568 @brief Destroy vnode label
5569 @param label The label to be destroyed
5570
5571 Destroy a vnode label. Since the object is going out of scope,
5572 policy modules should free any internal storage associated with the
5573 label so that it may be destroyed.
5574 */
5575 typedef void mpo_vnode_label_destroy_t(
5576 struct label *label
5577 );
5578 /**
5579 @brief Externalize a vnode label for auditing
5580 @param label Label to be externalized
5581 @param element_name Name of the label namespace for which labels should be
5582 externalized
5583 @param sb String buffer to be filled with a text representation of the label
5584
5585 Produce an external representation of the label on a vnode suitable for
5586 inclusion in an audit record. An externalized label consists of a text
5587 representation of the label contents that will be added to the audit record
5588 as part of a text token. Policy-agnostic user space tools will display
5589 this externalized version.
5590
5591 @return 0 on success, return non-zero if an error occurs while
5592 externalizing the label data.
5593
5594 */
5595 typedef int mpo_vnode_label_externalize_audit_t(
5596 struct label *label,
5597 char *element_name,
5598 struct sbuf *sb
5599 );
5600 /**
5601 @brief Externalize a vnode label
5602 @param label Label to be externalized
5603 @param element_name Name of the label namespace for which labels should be
5604 externalized
5605 @param sb String buffer to be filled with a text representation of the label
5606
5607 Produce an external representation of the label on a vnode. An
5608 externalized label consists of a text representation of the label
5609 contents that can be used with user applications. Policy-agnostic
5610 user space tools will display this externalized version.
5611
5612 @return 0 on success, return non-zero if an error occurs while
5613 externalizing the label data.
5614
5615 */
5616 typedef int mpo_vnode_label_externalize_t(
5617 struct label *label,
5618 char *element_name,
5619 struct sbuf *sb
5620 );
5621 /**
5622 @brief Initialize vnode label
5623 @param label New label to initialize
5624
5625 Initialize label storage for use with a newly instantiated vnode, or
5626 for temporary storage associated with the copying in or out of a
5627 vnode label. While it is necessary to allocate space for a
5628 kernel-resident vnode label, it is not yet necessary to link this vnode
5629 with persistent label storage facilities, such as extended attributes.
5630 Sleeping is permitted.
5631 */
5632 typedef void mpo_vnode_label_init_t(
5633 struct label *label
5634 );
5635 /**
5636 @brief Internalize a vnode label
5637 @param label Label to be internalized
5638 @param element_name Name of the label namespace for which the label should
5639 be internalized
5640 @param element_data Text data to be internalized
5641
5642 Produce a vnode label from an external representation. An
5643 externalized label consists of a text representation of the label
5644 contents that can be used with user applications. Policy-agnostic
5645 user space tools will forward text version to the kernel for
5646 processing by individual policy modules.
5647
5648 The policy's internalize entry points will be called only if the
5649 policy has registered interest in the label namespace.
5650
5651 @return 0 on success, Otherwise, return non-zero if an error occurs
5652 while internalizing the label data.
5653 */
5654 typedef int mpo_vnode_label_internalize_t(
5655 struct label *label,
5656 char *element_name,
5657 char *element_data
5658 );
5659 /**
5660 @brief Clean up a vnode label
5661 @param label The label to be cleaned for re-use
5662
5663 Clean up a vnode label. Darwin (Tiger, 8.x) allocates vnodes on demand, but
5664 typically never frees them. Before vnodes are placed back on free lists for
5665 re-use, policies can cleanup or overwrite any information present in the label.
5666 */
5667 typedef void mpo_vnode_label_recycle_t(
5668 struct label *label
5669 );
5670 /**
5671 @brief Write a label to a extended attribute
5672 @param cred Subject credential
5673 @param vp The vnode for which the label is being stored
5674 @param vlabel Label associated with vp
5675 @param intlabel The new label to store
5676
5677 Store a new label in the extended attribute corresponding to the
5678 supplied vnode. The policy has already authorized the operation;
5679 this call must be implemented in order to perform the actual
5680 operation.
5681
5682 @return In the event of an error, an appropriate value for errno
5683 should be returned, otherwise return 0 upon success.
5684
5685 @warning XXX After examining the extended attribute implementation on
5686 Apple's future release, this entry point may be changed.
5687 */
5688 typedef int mpo_vnode_label_store_t(
5689 kauth_cred_t cred,
5690 struct vnode *vp,
5691 struct label *vlabel,
5692 struct label *intlabel
5693 );
5694 /**
5695 @brief Update vnode label from extended attributes
5696 @param mp File system mount point
5697 @param mntlabel Mount point label
5698 @param vp Vnode to label
5699 @param vlabel Label associated with vp
5700 @param name Name of the xattr
5701 @see mpo_vnode_check_setextattr_t
5702
5703 When an extended attribute is updated via the Vendor attribute management
5704 functions, the MAC vnode label might also require an update.
5705 Policies should first determine if 'name' matches their xattr label
5706 name. If it does, the kernel is has either replaced or removed the
5707 named extended attribute that was previously associated with the
5708 vnode. Normally labels should only be modified via MAC Framework label
5709 management calls, but sometimes the user space components will directly
5710 modify extended attributes. For example, 'cp', 'tar', etc. manage
5711 extended attributes in userspace, not the kernel.
5712
5713 This entry point is called after the label update has occurred, so
5714 it cannot return a failure. However, the operation is preceded by
5715 the mpo_vnode_check_setextattr() access control check.
5716
5717 If the vnode label needs to be updated the policy should return
5718 a non-zero value. The vnode label will be marked for re-association
5719 by the framework.
5720 */
5721 typedef int mpo_vnode_label_update_extattr_t(
5722 struct mount *mp,
5723 struct label *mntlabel,
5724 struct vnode *vp,
5725 struct label *vlabel,
5726 const char *name
5727 );
5728 /**
5729 @brief Update a vnode label
5730 @param cred Subject credential
5731 @param vp The vnode to relabel
5732 @param vnodelabel Existing vnode label
5733 @param label New label to replace existing label
5734 @see mpo_vnode_check_label_update_t
5735
5736 The subject identified by the credential has previously requested
5737 and was authorized to relabel the vnode; this entry point allows
5738 policies to perform the actual relabel operation. Policies should
5739 update vnodelabel using the label stored in the label parameter.
5740 */
5741 typedef void mpo_vnode_label_update_t(
5742 kauth_cred_t cred,
5743 struct vnode *vp,
5744 struct label *vnodelabel,
5745 struct label *label
5746 );
5747 /**
5748 @brief Create a new vnode, backed by extended attributes
5749 @param cred User credential for the creating process
5750 @param mp File system mount point
5751 @param mntlabel File system mount point label
5752 @param dvp Parent directory vnode
5753 @param dlabel Parent directory vnode label
5754 @param vp Newly created vnode
5755 @param vlabel Label to associate with the new vnode
5756 @param cnp Component name for vp
5757
5758 Write out the label for the newly created vnode, most likely storing
5759 the results in a file system extended attribute. Most policies will
5760 derive the new vnode label using information from a combination
5761 of the subject (user) credential, the file system label, the parent
5762 directory label, and potentially the path name component.
5763
5764 @return If the operation succeeds, store the new label in vlabel and
5765 return 0. Otherwise, return an appropriate errno value.
5766 */
5767 typedef int mpo_vnode_notify_create_t(
5768 kauth_cred_t cred,
5769 struct mount *mp,
5770 struct label *mntlabel,
5771 struct vnode *dvp,
5772 struct label *dlabel,
5773 struct vnode *vp,
5774 struct label *vlabel,
5775 struct componentname *cnp
5776 );
5777
5778 /*
5779 * Placeholder for future events that may need mac hooks.
5780 */
5781 typedef void mpo_reserved_hook_t(void);
5782
5783 /*!
5784 \struct mac_policy_ops
5785 */
5786 #define MAC_POLICY_OPS_VERSION 2 /* inc when new reserved slots are taken */
5787 struct mac_policy_ops {
5788 mpo_audit_check_postselect_t *mpo_audit_check_postselect;
5789 mpo_audit_check_preselect_t *mpo_audit_check_preselect;
5790 mpo_bpfdesc_label_associate_t *mpo_bpfdesc_label_associate;
5791 mpo_bpfdesc_label_destroy_t *mpo_bpfdesc_label_destroy;
5792 mpo_bpfdesc_label_init_t *mpo_bpfdesc_label_init;
5793 mpo_bpfdesc_check_receive_t *mpo_bpfdesc_check_receive;
5794 mpo_cred_check_label_update_execve_t *mpo_cred_check_label_update_execve;
5795 mpo_cred_check_label_update_t *mpo_cred_check_label_update;
5796 mpo_cred_check_visible_t *mpo_cred_check_visible;
5797 mpo_cred_label_associate_fork_t *mpo_cred_label_associate_fork;
5798 mpo_cred_label_associate_kernel_t *mpo_cred_label_associate_kernel;
5799 mpo_cred_label_associate_t *mpo_cred_label_associate;
5800 mpo_cred_label_associate_user_t *mpo_cred_label_associate_user;
5801 mpo_cred_label_destroy_t *mpo_cred_label_destroy;
5802 mpo_cred_label_externalize_audit_t *mpo_cred_label_externalize_audit;
5803 mpo_cred_label_externalize_t *mpo_cred_label_externalize;
5804 mpo_cred_label_init_t *mpo_cred_label_init;
5805 mpo_cred_label_internalize_t *mpo_cred_label_internalize;
5806 mpo_cred_label_update_execve_t *mpo_cred_label_update_execve;
5807 mpo_cred_label_update_t *mpo_cred_label_update;
5808 mpo_devfs_label_associate_device_t *mpo_devfs_label_associate_device;
5809 mpo_devfs_label_associate_directory_t *mpo_devfs_label_associate_directory;
5810 mpo_devfs_label_copy_t *mpo_devfs_label_copy;
5811 mpo_devfs_label_destroy_t *mpo_devfs_label_destroy;
5812 mpo_devfs_label_init_t *mpo_devfs_label_init;
5813 mpo_devfs_label_update_t *mpo_devfs_label_update;
5814 mpo_file_check_change_offset_t *mpo_file_check_change_offset;
5815 mpo_file_check_create_t *mpo_file_check_create;
5816 mpo_file_check_dup_t *mpo_file_check_dup;
5817 mpo_file_check_fcntl_t *mpo_file_check_fcntl;
5818 mpo_file_check_get_offset_t *mpo_file_check_get_offset;
5819 mpo_file_check_get_t *mpo_file_check_get;
5820 mpo_file_check_inherit_t *mpo_file_check_inherit;
5821 mpo_file_check_ioctl_t *mpo_file_check_ioctl;
5822 mpo_file_check_lock_t *mpo_file_check_lock;
5823 mpo_file_check_mmap_downgrade_t *mpo_file_check_mmap_downgrade;
5824 mpo_file_check_mmap_t *mpo_file_check_mmap;
5825 mpo_file_check_receive_t *mpo_file_check_receive;
5826 mpo_file_check_set_t *mpo_file_check_set;
5827 mpo_file_label_init_t *mpo_file_label_init;
5828 mpo_file_label_destroy_t *mpo_file_label_destroy;
5829 mpo_file_label_associate_t *mpo_file_label_associate;
5830 mpo_ifnet_check_label_update_t *mpo_ifnet_check_label_update;
5831 mpo_ifnet_check_transmit_t *mpo_ifnet_check_transmit;
5832 mpo_ifnet_label_associate_t *mpo_ifnet_label_associate;
5833 mpo_ifnet_label_copy_t *mpo_ifnet_label_copy;
5834 mpo_ifnet_label_destroy_t *mpo_ifnet_label_destroy;
5835 mpo_ifnet_label_externalize_t *mpo_ifnet_label_externalize;
5836 mpo_ifnet_label_init_t *mpo_ifnet_label_init;
5837 mpo_ifnet_label_internalize_t *mpo_ifnet_label_internalize;
5838 mpo_ifnet_label_update_t *mpo_ifnet_label_update;
5839 mpo_ifnet_label_recycle_t *mpo_ifnet_label_recycle;
5840 mpo_inpcb_check_deliver_t *mpo_inpcb_check_deliver;
5841 mpo_inpcb_label_associate_t *mpo_inpcb_label_associate;
5842 mpo_inpcb_label_destroy_t *mpo_inpcb_label_destroy;
5843 mpo_inpcb_label_init_t *mpo_inpcb_label_init;
5844 mpo_inpcb_label_recycle_t *mpo_inpcb_label_recycle;
5845 mpo_inpcb_label_update_t *mpo_inpcb_label_update;
5846 mpo_iokit_check_device_t *mpo_iokit_check_device;
5847 mpo_ipq_label_associate_t *mpo_ipq_label_associate;
5848 mpo_ipq_label_compare_t *mpo_ipq_label_compare;
5849 mpo_ipq_label_destroy_t *mpo_ipq_label_destroy;
5850 mpo_ipq_label_init_t *mpo_ipq_label_init;
5851 mpo_ipq_label_update_t *mpo_ipq_label_update;
5852 mpo_lctx_check_label_update_t *mpo_lctx_check_label_update;
5853 mpo_lctx_label_destroy_t *mpo_lctx_label_destroy;
5854 mpo_lctx_label_externalize_t *mpo_lctx_label_externalize;
5855 mpo_lctx_label_init_t *mpo_lctx_label_init;
5856 mpo_lctx_label_internalize_t *mpo_lctx_label_internalize;
5857 mpo_lctx_label_update_t *mpo_lctx_label_update;
5858 mpo_lctx_notify_create_t *mpo_lctx_notify_create;
5859 mpo_lctx_notify_join_t *mpo_lctx_notify_join;
5860 mpo_lctx_notify_leave_t *mpo_lctx_notify_leave;
5861 mpo_mbuf_label_associate_bpfdesc_t *mpo_mbuf_label_associate_bpfdesc;
5862 mpo_mbuf_label_associate_ifnet_t *mpo_mbuf_label_associate_ifnet;
5863 mpo_mbuf_label_associate_inpcb_t *mpo_mbuf_label_associate_inpcb;
5864 mpo_mbuf_label_associate_ipq_t *mpo_mbuf_label_associate_ipq;
5865 mpo_mbuf_label_associate_linklayer_t *mpo_mbuf_label_associate_linklayer;
5866 mpo_mbuf_label_associate_multicast_encap_t *mpo_mbuf_label_associate_multicast_encap;
5867 mpo_mbuf_label_associate_netlayer_t *mpo_mbuf_label_associate_netlayer;
5868 mpo_mbuf_label_associate_socket_t *mpo_mbuf_label_associate_socket;
5869 mpo_mbuf_label_copy_t *mpo_mbuf_label_copy;
5870 mpo_mbuf_label_destroy_t *mpo_mbuf_label_destroy;
5871 mpo_mbuf_label_init_t *mpo_mbuf_label_init;
5872 mpo_mount_check_fsctl_t *mpo_mount_check_fsctl;
5873 mpo_mount_check_getattr_t *mpo_mount_check_getattr;
5874 mpo_mount_check_label_update_t *mpo_mount_check_label_update;
5875 mpo_mount_check_mount_t *mpo_mount_check_mount;
5876 mpo_mount_check_remount_t *mpo_mount_check_remount;
5877 mpo_mount_check_setattr_t *mpo_mount_check_setattr;
5878 mpo_mount_check_stat_t *mpo_mount_check_stat;
5879 mpo_mount_check_umount_t *mpo_mount_check_umount;
5880 mpo_mount_label_associate_t *mpo_mount_label_associate;
5881 mpo_mount_label_destroy_t *mpo_mount_label_destroy;
5882 mpo_mount_label_externalize_t *mpo_mount_label_externalize;
5883 mpo_mount_label_init_t *mpo_mount_label_init;
5884 mpo_mount_label_internalize_t *mpo_mount_label_internalize;
5885 mpo_netinet_fragment_t *mpo_netinet_fragment;
5886 mpo_netinet_icmp_reply_t *mpo_netinet_icmp_reply;
5887 mpo_netinet_tcp_reply_t *mpo_netinet_tcp_reply;
5888 mpo_pipe_check_ioctl_t *mpo_pipe_check_ioctl;
5889 mpo_pipe_check_kqfilter_t *mpo_pipe_check_kqfilter;
5890 mpo_pipe_check_label_update_t *mpo_pipe_check_label_update;
5891 mpo_pipe_check_read_t *mpo_pipe_check_read;
5892 mpo_pipe_check_select_t *mpo_pipe_check_select;
5893 mpo_pipe_check_stat_t *mpo_pipe_check_stat;
5894 mpo_pipe_check_write_t *mpo_pipe_check_write;
5895 mpo_pipe_label_associate_t *mpo_pipe_label_associate;
5896 mpo_pipe_label_copy_t *mpo_pipe_label_copy;
5897 mpo_pipe_label_destroy_t *mpo_pipe_label_destroy;
5898 mpo_pipe_label_externalize_t *mpo_pipe_label_externalize;
5899 mpo_pipe_label_init_t *mpo_pipe_label_init;
5900 mpo_pipe_label_internalize_t *mpo_pipe_label_internalize;
5901 mpo_pipe_label_update_t *mpo_pipe_label_update;
5902 mpo_policy_destroy_t *mpo_policy_destroy;
5903 mpo_policy_init_t *mpo_policy_init;
5904 mpo_policy_initbsd_t *mpo_policy_initbsd;
5905 mpo_policy_syscall_t *mpo_policy_syscall;
5906 mpo_port_check_copy_send_t *mpo_port_check_copy_send;
5907 mpo_port_check_hold_receive_t *mpo_port_check_hold_receive;
5908 mpo_port_check_hold_send_once_t *mpo_port_check_hold_send_once;
5909 mpo_port_check_hold_send_t *mpo_port_check_hold_send;
5910 mpo_port_check_label_update_t *mpo_port_check_label_update;
5911 mpo_port_check_make_send_once_t *mpo_port_check_make_send_once;
5912 mpo_port_check_make_send_t *mpo_port_check_make_send;
5913 mpo_port_check_method_t *mpo_port_check_method;
5914 mpo_port_check_move_receive_t *mpo_port_check_move_receive;
5915 mpo_port_check_move_send_once_t *mpo_port_check_move_send_once;
5916 mpo_port_check_move_send_t *mpo_port_check_move_send;
5917 mpo_port_check_receive_t *mpo_port_check_receive;
5918 mpo_port_check_send_t *mpo_port_check_send;
5919 mpo_port_check_service_t *mpo_port_check_service;
5920 mpo_port_label_associate_kernel_t *mpo_port_label_associate_kernel;
5921 mpo_port_label_associate_t *mpo_port_label_associate;
5922 mpo_port_label_compute_t *mpo_port_label_compute;
5923 mpo_port_label_copy_t *mpo_port_label_copy;
5924 mpo_port_label_destroy_t *mpo_port_label_destroy;
5925 mpo_port_label_init_t *mpo_port_label_init;
5926 mpo_port_label_update_cred_t *mpo_port_label_update_cred;
5927 mpo_port_label_update_kobject_t *mpo_port_label_update_kobject;
5928 mpo_posixsem_check_create_t *mpo_posixsem_check_create;
5929 mpo_posixsem_check_open_t *mpo_posixsem_check_open;
5930 mpo_posixsem_check_post_t *mpo_posixsem_check_post;
5931 mpo_posixsem_check_unlink_t *mpo_posixsem_check_unlink;
5932 mpo_posixsem_check_wait_t *mpo_posixsem_check_wait;
5933 mpo_posixsem_label_associate_t *mpo_posixsem_label_associate;
5934 mpo_posixsem_label_destroy_t *mpo_posixsem_label_destroy;
5935 mpo_posixsem_label_init_t *mpo_posixsem_label_init;
5936 mpo_posixshm_check_create_t *mpo_posixshm_check_create;
5937 mpo_posixshm_check_mmap_t *mpo_posixshm_check_mmap;
5938 mpo_posixshm_check_open_t *mpo_posixshm_check_open;
5939 mpo_posixshm_check_stat_t *mpo_posixshm_check_stat;
5940 mpo_posixshm_check_truncate_t *mpo_posixshm_check_truncate;
5941 mpo_posixshm_check_unlink_t *mpo_posixshm_check_unlink;
5942 mpo_posixshm_label_associate_t *mpo_posixshm_label_associate;
5943 mpo_posixshm_label_destroy_t *mpo_posixshm_label_destroy;
5944 mpo_posixshm_label_init_t *mpo_posixshm_label_init;
5945 mpo_proc_check_debug_t *mpo_proc_check_debug;
5946 mpo_proc_check_fork_t *mpo_proc_check_fork;
5947 mpo_proc_check_get_task_name_t *mpo_proc_check_get_task_name;
5948 mpo_proc_check_get_task_t *mpo_proc_check_get_task;
5949 mpo_proc_check_getaudit_t *mpo_proc_check_getaudit;
5950 mpo_proc_check_getauid_t *mpo_proc_check_getauid;
5951 mpo_proc_check_getlcid_t *mpo_proc_check_getlcid;
5952 mpo_proc_check_mprotect_t *mpo_proc_check_mprotect;
5953 mpo_proc_check_sched_t *mpo_proc_check_sched;
5954 mpo_proc_check_setaudit_t *mpo_proc_check_setaudit;
5955 mpo_proc_check_setauid_t *mpo_proc_check_setauid;
5956 mpo_proc_check_setlcid_t *mpo_proc_check_setlcid;
5957 mpo_proc_check_signal_t *mpo_proc_check_signal;
5958 mpo_proc_check_wait_t *mpo_proc_check_wait;
5959 mpo_proc_label_destroy_t *mpo_proc_label_destroy;
5960 mpo_proc_label_init_t *mpo_proc_label_init;
5961 mpo_socket_check_accept_t *mpo_socket_check_accept;
5962 mpo_socket_check_accepted_t *mpo_socket_check_accepted;
5963 mpo_socket_check_bind_t *mpo_socket_check_bind;
5964 mpo_socket_check_connect_t *mpo_socket_check_connect;
5965 mpo_socket_check_create_t *mpo_socket_check_create;
5966 mpo_socket_check_deliver_t *mpo_socket_check_deliver;
5967 mpo_socket_check_kqfilter_t *mpo_socket_check_kqfilter;
5968 mpo_socket_check_label_update_t *mpo_socket_check_label_update;
5969 mpo_socket_check_listen_t *mpo_socket_check_listen;
5970 mpo_socket_check_receive_t *mpo_socket_check_receive;
5971 mpo_socket_check_received_t *mpo_socket_check_received;
5972 mpo_socket_check_select_t *mpo_socket_check_select;
5973 mpo_socket_check_send_t *mpo_socket_check_send;
5974 mpo_socket_check_stat_t *mpo_socket_check_stat;
5975 mpo_socket_check_setsockopt_t *mpo_socket_check_setsockopt;
5976 mpo_socket_check_getsockopt_t *mpo_socket_check_getsockopt;
5977 mpo_socket_label_associate_accept_t *mpo_socket_label_associate_accept;
5978 mpo_socket_label_associate_t *mpo_socket_label_associate;
5979 mpo_socket_label_copy_t *mpo_socket_label_copy;
5980 mpo_socket_label_destroy_t *mpo_socket_label_destroy;
5981 mpo_socket_label_externalize_t *mpo_socket_label_externalize;
5982 mpo_socket_label_init_t *mpo_socket_label_init;
5983 mpo_socket_label_internalize_t *mpo_socket_label_internalize;
5984 mpo_socket_label_update_t *mpo_socket_label_update;
5985 mpo_socketpeer_label_associate_mbuf_t *mpo_socketpeer_label_associate_mbuf;
5986 mpo_socketpeer_label_associate_socket_t *mpo_socketpeer_label_associate_socket;
5987 mpo_socketpeer_label_destroy_t *mpo_socketpeer_label_destroy;
5988 mpo_socketpeer_label_externalize_t *mpo_socketpeer_label_externalize;
5989 mpo_socketpeer_label_init_t *mpo_socketpeer_label_init;
5990 mpo_system_check_acct_t *mpo_system_check_acct;
5991 mpo_system_check_audit_t *mpo_system_check_audit;
5992 mpo_system_check_auditctl_t *mpo_system_check_auditctl;
5993 mpo_system_check_auditon_t *mpo_system_check_auditon;
5994 mpo_system_check_host_priv_t *mpo_system_check_host_priv;
5995 mpo_system_check_nfsd_t *mpo_system_check_nfsd;
5996 mpo_system_check_reboot_t *mpo_system_check_reboot;
5997 mpo_system_check_settime_t *mpo_system_check_settime;
5998 mpo_system_check_swapoff_t *mpo_system_check_swapoff;
5999 mpo_system_check_swapon_t *mpo_system_check_swapon;
6000 mpo_system_check_sysctl_t *mpo_system_check_sysctl;
6001 mpo_sysvmsg_label_associate_t *mpo_sysvmsg_label_associate;
6002 mpo_sysvmsg_label_destroy_t *mpo_sysvmsg_label_destroy;
6003 mpo_sysvmsg_label_init_t *mpo_sysvmsg_label_init;
6004 mpo_sysvmsg_label_recycle_t *mpo_sysvmsg_label_recycle;
6005 mpo_sysvmsq_check_enqueue_t *mpo_sysvmsq_check_enqueue;
6006 mpo_sysvmsq_check_msgrcv_t *mpo_sysvmsq_check_msgrcv;
6007 mpo_sysvmsq_check_msgrmid_t *mpo_sysvmsq_check_msgrmid;
6008 mpo_sysvmsq_check_msqctl_t *mpo_sysvmsq_check_msqctl;
6009 mpo_sysvmsq_check_msqget_t *mpo_sysvmsq_check_msqget;
6010 mpo_sysvmsq_check_msqrcv_t *mpo_sysvmsq_check_msqrcv;
6011 mpo_sysvmsq_check_msqsnd_t *mpo_sysvmsq_check_msqsnd;
6012 mpo_sysvmsq_label_associate_t *mpo_sysvmsq_label_associate;
6013 mpo_sysvmsq_label_destroy_t *mpo_sysvmsq_label_destroy;
6014 mpo_sysvmsq_label_init_t *mpo_sysvmsq_label_init;
6015 mpo_sysvmsq_label_recycle_t *mpo_sysvmsq_label_recycle;
6016 mpo_sysvsem_check_semctl_t *mpo_sysvsem_check_semctl;
6017 mpo_sysvsem_check_semget_t *mpo_sysvsem_check_semget;
6018 mpo_sysvsem_check_semop_t *mpo_sysvsem_check_semop;
6019 mpo_sysvsem_label_associate_t *mpo_sysvsem_label_associate;
6020 mpo_sysvsem_label_destroy_t *mpo_sysvsem_label_destroy;
6021 mpo_sysvsem_label_init_t *mpo_sysvsem_label_init;
6022 mpo_sysvsem_label_recycle_t *mpo_sysvsem_label_recycle;
6023 mpo_sysvshm_check_shmat_t *mpo_sysvshm_check_shmat;
6024 mpo_sysvshm_check_shmctl_t *mpo_sysvshm_check_shmctl;
6025 mpo_sysvshm_check_shmdt_t *mpo_sysvshm_check_shmdt;
6026 mpo_sysvshm_check_shmget_t *mpo_sysvshm_check_shmget;
6027 mpo_sysvshm_label_associate_t *mpo_sysvshm_label_associate;
6028 mpo_sysvshm_label_destroy_t *mpo_sysvshm_label_destroy;
6029 mpo_sysvshm_label_init_t *mpo_sysvshm_label_init;
6030 mpo_sysvshm_label_recycle_t *mpo_sysvshm_label_recycle;
6031 mpo_task_label_associate_kernel_t *mpo_task_label_associate_kernel;
6032 mpo_task_label_associate_t *mpo_task_label_associate;
6033 mpo_task_label_copy_t *mpo_task_label_copy;
6034 mpo_task_label_destroy_t *mpo_task_label_destroy;
6035 mpo_task_label_externalize_t *mpo_task_label_externalize;
6036 mpo_task_label_init_t *mpo_task_label_init;
6037 mpo_task_label_internalize_t *mpo_task_label_internalize;
6038 mpo_task_label_update_t *mpo_task_label_update;
6039 mpo_thread_userret_t *mpo_thread_userret;
6040 mpo_vnode_check_access_t *mpo_vnode_check_access;
6041 mpo_vnode_check_chdir_t *mpo_vnode_check_chdir;
6042 mpo_vnode_check_chroot_t *mpo_vnode_check_chroot;
6043 mpo_vnode_check_create_t *mpo_vnode_check_create;
6044 mpo_vnode_check_deleteextattr_t *mpo_vnode_check_deleteextattr;
6045 mpo_vnode_check_exchangedata_t *mpo_vnode_check_exchangedata;
6046 mpo_vnode_check_exec_t *mpo_vnode_check_exec;
6047 mpo_vnode_check_getattrlist_t *mpo_vnode_check_getattrlist;
6048 mpo_vnode_check_getextattr_t *mpo_vnode_check_getextattr;
6049 mpo_vnode_check_ioctl_t *mpo_vnode_check_ioctl;
6050 mpo_vnode_check_kqfilter_t *mpo_vnode_check_kqfilter;
6051 mpo_vnode_check_label_update_t *mpo_vnode_check_label_update;
6052 mpo_vnode_check_link_t *mpo_vnode_check_link;
6053 mpo_vnode_check_listextattr_t *mpo_vnode_check_listextattr;
6054 mpo_vnode_check_lookup_t *mpo_vnode_check_lookup;
6055 mpo_vnode_check_open_t *mpo_vnode_check_open;
6056 mpo_vnode_check_read_t *mpo_vnode_check_read;
6057 mpo_vnode_check_readdir_t *mpo_vnode_check_readdir;
6058 mpo_vnode_check_readlink_t *mpo_vnode_check_readlink;
6059 mpo_vnode_check_rename_from_t *mpo_vnode_check_rename_from;
6060 mpo_vnode_check_rename_to_t *mpo_vnode_check_rename_to;
6061 mpo_vnode_check_revoke_t *mpo_vnode_check_revoke;
6062 mpo_vnode_check_select_t *mpo_vnode_check_select;
6063 mpo_vnode_check_setattrlist_t *mpo_vnode_check_setattrlist;
6064 mpo_vnode_check_setextattr_t *mpo_vnode_check_setextattr;
6065 mpo_vnode_check_setflags_t *mpo_vnode_check_setflags;
6066 mpo_vnode_check_setmode_t *mpo_vnode_check_setmode;
6067 mpo_vnode_check_setowner_t *mpo_vnode_check_setowner;
6068 mpo_vnode_check_setutimes_t *mpo_vnode_check_setutimes;
6069 mpo_vnode_check_stat_t *mpo_vnode_check_stat;
6070 mpo_vnode_check_truncate_t *mpo_vnode_check_truncate;
6071 mpo_vnode_check_unlink_t *mpo_vnode_check_unlink;
6072 mpo_vnode_check_write_t *mpo_vnode_check_write;
6073 mpo_vnode_label_associate_devfs_t *mpo_vnode_label_associate_devfs;
6074 mpo_vnode_label_associate_extattr_t *mpo_vnode_label_associate_extattr;
6075 mpo_vnode_label_associate_file_t *mpo_vnode_label_associate_file;
6076 mpo_vnode_label_associate_pipe_t *mpo_vnode_label_associate_pipe;
6077 mpo_vnode_label_associate_posixsem_t *mpo_vnode_label_associate_posixsem;
6078 mpo_vnode_label_associate_posixshm_t *mpo_vnode_label_associate_posixshm;
6079 mpo_vnode_label_associate_singlelabel_t *mpo_vnode_label_associate_singlelabel;
6080 mpo_vnode_label_associate_socket_t *mpo_vnode_label_associate_socket;
6081 mpo_vnode_label_copy_t *mpo_vnode_label_copy;
6082 mpo_vnode_label_destroy_t *mpo_vnode_label_destroy;
6083 mpo_vnode_label_externalize_audit_t *mpo_vnode_label_externalize_audit;
6084 mpo_vnode_label_externalize_t *mpo_vnode_label_externalize;
6085 mpo_vnode_label_init_t *mpo_vnode_label_init;
6086 mpo_vnode_label_internalize_t *mpo_vnode_label_internalize;
6087 mpo_vnode_label_recycle_t *mpo_vnode_label_recycle;
6088 mpo_vnode_label_store_t *mpo_vnode_label_store;
6089 mpo_vnode_label_update_extattr_t *mpo_vnode_label_update_extattr;
6090 mpo_vnode_label_update_t *mpo_vnode_label_update;
6091 mpo_vnode_notify_create_t *mpo_vnode_notify_create;
6092 mpo_vnode_check_signature_t *mpo_vnode_check_signature;
6093 mpo_vnode_check_uipc_bind_t *mpo_vnode_check_uipc_bind;
6094 mpo_vnode_check_uipc_connect_t *mpo_vnode_check_uipc_connect;
6095 mac_proc_check_run_cs_invalid_t *mpo_proc_check_run_cs_invalid;
6096 mpo_proc_check_suspend_resume_t *mpo_proc_check_suspend_resume;
6097 mpo_reserved_hook_t *mpo_reserved5;
6098 mpo_reserved_hook_t *mpo_reserved6;
6099 mpo_reserved_hook_t *mpo_reserved7;
6100 mpo_reserved_hook_t *mpo_reserved8;
6101 mpo_reserved_hook_t *mpo_reserved9;
6102 };
6103
6104 /**
6105 @brief MAC policy handle type
6106
6107 The MAC handle is used to uniquely identify a loaded policy within
6108 the MAC Framework.
6109
6110 A variable of this type is set by mac_policy_register().
6111 */
6112 typedef unsigned int mac_policy_handle_t;
6113
6114 #define mpc_t struct mac_policy_conf *
6115
6116 /**
6117 @brief Mac policy configuration
6118
6119 This structure specifies the configuration information for a
6120 MAC policy module. A policy module developer must supply
6121 a short unique policy name, a more descriptive full name, a list of label
6122 namespaces and count, a pointer to the registered enty point operations,
6123 any load time flags, and optionally, a pointer to a label slot identifier.
6124
6125 The Framework will update the runtime flags (mpc_runtime_flags) to
6126 indicate that the module has been registered.
6127
6128 If the label slot identifier (mpc_field_off) is NULL, the Framework
6129 will not provide label storage for the policy. Otherwise, the
6130 Framework will store the label location (slot) in this field.
6131
6132 The mpc_list field is used by the Framework and should not be
6133 modified by policies.
6134 */
6135 /* XXX - reorder these for better aligment on 64bit platforms */
6136 struct mac_policy_conf {
6137 const char *mpc_name; /** policy name */
6138 const char *mpc_fullname; /** full name */
6139 const char **mpc_labelnames; /** managed label namespaces */
6140 unsigned int mpc_labelname_count; /** number of managed label namespaces */
6141 struct mac_policy_ops *mpc_ops; /** operation vector */
6142 int mpc_loadtime_flags; /** load time flags */
6143 int *mpc_field_off; /** label slot */
6144 int mpc_runtime_flags; /** run time flags */
6145 mpc_t mpc_list; /** List reference */
6146 void *mpc_data; /** module data */
6147 };
6148
6149 /**
6150 @brief MAC policy module registration routine
6151
6152 This function is called to register a policy with the
6153 MAC framework. A policy module will typically call this from the
6154 Darwin KEXT registration routine.
6155 */
6156 int mac_policy_register(struct mac_policy_conf *mpc,
6157 mac_policy_handle_t *handlep, void *xd);
6158
6159 /**
6160 @brief MAC policy module de-registration routine
6161
6162 This function is called to de-register a policy with theD
6163 MAC framework. A policy module will typically call this from the
6164 Darwin KEXT de-registration routine.
6165 */
6166 int mac_policy_unregister(mac_policy_handle_t handle);
6167
6168 /*
6169 * Framework entry points for the policies to add audit data.
6170 */
6171 int mac_audit_text(char *text, mac_policy_handle_t handle);
6172
6173 /*
6174 * Calls to assist with use of Apple XATTRs within policy modules.
6175 */
6176 int mac_vnop_setxattr(struct vnode *, const char *, char *, size_t);
6177 int mac_vnop_getxattr(struct vnode *, const char *, char *, size_t,
6178 size_t *);
6179 int mac_vnop_removexattr(struct vnode *, const char *);
6180
6181 /*
6182 * Arbitrary limit on how much data will be logged by the audit
6183 * entry points above.
6184 */
6185 #define MAC_AUDIT_DATA_LIMIT 1024
6186
6187 /*
6188 * Values returned by mac_audit_{pre,post}select. To combine the responses
6189 * of the security policies into a single decision,
6190 * mac_audit_{pre,post}select() choose the greatest value returned.
6191 */
6192 #define MAC_AUDIT_DEFAULT 0 /* use system behavior */
6193 #define MAC_AUDIT_NO 1 /* force not auditing this event */
6194 #define MAC_AUDIT_YES 2 /* force auditing this event */
6195
6196 // \defgroup mpc_loadtime_flags Flags for the mpc_loadtime_flags field
6197
6198 /**
6199 @name Flags for the mpc_loadtime_flags field
6200 @see mac_policy_conf
6201
6202 This is the complete list of flags that are supported by the
6203 mpc_loadtime_flags field of the mac_policy_conf structure. These
6204 flags specify the load time behavior of MAC Framework policy
6205 modules.
6206 */
6207
6208 /*@{*/
6209
6210 /**
6211 @brief Flag to indicate registration preference
6212
6213 This flag indicates that the policy module must be loaded and
6214 initialized early in the boot process. If the flag is specified,
6215 attempts to register the module following boot will be rejected. The
6216 flag may be used by policies that require pervasive labeling of all
6217 system objects, and cannot handle objects that have not been
6218 properly initialized by the policy.
6219 */
6220 #define MPC_LOADTIME_FLAG_NOTLATE 0x00000001
6221
6222 /**
6223 @brief Flag to indicate unload preference
6224
6225 This flag indicates that the policy module may be unloaded. If this
6226 flag is not set, then the policy framework will reject requests to
6227 unload the module. This flag might be used by modules that allocate
6228 label state and are unable to free that state at runtime, or for
6229 modules that simply do not want to permit unload operations.
6230 */
6231 #define MPC_LOADTIME_FLAG_UNLOADOK 0x00000002
6232
6233 /**
6234 @brief Unsupported
6235
6236 XXX This flag is not yet supported.
6237 */
6238 #define MPC_LOADTIME_FLAG_LABELMBUFS 0x00000004
6239
6240 /**
6241 @brief Flag to indicate a base policy
6242
6243 This flag indicates that the policy module is a base policy. Only
6244 one module can declare itself as base, otherwise the boot process
6245 will be halted.
6246 */
6247 #define MPC_LOADTIME_BASE_POLICY 0x00000008
6248
6249 /*@}*/
6250
6251 /**
6252 @brief Policy registration flag
6253 @see mac_policy_conf
6254
6255 This flag indicates that the policy module has been successfully
6256 registered with the TrustedBSD MAC Framework. The Framework will
6257 set this flag in the mpc_runtime_flags field of the policy's
6258 mac_policy_conf structure after registering the policy.
6259 */
6260 #define MPC_RUNTIME_FLAG_REGISTERED 0x00000001
6261
6262 /*
6263 * Depends on POLICY_VER
6264 */
6265
6266 #ifndef POLICY_VER
6267 #define POLICY_VER 1.0
6268 #endif
6269
6270 #define MAC_POLICY_SET(handle, mpops, mpname, mpfullname, lnames, lcount, slot, lflags, rflags) \
6271 static struct mac_policy_conf mpname##_mac_policy_conf = { \
6272 .mpc_name = #mpname, \
6273 .mpc_fullname = mpfullname, \
6274 .mpc_labelnames = lnames, \
6275 .mpc_labelname_count = lcount, \
6276 .mpc_ops = mpops, \
6277 .mpc_loadtime_flags = lflags, \
6278 .mpc_field_off = slot, \
6279 .mpc_runtime_flags = rflags \
6280 }; \
6281 \
6282 static kern_return_t \
6283 kmod_start(kmod_info_t *ki, void *xd) \
6284 { \
6285 return mac_policy_register(&mpname##_mac_policy_conf, \
6286 &handle, xd); \
6287 } \
6288 \
6289 static kern_return_t \
6290 kmod_stop(kmod_info_t *ki, void *xd) \
6291 { \
6292 return mac_policy_unregister(handle); \
6293 } \
6294 \
6295 extern kern_return_t _start(kmod_info_t *ki, void *data); \
6296 extern kern_return_t _stop(kmod_info_t *ki, void *data); \
6297 \
6298 KMOD_EXPLICIT_DECL(security.mpname, POLICY_VER, _start, _stop) \
6299 kmod_start_func_t *_realmain = kmod_start; \
6300 kmod_stop_func_t *_antimain = kmod_stop; \
6301 int _kext_apple_cc = __APPLE_CC__
6302
6303
6304 #define LABEL_TO_SLOT(l, s) (l)->l_perpolicy[s]
6305
6306 /*
6307 * Policy interface to map a struct label pointer to per-policy data.
6308 * Typically, policies wrap this in their own accessor macro that casts an
6309 * intptr_t to a policy-specific data type.
6310 */
6311 intptr_t mac_label_get(struct label *l, int slot);
6312 void mac_label_set(struct label *l, int slot, intptr_t v);
6313
6314 #define mac_get_mpc(h) (mac_policy_list.entries[h].mpc)
6315
6316 /**
6317 @name Flags for MAC allocator interfaces
6318
6319 These flags are passed to the Darwin kernel allocator routines to
6320 indicate whether the allocation is permitted to block or not.
6321 Caution should be taken; some operations are not permitted to sleep,
6322 and some types of locks cannot be held when sleeping.
6323 */
6324
6325 /*@{*/
6326
6327 /**
6328 @brief Allocation operations may block
6329
6330 If memory is not immediately available, the allocation routine
6331 will block (typically sleeping) until memory is available.
6332
6333 @warning Inappropriate use of this flag may cause kernel panics.
6334 */
6335 #define MAC_WAITOK 0
6336
6337 /**
6338 @brief Allocation operations may not block
6339
6340 Rather than blocking, the allocator may return an error if memory
6341 is not immediately available. This type of allocation will not
6342 sleep, preserving locking semantics.
6343 */
6344 #define MAC_NOWAIT 1
6345
6346 /*@}*/
6347
6348 #endif /* !_SECURITY_MAC_POLICY_H_ */