2 * Copyright (c) 2007-2008 Apple Inc. All rights reserved.
4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
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.
15 * Please obtain a copy of the License at
16 * http://www.opensource.apple.com/apsl/ and read it before using this file.
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.
26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
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.
34 * This software was developed by Robert Watson for the TrustedBSD Project.
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.
41 * This software was enhanced by SPARTA ISSO under SPAWAR contract
42 * N66001-04-C-6019 ("SEFOS").
44 * Redistribution and use in source and binary forms, with or without
45 * modification, are permitted provided that the following conditions
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.
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
65 * $FreeBSD: src/sys/sys/mac_policy.h,v 1.39 2003/04/18 19:57:37 rwatson Exp $
70 @brief Kernel Interfaces for MAC policy modules
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
80 #ifndef _SECURITY_MAC_POLICY_H_
81 #define _SECURITY_MAC_POLICY_H_
83 #include <security/_label.h>
95 struct mac_module_data
;
96 struct mac_policy_conf
;
113 #ifndef _KAUTH_CRED_T
114 #define _KAUTH_CRED_T
115 typedef struct ucred
*kauth_cred_t
;
116 #endif /* !_KAUTH_CRED_T */
120 * MAC entry points are generally named using the following template:
122 * mpo_<object>_<operation>()
126 * mpo_<object>_check_<operation>()
128 * Entry points are sorted by object type.
130 * It may be desirable also to consider some subsystems as "objects", such
131 * as system, iokit, etc.
135 @name Entry Points for Label Management
137 These are the entry points corresponding to the life cycle events for
138 kernel objects, such as initialization, creation, and destruction.
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
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.
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.
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
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.
174 @warning The suppression behavior will probably go away in Apple's
175 future version of the audit implementation.
177 @return Return MAC_AUDIT_NO to force suppression of the audit record.
178 Any other value results in the audit record being committed.
181 typedef int mpo_audit_check_postselect_t(
183 unsigned short syscode
,
189 @brief Audit event preselection
190 @param cred Subject credential
191 @param syscode Syscall number
192 @param args Syscall arguments
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.
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.
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.
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.
217 typedef int mpo_audit_check_preselect_t(
219 unsigned short syscode
,
223 @brief Initialize BPF descriptor label
224 @param label New label to initialize
226 Initialize the label for a newly instantiated BPF descriptor.
227 Sleeping is permitted.
229 typedef void mpo_bpfdesc_label_init_t(
233 @brief Destroy BPF descriptor label
234 @param label The label to be destroyed
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.
240 typedef void mpo_bpfdesc_label_destroy_t(
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
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.
253 typedef void mpo_bpfdesc_label_associate_t(
256 struct label
*bpflabel
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
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.
271 typedef int mpo_bpfdesc_check_receive_t(
273 struct label
*bpflabel
,
275 struct label
*ifnetlabel
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
286 @see mpo_cred_label_update_execve_t
287 @see mpo_vnode_check_exec_t
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.
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.
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.
306 The vnode lock is held during this operation. No changes should be
307 made to the old credential structure.
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.
313 @return Non-zero if a transition is required, 0 otherwise.
315 typedef int mpo_cred_check_label_update_execve_t(
318 struct label
*vnodelabel
,
319 struct label
*scriptvnodelabel
,
320 struct label
*execlabel
,
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
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.
336 @return Return 0 if access is granted, otherwise an appropriate value for
337 errno should be returned.
339 typedef int mpo_cred_check_label_update_t(
341 struct label
*newlabel
344 @brief Access control check for visibility of other subjects
345 @param u1 Subject credential
346 @param u2 Object credential
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.
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.
357 typedef int mpo_cred_check_visible_t(
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
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.
372 typedef void mpo_cred_label_associate_fork_t(
377 @brief Create the first process
378 @param cred Subject credential to be labeled
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.
384 typedef void mpo_cred_label_associate_kernel_t(
388 @brief Create a credential label
389 @param parent_cred Parent credential
390 @param child_cred Child credential
392 Set the label of a newly created credential, most likely using the
393 information in the supplied parent credential.
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.
399 typedef void mpo_cred_label_associate_t(
400 kauth_cred_t parent_cred
,
401 kauth_cred_t child_cred
404 @brief Create the first process
405 @param cred Subject credential to be labeled
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.
411 typedef void mpo_cred_label_associate_user_t(
415 @brief Destroy credential label
416 @param label The label to be destroyed
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.
422 typedef void mpo_cred_label_destroy_t(
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
430 @param sb String buffer to be filled with a text representation of the label
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.
438 @return 0 on success, return non-zero if an error occurs while
439 externalizing the label data.
442 typedef int mpo_cred_label_externalize_audit_t(
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
452 @param sb String buffer to be filled with a text representation of the label
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
460 @return 0 on success, return non-zero if an error occurs while
461 externalizing the label data.
464 typedef int mpo_cred_label_externalize_t(
470 @brief Initialize user credential label
471 @param label New label to initialize
473 Initialize the label for a newly instantiated user credential.
474 Sleeping is permitted.
476 typedef void mpo_cred_label_init_t(
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
484 @param element_data Text data to be internalized
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.
492 The policy's internalize entry points will be called only if the
493 policy has registered interest in the label namespace.
495 @return 0 on success, Otherwise, return non-zero if an error occurs
496 while internalizing the label data.
499 typedef int mpo_cred_label_internalize_t(
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
513 @see mpo_cred_check_label_update_execve_t
514 @see mpo_vnode_check_exec_t
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.
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.
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.
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.
535 The vnode lock is held during this operation. No changes should be
536 made to the old credential structure.
538 typedef void mpo_cred_label_update_execve_t(
539 kauth_cred_t old_cred
,
540 kauth_cred_t new_cred
,
542 struct label
*vnodelabel
,
543 struct label
*scriptvnodelabel
,
544 struct label
*execlabel
,
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
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.
558 typedef void mpo_cred_label_update_t(
560 struct label
*newlabel
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
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'.
573 typedef void mpo_devfs_label_associate_device_t(
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
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.
591 typedef void mpo_devfs_label_associate_directory_t(
599 @brief Copy a devfs label
600 @param src Source devfs label
601 @param dest Destination devfs label
603 Copy the label information from src to dest. The devfs file system
604 often duplicates (splits) existing device nodes rather than creating
607 typedef void mpo_devfs_label_copy_t(
612 @brief Destroy devfs label
613 @param label The label to be destroyed
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.
619 typedef void mpo_devfs_label_destroy_t(
623 @brief Initialize devfs label
624 @param label New label to initialize
626 Initialize the label for a newly instantiated devfs entry. Sleeping
629 typedef void mpo_devfs_label_init_t(
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
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.
644 typedef void mpo_devfs_label_update_t(
647 struct label
*delabel
,
649 struct label
*vnodelabel
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
657 Determine whether the subject identified by the credential can
658 change the offset of the file represented by fg.
660 @return Return 0 if access if granted, otherwise an appropriate
661 value for errno should be returned.
663 typedef int mpo_file_check_change_offset_t(
669 @brief Access control for creating a file descriptor
670 @param cred Subject credential
672 Determine whether the subject identified by the credential can
673 allocate a new file descriptor.
675 @return Return 0 if access if granted, otherwise an appropriate
676 value for errno should be returned.
678 typedef int mpo_file_check_create_t(
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
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.
692 @return Return 0 if access if granted, otherwise an appropriate
693 value for errno should be returned.
695 typedef int mpo_file_check_dup_t(
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)
709 Determine whether the subject identified by the credential can perform
710 the file control operation indicated by cmd.
712 @return Return 0 if access is granted, otherwise an appropriate value for
713 errno should be returned.
715 typedef int mpo_file_check_fcntl_t(
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
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.
732 @return Return 0 if access is granted, otherwise an appropriate value for
733 errno should be returned.
735 typedef int mpo_file_check_get_t(
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
747 Determine whether the subject identified by the credential can
748 get the offset of the file represented by fg.
750 @return Return 0 if access if granted, otherwise an appropriate
751 value for errno should be returned.
753 typedef int mpo_file_check_get_offset_t(
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
764 Determine whether the subject identified by the credential can
765 inherit the fileglob structure represented by fg.
767 @return Return 0 if access if granted, otherwise an appropriate
768 value for errno should be returned.
770 typedef int mpo_file_check_inherit_t(
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)
782 Determine whether the subject identified by the credential can perform
783 the ioctl operation indicated by cmd.
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.
789 @return Return 0 if access is granted, otherwise an appropriate value for
790 errno should be returned.
793 typedef int mpo_file_check_ioctl_t(
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
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.
810 @return Return 0 if access is granted, otherwise an appropriate value for
811 errno should be returned.
814 typedef int mpo_file_check_lock_t(
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
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.
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.
841 typedef int mpo_file_check_mmap_t(
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
856 Downgrade the mmap protections based on the subject and object labels.
858 typedef void mpo_file_check_mmap_downgrade_t(
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
870 Determine whether the subject identified by the credential can
871 receive the fileglob structure represented by fg.
873 @return Return 0 if access if granted, otherwise an appropriate
874 value for errno should be returned.
876 typedef int mpo_file_check_receive_t(
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
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.
892 @return Return 0 if access is granted, otherwise an appropriate value for
893 errno should be returned.
895 typedef int mpo_file_check_set_t(
902 @brief Create file label
903 @param cred Subject credential
904 @param fg Fileglob structure
905 @param label Policy label for fg
907 typedef void mpo_file_label_associate_t(
913 @brief Destroy file label
914 @param label The label to be destroyed
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.
920 typedef void mpo_file_label_destroy_t(
924 @brief Initialize file label
925 @param label New label to initialize
927 typedef void mpo_file_label_init_t(
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
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).
942 @return Return 0 if access is granted, otherwise an appropriate value for
943 errno should be returned.
945 typedef int mpo_ifnet_check_label_update_t(
948 struct label
*ifnetlabel
,
949 struct label
*newlabel
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}
960 Determine whether the mbuf with label mbuflabel may be transmitted
961 through the network interface represented by ifp that has the
964 @return Return 0 if access is granted, otherwise an appropriate value for
965 errno should be returned.
967 typedef int mpo_ifnet_check_transmit_t(
969 struct label
*ifnetlabel
,
971 struct label
*mbuflabel
,
976 @brief Create a network interface label
977 @param ifp Network interface labeled
978 @param ifnetlabel Label for the network interface
980 Set the label of a newly created network interface, most likely
981 using the information in the supplied network interface struct.
983 typedef void mpo_ifnet_label_associate_t(
985 struct label
*ifnetlabel
988 @brief Copy an ifnet label
989 @param src Source ifnet label
990 @param dest Destination ifnet label
992 Copy the label information from src to dest.
994 typedef void mpo_ifnet_label_copy_t(
999 @brief Destroy ifnet label
1000 @param label The label to be destroyed
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.
1006 typedef void mpo_ifnet_label_destroy_t(
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
1014 @param sb String buffer to be filled with a text representation of the label
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
1022 @return 0 on success, return non-zero if an error occurs while
1023 externalizing the label data.
1026 typedef int mpo_ifnet_label_externalize_t(
1027 struct label
*label
,
1032 @brief Initialize ifnet label
1033 @param label New label to initialize
1035 typedef void mpo_ifnet_label_init_t(
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
1043 @param element_data Text data to be internalized
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.
1051 The policy's internalize entry points will be called only if the
1052 policy has registered interest in the label namespace.
1054 @return 0 on success, Otherwise, return non-zero if an error occurs
1055 while internalizing the label data.
1058 typedef int mpo_ifnet_label_internalize_t(
1059 struct label
*label
,
1064 @brief Recycle up a network interface label
1065 @param label The label to be recycled
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.
1072 typedef void mpo_ifnet_label_recycle_t(
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
1083 Update the label on a network interface, using the supplied new label.
1085 typedef void mpo_ifnet_label_update_t(
1088 struct label
*ifnetlabel
,
1089 struct label
*newlabel
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}
1100 Determine whether the mbuf with label mbuflabel may be received
1101 by the socket associated with inpcb that has the label inplabel.
1103 @return Return 0 if access is granted, otherwise an appropriate value for
1104 errno should be returned.
1106 typedef int mpo_inpcb_check_deliver_t(
1108 struct label
*inplabel
,
1110 struct label
*mbuflabel
,
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
1121 Set the label of a newly created inpcb, most likely
1122 using the information in the socket and/or socket label.
1124 typedef void mpo_inpcb_label_associate_t(
1126 struct label
*solabel
,
1128 struct label
*inplabel
1131 @brief Destroy inpcb label
1132 @param label The label to be destroyed
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.
1138 typedef void mpo_inpcb_label_destroy_t(
1142 @brief Initialize inpcb label
1143 @param label New label to initialize
1144 @param flag M_WAITOK or M_NOWAIT
1146 typedef int mpo_inpcb_label_init_t(
1147 struct label
*label
,
1151 @brief Recycle up an inpcb label
1152 @param label The label to be recycled
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.
1158 typedef void mpo_inpcb_label_recycle_t(
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
1168 Set the label of a newly created inpcb due to a change in the
1169 underlying socket label.
1171 typedef void mpo_inpcb_label_update_t(
1173 struct label
*solabel
,
1175 struct label
*inplabel
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
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.
1191 @warning This is an experimental interface and may change in the future.
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.
1198 typedef int mpo_iokit_check_device_t(
1200 struct mac_module_data
*mdata
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
1209 Set the label on a newly created IP reassembly queue from
1210 the mbuf header of the first received fragment.
1212 typedef void mpo_ipq_label_associate_t(
1213 struct mbuf
*fragment
,
1214 struct label
*fragmentlabel
,
1216 struct label
*ipqlabel
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
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.
1236 typedef int mpo_ipq_label_compare_t(
1237 struct mbuf
*fragment
,
1238 struct label
*fragmentlabel
,
1240 struct label
*ipqlabel
1243 @brief Destroy IP reassembly queue label
1244 @param label The label to be destroyed
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.
1250 typedef void mpo_ipq_label_destroy_t(
1254 @brief Initialize IP reassembly queue label
1255 @param label New label to initialize
1256 @param flag M_WAITOK or M_NOWAIT
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.
1267 typedef int mpo_ipq_label_init_t(
1268 struct label
*label
,
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
1278 Update the label on an IP fragment reassembly queue (ipq) based
1279 on the acceptance of the passed IP fragment mbuf header (fragment).
1281 typedef void mpo_ipq_label_update_t(
1282 struct mbuf
*fragment
,
1283 struct label
*fragmentlabel
,
1285 struct label
*ipqlabel
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
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.
1301 @return Return 0 if access is granted, otherwise an appropriate value for
1302 errno should be returned.
1304 typedef int mpo_lctx_check_label_update_t(
1306 struct label
*newlabel
1309 @brief Destroy Login Context label
1310 @param label The label to be destroyed
1312 typedef void mpo_lctx_label_destroy_t(
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
1320 @param sb String buffer to be filled with a text representation of the label
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
1328 @return 0 on success, return non-zero if an error occurs while
1329 externalizing the label data.
1332 typedef int mpo_lctx_label_externalize_t(
1333 struct label
*label
,
1338 @brief Initialize Login Context label
1339 @param label New label to initialize
1341 typedef void mpo_lctx_label_init_t(
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
1349 @param element_data Text data to be internalized
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.
1357 The policy's internalize entry points will be called only if the
1358 policy has registered interest in the label namespace.
1360 @return 0 on success, Otherwise, return non-zero if an error occurs
1361 while internalizing the label data.
1364 typedef int mpo_lctx_label_internalize_t(
1365 struct label
*label
,
1370 @brief Update a Login Context label
1372 @param newlabel A new label to apply to the Login Context
1373 @see mpo_lctx_check_label_update_t
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.
1381 typedef void mpo_lctx_label_update_t(
1383 struct label
*newlabel
1386 @brief A process has created a login context
1388 @param l Login Context
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
1394 typedef void mpo_lctx_notify_create_t(
1399 @brief A process has joined a login context
1401 @param l Login Context
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'.
1407 typedef void mpo_lctx_notify_join_t(
1412 @brief A process has left a login context
1414 @param l Login Context
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'.
1420 typedef void mpo_lctx_notify_leave_t(
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
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
1436 typedef void mpo_mbuf_label_associate_bpfdesc_t(
1437 struct bpf_d
*bpf_d
,
1438 struct label
*b_label
,
1440 struct label
*m_label
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
1449 Label an mbuf based on the interface from which it was received.
1451 typedef void mpo_mbuf_label_associate_ifnet_t(
1453 struct label
*i_label
,
1455 struct label
*m_label
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
1464 Label an mbuf based on the inpcb from which it was derived.
1466 typedef void mpo_mbuf_label_associate_inpcb_t(
1468 struct label
*i_label
,
1470 struct label
*m_label
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
1479 Set the label on a newly reassembled IP datagram (mbuf) from the IP
1480 fragment reassembly queue (ipq) from which it was generated.
1482 typedef void mpo_mbuf_label_associate_ipq_t(
1484 struct label
*ipqlabel
,
1486 struct label
*mbuflabel
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
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.
1500 typedef void mpo_mbuf_label_associate_linklayer_t(
1502 struct label
*i_label
,
1504 struct label
*m_label
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
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.
1520 typedef void mpo_mbuf_label_associate_multicast_encap_t(
1521 struct mbuf
*oldmbuf
,
1522 struct label
*oldmbuflabel
,
1524 struct label
*ifplabel
,
1525 struct mbuf
*newmbuf
,
1526 struct label
*newmbuflabel
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
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.
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
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
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
1560 Only labeled MBUFs will be presented to the policy via this entrypoint.
1562 typedef void mpo_mbuf_label_associate_socket_t(
1564 struct label
*so_label
,
1566 struct label
*m_label
1569 @brief Copy a mbuf label
1570 @param src Source label
1571 @param dest Destination label
1573 Copy the mbuf label information in src into dest.
1575 Only called when both source and destination mbufs have labels.
1577 typedef void mpo_mbuf_label_copy_t(
1582 @brief Destroy mbuf label
1583 @param label The label to be destroyed
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
1590 typedef void mpo_mbuf_label_destroy_t(
1594 @brief Initialize mbuf label
1595 @param label New label to initialize
1596 @param flag Malloc flags
1598 Initialize the label for a newly instantiated mbuf.
1600 @warning Since it is possible for the flags to be set to
1601 M_NOWAIT, the malloc operation may fail.
1603 @return On success, 0, otherwise, an appropriate errno return value.
1605 typedef int mpo_mbuf_label_init_t(
1606 struct label
*label
,
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)
1616 Determine whether the subject identified by the credential can perform
1617 the volume operation indicated by com.
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.
1624 @return Return 0 if access is granted, otherwise an appropriate value for
1625 errno should be returned.
1627 typedef int mpo_mount_check_fsctl_t(
1630 struct label
*label
,
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
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.
1643 @return Return 0 if access is granted, otherwise an appropriate value for
1644 errno should be returned.
1647 typedef int mpo_mount_check_getattr_t(
1650 struct label
*mp_label
,
1651 struct vfs_attr
*vfa
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
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.
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.
1666 typedef int mpo_mount_check_label_update_t(
1669 struct label
*mntlabel
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
1679 Determine whether the subject identified by the credential can perform
1680 the mount operation on the target vnode.
1682 @return Return 0 if access is granted, otherwise an appropriate value for
1683 errno should be returned.
1685 typedef int mpo_mount_check_mount_t(
1688 struct label
*vlabel
,
1689 struct componentname
*cnp
,
1690 const char *vfc_name
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
1698 Determine whether the subject identified by the credential can perform
1699 the remount operation on the target vnode.
1701 @return Return 0 if access is granted, otherwise an appropriate value for
1702 errno should be returned.
1704 typedef int mpo_mount_check_remount_t(
1707 struct label
*mlabel
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
1715 This entry point determines whether given subject can set information
1716 about the given file system, for example the volume name.
1718 @return Return 0 if access is granted, otherwise an appropriate value for
1719 errno should be returned.
1722 typedef int mpo_mount_check_setattr_t(
1725 struct label
*mp_label
,
1726 struct vfs_attr
*vfa
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
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)
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.
1745 typedef int mpo_mount_check_stat_t(
1748 struct label
*mntlabel
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
1756 Determine whether the subject identified by the credential can perform
1757 the unmount operation on the target vnode.
1759 @return Return 0 if access is granted, otherwise an appropriate value for
1760 errno should be returned.
1762 typedef int mpo_mount_check_umount_t(
1765 struct label
*mlabel
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
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.
1777 typedef void mpo_mount_label_associate_t(
1780 struct label
*mntlabel
1783 @brief Destroy mount label
1784 @param label The label to be destroyed
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
1791 typedef void mpo_mount_label_destroy_t(
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
1799 @param sb String buffer to be filled with a text representation of the label
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.
1806 The policy's externalize entry points will be called only if the
1807 policy has registered interest in the label namespace.
1809 @return 0 on success, return non-zero if an error occurs while
1810 externalizing the label data.
1813 typedef int mpo_mount_label_externalize_t(
1814 struct label
*label
,
1819 @brief Initialize mount point label
1820 @param label New label to initialize
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.
1830 typedef void mpo_mount_label_init_t(
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
1838 @param element_data Text data to be internalized
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.
1846 The policy's internalize entry points will be called only if the
1847 policy has registered interest in the label namespace.
1849 @return 0 on success, Otherwise, return non-zero if an error occurs
1850 while internalizing the label data.
1853 typedef int mpo_mount_label_internalize_t(
1854 struct label
*label
,
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
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.
1869 typedef void mpo_netinet_fragment_t(
1870 struct mbuf
*datagram
,
1871 struct label
*datagramlabel
,
1872 struct mbuf
*fragment
,
1873 struct label
*fragmentlabel
1876 @brief Set the label on an ICMP reply
1877 @param m mbuf containing the ICMP reply
1878 @param mlabel Policy label for m
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.
1884 typedef void mpo_netinet_icmp_reply_t(
1886 struct label
*mlabel
1889 @brief Set the label on a TCP reply
1890 @param m mbuf containing the TCP reply
1891 @param mlabel Policy label for m
1893 Called for outgoing TCP packets not associated with an actual socket.
1895 typedef void mpo_netinet_tcp_reply_t(
1897 struct label
*mlabel
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)
1906 Determine whether the subject identified by the credential can perform
1907 the ioctl operation indicated by cmd.
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.
1913 @return Return 0 if access is granted, otherwise an appropriate value for
1914 errno should be returned.
1917 typedef int mpo_pipe_check_ioctl_t(
1920 struct label
*pipelabel
,
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
1930 Determine whether the subject identified by the credential can
1931 receive the knote on the passed pipe.
1933 @return Return 0 if access if granted, otherwise an appropriate
1934 value for errno should be returned.
1936 typedef int mpo_pipe_check_kqfilter_t(
1940 struct label
*pipelabel
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
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.
1953 @return Return 0 if access is granted, otherwise an appropriate value for
1954 errno should be returned.
1957 typedef int mpo_pipe_check_label_update_t(
1960 struct label
*pipelabel
,
1961 struct label
*newlabel
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
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.
1973 @return Return 0 if access is granted, otherwise an appropriate value for
1974 errno should be returned.
1977 typedef int mpo_pipe_check_read_t(
1980 struct label
*pipelabel
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
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.
1993 @return Return 0 if access is granted, otherwise an appropriate value for
1994 errno should be returned.
1997 typedef int mpo_pipe_check_select_t(
2000 struct label
*pipelabel
,
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
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.
2013 @return Return 0 if access is granted, otherwise an appropriate value for
2014 errno should be returned.
2017 typedef int mpo_pipe_check_stat_t(
2020 struct label
*pipelabel
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
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.
2032 @return Return 0 if access is granted, otherwise an appropriate value for
2033 errno should be returned.
2036 typedef int mpo_pipe_check_write_t(
2039 struct label
*pipelabel
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
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?).
2052 typedef void mpo_pipe_label_associate_t(
2055 struct label
*pipelabel
2058 @brief Copy a pipe label
2059 @param src Source pipe label
2060 @param dest Destination pipe label
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.
2066 typedef void mpo_pipe_label_copy_t(
2071 @brief Destroy pipe label
2072 @param label The label to be destroyed
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.
2078 typedef void mpo_pipe_label_destroy_t(
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
2086 @param sb String buffer to be filled with a text representation of the label
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
2094 The policy's externalize entry points will be called only if the
2095 policy has registered interest in the label namespace.
2097 @return 0 on success, return non-zero if an error occurs while
2098 externalizing the label data.
2101 typedef int mpo_pipe_label_externalize_t(
2102 struct label
*label
,
2107 @brief Initialize pipe label
2108 @param label New label to initialize
2110 Initialize label storage for use with a newly instantiated pipe object.
2111 Sleeping is permitted.
2113 typedef void mpo_pipe_label_init_t(
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
2121 @param element_data Text data to be internalized
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.
2129 The policy's internalize entry points will be called only if the
2130 policy has registered interest in the label namespace.
2132 @return 0 on success, Otherwise, return non-zero if an error occurs
2133 while internalizing the label data.
2136 typedef int mpo_pipe_label_internalize_t(
2137 struct label
*label
,
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
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.
2155 typedef void mpo_pipe_label_update_t(
2158 struct label
*oldlabel
,
2159 struct label
*newlabel
2162 @brief Policy unload event
2163 @param mpc MAC policy configuration
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.
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.
2175 @see MPC_LOADTIME_FLAG_UNLOADOK
2177 typedef void mpo_policy_destroy_t(
2178 struct mac_policy_conf
*mpc
2181 @brief Policy initialization event
2182 @param mpc MAC policy configuration
2183 @see mac_policy_register
2184 @see mpo_policy_initbsd_t
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.
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.
2201 typedef void mpo_policy_init_t(
2202 struct mac_policy_conf
*mpc
2205 @brief Policy BSD initialization event
2206 @param mpc MAC policy configuration
2207 @see mpo_policy_init_t
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.
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.
2223 typedef void mpo_policy_initbsd_t(
2224 struct mac_policy_conf
*mpc
2227 @brief Policy extension service
2228 @param p Calling process
2229 @param call Policy-specific syscall number
2230 @param arg Pointer to syscall arguments
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.
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.
2250 @return In the event of an error, an appropriate value for errno
2251 should be returned, otherwise return 0 upon success.
2253 typedef int mpo_policy_syscall_t(
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
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.
2270 The task label and the port are locked. Sleeping is permitted.
2272 @return Return 0 if access is granted, non-zero otherwise.
2274 typedef int mpo_port_check_copy_send_t(
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
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.
2290 The task label and the port are locked. Sleeping is permitted.
2292 @return Return 0 if access is granted, non-zero otherwise.
2294 typedef int mpo_port_check_hold_receive_t(
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
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.
2309 The task label and the port are locked. Sleeping is permitted.
2311 @return Return 0 if access is granted, non-zero otherwise.
2313 typedef int mpo_port_check_hold_send_once_t(
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
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.
2328 The task label and the port are locked. Sleeping is permitted.
2330 @return Return 0 if access is granted, non-zero otherwise.
2332 typedef int mpo_port_check_hold_send_t(
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
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.
2347 @warning XXX In future releases, the task label lock will likely
2350 @return Return 0 if access is granted, non-zero otherwise.
2352 typedef int mpo_port_check_label_update_t(
2354 struct label
*oldlabel
,
2355 struct label
*newlabel
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
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.
2370 The task label and the port are locked. Sleeping is permitted.
2372 @return Return 0 if access is granted, non-zero otherwise.
2374 typedef int mpo_port_check_make_send_once_t(
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
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.
2391 The task label and the port are locked. Sleeping is permitted.
2393 @return Return 0 if access is granted, non-zero otherwise.
2395 typedef int mpo_port_check_make_send_t(
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
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
2415 @return 0 for access granted, nonzero for access denied.
2418 typedef int mpo_port_check_method_t(
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
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.
2437 The task label and the port are locked. Sleeping is permitted.
2439 @return Return 0 if access is granted, non-zero otherwise.
2441 typedef int mpo_port_check_move_receive_t(
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
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.
2457 The task label and the port are locked. Sleeping is permitted.
2459 @return Return 0 if access is granted, non-zero otherwise.
2461 typedef int mpo_port_check_move_send_once_t(
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
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.
2477 The task label and the port are locked. Sleeping is permitted.
2479 @return Return 0 if access is granted, non-zero otherwise.
2481 typedef int mpo_port_check_move_send_t(
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
2490 Access control check for receiving messages. The two labels are locked.
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
2497 @return Return 0 if access is granted, non-zero otherwise.
2499 typedef int mpo_port_check_receive_t(
2501 struct label
*sender
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
2508 Access control check for sending messages. The task label and the
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
2516 @return Return 0 if access is granted, non-zero otherwise.
2518 typedef int mpo_port_check_send_t(
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
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.
2536 @return Return 0 if access is granted, non-zero otherwise.
2538 typedef int mpo_port_check_service_t(
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
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.
2552 typedef void mpo_port_label_associate_kernel_t(
2553 struct label
*portlabel
,
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
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.
2567 typedef void mpo_port_label_associate_t(
2570 struct label
*portlabel
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
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.
2586 @return 0 on success, or an errno value for failure.
2588 typedef int mpo_port_label_compute_t(
2595 @brief Copy a Mach port label
2596 @param src Source port label
2597 @param dest Destination port label
2599 Copy the Mach port label information from src to dest. This is used
2600 to copy user-suplied labels into an existing port.
2602 typedef void mpo_port_label_copy_t(
2607 @brief Destroy Mach port label
2608 @param label The label to be destroyed
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.
2614 typedef void mpo_port_label_destroy_t(
2618 @brief Initialize Mach port label
2619 @param label New label to initialize
2621 Initialize the label for a newly instantiated Mach port. Sleeping
2624 typedef void mpo_port_label_init_t(
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
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).
2640 typedef void mpo_port_label_update_cred_t(
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
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.
2655 typedef void mpo_port_label_update_kobject_t(
2656 struct label
*portlabel
,
2660 @brief Access control check for POSIX semaphore create
2661 @param cred Subject credential
2662 @param name String name of the semaphore
2664 Determine whether the subject identified by the credential can create
2665 a POSIX semaphore specified by name.
2667 @return Return 0 if access is granted, otherwise an appropriate value for
2668 errno should be returned.
2670 typedef int mpo_posixsem_check_create_t(
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
2680 Determine whether the subject identified by the credential can open
2681 the named POSIX semaphore with label semlabel.
2683 @return Return 0 if access is granted, otherwise an appropriate value for
2684 errno should be returned.
2686 typedef int mpo_posixsem_check_open_t(
2688 struct pseminfo
*ps
,
2689 struct label
*semlabel
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
2697 Determine whether the subject identified by the credential can unlock
2698 the named POSIX semaphore with label semlabel.
2700 @return Return 0 if access is granted, otherwise an appropriate value for
2701 errno should be returned.
2703 typedef int mpo_posixsem_check_post_t(
2705 struct pseminfo
*ps
,
2706 struct label
*semlabel
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
2715 Determine whether the subject identified by the credential can remove
2716 the named POSIX semaphore with label semlabel.
2718 @return Return 0 if access is granted, otherwise an appropriate value for
2719 errno should be returned.
2721 typedef int mpo_posixsem_check_unlink_t(
2723 struct pseminfo
*ps
,
2724 struct label
*semlabel
,
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
2733 Determine whether the subject identified by the credential can lock
2734 the named POSIX semaphore with label semlabel.
2736 @return Return 0 if access is granted, otherwise an appropriate value for
2737 errno should be returned.
2739 typedef int mpo_posixsem_check_wait_t(
2741 struct pseminfo
*ps
,
2742 struct label
*semlabel
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
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.
2756 typedef void mpo_posixsem_label_associate_t(
2758 struct pseminfo
*ps
,
2759 struct label
*semlabel
,
2763 @brief Destroy POSIX semaphore label
2764 @param label The label to be destroyed
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.
2770 typedef void mpo_posixsem_label_destroy_t(
2774 @brief Initialize POSIX semaphore label
2775 @param label New label to initialize
2777 Initialize the label for a newly instantiated POSIX semaphore. Sleeping
2780 typedef void mpo_posixsem_label_init_t(
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
2788 Determine whether the subject identified by the credential can create
2789 the POSIX shared memory region referenced by name.
2791 @return Return 0 if access is granted, otherwise an appropriate value for
2792 errno should be returned.
2794 typedef int mpo_posixshm_check_create_t(
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)
2806 Determine whether the subject identified by the credential can map
2807 the POSIX shared memory segment associated with shmlabel.
2809 @return Return 0 if access is granted, otherwise an appropriate value for
2810 errno should be returned.
2812 typedef int mpo_posixshm_check_mmap_t(
2814 struct pshminfo
*ps
,
2815 struct label
*shmlabel
,
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
2825 Determine whether the subject identified by the credential can open
2826 the POSIX shared memory region.
2828 @return Return 0 if access is granted, otherwise an appropriate value for
2829 errno should be returned.
2831 typedef int mpo_posixshm_check_open_t(
2833 struct pshminfo
*ps
,
2834 struct label
*shmlabel
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
2842 Determine whether the subject identified by the credential can obtain
2843 status for the POSIX shared memory segment associated with shmlabel.
2845 @return Return 0 if access is granted, otherwise an appropriate value for
2846 errno should be returned.
2848 typedef int mpo_posixshm_check_stat_t(
2850 struct pshminfo
*ps
,
2851 struct label
*shmlabel
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
2860 Determine whether the subject identified by the credential can truncate
2861 or extend (to len) the POSIX shared memory segment associated with shmlabel.
2863 @return Return 0 if access is granted, otherwise an appropriate value for
2864 errno should be returned.
2866 typedef int mpo_posixshm_check_truncate_t(
2868 struct pshminfo
*ps
,
2869 struct label
*shmlabel
,
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
2879 Determine whether the subject identified by the credential can delete
2880 the POSIX shared memory segment associated with shmlabel.
2882 @return Return 0 if access is granted, otherwise an appropriate value for
2883 errno should be returned.
2885 typedef int mpo_posixshm_check_unlink_t(
2887 struct pshminfo
*ps
,
2888 struct label
*shmlabel
,
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
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.
2903 typedef void mpo_posixshm_label_associate_t(
2905 struct pshminfo
*ps
,
2906 struct label
*shmlabel
,
2910 @brief Destroy POSIX shared memory label
2911 @param label The label to be destroyed
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
2918 typedef void mpo_posixshm_label_destroy_t(
2922 @brief Initialize POSIX Shared Memory region label
2923 @param label New label to initialize
2925 Initialize the label for newly a instantiated POSIX Shared Memory
2926 region. Sleeping is permitted.
2928 typedef void mpo_posixshm_label_init_t(
2932 @brief Access control check for debugging process
2933 @param cred Subject credential
2934 @param proc Object process
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.
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.
2945 typedef int mpo_proc_check_debug_t(
2950 @brief Access control over fork
2951 @param cred Subject credential
2952 @param proc Subject process trying to fork
2954 Determine whether the subject identified is allowed to fork.
2956 @return Return 0 if access is granted, otherwise an appropriate value for
2957 errno should be returned.
2959 typedef int mpo_proc_check_fork_t(
2964 @brief Access control check for retrieving audit information
2965 @param cred Subject credential
2967 Determine whether the subject identified by the credential can get
2968 audit information such as the audit user ID, the preselection mask,
2969 the terminal ID and the audit session ID, using the getaudit() system call.
2971 @return Return 0 if access is granted, otherwise an appropriate value for
2972 errno should be returned.
2974 typedef int mpo_proc_check_getaudit_t(
2978 @brief Access control check for retrieving audit user ID
2979 @param cred Subject credential
2981 Determine whether the subject identified by the credential can get
2982 the user identity being used by the auditing system, using the getauid()
2985 @return Return 0 if access is granted, otherwise an appropriate value for
2986 errno should be returned.
2988 typedef int mpo_proc_check_getauid_t(
2992 @brief Access control check for retrieving Login Context ID
2993 @param p0 Calling process
2994 @param p Effected process
2995 @param pid syscall PID argument
2997 Determine if getlcid(2) system call is permitted.
2999 Information returned by this system call is similar to that returned via
3000 process listings etc.
3002 @return Return 0 if access is granted, otherwise an appropriate value for
3003 errno should be returned.
3005 typedef int mpo_proc_check_getlcid_t(
3011 @brief Access control check for setting memory protections
3012 @param cred Subject credential
3013 @param proc User process requesting the change
3014 @param addr Start address of the memory range
3015 @param size Length address of the memory range
3016 @param prot Memory protections, see mmap(2)
3018 Determine whether the subject identified by the credential should
3019 be allowed to set the specified memory protections on memory mapped
3020 in the process proc.
3022 @return Return 0 if access is granted, otherwise an appropriate value for
3023 errno should be returned.
3025 typedef int mpo_proc_check_mprotect_t(
3033 @brief Access control check for changing scheduling parameters
3034 @param cred Subject credential
3035 @param proc Object process
3037 Determine whether the subject identified by the credential can change
3038 the scheduling parameters of the passed process.
3040 @return Return 0 if access is granted, otherwise an appropriate value for
3041 errno should be returned. Suggested failure: EACCES for label mismatch,
3042 EPERM for lack of privilege, or ESRCH to limit visibility.
3044 typedef int mpo_proc_check_sched_t(
3049 @brief Access control check for setting audit information
3050 @param cred Subject credential
3051 @param ai Audit information
3053 Determine whether the subject identified by the credential can set
3054 audit information such as the the preselection mask, the terminal ID
3055 and the audit session ID, using the setaudit() system call.
3057 @return Return 0 if access is granted, otherwise an appropriate value for
3058 errno should be returned.
3060 typedef int mpo_proc_check_setaudit_t(
3062 struct auditinfo_addr
*ai
3065 @brief Access control check for setting audit user ID
3066 @param cred Subject credential
3067 @param auid Audit user ID
3069 Determine whether the subject identified by the credential can set
3070 the user identity used by the auditing system, using the setauid()
3073 @return Return 0 if access is granted, otherwise an appropriate value for
3074 errno should be returned.
3076 typedef int mpo_proc_check_setauid_t(
3081 @brief Access control check for setting the Login Context
3082 @param p0 Calling process
3083 @param p Effected process
3084 @param pid syscall PID argument
3085 @param lcid syscall LCID argument
3087 Determine if setlcid(2) system call is permitted.
3089 See xnu/bsd/kern/kern_prot.c:setlcid() implementation for example of
3090 decoding syscall arguments to determine action desired by caller.
3092 Five distinct actions are possible: CREATE JOIN LEAVE ADOPT ORPHAN
3094 @return Return 0 if access is granted, otherwise an appropriate value for
3095 errno should be returned.
3097 typedef int mpo_proc_check_setlcid_t(
3104 @brief Access control check for delivering signal
3105 @param cred Subject credential
3106 @param proc Object process
3107 @param signum Signal number; see kill(2)
3109 Determine whether the subject identified by the credential can deliver
3110 the passed signal to the passed process.
3112 @warning Programs typically expect to be able to send and receive
3113 signals as part or their normal process lifecycle; caution should be
3114 exercised when implementing access controls over signal events.
3116 @return Return 0 if access is granted, otherwise an appropriate value for
3117 errno should be returned. Suggested failure: EACCES for label mismatch,
3118 EPERM for lack of privilege, or ESRCH to limit visibility.
3120 typedef int mpo_proc_check_signal_t(
3126 @brief Access control check for wait
3127 @param cred Subject credential
3128 @param proc Object process
3130 Determine whether the subject identified by the credential can wait
3131 for process termination.
3133 @warning Caution should be exercised when implementing access
3134 controls for wait, since programs often wait for child processes to
3135 exit. Failure to be notified of a child process terminating may
3136 cause the parent process to hang, or may produce zombie processes.
3138 @return Return 0 if access is granted, otherwise an appropriate value for
3139 errno should be returned.
3141 typedef int mpo_proc_check_wait_t(
3146 @brief Destroy process label
3147 @param label The label to be destroyed
3149 Destroy a process label. Since the object is going
3150 out of scope, policy modules should free any internal storage
3151 associated with the label so that it may be destroyed.
3153 typedef void mpo_proc_label_destroy_t(
3157 @brief Initialize process label
3158 @param label New label to initialize
3159 @see mpo_cred_label_init_t
3161 Initialize the label for a newly instantiated BSD process structure.
3162 Normally, security policies will store the process label in the user
3163 credential rather than here in the process structure. However,
3164 there are some floating label policies that may need to temporarily
3165 store a label in the process structure until it is safe to update
3166 the user credential label. Sleeping is permitted.
3168 typedef void mpo_proc_label_init_t(
3172 @brief Access control check for socket accept
3173 @param cred Subject credential
3174 @param socket Object socket
3175 @param socklabel Policy label for socket
3177 Determine whether the subject identified by the credential can accept()
3178 a new connection on the socket from the host specified by addr.
3180 @return Return 0 if access if granted, otherwise an appropriate
3181 value for errno should be returned.
3183 typedef int mpo_socket_check_accept_t(
3186 struct label
*socklabel
3189 @brief Access control check for a pending socket accept
3190 @param cred Subject credential
3191 @param so Object socket
3192 @param socklabel Policy label for socket
3193 @param addr Address of the listening socket (coming soon)
3195 Determine whether the subject identified by the credential can accept()
3196 a pending connection on the socket from the host specified by addr.
3198 @return Return 0 if access if granted, otherwise an appropriate
3199 value for errno should be returned.
3201 typedef int mpo_socket_check_accepted_t(
3204 struct label
*socklabel
,
3205 struct sockaddr
*addr
3208 @brief Access control check for socket bind
3209 @param cred Subject credential
3210 @param so Object socket
3211 @param socklabel Policy label for socket
3212 @param addr Name to assign to the socket
3214 Determine whether the subject identified by the credential can bind()
3215 the name (addr) to the socket.
3217 @return Return 0 if access if granted, otherwise an appropriate
3218 value for errno should be returned.
3220 typedef int mpo_socket_check_bind_t(
3223 struct label
*socklabel
,
3224 struct sockaddr
*addr
3227 @brief Access control check for socket connect
3228 @param cred Subject credential
3229 @param so Object socket
3230 @param socklabel Policy label for socket
3231 @param addr Name to assign to the socket
3233 Determine whether the subject identified by the credential can
3234 connect() the passed socket to the remote host specified by addr.
3236 @return Return 0 if access if granted, otherwise an appropriate
3237 value for errno should be returned.
3239 typedef int mpo_socket_check_connect_t(
3242 struct label
*socklabel
,
3243 struct sockaddr
*addr
3246 @brief Access control check for socket() system call.
3247 @param cred Subject credential
3248 @param domain communication domain
3249 @param type socket type
3250 @param protocol socket protocol
3252 Determine whether the subject identified by the credential can
3253 make the socket() call.
3255 @return Return 0 if access if granted, otherwise an appropriate
3256 value for errno should be returned.
3258 typedef int mpo_socket_check_create_t(
3265 @brief Access control check for delivering data to a user's receieve queue
3266 @param so The socket data is being delivered to
3267 @param so_label The label of so
3268 @param m The mbuf whose data will be deposited into the receive queue
3269 @param m_label The label of the sender of the data.
3271 A socket has a queue for receiving incoming data. When a packet arrives
3272 on the wire, it eventually gets deposited into this queue, which the
3273 owner of the socket drains when they read from the socket's file descriptor.
3275 This function determines whether the socket can receive data from
3276 the sender specified by m_label.
3278 @warning There is an outstanding design issue surrounding the placement
3279 of this function. The check must be placed either before or after the
3280 TCP sequence and ACK counters are updated. Placing the check before
3281 the counters are updated causes the incoming packet to be resent by
3282 the remote if the check rejects it. Placing the check after the counters
3283 are updated results in a completely silent drop. As far as each TCP stack
3284 is concerned the packet was received, however, the data will not be in the
3285 socket's receive queue. Another consideration is that the current design
3286 requires using the "failed label" occasionally. In that case, on rejection,
3287 we want the remote TCP to resend the data. Because of this, we chose to
3288 place this check before the counters are updated, so rejected packets will be
3289 resent by the remote host.
3291 If a policy keeps rejecting the same packet, eventually the connection will
3292 be dropped. Policies have several options if this design causes problems.
3293 For example, one options is to sanitize the mbuf such that it is acceptable,
3294 then accept it. That may require negotiation between policies as the
3295 Framework will not know to re-check the packet.
3297 The policy must handle NULL MBUF labels. This will likely be the case
3298 for non-local TCP sockets for example.
3300 @return Return 0 if access if granted, otherwise an appropriate
3301 value for errno should be returned.
3303 typedef int mpo_socket_check_deliver_t(
3305 struct label
*so_label
,
3307 struct label
*m_label
3310 @brief Access control check for socket kqfilter
3311 @param cred Subject credential
3312 @param kn Object knote
3313 @param so Object socket
3314 @param socklabel Policy label for socket
3316 Determine whether the subject identified by the credential can
3317 receive the knote on the passed socket.
3319 @return Return 0 if access if granted, otherwise an appropriate
3320 value for errno should be returned.
3322 typedef int mpo_socket_check_kqfilter_t(
3326 struct label
*socklabel
3329 @brief Access control check for socket relabel
3330 @param cred Subject credential
3331 @param so Object socket
3332 @param so_label The current label of so
3333 @param newlabel The label to be assigned to so
3335 Determine whether the subject identified by the credential can
3336 change the label on the socket.
3338 @return Return 0 if access if granted, otherwise an appropriate
3339 value for errno should be returned.
3341 typedef int mpo_socket_check_label_update_t(
3344 struct label
*so_label
,
3345 struct label
*newlabel
3348 @brief Access control check for socket listen
3349 @param cred Subject credential
3350 @param so Object socket
3351 @param socklabel Policy label for socket
3353 Determine whether the subject identified by the credential can
3354 listen() on the passed socket.
3356 @return Return 0 if access if granted, otherwise an appropriate
3357 value for errno should be returned.
3359 typedef int mpo_socket_check_listen_t(
3362 struct label
*socklabel
3365 @brief Access control check for socket receive
3366 @param cred Subject credential
3367 @param so Object socket
3368 @param socklabel Policy label for socket
3370 Determine whether the subject identified by the credential can
3371 receive data from the socket.
3373 @return Return 0 if access if granted, otherwise an appropriate
3374 value for errno should be returned.
3376 typedef int mpo_socket_check_receive_t(
3379 struct label
*socklabel
3383 @brief Access control check for socket receive
3384 @param cred Subject credential
3385 @param socket Object socket
3386 @param socklabel Policy label for socket
3387 @param addr Name of the remote socket
3389 Determine whether the subject identified by the credential can
3390 receive data from the remote host specified by addr.
3392 @return Return 0 if access if granted, otherwise an appropriate
3393 value for errno should be returned.
3395 typedef int mpo_socket_check_received_t(
3397 struct socket
*sock
,
3398 struct label
*socklabel
,
3399 struct sockaddr
*saddr
3404 @brief Access control check for socket select
3405 @param cred Subject credential
3406 @param so Object socket
3407 @param socklabel Policy label for socket
3408 @param which The operation selected on: FREAD or FWRITE
3410 Determine whether the subject identified by the credential can use the
3411 socket in a call to select().
3413 @return Return 0 if access if granted, otherwise an appropriate
3414 value for errno should be returned.
3416 typedef int mpo_socket_check_select_t(
3419 struct label
*socklabel
,
3423 @brief Access control check for socket send
3424 @param cred Subject credential
3425 @param so Object socket
3426 @param socklabel Policy label for socket
3427 @param addr Address being sent to
3429 Determine whether the subject identified by the credential can send
3432 @return Return 0 if access if granted, otherwise an appropriate
3433 value for errno should be returned.
3435 typedef int mpo_socket_check_send_t(
3438 struct label
*socklabel
,
3439 struct sockaddr
*addr
3442 @brief Access control check for retrieving socket status
3443 @param cred Subject credential
3444 @param so Object socket
3445 @param socklabel Policy label for so
3447 Determine whether the subject identified by the credential can
3448 execute the stat() system call on the given socket.
3450 @return Return 0 if access if granted, otherwise an appropriate
3451 value for errno should be returned.
3453 typedef int mpo_socket_check_stat_t(
3456 struct label
*socklabel
3459 @brief Access control check for setting socket options
3460 @param cred Subject credential
3461 @param so Object socket
3462 @param socklabel Policy label for so
3463 @param sopt The options being set
3465 Determine whether the subject identified by the credential can
3466 execute the setsockopt system call on the given socket.
3468 @return Return 0 if access if granted, otherwise an appropriate
3469 value for errno should be returned.
3471 typedef int mpo_socket_check_setsockopt_t(
3474 struct label
*socklabel
,
3475 struct sockopt
*sopt
3478 @brief Access control check for getting socket options
3479 @param cred Subject credential
3480 @param so Object socket
3481 @param socklabel Policy label for so
3482 @param sopt The options to get
3484 Determine whether the subject identified by the credential can
3485 execute the getsockopt system call on the given socket.
3487 @return Return 0 if access if granted, otherwise an appropriate
3488 value for errno should be returned.
3490 typedef int mpo_socket_check_getsockopt_t(
3493 struct label
*socklabel
,
3494 struct sockopt
*sopt
3497 @brief Label a socket
3498 @param oldsock Listening socket
3499 @param oldlabel Policy label associated with oldsock
3500 @param newsock New socket
3501 @param newlabel Policy label associated with newsock
3503 A new socket is created when a connection is accept(2)ed. This
3504 function labels the new socket based on the existing listen(2)ing
3507 typedef void mpo_socket_label_associate_accept_t(
3509 struct label
*oldlabel
,
3511 struct label
*newlabel
3514 @brief Assign a label to a new socket
3515 @param cred Credential of the owning process
3516 @param so The socket being labeled
3517 @param solabel The label
3518 @warning cred can be NULL
3520 Set the label on a newly created socket from the passed subject
3521 credential. This call is made when a socket is created. The
3522 credentials may be null if the socket is being created by the
3525 typedef void mpo_socket_label_associate_t(
3528 struct label
*solabel
3531 @brief Copy a socket label
3532 @param src Source label
3533 @param dest Destination label
3535 Copy the socket label information in src into dest.
3537 typedef void mpo_socket_label_copy_t(
3542 @brief Destroy socket label
3543 @param label The label to be destroyed
3545 Destroy a socket label. Since the object is going out of
3546 scope, policy modules should free any internal storage associated
3547 with the label so that it may be destroyed.
3549 typedef void mpo_socket_label_destroy_t(
3553 @brief Externalize a socket label
3554 @param label Label to be externalized
3555 @param element_name Name of the label namespace for which labels should be
3557 @param sb String buffer to be filled with a text representation of label
3559 Produce an externalized socket label based on the label structure passed.
3560 An externalized label consists of a text representation of the label
3561 contents that can be used with userland applications and read by the
3562 user. If element_name does not match a namespace managed by the policy,
3563 simply return 0. Only return nonzero if an error occurs while externalizing
3566 @return In the event of an error, an appropriate value for errno
3567 should be returned, otherwise return 0 upon success.
3569 typedef int mpo_socket_label_externalize_t(
3570 struct label
*label
,
3575 @brief Initialize socket label
3576 @param label New label to initialize
3577 @param waitok Malloc flags
3579 Initialize the label of a newly instantiated socket. The waitok
3580 field may be one of M_WAITOK and M_NOWAIT, and should be employed to
3581 avoid performing a sleeping malloc(9) during this initialization
3582 call. It it not always safe to sleep during this entry point.
3584 @warning Since it is possible for the waitok flags to be set to
3585 M_NOWAIT, the malloc operation may fail.
3587 @return In the event of an error, an appropriate value for errno
3588 should be returned, otherwise return 0 upon success.
3590 typedef int mpo_socket_label_init_t(
3591 struct label
*label
,
3595 @brief Internalize a socket label
3596 @param label Label to be filled in
3597 @param element_name Name of the label namespace for which the label should
3599 @param element_data Text data to be internalized
3601 Produce an internal socket label structure based on externalized label
3602 data in text format.
3604 The policy's internalize entry points will be called only if the
3605 policy has registered interest in the label namespace.
3607 @return In the event of an error, an appropriate value for errno
3608 should be returned, otherwise return 0 upon success.
3610 typedef int mpo_socket_label_internalize_t(
3611 struct label
*label
,
3616 @brief Relabel socket
3617 @param cred Subject credential
3618 @param so Object; socket
3619 @param so_label Current label of the socket
3620 @param newlabel The label to be assigned to so
3622 The subject identified by the credential has previously requested
3623 and was authorized to relabel the socket; this entry point allows
3624 policies to perform the actual label update operation.
3626 @warning XXX This entry point will likely change in future versions.
3628 typedef void mpo_socket_label_update_t(
3631 struct label
*so_label
,
3632 struct label
*newlabel
3635 @brief Set the peer label on a socket from mbuf
3636 @param m Mbuf chain received on socket so
3637 @param m_label Label for m
3638 @param so Current label for the socket
3639 @param so_label Policy label to be filled out for the socket
3641 Set the peer label of a socket based on the label of the sender of the
3644 This is called for every TCP/IP packet received. The first call for a given
3645 socket operates on a newly initialized label, and subsequent calls operate
3646 on existing label data.
3648 @warning Because this can affect performance significantly, it has
3649 different sematics than other 'set' operations. Typically, 'set' operations
3650 operate on newly initialzed labels and policies do not need to worry about
3651 clobbering existing values. In this case, it is too inefficient to
3652 initialize and destroy a label every time data is received for the socket.
3653 Instead, it is up to the policies to determine how to replace the label data.
3654 Most policies should be able to replace the data inline.
3656 typedef void mpo_socketpeer_label_associate_mbuf_t(
3658 struct label
*m_label
,
3660 struct label
*so_label
3663 @brief Set the peer label on a socket from socket
3664 @param source Local socket
3665 @param sourcelabel Policy label for source
3666 @param target Peer socket
3667 @param targetlabel Policy label to fill in for target
3669 Set the peer label on a stream UNIX domain socket from the passed
3670 remote socket endpoint. This call will be made when the socket pair
3671 is connected, and will be made for both endpoints.
3673 Note that this call is only made on connection; it is currently not updated
3674 during communication.
3676 typedef void mpo_socketpeer_label_associate_socket_t(
3678 struct label
*sourcelabel
,
3680 struct label
*targetlabel
3683 @brief Destroy socket peer label
3684 @param label The peer label to be destroyed
3686 Destroy a socket peer label. Since the object is going out of
3687 scope, policy modules should free any internal storage associated
3688 with the label so that it may be destroyed.
3690 typedef void mpo_socketpeer_label_destroy_t(
3694 @brief Externalize a socket peer label
3695 @param label Label to be externalized
3696 @param element_name Name of the label namespace for which labels should be
3698 @param sb String buffer to be filled with a text representation of label
3700 Produce an externalized socket peer label based on the label structure
3701 passed. An externalized label consists of a text representation of the
3702 label contents that can be used with userland applications and read by the
3703 user. If element_name does not match a namespace managed by the policy,
3704 simply return 0. Only return nonzero if an error occurs while externalizing
3707 @return In the event of an error, an appropriate value for errno
3708 should be returned, otherwise return 0 upon success.
3710 typedef int mpo_socketpeer_label_externalize_t(
3711 struct label
*label
,
3716 @brief Initialize socket peer label
3717 @param label New label to initialize
3718 @param waitok Malloc flags
3720 Initialize the peer label of a newly instantiated socket. The
3721 waitok field may be one of M_WAITOK and M_NOWAIT, and should be
3722 employed to avoid performing a sleeping malloc(9) during this
3723 initialization call. It it not always safe to sleep during this
3726 @warning Since it is possible for the waitok flags to be set to
3727 M_NOWAIT, the malloc operation may fail.
3729 @return In the event of an error, an appropriate value for errno
3730 should be returned, otherwise return 0 upon success.
3732 typedef int mpo_socketpeer_label_init_t(
3733 struct label
*label
,
3737 @brief Access control check for enabling accounting
3738 @param cred Subject credential
3739 @param vp Accounting file
3740 @param vlabel Label associated with vp
3742 Determine whether the subject should be allowed to enable accounting,
3743 based on its label and the label of the accounting log file. See
3744 acct(5) for more information.
3746 As accounting is disabled by passing NULL to the acct(2) system call,
3747 the policy should be prepared for both 'vp' and 'vlabel' to be NULL.
3749 @return Return 0 if access is granted, otherwise an appropriate value for
3750 errno should be returned.
3752 typedef int mpo_system_check_acct_t(
3755 struct label
*vlabel
3758 @brief Access control check for audit
3759 @param cred Subject credential
3760 @param record Audit record
3761 @param length Audit record length
3763 Determine whether the subject identified by the credential can submit
3764 an audit record for inclusion in the audit log via the audit() system call.
3766 @return Return 0 if access is granted, otherwise an appropriate value for
3767 errno should be returned.
3769 typedef int mpo_system_check_audit_t(
3775 @brief Access control check for controlling audit
3776 @param cred Subject credential
3777 @param vp Audit file
3778 @param vl Label associated with vp
3780 Determine whether the subject should be allowed to enable auditing using
3781 the auditctl() system call, based on its label and the label of the proposed
3784 @return Return 0 if access is granted, otherwise an appropriate value for
3785 errno should be returned.
3787 typedef int mpo_system_check_auditctl_t(
3793 @brief Access control check for manipulating auditing
3794 @param cred Subject credential
3795 @param cmd Audit control command
3797 Determine whether the subject identified by the credential can perform
3798 the audit subsystem control operation cmd via the auditon() system call.
3800 @return Return 0 if access is granted, otherwise an appropriate value for
3801 errno should be returned.
3803 typedef int mpo_system_check_auditon_t(
3808 @brief Access control check for obtaining the host control port
3809 @param cred Subject credential
3811 Determine whether the subject identified by the credential can
3812 obtain the host control port.
3814 @return Return 0 if access is granted, or non-zero otherwise.
3816 typedef int mpo_system_check_host_priv_t(
3820 @brief Access control check for calling NFS services
3821 @param cred Subject credential
3823 Determine whether the subject identified by the credential should be
3824 allowed to call nfssrv(2).
3826 @return Return 0 if access is granted, otherwise an appropriate value for
3827 errno should be returned.
3829 typedef int mpo_system_check_nfsd_t(
3833 @brief Access control check for reboot
3834 @param cred Subject credential
3835 @param howto howto parameter from reboot(2)
3837 Determine whether the subject identified by the credential should be
3838 allowed to reboot the system in the specified manner.
3840 @return Return 0 if access is granted, otherwise an appropriate value for
3841 errno should be returned.
3843 typedef int mpo_system_check_reboot_t(
3848 @brief Access control check for setting system clock
3849 @param cred Subject credential
3851 Determine whether the subject identified by the credential should be
3852 allowed to set the system clock.
3854 @return Return 0 if access is granted, otherwise an appropriate value for
3855 errno should be returned.
3857 typedef int mpo_system_check_settime_t(
3861 @brief Access control check for removing swap devices
3862 @param cred Subject credential
3863 @param vp Swap device
3864 @param label Label associated with vp
3866 Determine whether the subject identified by the credential should be
3867 allowed to remove vp as a swap device.
3869 @return Return 0 if access is granted, otherwise an appropriate value for
3870 errno should be returned.
3872 typedef int mpo_system_check_swapoff_t(
3878 @brief Access control check for adding swap devices
3879 @param cred Subject credential
3880 @param vp Swap device
3881 @param label Label associated with vp
3883 Determine whether the subject identified by the credential should be
3884 allowed to add vp as a swap device.
3886 @return Return 0 if access is granted, otherwise an appropriate value for
3887 errno should be returned.
3889 typedef int mpo_system_check_swapon_t(
3895 @brief Access control check for sysctl
3896 @param cred Subject credential
3897 @param name Integer name; see sysctl(3)
3898 @param namelen Length of name array of integers; see sysctl(3)
3899 @param old 0 or address where to store old value; see sysctl(3)
3900 @param oldlenp Pointer to length of old buffer; see sysctl(3)
3901 @param inkernel Boolean; 1 if called from kernel
3902 @param newvalue 0 or address of new value; see sysctl(3)
3903 @param newlen Length of new buffer; see sysctl(3)
3905 Determine whether the subject identified by the credential should be
3906 allowed to make the specified sysctl(3) transaction.
3908 The sysctl(3) call specifies that if the old value is not desired,
3909 oldp and oldlenp should be set to NULL. Likewise, if a new value is
3910 not to be set, newp should be set to NULL and newlen set to 0.
3912 @return Return 0 if access is granted, otherwise an appropriate value for
3913 errno should be returned.
3915 typedef int mpo_system_check_sysctl_t(
3919 user_addr_t old
, /* NULLOK */
3920 user_addr_t oldlenp
, /* NULLOK */
3922 user_addr_t newvalue
, /* NULLOK */
3926 @brief Create a System V message label
3927 @param cred Subject credential
3928 @param msqkptr The message queue the message will be placed in
3929 @param msqlabel The label of the message queue
3930 @param msgptr The message
3931 @param msglabel The label of the message
3933 Label the message as its placed in the message queue.
3935 typedef void mpo_sysvmsg_label_associate_t(
3937 struct msqid_kernel
*msqptr
,
3938 struct label
*msqlabel
,
3940 struct label
*msglabel
3943 @brief Destroy System V message label
3944 @param label The label to be destroyed
3946 Destroy a System V message label. Since the object is
3947 going out of scope, policy modules should free any internal storage
3948 associated with the label so that it may be destroyed.
3950 typedef void mpo_sysvmsg_label_destroy_t(
3954 @brief Initialize System V message label
3955 @param label New label to initialize
3957 Initialize the label for a newly instantiated System V message.
3959 typedef void mpo_sysvmsg_label_init_t(
3963 @brief Clean up a System V message label
3964 @param label The label to be destroyed
3966 Clean up a System V message label. Darwin pre-allocates
3967 messages at system boot time and re-uses them rather than
3968 allocating new ones. Before messages are returned to the "free
3969 pool", policies can cleanup or overwrite any information present in
3972 typedef void mpo_sysvmsg_label_recycle_t(
3976 @brief Access control check for System V message enqueuing
3977 @param cred Subject credential
3978 @param msgptr The message
3979 @param msglabel The message's label
3980 @param msqkptr The message queue
3981 @param msqlabel The message queue's label
3983 Determine whether the subject identified by the credential can add the
3984 given message to the given message queue.
3986 @return Return 0 if access is granted, otherwise an appropriate value for
3987 errno should be returned.
3989 typedef int mpo_sysvmsq_check_enqueue_t(
3992 struct label
*msglabel
,
3993 struct msqid_kernel
*msqptr
,
3994 struct label
*msqlabel
3997 @brief Access control check for System V message reception
3998 @param cred The credential of the intended recipient
3999 @param msgptr The message
4000 @param msglabel The message's label
4002 Determine whether the subject identified by the credential can receive
4005 @return Return 0 if access is granted, otherwise an appropriate value for
4006 errno should be returned.
4008 typedef int mpo_sysvmsq_check_msgrcv_t(
4011 struct label
*msglabel
4014 @brief Access control check for System V message queue removal
4015 @param cred The credential of the caller
4016 @param msgptr The message
4017 @param msglabel The message's label
4019 System V message queues are removed using the msgctl() system call.
4020 The system will iterate over each messsage in the queue, calling this
4021 function for each, to determine whether the caller has the appropriate
4024 @return Return 0 if access is granted, otherwise an appropriate value for
4025 errno should be returned.
4027 typedef int mpo_sysvmsq_check_msgrmid_t(
4030 struct label
*msglabel
4033 @brief Access control check for msgctl()
4034 @param cred The credential of the caller
4035 @param msqptr The message queue
4036 @param msqlabel The message queue's label
4038 This access check is performed to validate calls to msgctl().
4040 @return Return 0 if access is granted, otherwise an appropriate value for
4041 errno should be returned.
4043 typedef int mpo_sysvmsq_check_msqctl_t(
4045 struct msqid_kernel
*msqptr
,
4046 struct label
*msqlabel
,
4050 @brief Access control check to get a System V message queue
4051 @param cred The credential of the caller
4052 @param msqptr The message queue requested
4053 @param msqlabel The message queue's label
4055 On a call to msgget(), if the queue requested already exists,
4056 and it is a public queue, this check will be performed before the
4057 queue's ID is returned to the user.
4059 @return Return 0 if access is granted, otherwise an appropriate value for
4060 errno should be returned.
4062 typedef int mpo_sysvmsq_check_msqget_t(
4064 struct msqid_kernel
*msqptr
,
4065 struct label
*msqlabel
4068 @brief Access control check to receive a System V message from the given queue
4069 @param cred The credential of the caller
4070 @param msqptr The message queue to receive from
4071 @param msqlabel The message queue's label
4073 On a call to msgrcv(), this check is performed to determine whether the
4074 caller has receive rights on the given queue.
4076 @return Return 0 if access is granted, otherwise an appropriate value for
4077 errno should be returned.
4079 typedef int mpo_sysvmsq_check_msqrcv_t(
4081 struct msqid_kernel
*msqptr
,
4082 struct label
*msqlabel
4085 @brief Access control check to send a System V message to the given queue
4086 @param cred The credential of the caller
4087 @param msqptr The message queue to send to
4088 @param msqlabel The message queue's label
4090 On a call to msgsnd(), this check is performed to determine whether the
4091 caller has send rights on the given queue.
4093 @return Return 0 if access is granted, otherwise an appropriate value for
4094 errno should be returned.
4096 typedef int mpo_sysvmsq_check_msqsnd_t(
4098 struct msqid_kernel
*msqptr
,
4099 struct label
*msqlabel
4102 @brief Create a System V message queue label
4103 @param cred Subject credential
4104 @param msqkptr The message queue
4105 @param msqlabel The label of the message queue
4108 typedef void mpo_sysvmsq_label_associate_t(
4110 struct msqid_kernel
*msqptr
,
4111 struct label
*msqlabel
4114 @brief Destroy System V message queue label
4115 @param label The label to be destroyed
4117 Destroy a System V message queue label. Since the object is
4118 going out of scope, policy modules should free any internal storage
4119 associated with the label so that it may be destroyed.
4121 typedef void mpo_sysvmsq_label_destroy_t(
4125 @brief Initialize System V message queue label
4126 @param label New label to initialize
4128 Initialize the label for a newly instantiated System V message queue.
4130 typedef void mpo_sysvmsq_label_init_t(
4134 @brief Clean up a System V message queue label
4135 @param label The label to be destroyed
4137 Clean up a System V message queue label. Darwin pre-allocates
4138 message queues at system boot time and re-uses them rather than
4139 allocating new ones. Before message queues are returned to the "free
4140 pool", policies can cleanup or overwrite any information present in
4143 typedef void mpo_sysvmsq_label_recycle_t(
4147 @brief Access control check for System V semaphore control operation
4148 @param cred Subject credential
4149 @param semakptr Pointer to semaphore identifier
4150 @param semaklabel Label associated with semaphore
4151 @param cmd Control operation to be performed; see semctl(2)
4153 Determine whether the subject identified by the credential can perform
4154 the operation indicated by cmd on the System V semaphore semakptr.
4156 @return Return 0 if access is granted, otherwise an appropriate value for
4157 errno should be returned.
4159 typedef int mpo_sysvsem_check_semctl_t(
4161 struct semid_kernel
*semakptr
,
4162 struct label
*semaklabel
,
4166 @brief Access control check for obtaining a System V semaphore
4167 @param cred Subject credential
4168 @param semakptr Pointer to semaphore identifier
4169 @param semaklabel Label to associate with the semaphore
4171 Determine whether the subject identified by the credential can
4172 obtain a System V semaphore.
4174 @return Return 0 if access is granted, otherwise an appropriate value for
4175 errno should be returned.
4177 typedef int mpo_sysvsem_check_semget_t(
4179 struct semid_kernel
*semakptr
,
4180 struct label
*semaklabel
4183 @brief Access control check for System V semaphore operations
4184 @param cred Subject credential
4185 @param semakptr Pointer to semaphore identifier
4186 @param semaklabel Label associated with the semaphore
4187 @param accesstype Flags to indicate access (read and/or write)
4189 Determine whether the subject identified by the credential can
4190 perform the operations on the System V semaphore indicated by
4191 semakptr. The accesstype flags hold the maximum set of permissions
4192 from the sem_op array passed to the semop system call. It may
4193 contain SEM_R for read-only operations or SEM_A for read/write
4196 @return Return 0 if access is granted, otherwise an appropriate value for
4197 errno should be returned.
4199 typedef int mpo_sysvsem_check_semop_t(
4201 struct semid_kernel
*semakptr
,
4202 struct label
*semaklabel
,
4206 @brief Create a System V semaphore label
4207 @param cred Subject credential
4208 @param semakptr The semaphore being created
4209 @param semalabel Label to associate with the new semaphore
4211 Label a new System V semaphore. The label was previously
4212 initialized and associated with the semaphore. At this time, an
4213 appropriate initial label value should be assigned to the object and
4214 stored in semalabel.
4216 typedef void mpo_sysvsem_label_associate_t(
4218 struct semid_kernel
*semakptr
,
4219 struct label
*semalabel
4222 @brief Destroy System V semaphore label
4223 @param label The label to be destroyed
4225 Destroy a System V semaphore label. Since the object is
4226 going out of scope, policy modules should free any internal storage
4227 associated with the label so that it may be destroyed.
4229 typedef void mpo_sysvsem_label_destroy_t(
4233 @brief Initialize System V semaphore label
4234 @param label New label to initialize
4236 Initialize the label for a newly instantiated System V semaphore. Sleeping
4239 typedef void mpo_sysvsem_label_init_t(
4243 @brief Clean up a System V semaphore label
4244 @param label The label to be cleaned
4246 Clean up a System V semaphore label. Darwin pre-allocates
4247 semaphores at system boot time and re-uses them rather than
4248 allocating new ones. Before semaphores are returned to the "free
4249 pool", policies can cleanup or overwrite any information present in
4252 typedef void mpo_sysvsem_label_recycle_t(
4256 @brief Access control check for mapping System V shared memory
4257 @param cred Subject credential
4258 @param shmsegptr Pointer to shared memory segment identifier
4259 @param shmseglabel Label associated with the shared memory segment
4260 @param shmflg shmat flags; see shmat(2)
4262 Determine whether the subject identified by the credential can map
4263 the System V shared memory segment associated with shmsegptr.
4265 @return Return 0 if access is granted, otherwise an appropriate value for
4266 errno should be returned.
4268 typedef int mpo_sysvshm_check_shmat_t(
4270 struct shmid_kernel
*shmsegptr
,
4271 struct label
*shmseglabel
,
4275 @brief Access control check for System V shared memory control operation
4276 @param cred Subject credential
4277 @param shmsegptr Pointer to shared memory segment identifier
4278 @param shmseglabel Label associated with the shared memory segment
4279 @param cmd Control operation to be performed; see shmctl(2)
4281 Determine whether the subject identified by the credential can perform
4282 the operation indicated by cmd on the System V shared memory segment
4285 @return Return 0 if access is granted, otherwise an appropriate value for
4286 errno should be returned.
4288 typedef int mpo_sysvshm_check_shmctl_t(
4290 struct shmid_kernel
*shmsegptr
,
4291 struct label
*shmseglabel
,
4295 @brief Access control check for unmapping System V shared memory
4296 @param cred Subject credential
4297 @param shmsegptr Pointer to shared memory segment identifier
4298 @param shmseglabel Label associated with the shared memory segment
4300 Determine whether the subject identified by the credential can unmap
4301 the System V shared memory segment associated with shmsegptr.
4303 @return Return 0 if access is granted, otherwise an appropriate value for
4304 errno should be returned.
4306 typedef int mpo_sysvshm_check_shmdt_t(
4308 struct shmid_kernel
*shmsegptr
,
4309 struct label
*shmseglabel
4312 @brief Access control check obtaining System V shared memory identifier
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 @param shmflg shmget flags; see shmget(2)
4318 Determine whether the subject identified by the credential can get
4319 the System V shared memory segment address.
4321 @return Return 0 if access is granted, otherwise an appropriate value for
4322 errno should be returned.
4324 typedef int mpo_sysvshm_check_shmget_t(
4326 struct shmid_kernel
*shmsegptr
,
4327 struct label
*shmseglabel
,
4331 @brief Create a System V shared memory region label
4332 @param cred Subject credential
4333 @param shmsegptr The shared memory region being created
4334 @param shmlabel Label to associate with the new shared memory region
4336 Label a new System V shared memory region. The label was previously
4337 initialized and associated with the shared memory region. At this
4338 time, an appropriate initial label value should be assigned to the
4339 object and stored in shmlabel.
4341 typedef void mpo_sysvshm_label_associate_t(
4343 struct shmid_kernel
*shmsegptr
,
4344 struct label
*shmlabel
4347 @brief Destroy System V shared memory label
4348 @param label The label to be destroyed
4350 Destroy a System V shared memory region label. Since the
4351 object is going out of scope, policy modules should free any
4352 internal storage associated with the label so that it may be
4355 typedef void mpo_sysvshm_label_destroy_t(
4359 @brief Initialize System V Shared Memory region label
4360 @param label New label to initialize
4362 Initialize the label for a newly instantiated System V Shared Memory
4363 region. Sleeping is permitted.
4365 typedef void mpo_sysvshm_label_init_t(
4369 @brief Clean up a System V Share Memory Region label
4370 @param shmlabel The label to be cleaned
4372 Clean up a System V Shared Memory Region label. Darwin
4373 pre-allocates these objects at system boot time and re-uses them
4374 rather than allocating new ones. Before the memory regions are
4375 returned to the "free pool", policies can cleanup or overwrite any
4376 information present in the label.
4378 typedef void mpo_sysvshm_label_recycle_t(
4379 struct label
*shmlabel
4382 @brief Access control check for getting a process's task name
4383 @param cred Subject credential
4384 @param proc Object process
4386 Determine whether the subject identified by the credential can get
4387 the passed process's task name port.
4388 This call is used by the task_name_for_pid(2) API.
4390 @return Return 0 if access is granted, otherwise an appropriate value for
4391 errno should be returned. Suggested failure: EACCES for label mismatch,
4392 EPERM for lack of privilege, or ESRCH to hide visibility of the target.
4394 typedef int mpo_proc_check_get_task_name_t(
4399 @brief Access control check for getting a process's task port
4400 @param cred Subject credential
4401 @param proc Object process
4403 Determine whether the subject identified by the credential can get
4404 the passed process's task control port.
4405 This call is used by the task_for_pid(2) API.
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.
4411 typedef int mpo_proc_check_get_task_t(
4416 @brief Privilege check for a process to run invalid
4417 @param proc Object process
4419 Determine whether the process may execute even though the system determined
4420 that it is untrusted (eg unidentified / modified code).
4422 @return Return 0 if access is granted, otherwise an appropriate value for
4423 errno should be returned.
4425 typedef int mac_proc_check_run_cs_invalid_t(
4431 @brief Assign a label to a new kernelspace Mach task
4432 @param kproc New task
4433 @param tasklabel Label for new task
4434 @param portlabel Label for new task port
4435 @see mpo_cred_label_associate_kernel_t
4437 Assign labels to a new kernel task and its task port. Both the task and
4438 task port labels should be specified. Both new labels are initialized.
4439 If there is an associated BSD process structure, it will be labelled
4440 with calls to mpo_cred_label_associate_kernel.
4442 typedef void mpo_task_label_associate_kernel_t(
4444 struct label
*tasklabel
,
4445 struct label
*portlabel
4448 @brief Assign a label to a new (userspace) Mach task
4449 @param parent Parent task
4450 @param child New (child) task
4451 @param parentlabel Label of parent task
4452 @param childlabel Label for new task
4453 @param childportlabel Label for new task's task port
4455 Assign labels to a new task and its task port. Both the task and task port
4456 labels should be specified. Both new labels are initialized. If the task
4457 will have an associated BSD process, that information will be made available
4458 by the task_label_update and port_label_update_cred entry points.
4460 typedef void mpo_task_label_associate_t(
4461 struct task
*parent
,
4463 struct label
*parentlabel
,
4464 struct label
*childlabel
,
4465 struct label
*childportlabel
4468 @brief Copy a Mach task label
4469 @param src Source task label
4470 @param dest Destination task label
4472 Copy the Mach task label information from src to dest. This is used
4473 when duplicating label handles to implement copy-on-write semantics.
4475 typedef void mpo_task_label_copy_t(
4480 @brief Destroy Mach task label
4481 @param label The label to be destroyed
4483 Destroy a Mach task label. Since the object is going out of
4484 scope, policy modules should free any internal storage associated
4485 with the label so that it may be destroyed.
4487 typedef void mpo_task_label_destroy_t(
4491 @brief Externalize a task label
4492 @param label Label to be externalized
4493 @param element_name Name of the label namespace for which labels should be
4495 @param sb String buffer to be filled with a text representation of the label
4497 Produce an external representation of the label on a task. An
4498 externalized label consists of a text representation of the label
4499 contents that can be used with user applications. Policy-agnostic
4500 user space tools will display this externalized version.
4502 @return 0 on success, return non-zero if an error occurs while
4503 externalizing the label data.
4506 typedef int mpo_task_label_externalize_t(
4507 struct label
*label
,
4512 @brief Initialize Mach task label
4513 @param label New label to initialize
4515 Initialize the label for a newly instantiated Mach task. Sleeping
4518 typedef void mpo_task_label_init_t(
4522 @brief Internalize a task label
4523 @param label Label to be internalized
4524 @param element_name Name of the label namespace for which the label should
4526 @param element_data Text data to be internalized
4528 Produce a task label from an external representation. An
4529 externalized label consists of a text representation of the label
4530 contents that can be used with user applications. Policy-agnostic
4531 user space tools will forward text version to the kernel for
4532 processing by individual policy modules.
4534 The policy's internalize entry points will be called only if the
4535 policy has registered interest in the label namespace.
4537 @return 0 on success, Otherwise, return non-zero if an error occurs
4538 while internalizing the label data.
4541 typedef int mpo_task_label_internalize_t(
4542 struct label
*label
,
4547 @brief Update a Mach task label
4548 @param cred User credential label to be used as the source
4549 @param task Mach task label to be used as the destination
4550 @see mpo_cred_label_update_t
4551 @see mpo_cred_label_update_execve_t
4553 Update the label on a Mach task, using the supplied user credential
4554 label. When a mac_cred_label_update_execve or a mac_cred_label_update operation
4555 causes the label on a user credential to change, the Mach task label
4556 also needs to be updated to reflect the change. Both labels are
4557 already valid (initialized and created).
4559 @warning XXX We may change the name of this entry point in a future
4560 version of the MAC framework.
4562 typedef void mpo_task_label_update_t(
4567 @brief Perform MAC-related events when a thread returns to user space
4568 @param code The number of the syscall/trap that has finished
4569 @param error The error code that will be returned to user space
4570 @param thread Mach (not BSD) thread that is returning
4572 This entry point permits policy modules to perform MAC-related
4573 events when a thread returns to user space, via a system call
4574 return, trap return, or otherwise.
4576 typedef void mpo_thread_userret_t(
4579 struct thread
*thread
4582 @brief Check vnode access
4583 @param cred Subject credential
4584 @param vp Object vnode
4585 @param label Label for vp
4586 @param acc_mode access(2) flags
4588 Determine how invocations of access(2) and related calls by the
4589 subject identified by the credential should return when performed
4590 on the passed vnode using the passed access flags. This should
4591 generally be implemented using the same semantics used in
4592 mpo_vnode_check_open.
4594 @return Return 0 if access is granted, otherwise an appropriate value for
4595 errno should be returned. Suggested failure: EACCES for label mismatch or
4596 EPERM for lack of privilege.
4598 typedef int mpo_vnode_check_access_t(
4601 struct label
*label
,
4605 @brief Access control check for changing working directory
4606 @param cred Subject credential
4607 @param dvp Object; vnode to chdir(2) into
4608 @param dlabel Policy label for dvp
4610 Determine whether the subject identified by the credential can change
4611 the process working directory to the passed vnode.
4613 @return Return 0 if access is granted, otherwise an appropriate value for
4614 errno should be returned. Suggested failure: EACCES for label mismatch or
4615 EPERM for lack of privilege.
4617 typedef int mpo_vnode_check_chdir_t(
4620 struct label
*dlabel
4623 @brief Access control check for changing root directory
4624 @param cred Subject credential
4625 @param dvp Directory vnode
4626 @param dlabel Policy label associated with dvp
4627 @param cnp Component name for dvp
4629 Determine whether the subject identified by the credential should be
4630 allowed to chroot(2) into the specified directory (dvp).
4632 @return In the event of an error, an appropriate value for errno
4633 should be returned, otherwise return 0 upon success.
4635 typedef int mpo_vnode_check_chroot_t(
4638 struct label
*dlabel
,
4639 struct componentname
*cnp
4642 @brief Access control check for creating vnode
4643 @param cred Subject credential
4644 @param dvp Directory vnode
4645 @param dlabel Policy label for dvp
4646 @param cnp Component name for dvp
4647 @param vap vnode attributes for vap
4649 Determine whether the subject identified by the credential can create
4650 a vnode with the passed parent directory, passed name information,
4651 and passed attribute information. This call may be made in a number of
4652 situations, including as a result of calls to open(2) with O_CREAT,
4653 mknod(2), mkfifo(2), and others.
4655 @return Return 0 if access is granted, otherwise an appropriate value for
4656 errno should be returned. Suggested failure: EACCES for label mismatch or
4657 EPERM for lack of privilege.
4659 typedef int mpo_vnode_check_create_t(
4662 struct label
*dlabel
,
4663 struct componentname
*cnp
,
4664 struct vnode_attr
*vap
4667 @brief Access control check for deleting extended attribute
4668 @param cred Subject credential
4669 @param vp Object vnode
4670 @param vlabel Label associated with vp
4671 @param name Extended attribute name
4673 Determine whether the subject identified by the credential can delete
4674 the extended attribute from the passed vnode.
4676 @return Return 0 if access is granted, otherwise an appropriate value for
4677 errno should be returned. Suggested failure: EACCES for label mismatch or
4678 EPERM for lack of privilege.
4680 typedef int mpo_vnode_check_deleteextattr_t(
4683 struct label
*vlabel
,
4687 @brief Access control check for exchanging file data
4688 @param cred Subject credential
4689 @param v1 vnode 1 to swap
4690 @param vl1 Policy label for v1
4691 @param v2 vnode 2 to swap
4692 @param vl2 Policy label for v2
4694 Determine whether the subject identified by the credential can swap the data
4695 in the two supplied vnodes.
4697 @return Return 0 if access is granted, otherwise an appropriate value for
4698 errno should be returned. Suggested failure: EACCES for label mismatch or
4699 EPERM for lack of privilege.
4701 typedef int mpo_vnode_check_exchangedata_t(
4709 @brief Access control check for executing the vnode
4710 @param cred Subject credential
4711 @param vp Object vnode to execute
4712 @param label Policy label for vp
4713 @param execlabel Userspace provided execution label
4714 @param cnp Component name for file being executed
4716 Determine whether the subject identified by the credential can execute
4717 the passed vnode. Determination of execute privilege is made separately
4718 from decisions about any process label transitioning event.
4720 The final label, execlabel, corresponds to a label supplied by a
4721 user space application through the use of the mac_execve system call.
4722 This label will be NULL if the user application uses the the vendor
4723 execve(2) call instead of the MAC Framework mac_execve() call.
4725 @return Return 0 if access is granted, otherwise an appropriate value for
4726 errno should be returned. Suggested failure: EACCES for label mismatch or
4727 EPERM for lack of privilege.
4729 typedef int mpo_vnode_check_exec_t(
4732 struct label
*label
,
4733 struct label
*execlabel
, /* NULLOK */
4734 struct componentname
*cnp
,
4738 @brief Access control check after determining the code directory hash
4740 typedef int mpo_vnode_check_signature_t(struct vnode
*vp
, struct label
*label
,
4741 unsigned char *sha1
, void *signature
,
4745 @brief Access control check for retrieving file attributes
4746 @param cred Subject credential
4747 @param vp Object vnode
4748 @param vlabel Policy label for vp
4749 @param alist List of attributes to retrieve
4751 Determine whether the subject identified by the credential can read
4752 various attributes of the specified vnode, or the filesystem or volume on
4753 which that vnode resides. See <sys/attr.h> for definitions of the
4756 @return Return 0 if access is granted, otherwise an appropriate value for
4757 errno should be returned. Suggested failure: EACCES for label mismatch or
4758 EPERM for lack of privilege. Access control covers all attributes requested
4759 with this call; the security policy is not permitted to change the set of
4760 attributes requested.
4762 typedef int mpo_vnode_check_getattrlist_t(
4765 struct label
*vlabel
,
4766 struct attrlist
*alist
4769 @brief Access control check for retrieving an extended attribute
4770 @param cred Subject credential
4771 @param vp Object vnode
4772 @param label Policy label for vp
4773 @param name Extended attribute name
4774 @param uio I/O structure pointer
4776 Determine whether the subject identified by the credential can retrieve
4777 the extended attribute from the passed vnode. The uio parameter
4778 will be NULL when the getxattr(2) call has been made with a NULL data
4779 value; this is done to request the size of the data only.
4781 @return Return 0 if access is granted, otherwise an appropriate value for
4782 errno should be returned. Suggested failure: EACCES for label mismatch or
4783 EPERM for lack of privilege.
4785 typedef int mpo_vnode_check_getextattr_t(
4788 struct label
*label
, /* NULLOK */
4790 struct uio
*uio
/* NULLOK */
4793 @brief Access control check for ioctl
4794 @param cred Subject credential
4795 @param vp Object vnode
4796 @param label Policy label for vp
4797 @param com Device-dependent request code; see ioctl(2)
4799 Determine whether the subject identified by the credential can perform
4800 the ioctl operation indicated by com.
4802 @warning Since ioctl data is opaque from the standpoint of the MAC
4803 framework, and since ioctls can affect many aspects of system
4804 operation, policies must exercise extreme care when implementing
4805 access control checks.
4807 @return Return 0 if access is granted, otherwise an appropriate value for
4808 errno should be returned.
4810 typedef int mpo_vnode_check_ioctl_t(
4813 struct label
*label
,
4817 @brief Access control check for vnode kqfilter
4818 @param cred Subject credential
4819 @param kn Object knote
4820 @param vp Object vnode
4821 @param label Policy label for vp
4823 Determine whether the subject identified by the credential can
4824 receive the knote on the passed vnode.
4826 @return Return 0 if access if granted, otherwise an appropriate
4827 value for errno should be returned.
4829 typedef int mpo_vnode_check_kqfilter_t(
4830 kauth_cred_t active_cred
,
4831 kauth_cred_t file_cred
, /* NULLOK */
4837 @brief Access control check for relabel
4838 @param cred Subject credential
4839 @param vp Object vnode
4840 @param vnodelabel Existing policy label for vp
4841 @param newlabel Policy label update to later be applied to vp
4842 @see mpo_relable_vnode_t
4844 Determine whether the subject identified by the credential can relabel
4845 the passed vnode to the passed label update. If all policies permit
4846 the label change, the actual relabel entry point (mpo_vnode_label_update)
4849 @return Return 0 if access is granted, otherwise an appropriate value for
4850 errno should be returned.
4852 typedef int mpo_vnode_check_label_update_t(
4855 struct label
*vnodelabel
,
4856 struct label
*newlabel
4859 @brief Access control check for creating link
4860 @param cred Subject credential
4861 @param dvp Directory vnode
4862 @param dlabel Policy label associated with dvp
4863 @param vp Link destination vnode
4864 @param label Policy label associated with vp
4865 @param cnp Component name for the link being created
4867 Determine whether the subject identified by the credential should be
4868 allowed to create a link to the vnode vp with the name specified by cnp.
4870 @return Return 0 if access is granted, otherwise an appropriate value for
4871 errno should be returned.
4873 typedef int mpo_vnode_check_link_t(
4876 struct label
*dlabel
,
4878 struct label
*label
,
4879 struct componentname
*cnp
4882 @brief Access control check for listing extended attributes
4883 @param cred Subject credential
4884 @param vp Object vnode
4885 @param vlabel Policy label associated with vp
4887 Determine whether the subject identified by the credential can retrieve
4888 a list of named extended attributes from a vnode.
4890 @return Return 0 if access is granted, otherwise an appropriate value for
4891 errno should be returned.
4893 typedef int mpo_vnode_check_listextattr_t(
4896 struct label
*vlabel
4899 @brief Access control check for lookup
4900 @param cred Subject credential
4901 @param dvp Object vnode
4902 @param dlabel Policy label for dvp
4903 @param cnp Component name being looked up
4905 Determine whether the subject identified by the credential can perform
4906 a lookup in the passed directory vnode for the passed name (cnp).
4908 @return Return 0 if access is granted, otherwise an appropriate value for
4909 errno should be returned. Suggested failure: EACCES for label mismatch or
4910 EPERM for lack of privilege.
4912 typedef int mpo_vnode_check_lookup_t(
4915 struct label
*dlabel
,
4916 struct componentname
*cnp
4919 @brief Access control check for open
4920 @param cred Subject credential
4921 @param vp Object vnode
4922 @param label Policy label associated with vp
4923 @param acc_mode open(2) access mode
4925 Determine whether the subject identified by the credential can perform
4926 an open operation on the passed vnode with the passed access mode.
4928 @return Return 0 if access is granted, otherwise an appropriate value for
4929 errno should be returned. Suggested failure: EACCES for label mismatch or
4930 EPERM for lack of privilege.
4932 typedef int mpo_vnode_check_open_t(
4935 struct label
*label
,
4939 @brief Access control check for read
4940 @param active_cred Subject credential
4941 @param file_cred Credential associated with the struct fileproc
4942 @param vp Object vnode
4943 @param label Policy label for vp
4945 Determine whether the subject identified by the credential can perform
4946 a read operation on the passed vnode. The active_cred hold the credentials
4947 of the subject performing the operation, and file_cred holds the
4948 credentials of the subject that originally opened the file.
4950 @return Return 0 if access is granted, otherwise an appropriate value for
4951 errno should be returned. Suggested failure: EACCES for label mismatch or
4952 EPERM for lack of privilege.
4954 typedef int mpo_vnode_check_read_t(
4955 kauth_cred_t active_cred
, /* SUBJECT */
4956 kauth_cred_t file_cred
, /* NULLOK */
4957 struct vnode
*vp
, /* OBJECT */
4958 struct label
*label
/* LABEL */
4961 @brief Access control check for read directory
4962 @param cred Subject credential
4963 @param dvp Object directory vnode
4964 @param dlabel Policy label for dvp
4966 Determine whether the subject identified by the credential can
4967 perform a readdir operation on the passed directory vnode.
4969 @return Return 0 if access is granted, otherwise an appropriate value for
4970 errno should be returned. Suggested failure: EACCES for label mismatch or
4971 EPERM for lack of privilege.
4973 typedef int mpo_vnode_check_readdir_t(
4974 kauth_cred_t cred
, /* SUBJECT */
4975 struct vnode
*dvp
, /* OBJECT */
4976 struct label
*dlabel
/* LABEL */
4979 @brief Access control check for read link
4980 @param cred Subject credential
4981 @param vp Object vnode
4982 @param label Policy label for vp
4984 Determine whether the subject identified by the credential can perform
4985 a readlink operation on the passed symlink vnode. This call can be made
4986 in a number of situations, including an explicit readlink call by the
4987 user process, or as a result of an implicit readlink during a name
4988 lookup by the process.
4990 @return Return 0 if access is granted, otherwise an appropriate value for
4991 errno should be returned. Suggested failure: EACCES for label mismatch or
4992 EPERM for lack of privilege.
4994 typedef int mpo_vnode_check_readlink_t(
5000 @brief Access control check for rename from
5001 @param cred Subject credential
5002 @param dvp Directory vnode
5003 @param dlabel Policy label associated with dvp
5004 @param vp vnode to be renamed
5005 @param label Policy label associated with vp
5006 @param cnp Component name for vp
5007 @see mpo_vnode_check_rename_to_t
5009 Determine whether the subject identified by the credential should be
5010 allowed to rename the vnode vp to something else.
5012 Due to VFS locking constraints (to make sure proper vnode locks are
5013 held during this entry point), the vnode relabel checks had to be
5014 split into two parts: relabel_from and relabel to.
5016 @return Return 0 if access is granted, otherwise an appropriate value for
5017 errno should be returned.
5019 typedef int mpo_vnode_check_rename_from_t(
5022 struct label
*dlabel
,
5024 struct label
*label
,
5025 struct componentname
*cnp
5028 @brief Access control check for rename to
5029 @param cred Subject credential
5030 @param dvp Directory vnode
5031 @param dlabel Policy label associated with dvp
5032 @param vp Overwritten vnode
5033 @param label Policy label associated with vp
5034 @param samedir Boolean; 1 if the source and destination directories are the same
5035 @param cnp Destination component name
5036 @see mpo_vnode_check_rename_from_t
5038 Determine whether the subject identified by the credential should be
5039 allowed to rename to the vnode vp, into the directory dvp, or to the
5040 name represented by cnp. If there is no existing file to overwrite,
5041 vp and label will be NULL.
5043 Due to VFS locking constraints (to make sure proper vnode locks are
5044 held during this entry point), the vnode relabel checks had to be
5045 split into two parts: relabel_from and relabel to.
5047 @return Return 0 if access is granted, otherwise an appropriate value for
5048 errno should be returned.
5050 typedef int mpo_vnode_check_rename_to_t(
5053 struct label
*dlabel
,
5054 struct vnode
*vp
, /* NULLOK */
5055 struct label
*label
, /* NULLOK */
5057 struct componentname
*cnp
5060 @brief Access control check for revoke
5061 @param cred Subject credential
5062 @param vp Object vnode
5063 @param label Policy label for vp
5065 Determine whether the subject identified by the credential can revoke
5066 access to the passed vnode.
5068 @return Return 0 if access is granted, otherwise an appropriate value for
5069 errno should be returned. Suggested failure: EACCES for label mismatch or
5070 EPERM for lack of privilege.
5072 typedef int mpo_vnode_check_revoke_t(
5078 @brief Access control check for select
5079 @param cred Subject credential
5080 @param vp Object vnode
5081 @param label Policy label for vp
5082 @param which The operation selected on: FREAD or FWRITE
5084 Determine whether the subject identified by the credential can select
5087 @return Return 0 if access is granted, otherwise an appropriate value for
5088 errno should be returned.
5090 typedef int mpo_vnode_check_select_t(
5093 struct label
*label
,
5097 @brief Access control check for setting file attributes
5098 @param cred Subject credential
5099 @param vp Object vnode
5100 @param vlabel Policy label for vp
5101 @param alist List of attributes to set
5103 Determine whether the subject identified by the credential can set
5104 various attributes of the specified vnode, or the filesystem or volume on
5105 which that vnode resides. See <sys/attr.h> for definitions of the
5108 @return Return 0 if access is granted, otherwise an appropriate value for
5109 errno should be returned. Suggested failure: EACCES for label mismatch or
5110 EPERM for lack of privilege. Access control covers all attributes requested
5113 typedef int mpo_vnode_check_setattrlist_t(
5116 struct label
*vlabel
,
5117 struct attrlist
*alist
5120 @brief Access control check for setting extended attribute
5121 @param cred Subject credential
5122 @param vp Object vnode
5123 @param label Policy label for vp
5124 @param name Extended attribute name
5125 @param uio I/O structure pointer
5127 Determine whether the subject identified by the credential can set the
5128 extended attribute of passed name and passed namespace on the passed
5129 vnode. Policies implementing security labels backed into extended
5130 attributes may want to provide additional protections for those
5131 attributes. Additionally, policies should avoid making decisions based
5132 on the data referenced from uio, as there is a potential race condition
5133 between this check and the actual operation. The uio may also be NULL
5134 if a delete operation is being performed.
5136 @return Return 0 if access is granted, otherwise an appropriate value for
5137 errno should be returned. Suggested failure: EACCES for label mismatch or
5138 EPERM for lack of privilege.
5140 typedef int mpo_vnode_check_setextattr_t(
5143 struct label
*label
,
5148 @brief Access control check for setting flags
5149 @param cred Subject credential
5150 @param vp Object vnode
5151 @param label Policy label for vp
5152 @param flags File flags; see chflags(2)
5154 Determine whether the subject identified by the credential can set
5155 the passed flags on the passed vnode.
5157 @return Return 0 if access is granted, otherwise an appropriate value for
5158 errno should be returned. Suggested failure: EACCES for label mismatch or
5159 EPERM for lack of privilege.
5161 typedef int mpo_vnode_check_setflags_t(
5164 struct label
*label
,
5168 @brief Access control check for setting mode
5169 @param cred Subject credential
5170 @param vp Object vnode
5171 @param label Policy label for vp
5172 @param mode File mode; see chmod(2)
5174 Determine whether the subject identified by the credential can set
5175 the passed mode on the passed vnode.
5177 @return Return 0 if access is granted, otherwise an appropriate value for
5178 errno should be returned. Suggested failure: EACCES for label mismatch or
5179 EPERM for lack of privilege.
5181 typedef int mpo_vnode_check_setmode_t(
5184 struct label
*label
,
5188 @brief Access control check for setting uid and gid
5189 @param cred Subject credential
5190 @param vp Object vnode
5191 @param label Policy label for vp
5195 Determine whether the subject identified by the credential can set
5196 the passed uid and passed gid as file uid and file gid on the passed
5197 vnode. The IDs may be set to (-1) to request no update.
5199 @return Return 0 if access is granted, otherwise an appropriate value for
5200 errno should be returned. Suggested failure: EACCES for label mismatch or
5201 EPERM for lack of privilege.
5203 typedef int mpo_vnode_check_setowner_t(
5206 struct label
*label
,
5211 @brief Access control check for setting timestamps
5212 @param cred Subject credential
5213 @param vp Object vnode
5214 @param label Policy label for vp
5215 @param atime Access time; see utimes(2)
5216 @param mtime Modification time; see utimes(2)
5218 Determine whether the subject identified by the credential can set
5219 the passed access timestamps on the passed vnode.
5221 @return Return 0 if access is granted, otherwise an appropriate value for
5222 errno should be returned. Suggested failure: EACCES for label mismatch or
5223 EPERM for lack of privilege.
5225 typedef int mpo_vnode_check_setutimes_t(
5228 struct label
*label
,
5229 struct timespec atime
,
5230 struct timespec mtime
5233 @brief Access control check for stat
5234 @param active_cred Subject credential
5235 @param file_cred Credential associated with the struct fileproc
5236 @param vp Object vnode
5237 @param label Policy label for vp
5239 Determine whether the subject identified by the credential can stat
5240 the passed vnode. See stat(2) for more information. The active_cred
5241 hold the credentials of the subject performing the operation, and
5242 file_cred holds the credentials of the subject that originally
5245 @return Return 0 if access is granted, otherwise an appropriate value for
5246 errno should be returned. Suggested failure: EACCES for label mismatch or
5247 EPERM for lack of privilege.
5249 typedef int mpo_vnode_check_stat_t(
5250 struct ucred
*active_cred
,
5251 struct ucred
*file_cred
, /* NULLOK */
5256 @brief Access control check for truncate/ftruncate
5257 @param active_cred Subject credential
5258 @param file_cred Credential associated with the struct fileproc
5259 @param vp Object vnode
5260 @param label Policy label for vp
5262 Determine whether the subject identified by the credential can
5263 perform a truncate operation on the passed vnode. The active_cred hold
5264 the credentials of the subject performing the operation, and
5265 file_cred holds the credentials of the subject that originally
5268 @return Return 0 if access is granted, otherwise an appropriate value for
5269 errno should be returned. Suggested failure: EACCES for label mismatch or
5270 EPERM for lack of privilege.
5272 typedef int mpo_vnode_check_truncate_t(
5273 kauth_cred_t active_cred
,
5274 kauth_cred_t file_cred
, /* NULLOK */
5279 @brief Access control check for binding UNIX domain socket
5280 @param cred Subject credential
5281 @param dvp Directory vnode
5282 @param dlabel Policy label for dvp
5283 @param cnp Component name for dvp
5284 @param vap vnode attributes for vap
5286 Determine whether the subject identified by the credential can perform a
5287 bind operation on a UNIX domain socket with the passed parent directory,
5288 passed name information, and passed attribute information.
5290 @return Return 0 if access is granted, otherwise an appropriate value for
5291 errno should be returned. Suggested failure: EACCES for label mismatch or
5292 EPERM for lack of privilege.
5294 typedef int mpo_vnode_check_uipc_bind_t(
5297 struct label
*dlabel
,
5298 struct componentname
*cnp
,
5299 struct vnode_attr
*vap
5302 @brief Access control check for connecting UNIX domain socket
5303 @param cred Subject credential
5304 @param vp Object vnode
5305 @param label Policy label associated with vp
5307 Determine whether the subject identified by the credential can perform a
5308 connect operation on the passed UNIX domain socket vnode.
5310 @return Return 0 if access is granted, otherwise an appropriate value for
5311 errno should be returned. Suggested failure: EACCES for label mismatch or
5312 EPERM for lack of privilege.
5314 typedef int mpo_vnode_check_uipc_connect_t(
5320 @brief Access control check for deleting vnode
5321 @param cred Subject credential
5322 @param dvp Parent directory vnode
5323 @param dlabel Policy label for dvp
5324 @param vp Object vnode to delete
5325 @param label Policy label for vp
5326 @param cnp Component name for vp
5327 @see mpo_check_rename_to_t
5329 Determine whether the subject identified by the credential can delete
5330 a vnode from the passed parent directory and passed name information.
5331 This call may be made in a number of situations, including as a
5332 results of calls to unlink(2) and rmdir(2). Policies implementing
5333 this entry point should also implement mpo_check_rename_to to
5334 authorize deletion of objects as a result of being the target of a rename.
5336 @return Return 0 if access is granted, otherwise an appropriate value for
5337 errno should be returned. Suggested failure: EACCES for label mismatch or
5338 EPERM for lack of privilege.
5340 typedef int mpo_vnode_check_unlink_t(
5343 struct label
*dlabel
,
5345 struct label
*label
,
5346 struct componentname
*cnp
5349 @brief Access control check for write
5350 @param active_cred Subject credential
5351 @param file_cred Credential associated with the struct fileproc
5352 @param vp Object vnode
5353 @param label Policy label for vp
5355 Determine whether the subject identified by the credential can
5356 perform a write operation on the passed vnode. The active_cred hold
5357 the credentials of the subject performing the operation, and
5358 file_cred holds the credentials of the subject that originally
5361 @return Return 0 if access is granted, otherwise an appropriate value for
5362 errno should be returned. Suggested failure: EACCES for label mismatch or
5363 EPERM for lack of privilege.
5365 typedef int mpo_vnode_check_write_t(
5366 kauth_cred_t active_cred
,
5367 kauth_cred_t file_cred
, /* NULLOK */
5372 @brief Associate a vnode with a devfs entry
5373 @param mp Devfs mount point
5374 @param mntlabel Devfs mount point label
5375 @param de Devfs directory entry
5376 @param delabel Label associated with de
5377 @param vp vnode associated with de
5378 @param vlabel Label associated with vp
5380 Fill in the label (vlabel) for a newly created devfs vnode. The
5381 label is typically derived from the label on the devfs directory
5382 entry or the label on the filesystem, supplied as parameters.
5384 typedef void mpo_vnode_label_associate_devfs_t(
5386 struct label
*mntlabel
,
5388 struct label
*delabel
,
5390 struct label
*vlabel
5393 @brief Associate a label with a vnode
5394 @param mp File system mount point
5395 @param mntlabel File system mount point label
5396 @param vp Vnode to label
5397 @param vlabel Label associated with vp
5399 Attempt to retrieve label information for the vnode, vp, from the
5400 file system extended attribute store. The label should be stored in
5401 the supplied vlabel parameter. If a policy cannot retrieve an
5402 extended attribute, sometimes it is acceptible to fallback to using
5405 If the policy requires vnodes to have a valid label elsewhere it
5406 MUST NOT return other than temporary errors, and must always provide
5407 a valid label of some sort. Returning an error will cause vnode
5408 labeling to be retried at a later access. Failure to handle policy
5409 centric errors internally (corrupt labels etc.) will result in
5412 @return In the event of an error, an appropriate value for errno
5413 should be returned, otherwise return 0 upon success.
5415 typedef int mpo_vnode_label_associate_extattr_t(
5417 struct label
*mntlabel
,
5419 struct label
*vlabel
5422 @brief Associate a file label with a vnode
5423 @param cred User credential
5424 @param mp Fdesc mount point
5425 @param mntlabel Fdesc mount point label
5426 @param fg Fileglob structure
5427 @param label Policy label for fg
5428 @param vp Vnode to label
5429 @param vlabel Label associated with vp
5431 Associate label information for the vnode, vp, with the label of
5432 the open file descriptor described by fg.
5433 The label should be stored in the supplied vlabel parameter.
5435 typedef void mpo_vnode_label_associate_file_t(
5438 struct label
*mntlabel
,
5439 struct fileglob
*fg
,
5440 struct label
*label
,
5442 struct label
*vlabel
5445 @brief Associate a pipe label with a vnode
5446 @param cred User credential for the process that opened the pipe
5447 @param cpipe Pipe structure
5448 @param pipelabel Label associated with pipe
5449 @param vp Vnode to label
5450 @param vlabel Label associated with vp
5452 Associate label information for the vnode, vp, with the label of
5453 the pipe described by the pipe structure cpipe.
5454 The label should be stored in the supplied vlabel parameter.
5456 typedef void mpo_vnode_label_associate_pipe_t(
5459 struct label
*pipelabel
,
5461 struct label
*vlabel
5464 @brief Associate a POSIX semaphore label with a vnode
5465 @param cred User credential for the process that create psem
5466 @param psem POSIX semaphore structure
5467 @param psemlabel Label associated with psem
5468 @param vp Vnode to label
5469 @param vlabel Label associated with vp
5471 Associate label information for the vnode, vp, with the label of
5472 the POSIX semaphore described by psem.
5473 The label should be stored in the supplied vlabel parameter.
5475 typedef void mpo_vnode_label_associate_posixsem_t(
5477 struct pseminfo
*psem
,
5478 struct label
*psemlabel
,
5480 struct label
*vlabel
5483 @brief Associate a POSIX shared memory label with a vnode
5484 @param cred User credential for the process that created pshm
5485 @param pshm POSIX shared memory structure
5486 @param pshmlabel Label associated with pshm
5487 @param vp Vnode to label
5488 @param vlabel Label associated with vp
5490 Associate label information for the vnode, vp, with the label of
5491 the POSIX shared memory region described by pshm.
5492 The label should be stored in the supplied vlabel parameter.
5494 typedef void mpo_vnode_label_associate_posixshm_t(
5496 struct pshminfo
*pshm
,
5497 struct label
*pshmlabel
,
5499 struct label
*vlabel
5502 @brief Associate a label with a vnode
5503 @param mp File system mount point
5504 @param mntlabel File system mount point label
5505 @param vp Vnode to label
5506 @param vlabel Label associated with vp
5508 On non-multilabel file systems, set the label for a vnode. The
5509 label will most likely be based on the file system label.
5511 typedef void mpo_vnode_label_associate_singlelabel_t(
5513 struct label
*mntlabel
,
5515 struct label
*vlabel
5518 @brief Associate a socket label with a vnode
5519 @param cred User credential for the process that opened the socket
5520 @param so Socket structure
5521 @param solabel Label associated with so
5522 @param vp Vnode to label
5523 @param vlabel Label associated with vp
5525 Associate label information for the vnode, vp, with the label of
5526 the open socket described by the socket structure so.
5527 The label should be stored in the supplied vlabel parameter.
5529 typedef void mpo_vnode_label_associate_socket_t(
5532 struct label
*solabel
,
5534 struct label
*vlabel
5537 @brief Copy a vnode label
5538 @param src Source vnode label
5539 @param dest Destination vnode label
5541 Copy the vnode label information from src to dest. On Darwin, this
5542 is currently only necessary when executing interpreted scripts, but
5543 will later be used if vnode label externalization cannot be an
5546 typedef void mpo_vnode_label_copy_t(
5551 @brief Destroy vnode label
5552 @param label The label to be destroyed
5554 Destroy a vnode label. Since the object is going out of scope,
5555 policy modules should free any internal storage associated with the
5556 label so that it may be destroyed.
5558 typedef void mpo_vnode_label_destroy_t(
5562 @brief Externalize a vnode label for auditing
5563 @param label Label to be externalized
5564 @param element_name Name of the label namespace for which labels should be
5566 @param sb String buffer to be filled with a text representation of the label
5568 Produce an external representation of the label on a vnode suitable for
5569 inclusion in an audit record. An externalized label consists of a text
5570 representation of the label contents that will be added to the audit record
5571 as part of a text token. Policy-agnostic user space tools will display
5572 this externalized version.
5574 @return 0 on success, return non-zero if an error occurs while
5575 externalizing the label data.
5578 typedef int mpo_vnode_label_externalize_audit_t(
5579 struct label
*label
,
5584 @brief Externalize a vnode label
5585 @param label Label to be externalized
5586 @param element_name Name of the label namespace for which labels should be
5588 @param sb String buffer to be filled with a text representation of the label
5590 Produce an external representation of the label on a vnode. An
5591 externalized label consists of a text representation of the label
5592 contents that can be used with user applications. Policy-agnostic
5593 user space tools will display this externalized version.
5595 @return 0 on success, return non-zero if an error occurs while
5596 externalizing the label data.
5599 typedef int mpo_vnode_label_externalize_t(
5600 struct label
*label
,
5605 @brief Initialize vnode label
5606 @param label New label to initialize
5608 Initialize label storage for use with a newly instantiated vnode, or
5609 for temporary storage associated with the copying in or out of a
5610 vnode label. While it is necessary to allocate space for a
5611 kernel-resident vnode label, it is not yet necessary to link this vnode
5612 with persistent label storage facilities, such as extended attributes.
5613 Sleeping is permitted.
5615 typedef void mpo_vnode_label_init_t(
5619 @brief Internalize a vnode label
5620 @param label Label to be internalized
5621 @param element_name Name of the label namespace for which the label should
5623 @param element_data Text data to be internalized
5625 Produce a vnode label from an external representation. An
5626 externalized label consists of a text representation of the label
5627 contents that can be used with user applications. Policy-agnostic
5628 user space tools will forward text version to the kernel for
5629 processing by individual policy modules.
5631 The policy's internalize entry points will be called only if the
5632 policy has registered interest in the label namespace.
5634 @return 0 on success, Otherwise, return non-zero if an error occurs
5635 while internalizing the label data.
5637 typedef int mpo_vnode_label_internalize_t(
5638 struct label
*label
,
5643 @brief Clean up a vnode label
5644 @param label The label to be cleaned for re-use
5646 Clean up a vnode label. Darwin (Tiger, 8.x) allocates vnodes on demand, but
5647 typically never frees them. Before vnodes are placed back on free lists for
5648 re-use, policies can cleanup or overwrite any information present in the label.
5650 typedef void mpo_vnode_label_recycle_t(
5654 @brief Write a label to a extended attribute
5655 @param cred Subject credential
5656 @param vp The vnode for which the label is being stored
5657 @param vlabel Label associated with vp
5658 @param intlabel The new label to store
5660 Store a new label in the extended attribute corresponding to the
5661 supplied vnode. The policy has already authorized the operation;
5662 this call must be implemented in order to perform the actual
5665 @return In the event of an error, an appropriate value for errno
5666 should be returned, otherwise return 0 upon success.
5668 @warning XXX After examining the extended attribute implementation on
5669 Apple's future release, this entry point may be changed.
5671 typedef int mpo_vnode_label_store_t(
5674 struct label
*vlabel
,
5675 struct label
*intlabel
5678 @brief Update vnode label from extended attributes
5679 @param mp File system mount point
5680 @param mntlabel Mount point label
5681 @param vp Vnode to label
5682 @param vlabel Label associated with vp
5683 @param name Name of the xattr
5684 @see mpo_vnode_check_setextattr_t
5686 When an extended attribute is updated via the Vendor attribute management
5687 functions, the MAC vnode label might also require an update.
5688 Policies should first determine if 'name' matches their xattr label
5689 name. If it does, the kernel is has either replaced or removed the
5690 named extended attribute that was previously associated with the
5691 vnode. Normally labels should only be modified via MAC Framework label
5692 management calls, but sometimes the user space components will directly
5693 modify extended attributes. For example, 'cp', 'tar', etc. manage
5694 extended attributes in userspace, not the kernel.
5696 This entry point is called after the label update has occurred, so
5697 it cannot return a failure. However, the operation is preceded by
5698 the mpo_vnode_check_setextattr() access control check.
5700 If the vnode label needs to be updated the policy should return
5701 a non-zero value. The vnode label will be marked for re-association
5704 typedef int mpo_vnode_label_update_extattr_t(
5706 struct label
*mntlabel
,
5708 struct label
*vlabel
,
5712 @brief Update a vnode label
5713 @param cred Subject credential
5714 @param vp The vnode to relabel
5715 @param vnodelabel Existing vnode label
5716 @param label New label to replace existing label
5717 @see mpo_vnode_check_label_update_t
5719 The subject identified by the credential has previously requested
5720 and was authorized to relabel the vnode; this entry point allows
5721 policies to perform the actual relabel operation. Policies should
5722 update vnodelabel using the label stored in the label parameter.
5724 typedef void mpo_vnode_label_update_t(
5727 struct label
*vnodelabel
,
5731 @brief Create a new vnode, backed by extended attributes
5732 @param cred User credential for the creating process
5733 @param mp File system mount point
5734 @param mntlabel File system mount point label
5735 @param dvp Parent directory vnode
5736 @param dlabel Parent directory vnode label
5737 @param vp Newly created vnode
5738 @param vlabel Label to associate with the new vnode
5739 @param cnp Component name for vp
5741 Write out the label for the newly created vnode, most likely storing
5742 the results in a file system extended attribute. Most policies will
5743 derive the new vnode label using information from a combination
5744 of the subject (user) credential, the file system label, the parent
5745 directory label, and potentially the path name component.
5747 @return If the operation succeeds, store the new label in vlabel and
5748 return 0. Otherwise, return an appropriate errno value.
5750 typedef int mpo_vnode_notify_create_t(
5753 struct label
*mntlabel
,
5755 struct label
*dlabel
,
5757 struct label
*vlabel
,
5758 struct componentname
*cnp
5762 * Placeholder for future events that may need mac hooks.
5764 typedef void mpo_reserved_hook_t(void);
5767 \struct mac_policy_ops
5769 struct mac_policy_ops
{
5770 mpo_audit_check_postselect_t
*mpo_audit_check_postselect
;
5771 mpo_audit_check_preselect_t
*mpo_audit_check_preselect
;
5772 mpo_bpfdesc_label_associate_t
*mpo_bpfdesc_label_associate
;
5773 mpo_bpfdesc_label_destroy_t
*mpo_bpfdesc_label_destroy
;
5774 mpo_bpfdesc_label_init_t
*mpo_bpfdesc_label_init
;
5775 mpo_bpfdesc_check_receive_t
*mpo_bpfdesc_check_receive
;
5776 mpo_cred_check_label_update_execve_t
*mpo_cred_check_label_update_execve
;
5777 mpo_cred_check_label_update_t
*mpo_cred_check_label_update
;
5778 mpo_cred_check_visible_t
*mpo_cred_check_visible
;
5779 mpo_cred_label_associate_fork_t
*mpo_cred_label_associate_fork
;
5780 mpo_cred_label_associate_kernel_t
*mpo_cred_label_associate_kernel
;
5781 mpo_cred_label_associate_t
*mpo_cred_label_associate
;
5782 mpo_cred_label_associate_user_t
*mpo_cred_label_associate_user
;
5783 mpo_cred_label_destroy_t
*mpo_cred_label_destroy
;
5784 mpo_cred_label_externalize_audit_t
*mpo_cred_label_externalize_audit
;
5785 mpo_cred_label_externalize_t
*mpo_cred_label_externalize
;
5786 mpo_cred_label_init_t
*mpo_cred_label_init
;
5787 mpo_cred_label_internalize_t
*mpo_cred_label_internalize
;
5788 mpo_cred_label_update_execve_t
*mpo_cred_label_update_execve
;
5789 mpo_cred_label_update_t
*mpo_cred_label_update
;
5790 mpo_devfs_label_associate_device_t
*mpo_devfs_label_associate_device
;
5791 mpo_devfs_label_associate_directory_t
*mpo_devfs_label_associate_directory
;
5792 mpo_devfs_label_copy_t
*mpo_devfs_label_copy
;
5793 mpo_devfs_label_destroy_t
*mpo_devfs_label_destroy
;
5794 mpo_devfs_label_init_t
*mpo_devfs_label_init
;
5795 mpo_devfs_label_update_t
*mpo_devfs_label_update
;
5796 mpo_file_check_change_offset_t
*mpo_file_check_change_offset
;
5797 mpo_file_check_create_t
*mpo_file_check_create
;
5798 mpo_file_check_dup_t
*mpo_file_check_dup
;
5799 mpo_file_check_fcntl_t
*mpo_file_check_fcntl
;
5800 mpo_file_check_get_offset_t
*mpo_file_check_get_offset
;
5801 mpo_file_check_get_t
*mpo_file_check_get
;
5802 mpo_file_check_inherit_t
*mpo_file_check_inherit
;
5803 mpo_file_check_ioctl_t
*mpo_file_check_ioctl
;
5804 mpo_file_check_lock_t
*mpo_file_check_lock
;
5805 mpo_file_check_mmap_downgrade_t
*mpo_file_check_mmap_downgrade
;
5806 mpo_file_check_mmap_t
*mpo_file_check_mmap
;
5807 mpo_file_check_receive_t
*mpo_file_check_receive
;
5808 mpo_file_check_set_t
*mpo_file_check_set
;
5809 mpo_file_label_init_t
*mpo_file_label_init
;
5810 mpo_file_label_destroy_t
*mpo_file_label_destroy
;
5811 mpo_file_label_associate_t
*mpo_file_label_associate
;
5812 mpo_ifnet_check_label_update_t
*mpo_ifnet_check_label_update
;
5813 mpo_ifnet_check_transmit_t
*mpo_ifnet_check_transmit
;
5814 mpo_ifnet_label_associate_t
*mpo_ifnet_label_associate
;
5815 mpo_ifnet_label_copy_t
*mpo_ifnet_label_copy
;
5816 mpo_ifnet_label_destroy_t
*mpo_ifnet_label_destroy
;
5817 mpo_ifnet_label_externalize_t
*mpo_ifnet_label_externalize
;
5818 mpo_ifnet_label_init_t
*mpo_ifnet_label_init
;
5819 mpo_ifnet_label_internalize_t
*mpo_ifnet_label_internalize
;
5820 mpo_ifnet_label_update_t
*mpo_ifnet_label_update
;
5821 mpo_ifnet_label_recycle_t
*mpo_ifnet_label_recycle
;
5822 mpo_inpcb_check_deliver_t
*mpo_inpcb_check_deliver
;
5823 mpo_inpcb_label_associate_t
*mpo_inpcb_label_associate
;
5824 mpo_inpcb_label_destroy_t
*mpo_inpcb_label_destroy
;
5825 mpo_inpcb_label_init_t
*mpo_inpcb_label_init
;
5826 mpo_inpcb_label_recycle_t
*mpo_inpcb_label_recycle
;
5827 mpo_inpcb_label_update_t
*mpo_inpcb_label_update
;
5828 mpo_iokit_check_device_t
*mpo_iokit_check_device
;
5829 mpo_ipq_label_associate_t
*mpo_ipq_label_associate
;
5830 mpo_ipq_label_compare_t
*mpo_ipq_label_compare
;
5831 mpo_ipq_label_destroy_t
*mpo_ipq_label_destroy
;
5832 mpo_ipq_label_init_t
*mpo_ipq_label_init
;
5833 mpo_ipq_label_update_t
*mpo_ipq_label_update
;
5834 mpo_lctx_check_label_update_t
*mpo_lctx_check_label_update
;
5835 mpo_lctx_label_destroy_t
*mpo_lctx_label_destroy
;
5836 mpo_lctx_label_externalize_t
*mpo_lctx_label_externalize
;
5837 mpo_lctx_label_init_t
*mpo_lctx_label_init
;
5838 mpo_lctx_label_internalize_t
*mpo_lctx_label_internalize
;
5839 mpo_lctx_label_update_t
*mpo_lctx_label_update
;
5840 mpo_lctx_notify_create_t
*mpo_lctx_notify_create
;
5841 mpo_lctx_notify_join_t
*mpo_lctx_notify_join
;
5842 mpo_lctx_notify_leave_t
*mpo_lctx_notify_leave
;
5843 mpo_mbuf_label_associate_bpfdesc_t
*mpo_mbuf_label_associate_bpfdesc
;
5844 mpo_mbuf_label_associate_ifnet_t
*mpo_mbuf_label_associate_ifnet
;
5845 mpo_mbuf_label_associate_inpcb_t
*mpo_mbuf_label_associate_inpcb
;
5846 mpo_mbuf_label_associate_ipq_t
*mpo_mbuf_label_associate_ipq
;
5847 mpo_mbuf_label_associate_linklayer_t
*mpo_mbuf_label_associate_linklayer
;
5848 mpo_mbuf_label_associate_multicast_encap_t
*mpo_mbuf_label_associate_multicast_encap
;
5849 mpo_mbuf_label_associate_netlayer_t
*mpo_mbuf_label_associate_netlayer
;
5850 mpo_mbuf_label_associate_socket_t
*mpo_mbuf_label_associate_socket
;
5851 mpo_mbuf_label_copy_t
*mpo_mbuf_label_copy
;
5852 mpo_mbuf_label_destroy_t
*mpo_mbuf_label_destroy
;
5853 mpo_mbuf_label_init_t
*mpo_mbuf_label_init
;
5854 mpo_mount_check_fsctl_t
*mpo_mount_check_fsctl
;
5855 mpo_mount_check_getattr_t
*mpo_mount_check_getattr
;
5856 mpo_mount_check_label_update_t
*mpo_mount_check_label_update
;
5857 mpo_mount_check_mount_t
*mpo_mount_check_mount
;
5858 mpo_mount_check_remount_t
*mpo_mount_check_remount
;
5859 mpo_mount_check_setattr_t
*mpo_mount_check_setattr
;
5860 mpo_mount_check_stat_t
*mpo_mount_check_stat
;
5861 mpo_mount_check_umount_t
*mpo_mount_check_umount
;
5862 mpo_mount_label_associate_t
*mpo_mount_label_associate
;
5863 mpo_mount_label_destroy_t
*mpo_mount_label_destroy
;
5864 mpo_mount_label_externalize_t
*mpo_mount_label_externalize
;
5865 mpo_mount_label_init_t
*mpo_mount_label_init
;
5866 mpo_mount_label_internalize_t
*mpo_mount_label_internalize
;
5867 mpo_netinet_fragment_t
*mpo_netinet_fragment
;
5868 mpo_netinet_icmp_reply_t
*mpo_netinet_icmp_reply
;
5869 mpo_netinet_tcp_reply_t
*mpo_netinet_tcp_reply
;
5870 mpo_pipe_check_ioctl_t
*mpo_pipe_check_ioctl
;
5871 mpo_pipe_check_kqfilter_t
*mpo_pipe_check_kqfilter
;
5872 mpo_pipe_check_label_update_t
*mpo_pipe_check_label_update
;
5873 mpo_pipe_check_read_t
*mpo_pipe_check_read
;
5874 mpo_pipe_check_select_t
*mpo_pipe_check_select
;
5875 mpo_pipe_check_stat_t
*mpo_pipe_check_stat
;
5876 mpo_pipe_check_write_t
*mpo_pipe_check_write
;
5877 mpo_pipe_label_associate_t
*mpo_pipe_label_associate
;
5878 mpo_pipe_label_copy_t
*mpo_pipe_label_copy
;
5879 mpo_pipe_label_destroy_t
*mpo_pipe_label_destroy
;
5880 mpo_pipe_label_externalize_t
*mpo_pipe_label_externalize
;
5881 mpo_pipe_label_init_t
*mpo_pipe_label_init
;
5882 mpo_pipe_label_internalize_t
*mpo_pipe_label_internalize
;
5883 mpo_pipe_label_update_t
*mpo_pipe_label_update
;
5884 mpo_policy_destroy_t
*mpo_policy_destroy
;
5885 mpo_policy_init_t
*mpo_policy_init
;
5886 mpo_policy_initbsd_t
*mpo_policy_initbsd
;
5887 mpo_policy_syscall_t
*mpo_policy_syscall
;
5888 mpo_port_check_copy_send_t
*mpo_port_check_copy_send
;
5889 mpo_port_check_hold_receive_t
*mpo_port_check_hold_receive
;
5890 mpo_port_check_hold_send_once_t
*mpo_port_check_hold_send_once
;
5891 mpo_port_check_hold_send_t
*mpo_port_check_hold_send
;
5892 mpo_port_check_label_update_t
*mpo_port_check_label_update
;
5893 mpo_port_check_make_send_once_t
*mpo_port_check_make_send_once
;
5894 mpo_port_check_make_send_t
*mpo_port_check_make_send
;
5895 mpo_port_check_method_t
*mpo_port_check_method
;
5896 mpo_port_check_move_receive_t
*mpo_port_check_move_receive
;
5897 mpo_port_check_move_send_once_t
*mpo_port_check_move_send_once
;
5898 mpo_port_check_move_send_t
*mpo_port_check_move_send
;
5899 mpo_port_check_receive_t
*mpo_port_check_receive
;
5900 mpo_port_check_send_t
*mpo_port_check_send
;
5901 mpo_port_check_service_t
*mpo_port_check_service
;
5902 mpo_port_label_associate_kernel_t
*mpo_port_label_associate_kernel
;
5903 mpo_port_label_associate_t
*mpo_port_label_associate
;
5904 mpo_port_label_compute_t
*mpo_port_label_compute
;
5905 mpo_port_label_copy_t
*mpo_port_label_copy
;
5906 mpo_port_label_destroy_t
*mpo_port_label_destroy
;
5907 mpo_port_label_init_t
*mpo_port_label_init
;
5908 mpo_port_label_update_cred_t
*mpo_port_label_update_cred
;
5909 mpo_port_label_update_kobject_t
*mpo_port_label_update_kobject
;
5910 mpo_posixsem_check_create_t
*mpo_posixsem_check_create
;
5911 mpo_posixsem_check_open_t
*mpo_posixsem_check_open
;
5912 mpo_posixsem_check_post_t
*mpo_posixsem_check_post
;
5913 mpo_posixsem_check_unlink_t
*mpo_posixsem_check_unlink
;
5914 mpo_posixsem_check_wait_t
*mpo_posixsem_check_wait
;
5915 mpo_posixsem_label_associate_t
*mpo_posixsem_label_associate
;
5916 mpo_posixsem_label_destroy_t
*mpo_posixsem_label_destroy
;
5917 mpo_posixsem_label_init_t
*mpo_posixsem_label_init
;
5918 mpo_posixshm_check_create_t
*mpo_posixshm_check_create
;
5919 mpo_posixshm_check_mmap_t
*mpo_posixshm_check_mmap
;
5920 mpo_posixshm_check_open_t
*mpo_posixshm_check_open
;
5921 mpo_posixshm_check_stat_t
*mpo_posixshm_check_stat
;
5922 mpo_posixshm_check_truncate_t
*mpo_posixshm_check_truncate
;
5923 mpo_posixshm_check_unlink_t
*mpo_posixshm_check_unlink
;
5924 mpo_posixshm_label_associate_t
*mpo_posixshm_label_associate
;
5925 mpo_posixshm_label_destroy_t
*mpo_posixshm_label_destroy
;
5926 mpo_posixshm_label_init_t
*mpo_posixshm_label_init
;
5927 mpo_proc_check_debug_t
*mpo_proc_check_debug
;
5928 mpo_proc_check_fork_t
*mpo_proc_check_fork
;
5929 mpo_proc_check_get_task_name_t
*mpo_proc_check_get_task_name
;
5930 mpo_proc_check_get_task_t
*mpo_proc_check_get_task
;
5931 mpo_proc_check_getaudit_t
*mpo_proc_check_getaudit
;
5932 mpo_proc_check_getauid_t
*mpo_proc_check_getauid
;
5933 mpo_proc_check_getlcid_t
*mpo_proc_check_getlcid
;
5934 mpo_proc_check_mprotect_t
*mpo_proc_check_mprotect
;
5935 mpo_proc_check_sched_t
*mpo_proc_check_sched
;
5936 mpo_proc_check_setaudit_t
*mpo_proc_check_setaudit
;
5937 mpo_proc_check_setauid_t
*mpo_proc_check_setauid
;
5938 mpo_proc_check_setlcid_t
*mpo_proc_check_setlcid
;
5939 mpo_proc_check_signal_t
*mpo_proc_check_signal
;
5940 mpo_proc_check_wait_t
*mpo_proc_check_wait
;
5941 mpo_proc_label_destroy_t
*mpo_proc_label_destroy
;
5942 mpo_proc_label_init_t
*mpo_proc_label_init
;
5943 mpo_socket_check_accept_t
*mpo_socket_check_accept
;
5944 mpo_socket_check_accepted_t
*mpo_socket_check_accepted
;
5945 mpo_socket_check_bind_t
*mpo_socket_check_bind
;
5946 mpo_socket_check_connect_t
*mpo_socket_check_connect
;
5947 mpo_socket_check_create_t
*mpo_socket_check_create
;
5948 mpo_socket_check_deliver_t
*mpo_socket_check_deliver
;
5949 mpo_socket_check_kqfilter_t
*mpo_socket_check_kqfilter
;
5950 mpo_socket_check_label_update_t
*mpo_socket_check_label_update
;
5951 mpo_socket_check_listen_t
*mpo_socket_check_listen
;
5952 mpo_socket_check_receive_t
*mpo_socket_check_receive
;
5953 mpo_socket_check_received_t
*mpo_socket_check_received
;
5954 mpo_socket_check_select_t
*mpo_socket_check_select
;
5955 mpo_socket_check_send_t
*mpo_socket_check_send
;
5956 mpo_socket_check_stat_t
*mpo_socket_check_stat
;
5957 mpo_socket_check_setsockopt_t
*mpo_socket_check_setsockopt
;
5958 mpo_socket_check_getsockopt_t
*mpo_socket_check_getsockopt
;
5959 mpo_socket_label_associate_accept_t
*mpo_socket_label_associate_accept
;
5960 mpo_socket_label_associate_t
*mpo_socket_label_associate
;
5961 mpo_socket_label_copy_t
*mpo_socket_label_copy
;
5962 mpo_socket_label_destroy_t
*mpo_socket_label_destroy
;
5963 mpo_socket_label_externalize_t
*mpo_socket_label_externalize
;
5964 mpo_socket_label_init_t
*mpo_socket_label_init
;
5965 mpo_socket_label_internalize_t
*mpo_socket_label_internalize
;
5966 mpo_socket_label_update_t
*mpo_socket_label_update
;
5967 mpo_socketpeer_label_associate_mbuf_t
*mpo_socketpeer_label_associate_mbuf
;
5968 mpo_socketpeer_label_associate_socket_t
*mpo_socketpeer_label_associate_socket
;
5969 mpo_socketpeer_label_destroy_t
*mpo_socketpeer_label_destroy
;
5970 mpo_socketpeer_label_externalize_t
*mpo_socketpeer_label_externalize
;
5971 mpo_socketpeer_label_init_t
*mpo_socketpeer_label_init
;
5972 mpo_system_check_acct_t
*mpo_system_check_acct
;
5973 mpo_system_check_audit_t
*mpo_system_check_audit
;
5974 mpo_system_check_auditctl_t
*mpo_system_check_auditctl
;
5975 mpo_system_check_auditon_t
*mpo_system_check_auditon
;
5976 mpo_system_check_host_priv_t
*mpo_system_check_host_priv
;
5977 mpo_system_check_nfsd_t
*mpo_system_check_nfsd
;
5978 mpo_system_check_reboot_t
*mpo_system_check_reboot
;
5979 mpo_system_check_settime_t
*mpo_system_check_settime
;
5980 mpo_system_check_swapoff_t
*mpo_system_check_swapoff
;
5981 mpo_system_check_swapon_t
*mpo_system_check_swapon
;
5982 mpo_system_check_sysctl_t
*mpo_system_check_sysctl
;
5983 mpo_sysvmsg_label_associate_t
*mpo_sysvmsg_label_associate
;
5984 mpo_sysvmsg_label_destroy_t
*mpo_sysvmsg_label_destroy
;
5985 mpo_sysvmsg_label_init_t
*mpo_sysvmsg_label_init
;
5986 mpo_sysvmsg_label_recycle_t
*mpo_sysvmsg_label_recycle
;
5987 mpo_sysvmsq_check_enqueue_t
*mpo_sysvmsq_check_enqueue
;
5988 mpo_sysvmsq_check_msgrcv_t
*mpo_sysvmsq_check_msgrcv
;
5989 mpo_sysvmsq_check_msgrmid_t
*mpo_sysvmsq_check_msgrmid
;
5990 mpo_sysvmsq_check_msqctl_t
*mpo_sysvmsq_check_msqctl
;
5991 mpo_sysvmsq_check_msqget_t
*mpo_sysvmsq_check_msqget
;
5992 mpo_sysvmsq_check_msqrcv_t
*mpo_sysvmsq_check_msqrcv
;
5993 mpo_sysvmsq_check_msqsnd_t
*mpo_sysvmsq_check_msqsnd
;
5994 mpo_sysvmsq_label_associate_t
*mpo_sysvmsq_label_associate
;
5995 mpo_sysvmsq_label_destroy_t
*mpo_sysvmsq_label_destroy
;
5996 mpo_sysvmsq_label_init_t
*mpo_sysvmsq_label_init
;
5997 mpo_sysvmsq_label_recycle_t
*mpo_sysvmsq_label_recycle
;
5998 mpo_sysvsem_check_semctl_t
*mpo_sysvsem_check_semctl
;
5999 mpo_sysvsem_check_semget_t
*mpo_sysvsem_check_semget
;
6000 mpo_sysvsem_check_semop_t
*mpo_sysvsem_check_semop
;
6001 mpo_sysvsem_label_associate_t
*mpo_sysvsem_label_associate
;
6002 mpo_sysvsem_label_destroy_t
*mpo_sysvsem_label_destroy
;
6003 mpo_sysvsem_label_init_t
*mpo_sysvsem_label_init
;
6004 mpo_sysvsem_label_recycle_t
*mpo_sysvsem_label_recycle
;
6005 mpo_sysvshm_check_shmat_t
*mpo_sysvshm_check_shmat
;
6006 mpo_sysvshm_check_shmctl_t
*mpo_sysvshm_check_shmctl
;
6007 mpo_sysvshm_check_shmdt_t
*mpo_sysvshm_check_shmdt
;
6008 mpo_sysvshm_check_shmget_t
*mpo_sysvshm_check_shmget
;
6009 mpo_sysvshm_label_associate_t
*mpo_sysvshm_label_associate
;
6010 mpo_sysvshm_label_destroy_t
*mpo_sysvshm_label_destroy
;
6011 mpo_sysvshm_label_init_t
*mpo_sysvshm_label_init
;
6012 mpo_sysvshm_label_recycle_t
*mpo_sysvshm_label_recycle
;
6013 mpo_task_label_associate_kernel_t
*mpo_task_label_associate_kernel
;
6014 mpo_task_label_associate_t
*mpo_task_label_associate
;
6015 mpo_task_label_copy_t
*mpo_task_label_copy
;
6016 mpo_task_label_destroy_t
*mpo_task_label_destroy
;
6017 mpo_task_label_externalize_t
*mpo_task_label_externalize
;
6018 mpo_task_label_init_t
*mpo_task_label_init
;
6019 mpo_task_label_internalize_t
*mpo_task_label_internalize
;
6020 mpo_task_label_update_t
*mpo_task_label_update
;
6021 mpo_thread_userret_t
*mpo_thread_userret
;
6022 mpo_vnode_check_access_t
*mpo_vnode_check_access
;
6023 mpo_vnode_check_chdir_t
*mpo_vnode_check_chdir
;
6024 mpo_vnode_check_chroot_t
*mpo_vnode_check_chroot
;
6025 mpo_vnode_check_create_t
*mpo_vnode_check_create
;
6026 mpo_vnode_check_deleteextattr_t
*mpo_vnode_check_deleteextattr
;
6027 mpo_vnode_check_exchangedata_t
*mpo_vnode_check_exchangedata
;
6028 mpo_vnode_check_exec_t
*mpo_vnode_check_exec
;
6029 mpo_vnode_check_getattrlist_t
*mpo_vnode_check_getattrlist
;
6030 mpo_vnode_check_getextattr_t
*mpo_vnode_check_getextattr
;
6031 mpo_vnode_check_ioctl_t
*mpo_vnode_check_ioctl
;
6032 mpo_vnode_check_kqfilter_t
*mpo_vnode_check_kqfilter
;
6033 mpo_vnode_check_label_update_t
*mpo_vnode_check_label_update
;
6034 mpo_vnode_check_link_t
*mpo_vnode_check_link
;
6035 mpo_vnode_check_listextattr_t
*mpo_vnode_check_listextattr
;
6036 mpo_vnode_check_lookup_t
*mpo_vnode_check_lookup
;
6037 mpo_vnode_check_open_t
*mpo_vnode_check_open
;
6038 mpo_vnode_check_read_t
*mpo_vnode_check_read
;
6039 mpo_vnode_check_readdir_t
*mpo_vnode_check_readdir
;
6040 mpo_vnode_check_readlink_t
*mpo_vnode_check_readlink
;
6041 mpo_vnode_check_rename_from_t
*mpo_vnode_check_rename_from
;
6042 mpo_vnode_check_rename_to_t
*mpo_vnode_check_rename_to
;
6043 mpo_vnode_check_revoke_t
*mpo_vnode_check_revoke
;
6044 mpo_vnode_check_select_t
*mpo_vnode_check_select
;
6045 mpo_vnode_check_setattrlist_t
*mpo_vnode_check_setattrlist
;
6046 mpo_vnode_check_setextattr_t
*mpo_vnode_check_setextattr
;
6047 mpo_vnode_check_setflags_t
*mpo_vnode_check_setflags
;
6048 mpo_vnode_check_setmode_t
*mpo_vnode_check_setmode
;
6049 mpo_vnode_check_setowner_t
*mpo_vnode_check_setowner
;
6050 mpo_vnode_check_setutimes_t
*mpo_vnode_check_setutimes
;
6051 mpo_vnode_check_stat_t
*mpo_vnode_check_stat
;
6052 mpo_vnode_check_truncate_t
*mpo_vnode_check_truncate
;
6053 mpo_vnode_check_unlink_t
*mpo_vnode_check_unlink
;
6054 mpo_vnode_check_write_t
*mpo_vnode_check_write
;
6055 mpo_vnode_label_associate_devfs_t
*mpo_vnode_label_associate_devfs
;
6056 mpo_vnode_label_associate_extattr_t
*mpo_vnode_label_associate_extattr
;
6057 mpo_vnode_label_associate_file_t
*mpo_vnode_label_associate_file
;
6058 mpo_vnode_label_associate_pipe_t
*mpo_vnode_label_associate_pipe
;
6059 mpo_vnode_label_associate_posixsem_t
*mpo_vnode_label_associate_posixsem
;
6060 mpo_vnode_label_associate_posixshm_t
*mpo_vnode_label_associate_posixshm
;
6061 mpo_vnode_label_associate_singlelabel_t
*mpo_vnode_label_associate_singlelabel
;
6062 mpo_vnode_label_associate_socket_t
*mpo_vnode_label_associate_socket
;
6063 mpo_vnode_label_copy_t
*mpo_vnode_label_copy
;
6064 mpo_vnode_label_destroy_t
*mpo_vnode_label_destroy
;
6065 mpo_vnode_label_externalize_audit_t
*mpo_vnode_label_externalize_audit
;
6066 mpo_vnode_label_externalize_t
*mpo_vnode_label_externalize
;
6067 mpo_vnode_label_init_t
*mpo_vnode_label_init
;
6068 mpo_vnode_label_internalize_t
*mpo_vnode_label_internalize
;
6069 mpo_vnode_label_recycle_t
*mpo_vnode_label_recycle
;
6070 mpo_vnode_label_store_t
*mpo_vnode_label_store
;
6071 mpo_vnode_label_update_extattr_t
*mpo_vnode_label_update_extattr
;
6072 mpo_vnode_label_update_t
*mpo_vnode_label_update
;
6073 mpo_vnode_notify_create_t
*mpo_vnode_notify_create
;
6074 mpo_vnode_check_signature_t
*mpo_vnode_check_signature
;
6075 mpo_vnode_check_uipc_bind_t
*mpo_vnode_check_uipc_bind
;
6076 mpo_vnode_check_uipc_connect_t
*mpo_vnode_check_uipc_connect
;
6077 mac_proc_check_run_cs_invalid_t
*mpo_proc_check_run_cs_invalid
;
6078 mpo_reserved_hook_t
*mpo_reserved4
;
6079 mpo_reserved_hook_t
*mpo_reserved5
;
6080 mpo_reserved_hook_t
*mpo_reserved6
;
6081 mpo_reserved_hook_t
*mpo_reserved7
;
6082 mpo_reserved_hook_t
*mpo_reserved8
;
6083 mpo_reserved_hook_t
*mpo_reserved9
;
6087 @brief MAC policy handle type
6089 The MAC handle is used to uniquely identify a loaded policy within
6092 A variable of this type is set by mac_policy_register().
6094 typedef unsigned int mac_policy_handle_t
;
6096 #define mpc_t struct mac_policy_conf *
6099 @brief Mac policy configuration
6101 This structure specifies the configuration information for a
6102 MAC policy module. A policy module developer must supply
6103 a short unique policy name, a more descriptive full name, a list of label
6104 namespaces and count, a pointer to the registered enty point operations,
6105 any load time flags, and optionally, a pointer to a label slot identifier.
6107 The Framework will update the runtime flags (mpc_runtime_flags) to
6108 indicate that the module has been registered.
6110 If the label slot identifier (mpc_field_off) is NULL, the Framework
6111 will not provide label storage for the policy. Otherwise, the
6112 Framework will store the label location (slot) in this field.
6114 The mpc_list field is used by the Framework and should not be
6115 modified by policies.
6117 /* XXX - reorder these for better aligment on 64bit platforms */
6118 struct mac_policy_conf
{
6119 const char *mpc_name
; /** policy name */
6120 const char *mpc_fullname
; /** full name */
6121 const char **mpc_labelnames
; /** managed label namespaces */
6122 unsigned int mpc_labelname_count
; /** number of managed label namespaces */
6123 struct mac_policy_ops
*mpc_ops
; /** operation vector */
6124 int mpc_loadtime_flags
; /** load time flags */
6125 int *mpc_field_off
; /** label slot */
6126 int mpc_runtime_flags
; /** run time flags */
6127 mpc_t mpc_list
; /** List reference */
6128 void *mpc_data
; /** module data */
6132 @brief MAC policy module registration routine
6134 This function is called to register a policy with the
6135 MAC framework. A policy module will typically call this from the
6136 Darwin KEXT registration routine.
6138 int mac_policy_register(struct mac_policy_conf
*mpc
,
6139 mac_policy_handle_t
*handlep
, void *xd
);
6142 @brief MAC policy module de-registration routine
6144 This function is called to de-register a policy with theD
6145 MAC framework. A policy module will typically call this from the
6146 Darwin KEXT de-registration routine.
6148 int mac_policy_unregister(mac_policy_handle_t handle
);
6151 * Framework entry points for the policies to add audit data.
6153 int mac_audit_text(char *text
, mac_policy_handle_t handle
);
6156 * Calls to assist with use of Apple XATTRs within policy modules.
6158 int mac_vnop_setxattr(struct vnode
*, const char *, char *, size_t);
6159 int mac_vnop_getxattr(struct vnode
*, const char *, char *, size_t,
6161 int mac_vnop_removexattr(struct vnode
*, const char *);
6164 * Arbitrary limit on how much data will be logged by the audit
6165 * entry points above.
6167 #define MAC_AUDIT_DATA_LIMIT 1024
6170 * Values returned by mac_audit_{pre,post}select. To combine the responses
6171 * of the security policies into a single decision,
6172 * mac_audit_{pre,post}select() choose the greatest value returned.
6174 #define MAC_AUDIT_DEFAULT 0 /* use system behavior */
6175 #define MAC_AUDIT_NO 1 /* force not auditing this event */
6176 #define MAC_AUDIT_YES 2 /* force auditing this event */
6178 // \defgroup mpc_loadtime_flags Flags for the mpc_loadtime_flags field
6181 @name Flags for the mpc_loadtime_flags field
6182 @see mac_policy_conf
6184 This is the complete list of flags that are supported by the
6185 mpc_loadtime_flags field of the mac_policy_conf structure. These
6186 flags specify the load time behavior of MAC Framework policy
6193 @brief Flag to indicate registration preference
6195 This flag indicates that the policy module must be loaded and
6196 initialized early in the boot process. If the flag is specified,
6197 attempts to register the module following boot will be rejected. The
6198 flag may be used by policies that require pervasive labeling of all
6199 system objects, and cannot handle objects that have not been
6200 properly initialized by the policy.
6202 #define MPC_LOADTIME_FLAG_NOTLATE 0x00000001
6205 @brief Flag to indicate unload preference
6207 This flag indicates that the policy module may be unloaded. If this
6208 flag is not set, then the policy framework will reject requests to
6209 unload the module. This flag might be used by modules that allocate
6210 label state and are unable to free that state at runtime, or for
6211 modules that simply do not want to permit unload operations.
6213 #define MPC_LOADTIME_FLAG_UNLOADOK 0x00000002
6218 XXX This flag is not yet supported.
6220 #define MPC_LOADTIME_FLAG_LABELMBUFS 0x00000004
6223 @brief Flag to indicate a base policy
6225 This flag indicates that the policy module is a base policy. Only
6226 one module can declare itself as base, otherwise the boot process
6229 #define MPC_LOADTIME_BASE_POLICY 0x00000008
6234 @brief Policy registration flag
6235 @see mac_policy_conf
6237 This flag indicates that the policy module has been successfully
6238 registered with the TrustedBSD MAC Framework. The Framework will
6239 set this flag in the mpc_runtime_flags field of the policy's
6240 mac_policy_conf structure after registering the policy.
6242 #define MPC_RUNTIME_FLAG_REGISTERED 0x00000001
6245 * Depends on POLICY_VER
6249 #define POLICY_VER 1.0
6252 #define MAC_POLICY_SET(handle, mpops, mpname, mpfullname, lnames, lcount, slot, lflags, rflags) \
6253 static struct mac_policy_conf mpname##_mac_policy_conf = { \
6254 .mpc_name = #mpname, \
6255 .mpc_fullname = mpfullname, \
6256 .mpc_labelnames = lnames, \
6257 .mpc_labelname_count = lcount, \
6259 .mpc_loadtime_flags = lflags, \
6260 .mpc_field_off = slot, \
6261 .mpc_runtime_flags = rflags \
6264 static kern_return_t \
6265 kmod_start(kmod_info_t *ki, void *xd) \
6267 return mac_policy_register(&mpname##_mac_policy_conf, \
6271 static kern_return_t \
6272 kmod_stop(kmod_info_t *ki, void *xd) \
6274 return mac_policy_unregister(handle); \
6277 extern kern_return_t _start(kmod_info_t *ki, void *data); \
6278 extern kern_return_t _stop(kmod_info_t *ki, void *data); \
6280 KMOD_EXPLICIT_DECL(security.mpname, POLICY_VER, _start, _stop) \
6281 kmod_start_func_t *_realmain = kmod_start; \
6282 kmod_stop_func_t *_antimain = kmod_stop; \
6283 int _kext_apple_cc = __APPLE_CC__
6286 #define LABEL_TO_SLOT(l, s) (l)->l_perpolicy[s]
6289 * Policy interface to map a struct label pointer to per-policy data.
6290 * Typically, policies wrap this in their own accessor macro that casts an
6291 * intptr_t to a policy-specific data type.
6293 intptr_t mac_label_get(struct label
*l
, int slot
);
6294 void mac_label_set(struct label
*l
, int slot
, intptr_t v
);
6296 #define mac_get_mpc(h) (mac_policy_list.entries[h].mpc)
6299 @name Flags for MAC allocator interfaces
6301 These flags are passed to the Darwin kernel allocator routines to
6302 indicate whether the allocation is permitted to block or not.
6303 Caution should be taken; some operations are not permitted to sleep,
6304 and some types of locks cannot be held when sleeping.
6310 @brief Allocation operations may block
6312 If memory is not immediately available, the allocation routine
6313 will block (typically sleeping) until memory is available.
6315 @warning Inappropriate use of this flag may cause kernel panics.
6317 #define MAC_WAITOK 0
6320 @brief Allocation operations may not block
6322 Rather than blocking, the allocator may return an error if memory
6323 is not immediately available. This type of allocation will not
6324 sleep, preserving locking semantics.
6326 #define MAC_NOWAIT 1
6330 #endif /* !_SECURITY_MAC_POLICY_H_ */