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 over pid_suspend and pid_resume
2965 @param cred Subject credential
2966 @param proc Subject process trying to run pid_suspend or pid_resume
2967 @param sr Call is suspend (0) or resume (1)
2969 Determine whether the subject identified is allowed to suspend or resume
2972 @return Return 0 if access is granted, otherwise an appropriate value for
2973 errno should be returned.
2975 typedef int mpo_proc_check_suspend_resume_t(
2981 @brief Access control check for retrieving audit information
2982 @param cred Subject credential
2984 Determine whether the subject identified by the credential can get
2985 audit information such as the audit user ID, the preselection mask,
2986 the terminal ID and the audit session ID, using the getaudit() system call.
2988 @return Return 0 if access is granted, otherwise an appropriate value for
2989 errno should be returned.
2991 typedef int mpo_proc_check_getaudit_t(
2995 @brief Access control check for retrieving audit user ID
2996 @param cred Subject credential
2998 Determine whether the subject identified by the credential can get
2999 the user identity being used by the auditing system, using the getauid()
3002 @return Return 0 if access is granted, otherwise an appropriate value for
3003 errno should be returned.
3005 typedef int mpo_proc_check_getauid_t(
3009 @brief Access control check for retrieving Login Context ID
3010 @param p0 Calling process
3011 @param p Effected process
3012 @param pid syscall PID argument
3014 Determine if getlcid(2) system call is permitted.
3016 Information returned by this system call is similar to that returned via
3017 process listings etc.
3019 @return Return 0 if access is granted, otherwise an appropriate value for
3020 errno should be returned.
3022 typedef int mpo_proc_check_getlcid_t(
3028 @brief Access control check for setting memory protections
3029 @param cred Subject credential
3030 @param proc User process requesting the change
3031 @param addr Start address of the memory range
3032 @param size Length address of the memory range
3033 @param prot Memory protections, see mmap(2)
3035 Determine whether the subject identified by the credential should
3036 be allowed to set the specified memory protections on memory mapped
3037 in the process proc.
3039 @return Return 0 if access is granted, otherwise an appropriate value for
3040 errno should be returned.
3042 typedef int mpo_proc_check_mprotect_t(
3050 @brief Access control check for changing scheduling parameters
3051 @param cred Subject credential
3052 @param proc Object process
3054 Determine whether the subject identified by the credential can change
3055 the scheduling parameters of the passed process.
3057 @return Return 0 if access is granted, otherwise an appropriate value for
3058 errno should be returned. Suggested failure: EACCES for label mismatch,
3059 EPERM for lack of privilege, or ESRCH to limit visibility.
3061 typedef int mpo_proc_check_sched_t(
3066 @brief Access control check for setting audit information
3067 @param cred Subject credential
3068 @param ai Audit information
3070 Determine whether the subject identified by the credential can set
3071 audit information such as the the preselection mask, the terminal ID
3072 and the audit session ID, using the setaudit() system call.
3074 @return Return 0 if access is granted, otherwise an appropriate value for
3075 errno should be returned.
3077 typedef int mpo_proc_check_setaudit_t(
3079 struct auditinfo_addr
*ai
3082 @brief Access control check for setting audit user ID
3083 @param cred Subject credential
3084 @param auid Audit user ID
3086 Determine whether the subject identified by the credential can set
3087 the user identity used by the auditing system, using the setauid()
3090 @return Return 0 if access is granted, otherwise an appropriate value for
3091 errno should be returned.
3093 typedef int mpo_proc_check_setauid_t(
3098 @brief Access control check for setting the Login Context
3099 @param p0 Calling process
3100 @param p Effected process
3101 @param pid syscall PID argument
3102 @param lcid syscall LCID argument
3104 Determine if setlcid(2) system call is permitted.
3106 See xnu/bsd/kern/kern_prot.c:setlcid() implementation for example of
3107 decoding syscall arguments to determine action desired by caller.
3109 Five distinct actions are possible: CREATE JOIN LEAVE ADOPT ORPHAN
3111 @return Return 0 if access is granted, otherwise an appropriate value for
3112 errno should be returned.
3114 typedef int mpo_proc_check_setlcid_t(
3121 @brief Access control check for delivering signal
3122 @param cred Subject credential
3123 @param proc Object process
3124 @param signum Signal number; see kill(2)
3126 Determine whether the subject identified by the credential can deliver
3127 the passed signal to the passed process.
3129 @warning Programs typically expect to be able to send and receive
3130 signals as part or their normal process lifecycle; caution should be
3131 exercised when implementing access controls over signal events.
3133 @return Return 0 if access is granted, otherwise an appropriate value for
3134 errno should be returned. Suggested failure: EACCES for label mismatch,
3135 EPERM for lack of privilege, or ESRCH to limit visibility.
3137 typedef int mpo_proc_check_signal_t(
3143 @brief Access control check for wait
3144 @param cred Subject credential
3145 @param proc Object process
3147 Determine whether the subject identified by the credential can wait
3148 for process termination.
3150 @warning Caution should be exercised when implementing access
3151 controls for wait, since programs often wait for child processes to
3152 exit. Failure to be notified of a child process terminating may
3153 cause the parent process to hang, or may produce zombie processes.
3155 @return Return 0 if access is granted, otherwise an appropriate value for
3156 errno should be returned.
3158 typedef int mpo_proc_check_wait_t(
3163 @brief Destroy process label
3164 @param label The label to be destroyed
3166 Destroy a process label. Since the object is going
3167 out of scope, policy modules should free any internal storage
3168 associated with the label so that it may be destroyed.
3170 typedef void mpo_proc_label_destroy_t(
3174 @brief Initialize process label
3175 @param label New label to initialize
3176 @see mpo_cred_label_init_t
3178 Initialize the label for a newly instantiated BSD process structure.
3179 Normally, security policies will store the process label in the user
3180 credential rather than here in the process structure. However,
3181 there are some floating label policies that may need to temporarily
3182 store a label in the process structure until it is safe to update
3183 the user credential label. Sleeping is permitted.
3185 typedef void mpo_proc_label_init_t(
3189 @brief Access control check for socket accept
3190 @param cred Subject credential
3191 @param socket Object socket
3192 @param socklabel Policy label for socket
3194 Determine whether the subject identified by the credential can accept()
3195 a new connection on the socket from the host specified by addr.
3197 @return Return 0 if access if granted, otherwise an appropriate
3198 value for errno should be returned.
3200 typedef int mpo_socket_check_accept_t(
3203 struct label
*socklabel
3206 @brief Access control check for a pending socket accept
3207 @param cred Subject credential
3208 @param so Object socket
3209 @param socklabel Policy label for socket
3210 @param addr Address of the listening socket (coming soon)
3212 Determine whether the subject identified by the credential can accept()
3213 a pending connection on the socket from the host specified by addr.
3215 @return Return 0 if access if granted, otherwise an appropriate
3216 value for errno should be returned.
3218 typedef int mpo_socket_check_accepted_t(
3221 struct label
*socklabel
,
3222 struct sockaddr
*addr
3225 @brief Access control check for socket bind
3226 @param cred Subject credential
3227 @param so Object socket
3228 @param socklabel Policy label for socket
3229 @param addr Name to assign to the socket
3231 Determine whether the subject identified by the credential can bind()
3232 the name (addr) to the socket.
3234 @return Return 0 if access if granted, otherwise an appropriate
3235 value for errno should be returned.
3237 typedef int mpo_socket_check_bind_t(
3240 struct label
*socklabel
,
3241 struct sockaddr
*addr
3244 @brief Access control check for socket connect
3245 @param cred Subject credential
3246 @param so Object socket
3247 @param socklabel Policy label for socket
3248 @param addr Name to assign to the socket
3250 Determine whether the subject identified by the credential can
3251 connect() the passed socket to the remote host specified by addr.
3253 @return Return 0 if access if granted, otherwise an appropriate
3254 value for errno should be returned.
3256 typedef int mpo_socket_check_connect_t(
3259 struct label
*socklabel
,
3260 struct sockaddr
*addr
3263 @brief Access control check for socket() system call.
3264 @param cred Subject credential
3265 @param domain communication domain
3266 @param type socket type
3267 @param protocol socket protocol
3269 Determine whether the subject identified by the credential can
3270 make the socket() call.
3272 @return Return 0 if access if granted, otherwise an appropriate
3273 value for errno should be returned.
3275 typedef int mpo_socket_check_create_t(
3282 @brief Access control check for delivering data to a user's receieve queue
3283 @param so The socket data is being delivered to
3284 @param so_label The label of so
3285 @param m The mbuf whose data will be deposited into the receive queue
3286 @param m_label The label of the sender of the data.
3288 A socket has a queue for receiving incoming data. When a packet arrives
3289 on the wire, it eventually gets deposited into this queue, which the
3290 owner of the socket drains when they read from the socket's file descriptor.
3292 This function determines whether the socket can receive data from
3293 the sender specified by m_label.
3295 @warning There is an outstanding design issue surrounding the placement
3296 of this function. The check must be placed either before or after the
3297 TCP sequence and ACK counters are updated. Placing the check before
3298 the counters are updated causes the incoming packet to be resent by
3299 the remote if the check rejects it. Placing the check after the counters
3300 are updated results in a completely silent drop. As far as each TCP stack
3301 is concerned the packet was received, however, the data will not be in the
3302 socket's receive queue. Another consideration is that the current design
3303 requires using the "failed label" occasionally. In that case, on rejection,
3304 we want the remote TCP to resend the data. Because of this, we chose to
3305 place this check before the counters are updated, so rejected packets will be
3306 resent by the remote host.
3308 If a policy keeps rejecting the same packet, eventually the connection will
3309 be dropped. Policies have several options if this design causes problems.
3310 For example, one options is to sanitize the mbuf such that it is acceptable,
3311 then accept it. That may require negotiation between policies as the
3312 Framework will not know to re-check the packet.
3314 The policy must handle NULL MBUF labels. This will likely be the case
3315 for non-local TCP sockets for example.
3317 @return Return 0 if access if granted, otherwise an appropriate
3318 value for errno should be returned.
3320 typedef int mpo_socket_check_deliver_t(
3322 struct label
*so_label
,
3324 struct label
*m_label
3327 @brief Access control check for socket kqfilter
3328 @param cred Subject credential
3329 @param kn Object knote
3330 @param so Object socket
3331 @param socklabel Policy label for socket
3333 Determine whether the subject identified by the credential can
3334 receive the knote on the passed socket.
3336 @return Return 0 if access if granted, otherwise an appropriate
3337 value for errno should be returned.
3339 typedef int mpo_socket_check_kqfilter_t(
3343 struct label
*socklabel
3346 @brief Access control check for socket relabel
3347 @param cred Subject credential
3348 @param so Object socket
3349 @param so_label The current label of so
3350 @param newlabel The label to be assigned to so
3352 Determine whether the subject identified by the credential can
3353 change the label on the socket.
3355 @return Return 0 if access if granted, otherwise an appropriate
3356 value for errno should be returned.
3358 typedef int mpo_socket_check_label_update_t(
3361 struct label
*so_label
,
3362 struct label
*newlabel
3365 @brief Access control check for socket listen
3366 @param cred Subject credential
3367 @param so Object socket
3368 @param socklabel Policy label for socket
3370 Determine whether the subject identified by the credential can
3371 listen() on the passed 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_listen_t(
3379 struct label
*socklabel
3382 @brief Access control check for socket receive
3383 @param cred Subject credential
3384 @param so Object socket
3385 @param socklabel Policy label for socket
3387 Determine whether the subject identified by the credential can
3388 receive data from the socket.
3390 @return Return 0 if access if granted, otherwise an appropriate
3391 value for errno should be returned.
3393 typedef int mpo_socket_check_receive_t(
3396 struct label
*socklabel
3400 @brief Access control check for socket receive
3401 @param cred Subject credential
3402 @param socket Object socket
3403 @param socklabel Policy label for socket
3404 @param addr Name of the remote socket
3406 Determine whether the subject identified by the credential can
3407 receive data from the remote host specified by addr.
3409 @return Return 0 if access if granted, otherwise an appropriate
3410 value for errno should be returned.
3412 typedef int mpo_socket_check_received_t(
3414 struct socket
*sock
,
3415 struct label
*socklabel
,
3416 struct sockaddr
*saddr
3421 @brief Access control check for socket select
3422 @param cred Subject credential
3423 @param so Object socket
3424 @param socklabel Policy label for socket
3425 @param which The operation selected on: FREAD or FWRITE
3427 Determine whether the subject identified by the credential can use the
3428 socket in a call to select().
3430 @return Return 0 if access if granted, otherwise an appropriate
3431 value for errno should be returned.
3433 typedef int mpo_socket_check_select_t(
3436 struct label
*socklabel
,
3440 @brief Access control check for socket send
3441 @param cred Subject credential
3442 @param so Object socket
3443 @param socklabel Policy label for socket
3444 @param addr Address being sent to
3446 Determine whether the subject identified by the credential can send
3449 @return Return 0 if access if granted, otherwise an appropriate
3450 value for errno should be returned.
3452 typedef int mpo_socket_check_send_t(
3455 struct label
*socklabel
,
3456 struct sockaddr
*addr
3459 @brief Access control check for retrieving socket status
3460 @param cred Subject credential
3461 @param so Object socket
3462 @param socklabel Policy label for so
3464 Determine whether the subject identified by the credential can
3465 execute the stat() system call on the given socket.
3467 @return Return 0 if access if granted, otherwise an appropriate
3468 value for errno should be returned.
3470 typedef int mpo_socket_check_stat_t(
3473 struct label
*socklabel
3476 @brief Access control check for setting socket options
3477 @param cred Subject credential
3478 @param so Object socket
3479 @param socklabel Policy label for so
3480 @param sopt The options being set
3482 Determine whether the subject identified by the credential can
3483 execute the setsockopt system call on the given socket.
3485 @return Return 0 if access if granted, otherwise an appropriate
3486 value for errno should be returned.
3488 typedef int mpo_socket_check_setsockopt_t(
3491 struct label
*socklabel
,
3492 struct sockopt
*sopt
3495 @brief Access control check for getting socket options
3496 @param cred Subject credential
3497 @param so Object socket
3498 @param socklabel Policy label for so
3499 @param sopt The options to get
3501 Determine whether the subject identified by the credential can
3502 execute the getsockopt system call on the given socket.
3504 @return Return 0 if access if granted, otherwise an appropriate
3505 value for errno should be returned.
3507 typedef int mpo_socket_check_getsockopt_t(
3510 struct label
*socklabel
,
3511 struct sockopt
*sopt
3514 @brief Label a socket
3515 @param oldsock Listening socket
3516 @param oldlabel Policy label associated with oldsock
3517 @param newsock New socket
3518 @param newlabel Policy label associated with newsock
3520 A new socket is created when a connection is accept(2)ed. This
3521 function labels the new socket based on the existing listen(2)ing
3524 typedef void mpo_socket_label_associate_accept_t(
3526 struct label
*oldlabel
,
3528 struct label
*newlabel
3531 @brief Assign a label to a new socket
3532 @param cred Credential of the owning process
3533 @param so The socket being labeled
3534 @param solabel The label
3535 @warning cred can be NULL
3537 Set the label on a newly created socket from the passed subject
3538 credential. This call is made when a socket is created. The
3539 credentials may be null if the socket is being created by the
3542 typedef void mpo_socket_label_associate_t(
3545 struct label
*solabel
3548 @brief Copy a socket label
3549 @param src Source label
3550 @param dest Destination label
3552 Copy the socket label information in src into dest.
3554 typedef void mpo_socket_label_copy_t(
3559 @brief Destroy socket label
3560 @param label The label to be destroyed
3562 Destroy a socket label. Since the object is going out of
3563 scope, policy modules should free any internal storage associated
3564 with the label so that it may be destroyed.
3566 typedef void mpo_socket_label_destroy_t(
3570 @brief Externalize a socket label
3571 @param label Label to be externalized
3572 @param element_name Name of the label namespace for which labels should be
3574 @param sb String buffer to be filled with a text representation of label
3576 Produce an externalized socket label based on the label structure passed.
3577 An externalized label consists of a text representation of the label
3578 contents that can be used with userland applications and read by the
3579 user. If element_name does not match a namespace managed by the policy,
3580 simply return 0. Only return nonzero if an error occurs while externalizing
3583 @return In the event of an error, an appropriate value for errno
3584 should be returned, otherwise return 0 upon success.
3586 typedef int mpo_socket_label_externalize_t(
3587 struct label
*label
,
3592 @brief Initialize socket label
3593 @param label New label to initialize
3594 @param waitok Malloc flags
3596 Initialize the label of a newly instantiated socket. The waitok
3597 field may be one of M_WAITOK and M_NOWAIT, and should be employed to
3598 avoid performing a sleeping malloc(9) during this initialization
3599 call. It it not always safe to sleep during this entry point.
3601 @warning Since it is possible for the waitok flags to be set to
3602 M_NOWAIT, the malloc operation may fail.
3604 @return In the event of an error, an appropriate value for errno
3605 should be returned, otherwise return 0 upon success.
3607 typedef int mpo_socket_label_init_t(
3608 struct label
*label
,
3612 @brief Internalize a socket label
3613 @param label Label to be filled in
3614 @param element_name Name of the label namespace for which the label should
3616 @param element_data Text data to be internalized
3618 Produce an internal socket label structure based on externalized label
3619 data in text format.
3621 The policy's internalize entry points will be called only if the
3622 policy has registered interest in the label namespace.
3624 @return In the event of an error, an appropriate value for errno
3625 should be returned, otherwise return 0 upon success.
3627 typedef int mpo_socket_label_internalize_t(
3628 struct label
*label
,
3633 @brief Relabel socket
3634 @param cred Subject credential
3635 @param so Object; socket
3636 @param so_label Current label of the socket
3637 @param newlabel The label to be assigned to so
3639 The subject identified by the credential has previously requested
3640 and was authorized to relabel the socket; this entry point allows
3641 policies to perform the actual label update operation.
3643 @warning XXX This entry point will likely change in future versions.
3645 typedef void mpo_socket_label_update_t(
3648 struct label
*so_label
,
3649 struct label
*newlabel
3652 @brief Set the peer label on a socket from mbuf
3653 @param m Mbuf chain received on socket so
3654 @param m_label Label for m
3655 @param so Current label for the socket
3656 @param so_label Policy label to be filled out for the socket
3658 Set the peer label of a socket based on the label of the sender of the
3661 This is called for every TCP/IP packet received. The first call for a given
3662 socket operates on a newly initialized label, and subsequent calls operate
3663 on existing label data.
3665 @warning Because this can affect performance significantly, it has
3666 different sematics than other 'set' operations. Typically, 'set' operations
3667 operate on newly initialzed labels and policies do not need to worry about
3668 clobbering existing values. In this case, it is too inefficient to
3669 initialize and destroy a label every time data is received for the socket.
3670 Instead, it is up to the policies to determine how to replace the label data.
3671 Most policies should be able to replace the data inline.
3673 typedef void mpo_socketpeer_label_associate_mbuf_t(
3675 struct label
*m_label
,
3677 struct label
*so_label
3680 @brief Set the peer label on a socket from socket
3681 @param source Local socket
3682 @param sourcelabel Policy label for source
3683 @param target Peer socket
3684 @param targetlabel Policy label to fill in for target
3686 Set the peer label on a stream UNIX domain socket from the passed
3687 remote socket endpoint. This call will be made when the socket pair
3688 is connected, and will be made for both endpoints.
3690 Note that this call is only made on connection; it is currently not updated
3691 during communication.
3693 typedef void mpo_socketpeer_label_associate_socket_t(
3695 struct label
*sourcelabel
,
3697 struct label
*targetlabel
3700 @brief Destroy socket peer label
3701 @param label The peer label to be destroyed
3703 Destroy a socket peer label. Since the object is going out of
3704 scope, policy modules should free any internal storage associated
3705 with the label so that it may be destroyed.
3707 typedef void mpo_socketpeer_label_destroy_t(
3711 @brief Externalize a socket peer label
3712 @param label Label to be externalized
3713 @param element_name Name of the label namespace for which labels should be
3715 @param sb String buffer to be filled with a text representation of label
3717 Produce an externalized socket peer label based on the label structure
3718 passed. An externalized label consists of a text representation of the
3719 label contents that can be used with userland applications and read by the
3720 user. If element_name does not match a namespace managed by the policy,
3721 simply return 0. Only return nonzero if an error occurs while externalizing
3724 @return In the event of an error, an appropriate value for errno
3725 should be returned, otherwise return 0 upon success.
3727 typedef int mpo_socketpeer_label_externalize_t(
3728 struct label
*label
,
3733 @brief Initialize socket peer label
3734 @param label New label to initialize
3735 @param waitok Malloc flags
3737 Initialize the peer label of a newly instantiated socket. The
3738 waitok field may be one of M_WAITOK and M_NOWAIT, and should be
3739 employed to avoid performing a sleeping malloc(9) during this
3740 initialization call. It it not always safe to sleep during this
3743 @warning Since it is possible for the waitok flags to be set to
3744 M_NOWAIT, the malloc operation may fail.
3746 @return In the event of an error, an appropriate value for errno
3747 should be returned, otherwise return 0 upon success.
3749 typedef int mpo_socketpeer_label_init_t(
3750 struct label
*label
,
3754 @brief Access control check for enabling accounting
3755 @param cred Subject credential
3756 @param vp Accounting file
3757 @param vlabel Label associated with vp
3759 Determine whether the subject should be allowed to enable accounting,
3760 based on its label and the label of the accounting log file. See
3761 acct(5) for more information.
3763 As accounting is disabled by passing NULL to the acct(2) system call,
3764 the policy should be prepared for both 'vp' and 'vlabel' to be NULL.
3766 @return Return 0 if access is granted, otherwise an appropriate value for
3767 errno should be returned.
3769 typedef int mpo_system_check_acct_t(
3772 struct label
*vlabel
3775 @brief Access control check for audit
3776 @param cred Subject credential
3777 @param record Audit record
3778 @param length Audit record length
3780 Determine whether the subject identified by the credential can submit
3781 an audit record for inclusion in the audit log via the audit() system call.
3783 @return Return 0 if access is granted, otherwise an appropriate value for
3784 errno should be returned.
3786 typedef int mpo_system_check_audit_t(
3792 @brief Access control check for controlling audit
3793 @param cred Subject credential
3794 @param vp Audit file
3795 @param vl Label associated with vp
3797 Determine whether the subject should be allowed to enable auditing using
3798 the auditctl() system call, based on its label and the label of the proposed
3801 @return Return 0 if access is granted, otherwise an appropriate value for
3802 errno should be returned.
3804 typedef int mpo_system_check_auditctl_t(
3810 @brief Access control check for manipulating auditing
3811 @param cred Subject credential
3812 @param cmd Audit control command
3814 Determine whether the subject identified by the credential can perform
3815 the audit subsystem control operation cmd via the auditon() system call.
3817 @return Return 0 if access is granted, otherwise an appropriate value for
3818 errno should be returned.
3820 typedef int mpo_system_check_auditon_t(
3825 @brief Access control check for obtaining the host control port
3826 @param cred Subject credential
3828 Determine whether the subject identified by the credential can
3829 obtain the host control port.
3831 @return Return 0 if access is granted, or non-zero otherwise.
3833 typedef int mpo_system_check_host_priv_t(
3837 @brief Access control check for calling NFS services
3838 @param cred Subject credential
3840 Determine whether the subject identified by the credential should be
3841 allowed to call nfssrv(2).
3843 @return Return 0 if access is granted, otherwise an appropriate value for
3844 errno should be returned.
3846 typedef int mpo_system_check_nfsd_t(
3850 @brief Access control check for reboot
3851 @param cred Subject credential
3852 @param howto howto parameter from reboot(2)
3854 Determine whether the subject identified by the credential should be
3855 allowed to reboot the system in the specified manner.
3857 @return Return 0 if access is granted, otherwise an appropriate value for
3858 errno should be returned.
3860 typedef int mpo_system_check_reboot_t(
3865 @brief Access control check for setting system clock
3866 @param cred Subject credential
3868 Determine whether the subject identified by the credential should be
3869 allowed to set the system clock.
3871 @return Return 0 if access is granted, otherwise an appropriate value for
3872 errno should be returned.
3874 typedef int mpo_system_check_settime_t(
3878 @brief Access control check for removing swap devices
3879 @param cred Subject credential
3880 @param vp Swap device
3881 @param label Label associated with vp
3883 Determine whether the subject identified by the credential should be
3884 allowed to remove 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_swapoff_t(
3895 @brief Access control check for adding swap devices
3896 @param cred Subject credential
3897 @param vp Swap device
3898 @param label Label associated with vp
3900 Determine whether the subject identified by the credential should be
3901 allowed to add vp as a swap device.
3903 @return Return 0 if access is granted, otherwise an appropriate value for
3904 errno should be returned.
3906 typedef int mpo_system_check_swapon_t(
3912 @brief Access control check for sysctl
3913 @param cred Subject credential
3914 @param name Integer name; see sysctl(3)
3915 @param namelen Length of name array of integers; see sysctl(3)
3916 @param old 0 or address where to store old value; see sysctl(3)
3917 @param oldlenp Pointer to length of old buffer; see sysctl(3)
3918 @param inkernel Boolean; 1 if called from kernel
3919 @param newvalue 0 or address of new value; see sysctl(3)
3920 @param newlen Length of new buffer; see sysctl(3)
3922 Determine whether the subject identified by the credential should be
3923 allowed to make the specified sysctl(3) transaction.
3925 The sysctl(3) call specifies that if the old value is not desired,
3926 oldp and oldlenp should be set to NULL. Likewise, if a new value is
3927 not to be set, newp should be set to NULL and newlen set to 0.
3929 @return Return 0 if access is granted, otherwise an appropriate value for
3930 errno should be returned.
3932 typedef int mpo_system_check_sysctl_t(
3936 user_addr_t old
, /* NULLOK */
3937 user_addr_t oldlenp
, /* NULLOK */
3939 user_addr_t newvalue
, /* NULLOK */
3943 @brief Create a System V message label
3944 @param cred Subject credential
3945 @param msqkptr The message queue the message will be placed in
3946 @param msqlabel The label of the message queue
3947 @param msgptr The message
3948 @param msglabel The label of the message
3950 Label the message as its placed in the message queue.
3952 typedef void mpo_sysvmsg_label_associate_t(
3954 struct msqid_kernel
*msqptr
,
3955 struct label
*msqlabel
,
3957 struct label
*msglabel
3960 @brief Destroy System V message label
3961 @param label The label to be destroyed
3963 Destroy a System V message label. Since the object is
3964 going out of scope, policy modules should free any internal storage
3965 associated with the label so that it may be destroyed.
3967 typedef void mpo_sysvmsg_label_destroy_t(
3971 @brief Initialize System V message label
3972 @param label New label to initialize
3974 Initialize the label for a newly instantiated System V message.
3976 typedef void mpo_sysvmsg_label_init_t(
3980 @brief Clean up a System V message label
3981 @param label The label to be destroyed
3983 Clean up a System V message label. Darwin pre-allocates
3984 messages at system boot time and re-uses them rather than
3985 allocating new ones. Before messages are returned to the "free
3986 pool", policies can cleanup or overwrite any information present in
3989 typedef void mpo_sysvmsg_label_recycle_t(
3993 @brief Access control check for System V message enqueuing
3994 @param cred Subject credential
3995 @param msgptr The message
3996 @param msglabel The message's label
3997 @param msqkptr The message queue
3998 @param msqlabel The message queue's label
4000 Determine whether the subject identified by the credential can add the
4001 given message to the given message queue.
4003 @return Return 0 if access is granted, otherwise an appropriate value for
4004 errno should be returned.
4006 typedef int mpo_sysvmsq_check_enqueue_t(
4009 struct label
*msglabel
,
4010 struct msqid_kernel
*msqptr
,
4011 struct label
*msqlabel
4014 @brief Access control check for System V message reception
4015 @param cred The credential of the intended recipient
4016 @param msgptr The message
4017 @param msglabel The message's label
4019 Determine whether the subject identified by the credential can receive
4022 @return Return 0 if access is granted, otherwise an appropriate value for
4023 errno should be returned.
4025 typedef int mpo_sysvmsq_check_msgrcv_t(
4028 struct label
*msglabel
4031 @brief Access control check for System V message queue removal
4032 @param cred The credential of the caller
4033 @param msgptr The message
4034 @param msglabel The message's label
4036 System V message queues are removed using the msgctl() system call.
4037 The system will iterate over each messsage in the queue, calling this
4038 function for each, to determine whether the caller has the appropriate
4041 @return Return 0 if access is granted, otherwise an appropriate value for
4042 errno should be returned.
4044 typedef int mpo_sysvmsq_check_msgrmid_t(
4047 struct label
*msglabel
4050 @brief Access control check for msgctl()
4051 @param cred The credential of the caller
4052 @param msqptr The message queue
4053 @param msqlabel The message queue's label
4055 This access check is performed to validate calls to msgctl().
4057 @return Return 0 if access is granted, otherwise an appropriate value for
4058 errno should be returned.
4060 typedef int mpo_sysvmsq_check_msqctl_t(
4062 struct msqid_kernel
*msqptr
,
4063 struct label
*msqlabel
,
4067 @brief Access control check to get a System V message queue
4068 @param cred The credential of the caller
4069 @param msqptr The message queue requested
4070 @param msqlabel The message queue's label
4072 On a call to msgget(), if the queue requested already exists,
4073 and it is a public queue, this check will be performed before the
4074 queue's ID is returned to the user.
4076 @return Return 0 if access is granted, otherwise an appropriate value for
4077 errno should be returned.
4079 typedef int mpo_sysvmsq_check_msqget_t(
4081 struct msqid_kernel
*msqptr
,
4082 struct label
*msqlabel
4085 @brief Access control check to receive a System V message from the given queue
4086 @param cred The credential of the caller
4087 @param msqptr The message queue to receive from
4088 @param msqlabel The message queue's label
4090 On a call to msgrcv(), this check is performed to determine whether the
4091 caller has receive 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_msqrcv_t(
4098 struct msqid_kernel
*msqptr
,
4099 struct label
*msqlabel
4102 @brief Access control check to send a System V message to the given queue
4103 @param cred The credential of the caller
4104 @param msqptr The message queue to send to
4105 @param msqlabel The message queue's label
4107 On a call to msgsnd(), this check is performed to determine whether the
4108 caller has send rights on the given queue.
4110 @return Return 0 if access is granted, otherwise an appropriate value for
4111 errno should be returned.
4113 typedef int mpo_sysvmsq_check_msqsnd_t(
4115 struct msqid_kernel
*msqptr
,
4116 struct label
*msqlabel
4119 @brief Create a System V message queue label
4120 @param cred Subject credential
4121 @param msqkptr The message queue
4122 @param msqlabel The label of the message queue
4125 typedef void mpo_sysvmsq_label_associate_t(
4127 struct msqid_kernel
*msqptr
,
4128 struct label
*msqlabel
4131 @brief Destroy System V message queue label
4132 @param label The label to be destroyed
4134 Destroy a System V message queue label. Since the object is
4135 going out of scope, policy modules should free any internal storage
4136 associated with the label so that it may be destroyed.
4138 typedef void mpo_sysvmsq_label_destroy_t(
4142 @brief Initialize System V message queue label
4143 @param label New label to initialize
4145 Initialize the label for a newly instantiated System V message queue.
4147 typedef void mpo_sysvmsq_label_init_t(
4151 @brief Clean up a System V message queue label
4152 @param label The label to be destroyed
4154 Clean up a System V message queue label. Darwin pre-allocates
4155 message queues at system boot time and re-uses them rather than
4156 allocating new ones. Before message queues are returned to the "free
4157 pool", policies can cleanup or overwrite any information present in
4160 typedef void mpo_sysvmsq_label_recycle_t(
4164 @brief Access control check for System V semaphore control operation
4165 @param cred Subject credential
4166 @param semakptr Pointer to semaphore identifier
4167 @param semaklabel Label associated with semaphore
4168 @param cmd Control operation to be performed; see semctl(2)
4170 Determine whether the subject identified by the credential can perform
4171 the operation indicated by cmd on the System V semaphore semakptr.
4173 @return Return 0 if access is granted, otherwise an appropriate value for
4174 errno should be returned.
4176 typedef int mpo_sysvsem_check_semctl_t(
4178 struct semid_kernel
*semakptr
,
4179 struct label
*semaklabel
,
4183 @brief Access control check for obtaining a System V semaphore
4184 @param cred Subject credential
4185 @param semakptr Pointer to semaphore identifier
4186 @param semaklabel Label to associate with the semaphore
4188 Determine whether the subject identified by the credential can
4189 obtain a System V semaphore.
4191 @return Return 0 if access is granted, otherwise an appropriate value for
4192 errno should be returned.
4194 typedef int mpo_sysvsem_check_semget_t(
4196 struct semid_kernel
*semakptr
,
4197 struct label
*semaklabel
4200 @brief Access control check for System V semaphore operations
4201 @param cred Subject credential
4202 @param semakptr Pointer to semaphore identifier
4203 @param semaklabel Label associated with the semaphore
4204 @param accesstype Flags to indicate access (read and/or write)
4206 Determine whether the subject identified by the credential can
4207 perform the operations on the System V semaphore indicated by
4208 semakptr. The accesstype flags hold the maximum set of permissions
4209 from the sem_op array passed to the semop system call. It may
4210 contain SEM_R for read-only operations or SEM_A for read/write
4213 @return Return 0 if access is granted, otherwise an appropriate value for
4214 errno should be returned.
4216 typedef int mpo_sysvsem_check_semop_t(
4218 struct semid_kernel
*semakptr
,
4219 struct label
*semaklabel
,
4223 @brief Create a System V semaphore label
4224 @param cred Subject credential
4225 @param semakptr The semaphore being created
4226 @param semalabel Label to associate with the new semaphore
4228 Label a new System V semaphore. The label was previously
4229 initialized and associated with the semaphore. At this time, an
4230 appropriate initial label value should be assigned to the object and
4231 stored in semalabel.
4233 typedef void mpo_sysvsem_label_associate_t(
4235 struct semid_kernel
*semakptr
,
4236 struct label
*semalabel
4239 @brief Destroy System V semaphore label
4240 @param label The label to be destroyed
4242 Destroy a System V semaphore label. Since the object is
4243 going out of scope, policy modules should free any internal storage
4244 associated with the label so that it may be destroyed.
4246 typedef void mpo_sysvsem_label_destroy_t(
4250 @brief Initialize System V semaphore label
4251 @param label New label to initialize
4253 Initialize the label for a newly instantiated System V semaphore. Sleeping
4256 typedef void mpo_sysvsem_label_init_t(
4260 @brief Clean up a System V semaphore label
4261 @param label The label to be cleaned
4263 Clean up a System V semaphore label. Darwin pre-allocates
4264 semaphores at system boot time and re-uses them rather than
4265 allocating new ones. Before semaphores are returned to the "free
4266 pool", policies can cleanup or overwrite any information present in
4269 typedef void mpo_sysvsem_label_recycle_t(
4273 @brief Access control check for mapping System V shared memory
4274 @param cred Subject credential
4275 @param shmsegptr Pointer to shared memory segment identifier
4276 @param shmseglabel Label associated with the shared memory segment
4277 @param shmflg shmat flags; see shmat(2)
4279 Determine whether the subject identified by the credential can map
4280 the System V shared memory segment associated with shmsegptr.
4282 @return Return 0 if access is granted, otherwise an appropriate value for
4283 errno should be returned.
4285 typedef int mpo_sysvshm_check_shmat_t(
4287 struct shmid_kernel
*shmsegptr
,
4288 struct label
*shmseglabel
,
4292 @brief Access control check for System V shared memory control operation
4293 @param cred Subject credential
4294 @param shmsegptr Pointer to shared memory segment identifier
4295 @param shmseglabel Label associated with the shared memory segment
4296 @param cmd Control operation to be performed; see shmctl(2)
4298 Determine whether the subject identified by the credential can perform
4299 the operation indicated by cmd on the System V shared memory segment
4302 @return Return 0 if access is granted, otherwise an appropriate value for
4303 errno should be returned.
4305 typedef int mpo_sysvshm_check_shmctl_t(
4307 struct shmid_kernel
*shmsegptr
,
4308 struct label
*shmseglabel
,
4312 @brief Access control check for unmapping System V shared memory
4313 @param cred Subject credential
4314 @param shmsegptr Pointer to shared memory segment identifier
4315 @param shmseglabel Label associated with the shared memory segment
4317 Determine whether the subject identified by the credential can unmap
4318 the System V shared memory segment associated with shmsegptr.
4320 @return Return 0 if access is granted, otherwise an appropriate value for
4321 errno should be returned.
4323 typedef int mpo_sysvshm_check_shmdt_t(
4325 struct shmid_kernel
*shmsegptr
,
4326 struct label
*shmseglabel
4329 @brief Access control check obtaining System V shared memory identifier
4330 @param cred Subject credential
4331 @param shmsegptr Pointer to shared memory segment identifier
4332 @param shmseglabel Label associated with the shared memory segment
4333 @param shmflg shmget flags; see shmget(2)
4335 Determine whether the subject identified by the credential can get
4336 the System V shared memory segment address.
4338 @return Return 0 if access is granted, otherwise an appropriate value for
4339 errno should be returned.
4341 typedef int mpo_sysvshm_check_shmget_t(
4343 struct shmid_kernel
*shmsegptr
,
4344 struct label
*shmseglabel
,
4348 @brief Create a System V shared memory region label
4349 @param cred Subject credential
4350 @param shmsegptr The shared memory region being created
4351 @param shmlabel Label to associate with the new shared memory region
4353 Label a new System V shared memory region. The label was previously
4354 initialized and associated with the shared memory region. At this
4355 time, an appropriate initial label value should be assigned to the
4356 object and stored in shmlabel.
4358 typedef void mpo_sysvshm_label_associate_t(
4360 struct shmid_kernel
*shmsegptr
,
4361 struct label
*shmlabel
4364 @brief Destroy System V shared memory label
4365 @param label The label to be destroyed
4367 Destroy a System V shared memory region label. Since the
4368 object is going out of scope, policy modules should free any
4369 internal storage associated with the label so that it may be
4372 typedef void mpo_sysvshm_label_destroy_t(
4376 @brief Initialize System V Shared Memory region label
4377 @param label New label to initialize
4379 Initialize the label for a newly instantiated System V Shared Memory
4380 region. Sleeping is permitted.
4382 typedef void mpo_sysvshm_label_init_t(
4386 @brief Clean up a System V Share Memory Region label
4387 @param shmlabel The label to be cleaned
4389 Clean up a System V Shared Memory Region label. Darwin
4390 pre-allocates these objects at system boot time and re-uses them
4391 rather than allocating new ones. Before the memory regions are
4392 returned to the "free pool", policies can cleanup or overwrite any
4393 information present in the label.
4395 typedef void mpo_sysvshm_label_recycle_t(
4396 struct label
*shmlabel
4399 @brief Access control check for getting a process's task name
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 name port.
4405 This call is used by the task_name_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_name_t(
4416 @brief Access control check for getting a process's task port
4417 @param cred Subject credential
4418 @param proc Object process
4420 Determine whether the subject identified by the credential can get
4421 the passed process's task control port.
4422 This call is used by the task_for_pid(2) API.
4424 @return Return 0 if access is granted, otherwise an appropriate value for
4425 errno should be returned. Suggested failure: EACCES for label mismatch,
4426 EPERM for lack of privilege, or ESRCH to hide visibility of the target.
4428 typedef int mpo_proc_check_get_task_t(
4433 @brief Privilege check for a process to run invalid
4434 @param proc Object process
4436 Determine whether the process may execute even though the system determined
4437 that it is untrusted (eg unidentified / modified code).
4439 @return Return 0 if access is granted, otherwise an appropriate value for
4440 errno should be returned.
4442 typedef int mac_proc_check_run_cs_invalid_t(
4448 @brief Assign a label to a new kernelspace Mach task
4449 @param kproc New task
4450 @param tasklabel Label for new task
4451 @param portlabel Label for new task port
4452 @see mpo_cred_label_associate_kernel_t
4454 Assign labels to a new kernel task and its task port. Both the task and
4455 task port labels should be specified. Both new labels are initialized.
4456 If there is an associated BSD process structure, it will be labelled
4457 with calls to mpo_cred_label_associate_kernel.
4459 typedef void mpo_task_label_associate_kernel_t(
4461 struct label
*tasklabel
,
4462 struct label
*portlabel
4465 @brief Assign a label to a new (userspace) Mach task
4466 @param parent Parent task
4467 @param child New (child) task
4468 @param parentlabel Label of parent task
4469 @param childlabel Label for new task
4470 @param childportlabel Label for new task's task port
4472 Assign labels to a new task and its task port. Both the task and task port
4473 labels should be specified. Both new labels are initialized. If the task
4474 will have an associated BSD process, that information will be made available
4475 by the task_label_update and port_label_update_cred entry points.
4477 typedef void mpo_task_label_associate_t(
4478 struct task
*parent
,
4480 struct label
*parentlabel
,
4481 struct label
*childlabel
,
4482 struct label
*childportlabel
4485 @brief Copy a Mach task label
4486 @param src Source task label
4487 @param dest Destination task label
4489 Copy the Mach task label information from src to dest. This is used
4490 when duplicating label handles to implement copy-on-write semantics.
4492 typedef void mpo_task_label_copy_t(
4497 @brief Destroy Mach task label
4498 @param label The label to be destroyed
4500 Destroy a Mach task label. Since the object is going out of
4501 scope, policy modules should free any internal storage associated
4502 with the label so that it may be destroyed.
4504 typedef void mpo_task_label_destroy_t(
4508 @brief Externalize a task label
4509 @param label Label to be externalized
4510 @param element_name Name of the label namespace for which labels should be
4512 @param sb String buffer to be filled with a text representation of the label
4514 Produce an external representation of the label on a task. An
4515 externalized label consists of a text representation of the label
4516 contents that can be used with user applications. Policy-agnostic
4517 user space tools will display this externalized version.
4519 @return 0 on success, return non-zero if an error occurs while
4520 externalizing the label data.
4523 typedef int mpo_task_label_externalize_t(
4524 struct label
*label
,
4529 @brief Initialize Mach task label
4530 @param label New label to initialize
4532 Initialize the label for a newly instantiated Mach task. Sleeping
4535 typedef void mpo_task_label_init_t(
4539 @brief Internalize a task label
4540 @param label Label to be internalized
4541 @param element_name Name of the label namespace for which the label should
4543 @param element_data Text data to be internalized
4545 Produce a task label from an external representation. An
4546 externalized label consists of a text representation of the label
4547 contents that can be used with user applications. Policy-agnostic
4548 user space tools will forward text version to the kernel for
4549 processing by individual policy modules.
4551 The policy's internalize entry points will be called only if the
4552 policy has registered interest in the label namespace.
4554 @return 0 on success, Otherwise, return non-zero if an error occurs
4555 while internalizing the label data.
4558 typedef int mpo_task_label_internalize_t(
4559 struct label
*label
,
4564 @brief Update a Mach task label
4565 @param cred User credential label to be used as the source
4566 @param task Mach task label to be used as the destination
4567 @see mpo_cred_label_update_t
4568 @see mpo_cred_label_update_execve_t
4570 Update the label on a Mach task, using the supplied user credential
4571 label. When a mac_cred_label_update_execve or a mac_cred_label_update operation
4572 causes the label on a user credential to change, the Mach task label
4573 also needs to be updated to reflect the change. Both labels are
4574 already valid (initialized and created).
4576 @warning XXX We may change the name of this entry point in a future
4577 version of the MAC framework.
4579 typedef void mpo_task_label_update_t(
4584 @brief Perform MAC-related events when a thread returns to user space
4585 @param code The number of the syscall/trap that has finished
4586 @param error The error code that will be returned to user space
4587 @param thread Mach (not BSD) thread that is returning
4589 This entry point permits policy modules to perform MAC-related
4590 events when a thread returns to user space, via a system call
4591 return, trap return, or otherwise.
4593 typedef void mpo_thread_userret_t(
4596 struct thread
*thread
4599 @brief Check vnode access
4600 @param cred Subject credential
4601 @param vp Object vnode
4602 @param label Label for vp
4603 @param acc_mode access(2) flags
4605 Determine how invocations of access(2) and related calls by the
4606 subject identified by the credential should return when performed
4607 on the passed vnode using the passed access flags. This should
4608 generally be implemented using the same semantics used in
4609 mpo_vnode_check_open.
4611 @return Return 0 if access is granted, otherwise an appropriate value for
4612 errno should be returned. Suggested failure: EACCES for label mismatch or
4613 EPERM for lack of privilege.
4615 typedef int mpo_vnode_check_access_t(
4618 struct label
*label
,
4622 @brief Access control check for changing working directory
4623 @param cred Subject credential
4624 @param dvp Object; vnode to chdir(2) into
4625 @param dlabel Policy label for dvp
4627 Determine whether the subject identified by the credential can change
4628 the process working directory to the passed vnode.
4630 @return Return 0 if access is granted, otherwise an appropriate value for
4631 errno should be returned. Suggested failure: EACCES for label mismatch or
4632 EPERM for lack of privilege.
4634 typedef int mpo_vnode_check_chdir_t(
4637 struct label
*dlabel
4640 @brief Access control check for changing root directory
4641 @param cred Subject credential
4642 @param dvp Directory vnode
4643 @param dlabel Policy label associated with dvp
4644 @param cnp Component name for dvp
4646 Determine whether the subject identified by the credential should be
4647 allowed to chroot(2) into the specified directory (dvp).
4649 @return In the event of an error, an appropriate value for errno
4650 should be returned, otherwise return 0 upon success.
4652 typedef int mpo_vnode_check_chroot_t(
4655 struct label
*dlabel
,
4656 struct componentname
*cnp
4659 @brief Access control check for creating vnode
4660 @param cred Subject credential
4661 @param dvp Directory vnode
4662 @param dlabel Policy label for dvp
4663 @param cnp Component name for dvp
4664 @param vap vnode attributes for vap
4666 Determine whether the subject identified by the credential can create
4667 a vnode with the passed parent directory, passed name information,
4668 and passed attribute information. This call may be made in a number of
4669 situations, including as a result of calls to open(2) with O_CREAT,
4670 mknod(2), mkfifo(2), and others.
4672 @return Return 0 if access is granted, otherwise an appropriate value for
4673 errno should be returned. Suggested failure: EACCES for label mismatch or
4674 EPERM for lack of privilege.
4676 typedef int mpo_vnode_check_create_t(
4679 struct label
*dlabel
,
4680 struct componentname
*cnp
,
4681 struct vnode_attr
*vap
4684 @brief Access control check for deleting extended attribute
4685 @param cred Subject credential
4686 @param vp Object vnode
4687 @param vlabel Label associated with vp
4688 @param name Extended attribute name
4690 Determine whether the subject identified by the credential can delete
4691 the extended attribute from the passed vnode.
4693 @return Return 0 if access is granted, otherwise an appropriate value for
4694 errno should be returned. Suggested failure: EACCES for label mismatch or
4695 EPERM for lack of privilege.
4697 typedef int mpo_vnode_check_deleteextattr_t(
4700 struct label
*vlabel
,
4704 @brief Access control check for exchanging file data
4705 @param cred Subject credential
4706 @param v1 vnode 1 to swap
4707 @param vl1 Policy label for v1
4708 @param v2 vnode 2 to swap
4709 @param vl2 Policy label for v2
4711 Determine whether the subject identified by the credential can swap the data
4712 in the two supplied vnodes.
4714 @return Return 0 if access is granted, otherwise an appropriate value for
4715 errno should be returned. Suggested failure: EACCES for label mismatch or
4716 EPERM for lack of privilege.
4718 typedef int mpo_vnode_check_exchangedata_t(
4726 @brief Access control check for executing the vnode
4727 @param cred Subject credential
4728 @param vp Object vnode to execute
4729 @param label Policy label for vp
4730 @param execlabel Userspace provided execution label
4731 @param cnp Component name for file being executed
4733 Determine whether the subject identified by the credential can execute
4734 the passed vnode. Determination of execute privilege is made separately
4735 from decisions about any process label transitioning event.
4737 The final label, execlabel, corresponds to a label supplied by a
4738 user space application through the use of the mac_execve system call.
4739 This label will be NULL if the user application uses the the vendor
4740 execve(2) call instead of the MAC Framework mac_execve() call.
4742 @return Return 0 if access is granted, otherwise an appropriate value for
4743 errno should be returned. Suggested failure: EACCES for label mismatch or
4744 EPERM for lack of privilege.
4746 typedef int mpo_vnode_check_exec_t(
4749 struct label
*label
,
4750 struct label
*execlabel
, /* NULLOK */
4751 struct componentname
*cnp
,
4755 @brief Access control check after determining the code directory hash
4757 typedef int mpo_vnode_check_signature_t(struct vnode
*vp
, struct label
*label
,
4758 unsigned char *sha1
, void *signature
,
4762 @brief Access control check for retrieving file attributes
4763 @param cred Subject credential
4764 @param vp Object vnode
4765 @param vlabel Policy label for vp
4766 @param alist List of attributes to retrieve
4768 Determine whether the subject identified by the credential can read
4769 various attributes of the specified vnode, or the filesystem or volume on
4770 which that vnode resides. See <sys/attr.h> for definitions of the
4773 @return Return 0 if access is granted, otherwise an appropriate value for
4774 errno should be returned. Suggested failure: EACCES for label mismatch or
4775 EPERM for lack of privilege. Access control covers all attributes requested
4776 with this call; the security policy is not permitted to change the set of
4777 attributes requested.
4779 typedef int mpo_vnode_check_getattrlist_t(
4782 struct label
*vlabel
,
4783 struct attrlist
*alist
4786 @brief Access control check for retrieving an extended attribute
4787 @param cred Subject credential
4788 @param vp Object vnode
4789 @param label Policy label for vp
4790 @param name Extended attribute name
4791 @param uio I/O structure pointer
4793 Determine whether the subject identified by the credential can retrieve
4794 the extended attribute from the passed vnode. The uio parameter
4795 will be NULL when the getxattr(2) call has been made with a NULL data
4796 value; this is done to request the size of the data only.
4798 @return Return 0 if access is granted, otherwise an appropriate value for
4799 errno should be returned. Suggested failure: EACCES for label mismatch or
4800 EPERM for lack of privilege.
4802 typedef int mpo_vnode_check_getextattr_t(
4805 struct label
*label
, /* NULLOK */
4807 struct uio
*uio
/* NULLOK */
4810 @brief Access control check for ioctl
4811 @param cred Subject credential
4812 @param vp Object vnode
4813 @param label Policy label for vp
4814 @param com Device-dependent request code; see ioctl(2)
4816 Determine whether the subject identified by the credential can perform
4817 the ioctl operation indicated by com.
4819 @warning Since ioctl data is opaque from the standpoint of the MAC
4820 framework, and since ioctls can affect many aspects of system
4821 operation, policies must exercise extreme care when implementing
4822 access control checks.
4824 @return Return 0 if access is granted, otherwise an appropriate value for
4825 errno should be returned.
4827 typedef int mpo_vnode_check_ioctl_t(
4830 struct label
*label
,
4834 @brief Access control check for vnode kqfilter
4835 @param cred Subject credential
4836 @param kn Object knote
4837 @param vp Object vnode
4838 @param label Policy label for vp
4840 Determine whether the subject identified by the credential can
4841 receive the knote on the passed vnode.
4843 @return Return 0 if access if granted, otherwise an appropriate
4844 value for errno should be returned.
4846 typedef int mpo_vnode_check_kqfilter_t(
4847 kauth_cred_t active_cred
,
4848 kauth_cred_t file_cred
, /* NULLOK */
4854 @brief Access control check for relabel
4855 @param cred Subject credential
4856 @param vp Object vnode
4857 @param vnodelabel Existing policy label for vp
4858 @param newlabel Policy label update to later be applied to vp
4859 @see mpo_relable_vnode_t
4861 Determine whether the subject identified by the credential can relabel
4862 the passed vnode to the passed label update. If all policies permit
4863 the label change, the actual relabel entry point (mpo_vnode_label_update)
4866 @return Return 0 if access is granted, otherwise an appropriate value for
4867 errno should be returned.
4869 typedef int mpo_vnode_check_label_update_t(
4872 struct label
*vnodelabel
,
4873 struct label
*newlabel
4876 @brief Access control check for creating link
4877 @param cred Subject credential
4878 @param dvp Directory vnode
4879 @param dlabel Policy label associated with dvp
4880 @param vp Link destination vnode
4881 @param label Policy label associated with vp
4882 @param cnp Component name for the link being created
4884 Determine whether the subject identified by the credential should be
4885 allowed to create a link to the vnode vp with the name specified by cnp.
4887 @return Return 0 if access is granted, otherwise an appropriate value for
4888 errno should be returned.
4890 typedef int mpo_vnode_check_link_t(
4893 struct label
*dlabel
,
4895 struct label
*label
,
4896 struct componentname
*cnp
4899 @brief Access control check for listing extended attributes
4900 @param cred Subject credential
4901 @param vp Object vnode
4902 @param vlabel Policy label associated with vp
4904 Determine whether the subject identified by the credential can retrieve
4905 a list of named extended attributes from a vnode.
4907 @return Return 0 if access is granted, otherwise an appropriate value for
4908 errno should be returned.
4910 typedef int mpo_vnode_check_listextattr_t(
4913 struct label
*vlabel
4916 @brief Access control check for lookup
4917 @param cred Subject credential
4918 @param dvp Object vnode
4919 @param dlabel Policy label for dvp
4920 @param cnp Component name being looked up
4922 Determine whether the subject identified by the credential can perform
4923 a lookup in the passed directory vnode for the passed name (cnp).
4925 @return Return 0 if access is granted, otherwise an appropriate value for
4926 errno should be returned. Suggested failure: EACCES for label mismatch or
4927 EPERM for lack of privilege.
4929 typedef int mpo_vnode_check_lookup_t(
4932 struct label
*dlabel
,
4933 struct componentname
*cnp
4936 @brief Access control check for open
4937 @param cred Subject credential
4938 @param vp Object vnode
4939 @param label Policy label associated with vp
4940 @param acc_mode open(2) access mode
4942 Determine whether the subject identified by the credential can perform
4943 an open operation on the passed vnode with the passed access mode.
4945 @return Return 0 if access is granted, otherwise an appropriate value for
4946 errno should be returned. Suggested failure: EACCES for label mismatch or
4947 EPERM for lack of privilege.
4949 typedef int mpo_vnode_check_open_t(
4952 struct label
*label
,
4956 @brief Access control check for read
4957 @param active_cred Subject credential
4958 @param file_cred Credential associated with the struct fileproc
4959 @param vp Object vnode
4960 @param label Policy label for vp
4962 Determine whether the subject identified by the credential can perform
4963 a read operation on the passed vnode. The active_cred hold the credentials
4964 of the subject performing the operation, and file_cred holds the
4965 credentials of the subject that originally opened the file.
4967 @return Return 0 if access is granted, otherwise an appropriate value for
4968 errno should be returned. Suggested failure: EACCES for label mismatch or
4969 EPERM for lack of privilege.
4971 typedef int mpo_vnode_check_read_t(
4972 kauth_cred_t active_cred
, /* SUBJECT */
4973 kauth_cred_t file_cred
, /* NULLOK */
4974 struct vnode
*vp
, /* OBJECT */
4975 struct label
*label
/* LABEL */
4978 @brief Access control check for read directory
4979 @param cred Subject credential
4980 @param dvp Object directory vnode
4981 @param dlabel Policy label for dvp
4983 Determine whether the subject identified by the credential can
4984 perform a readdir operation on the passed directory vnode.
4986 @return Return 0 if access is granted, otherwise an appropriate value for
4987 errno should be returned. Suggested failure: EACCES for label mismatch or
4988 EPERM for lack of privilege.
4990 typedef int mpo_vnode_check_readdir_t(
4991 kauth_cred_t cred
, /* SUBJECT */
4992 struct vnode
*dvp
, /* OBJECT */
4993 struct label
*dlabel
/* LABEL */
4996 @brief Access control check for read link
4997 @param cred Subject credential
4998 @param vp Object vnode
4999 @param label Policy label for vp
5001 Determine whether the subject identified by the credential can perform
5002 a readlink operation on the passed symlink vnode. This call can be made
5003 in a number of situations, including an explicit readlink call by the
5004 user process, or as a result of an implicit readlink during a name
5005 lookup by the process.
5007 @return Return 0 if access is granted, otherwise an appropriate value for
5008 errno should be returned. Suggested failure: EACCES for label mismatch or
5009 EPERM for lack of privilege.
5011 typedef int mpo_vnode_check_readlink_t(
5017 @brief Access control check for rename from
5018 @param cred Subject credential
5019 @param dvp Directory vnode
5020 @param dlabel Policy label associated with dvp
5021 @param vp vnode to be renamed
5022 @param label Policy label associated with vp
5023 @param cnp Component name for vp
5024 @see mpo_vnode_check_rename_to_t
5026 Determine whether the subject identified by the credential should be
5027 allowed to rename the vnode vp to something else.
5029 Due to VFS locking constraints (to make sure proper vnode locks are
5030 held during this entry point), the vnode relabel checks had to be
5031 split into two parts: relabel_from and relabel to.
5033 @return Return 0 if access is granted, otherwise an appropriate value for
5034 errno should be returned.
5036 typedef int mpo_vnode_check_rename_from_t(
5039 struct label
*dlabel
,
5041 struct label
*label
,
5042 struct componentname
*cnp
5045 @brief Access control check for rename to
5046 @param cred Subject credential
5047 @param dvp Directory vnode
5048 @param dlabel Policy label associated with dvp
5049 @param vp Overwritten vnode
5050 @param label Policy label associated with vp
5051 @param samedir Boolean; 1 if the source and destination directories are the same
5052 @param cnp Destination component name
5053 @see mpo_vnode_check_rename_from_t
5055 Determine whether the subject identified by the credential should be
5056 allowed to rename to the vnode vp, into the directory dvp, or to the
5057 name represented by cnp. If there is no existing file to overwrite,
5058 vp and label will be NULL.
5060 Due to VFS locking constraints (to make sure proper vnode locks are
5061 held during this entry point), the vnode relabel checks had to be
5062 split into two parts: relabel_from and relabel to.
5064 @return Return 0 if access is granted, otherwise an appropriate value for
5065 errno should be returned.
5067 typedef int mpo_vnode_check_rename_to_t(
5070 struct label
*dlabel
,
5071 struct vnode
*vp
, /* NULLOK */
5072 struct label
*label
, /* NULLOK */
5074 struct componentname
*cnp
5077 @brief Access control check for revoke
5078 @param cred Subject credential
5079 @param vp Object vnode
5080 @param label Policy label for vp
5082 Determine whether the subject identified by the credential can revoke
5083 access to the passed vnode.
5085 @return Return 0 if access is granted, otherwise an appropriate value for
5086 errno should be returned. Suggested failure: EACCES for label mismatch or
5087 EPERM for lack of privilege.
5089 typedef int mpo_vnode_check_revoke_t(
5095 @brief Access control check for select
5096 @param cred Subject credential
5097 @param vp Object vnode
5098 @param label Policy label for vp
5099 @param which The operation selected on: FREAD or FWRITE
5101 Determine whether the subject identified by the credential can select
5104 @return Return 0 if access is granted, otherwise an appropriate value for
5105 errno should be returned.
5107 typedef int mpo_vnode_check_select_t(
5110 struct label
*label
,
5114 @brief Access control check for setting file attributes
5115 @param cred Subject credential
5116 @param vp Object vnode
5117 @param vlabel Policy label for vp
5118 @param alist List of attributes to set
5120 Determine whether the subject identified by the credential can set
5121 various attributes of the specified vnode, or the filesystem or volume on
5122 which that vnode resides. See <sys/attr.h> for definitions of the
5125 @return Return 0 if access is granted, otherwise an appropriate value for
5126 errno should be returned. Suggested failure: EACCES for label mismatch or
5127 EPERM for lack of privilege. Access control covers all attributes requested
5130 typedef int mpo_vnode_check_setattrlist_t(
5133 struct label
*vlabel
,
5134 struct attrlist
*alist
5137 @brief Access control check for setting extended attribute
5138 @param cred Subject credential
5139 @param vp Object vnode
5140 @param label Policy label for vp
5141 @param name Extended attribute name
5142 @param uio I/O structure pointer
5144 Determine whether the subject identified by the credential can set the
5145 extended attribute of passed name and passed namespace on the passed
5146 vnode. Policies implementing security labels backed into extended
5147 attributes may want to provide additional protections for those
5148 attributes. Additionally, policies should avoid making decisions based
5149 on the data referenced from uio, as there is a potential race condition
5150 between this check and the actual operation. The uio may also be NULL
5151 if a delete operation is being performed.
5153 @return Return 0 if access is granted, otherwise an appropriate value for
5154 errno should be returned. Suggested failure: EACCES for label mismatch or
5155 EPERM for lack of privilege.
5157 typedef int mpo_vnode_check_setextattr_t(
5160 struct label
*label
,
5165 @brief Access control check for setting flags
5166 @param cred Subject credential
5167 @param vp Object vnode
5168 @param label Policy label for vp
5169 @param flags File flags; see chflags(2)
5171 Determine whether the subject identified by the credential can set
5172 the passed flags on the passed vnode.
5174 @return Return 0 if access is granted, otherwise an appropriate value for
5175 errno should be returned. Suggested failure: EACCES for label mismatch or
5176 EPERM for lack of privilege.
5178 typedef int mpo_vnode_check_setflags_t(
5181 struct label
*label
,
5185 @brief Access control check for setting mode
5186 @param cred Subject credential
5187 @param vp Object vnode
5188 @param label Policy label for vp
5189 @param mode File mode; see chmod(2)
5191 Determine whether the subject identified by the credential can set
5192 the passed mode on the passed vnode.
5194 @return Return 0 if access is granted, otherwise an appropriate value for
5195 errno should be returned. Suggested failure: EACCES for label mismatch or
5196 EPERM for lack of privilege.
5198 typedef int mpo_vnode_check_setmode_t(
5201 struct label
*label
,
5205 @brief Access control check for setting uid and gid
5206 @param cred Subject credential
5207 @param vp Object vnode
5208 @param label Policy label for vp
5212 Determine whether the subject identified by the credential can set
5213 the passed uid and passed gid as file uid and file gid on the passed
5214 vnode. The IDs may be set to (-1) to request no update.
5216 @return Return 0 if access is granted, otherwise an appropriate value for
5217 errno should be returned. Suggested failure: EACCES for label mismatch or
5218 EPERM for lack of privilege.
5220 typedef int mpo_vnode_check_setowner_t(
5223 struct label
*label
,
5228 @brief Access control check for setting timestamps
5229 @param cred Subject credential
5230 @param vp Object vnode
5231 @param label Policy label for vp
5232 @param atime Access time; see utimes(2)
5233 @param mtime Modification time; see utimes(2)
5235 Determine whether the subject identified by the credential can set
5236 the passed access timestamps on the passed vnode.
5238 @return Return 0 if access is granted, otherwise an appropriate value for
5239 errno should be returned. Suggested failure: EACCES for label mismatch or
5240 EPERM for lack of privilege.
5242 typedef int mpo_vnode_check_setutimes_t(
5245 struct label
*label
,
5246 struct timespec atime
,
5247 struct timespec mtime
5250 @brief Access control check for stat
5251 @param active_cred Subject credential
5252 @param file_cred Credential associated with the struct fileproc
5253 @param vp Object vnode
5254 @param label Policy label for vp
5256 Determine whether the subject identified by the credential can stat
5257 the passed vnode. See stat(2) for more information. The active_cred
5258 hold the credentials of the subject performing the operation, and
5259 file_cred holds the credentials of the subject that originally
5262 @return Return 0 if access is granted, otherwise an appropriate value for
5263 errno should be returned. Suggested failure: EACCES for label mismatch or
5264 EPERM for lack of privilege.
5266 typedef int mpo_vnode_check_stat_t(
5267 struct ucred
*active_cred
,
5268 struct ucred
*file_cred
, /* NULLOK */
5273 @brief Access control check for truncate/ftruncate
5274 @param active_cred Subject credential
5275 @param file_cred Credential associated with the struct fileproc
5276 @param vp Object vnode
5277 @param label Policy label for vp
5279 Determine whether the subject identified by the credential can
5280 perform a truncate operation on the passed vnode. The active_cred hold
5281 the credentials of the subject performing the operation, and
5282 file_cred holds the credentials of the subject that originally
5285 @return Return 0 if access is granted, otherwise an appropriate value for
5286 errno should be returned. Suggested failure: EACCES for label mismatch or
5287 EPERM for lack of privilege.
5289 typedef int mpo_vnode_check_truncate_t(
5290 kauth_cred_t active_cred
,
5291 kauth_cred_t file_cred
, /* NULLOK */
5296 @brief Access control check for binding UNIX domain socket
5297 @param cred Subject credential
5298 @param dvp Directory vnode
5299 @param dlabel Policy label for dvp
5300 @param cnp Component name for dvp
5301 @param vap vnode attributes for vap
5303 Determine whether the subject identified by the credential can perform a
5304 bind operation on a UNIX domain socket with the passed parent directory,
5305 passed name information, and passed attribute information.
5307 @return Return 0 if access is granted, otherwise an appropriate value for
5308 errno should be returned. Suggested failure: EACCES for label mismatch or
5309 EPERM for lack of privilege.
5311 typedef int mpo_vnode_check_uipc_bind_t(
5314 struct label
*dlabel
,
5315 struct componentname
*cnp
,
5316 struct vnode_attr
*vap
5319 @brief Access control check for connecting UNIX domain socket
5320 @param cred Subject credential
5321 @param vp Object vnode
5322 @param label Policy label associated with vp
5324 Determine whether the subject identified by the credential can perform a
5325 connect operation on the passed UNIX domain socket vnode.
5327 @return Return 0 if access is granted, otherwise an appropriate value for
5328 errno should be returned. Suggested failure: EACCES for label mismatch or
5329 EPERM for lack of privilege.
5331 typedef int mpo_vnode_check_uipc_connect_t(
5337 @brief Access control check for deleting vnode
5338 @param cred Subject credential
5339 @param dvp Parent directory vnode
5340 @param dlabel Policy label for dvp
5341 @param vp Object vnode to delete
5342 @param label Policy label for vp
5343 @param cnp Component name for vp
5344 @see mpo_check_rename_to_t
5346 Determine whether the subject identified by the credential can delete
5347 a vnode from the passed parent directory and passed name information.
5348 This call may be made in a number of situations, including as a
5349 results of calls to unlink(2) and rmdir(2). Policies implementing
5350 this entry point should also implement mpo_check_rename_to to
5351 authorize deletion of objects as a result of being the target of a rename.
5353 @return Return 0 if access is granted, otherwise an appropriate value for
5354 errno should be returned. Suggested failure: EACCES for label mismatch or
5355 EPERM for lack of privilege.
5357 typedef int mpo_vnode_check_unlink_t(
5360 struct label
*dlabel
,
5362 struct label
*label
,
5363 struct componentname
*cnp
5366 @brief Access control check for write
5367 @param active_cred Subject credential
5368 @param file_cred Credential associated with the struct fileproc
5369 @param vp Object vnode
5370 @param label Policy label for vp
5372 Determine whether the subject identified by the credential can
5373 perform a write operation on the passed vnode. The active_cred hold
5374 the credentials of the subject performing the operation, and
5375 file_cred holds the credentials of the subject that originally
5378 @return Return 0 if access is granted, otherwise an appropriate value for
5379 errno should be returned. Suggested failure: EACCES for label mismatch or
5380 EPERM for lack of privilege.
5382 typedef int mpo_vnode_check_write_t(
5383 kauth_cred_t active_cred
,
5384 kauth_cred_t file_cred
, /* NULLOK */
5389 @brief Associate a vnode with a devfs entry
5390 @param mp Devfs mount point
5391 @param mntlabel Devfs mount point label
5392 @param de Devfs directory entry
5393 @param delabel Label associated with de
5394 @param vp vnode associated with de
5395 @param vlabel Label associated with vp
5397 Fill in the label (vlabel) for a newly created devfs vnode. The
5398 label is typically derived from the label on the devfs directory
5399 entry or the label on the filesystem, supplied as parameters.
5401 typedef void mpo_vnode_label_associate_devfs_t(
5403 struct label
*mntlabel
,
5405 struct label
*delabel
,
5407 struct label
*vlabel
5410 @brief Associate a label with a vnode
5411 @param mp File system mount point
5412 @param mntlabel File system mount point label
5413 @param vp Vnode to label
5414 @param vlabel Label associated with vp
5416 Attempt to retrieve label information for the vnode, vp, from the
5417 file system extended attribute store. The label should be stored in
5418 the supplied vlabel parameter. If a policy cannot retrieve an
5419 extended attribute, sometimes it is acceptible to fallback to using
5422 If the policy requires vnodes to have a valid label elsewhere it
5423 MUST NOT return other than temporary errors, and must always provide
5424 a valid label of some sort. Returning an error will cause vnode
5425 labeling to be retried at a later access. Failure to handle policy
5426 centric errors internally (corrupt labels etc.) will result in
5429 @return In the event of an error, an appropriate value for errno
5430 should be returned, otherwise return 0 upon success.
5432 typedef int mpo_vnode_label_associate_extattr_t(
5434 struct label
*mntlabel
,
5436 struct label
*vlabel
5439 @brief Associate a file label with a vnode
5440 @param cred User credential
5441 @param mp Fdesc mount point
5442 @param mntlabel Fdesc mount point label
5443 @param fg Fileglob structure
5444 @param label Policy label for fg
5445 @param vp Vnode to label
5446 @param vlabel Label associated with vp
5448 Associate label information for the vnode, vp, with the label of
5449 the open file descriptor described by fg.
5450 The label should be stored in the supplied vlabel parameter.
5452 typedef void mpo_vnode_label_associate_file_t(
5455 struct label
*mntlabel
,
5456 struct fileglob
*fg
,
5457 struct label
*label
,
5459 struct label
*vlabel
5462 @brief Associate a pipe label with a vnode
5463 @param cred User credential for the process that opened the pipe
5464 @param cpipe Pipe structure
5465 @param pipelabel Label associated with pipe
5466 @param vp Vnode to label
5467 @param vlabel Label associated with vp
5469 Associate label information for the vnode, vp, with the label of
5470 the pipe described by the pipe structure cpipe.
5471 The label should be stored in the supplied vlabel parameter.
5473 typedef void mpo_vnode_label_associate_pipe_t(
5476 struct label
*pipelabel
,
5478 struct label
*vlabel
5481 @brief Associate a POSIX semaphore label with a vnode
5482 @param cred User credential for the process that create psem
5483 @param psem POSIX semaphore structure
5484 @param psemlabel Label associated with psem
5485 @param vp Vnode to label
5486 @param vlabel Label associated with vp
5488 Associate label information for the vnode, vp, with the label of
5489 the POSIX semaphore described by psem.
5490 The label should be stored in the supplied vlabel parameter.
5492 typedef void mpo_vnode_label_associate_posixsem_t(
5494 struct pseminfo
*psem
,
5495 struct label
*psemlabel
,
5497 struct label
*vlabel
5500 @brief Associate a POSIX shared memory label with a vnode
5501 @param cred User credential for the process that created pshm
5502 @param pshm POSIX shared memory structure
5503 @param pshmlabel Label associated with pshm
5504 @param vp Vnode to label
5505 @param vlabel Label associated with vp
5507 Associate label information for the vnode, vp, with the label of
5508 the POSIX shared memory region described by pshm.
5509 The label should be stored in the supplied vlabel parameter.
5511 typedef void mpo_vnode_label_associate_posixshm_t(
5513 struct pshminfo
*pshm
,
5514 struct label
*pshmlabel
,
5516 struct label
*vlabel
5519 @brief Associate a label with a vnode
5520 @param mp File system mount point
5521 @param mntlabel File system mount point label
5522 @param vp Vnode to label
5523 @param vlabel Label associated with vp
5525 On non-multilabel file systems, set the label for a vnode. The
5526 label will most likely be based on the file system label.
5528 typedef void mpo_vnode_label_associate_singlelabel_t(
5530 struct label
*mntlabel
,
5532 struct label
*vlabel
5535 @brief Associate a socket label with a vnode
5536 @param cred User credential for the process that opened the socket
5537 @param so Socket structure
5538 @param solabel Label associated with so
5539 @param vp Vnode to label
5540 @param vlabel Label associated with vp
5542 Associate label information for the vnode, vp, with the label of
5543 the open socket described by the socket structure so.
5544 The label should be stored in the supplied vlabel parameter.
5546 typedef void mpo_vnode_label_associate_socket_t(
5549 struct label
*solabel
,
5551 struct label
*vlabel
5554 @brief Copy a vnode label
5555 @param src Source vnode label
5556 @param dest Destination vnode label
5558 Copy the vnode label information from src to dest. On Darwin, this
5559 is currently only necessary when executing interpreted scripts, but
5560 will later be used if vnode label externalization cannot be an
5563 typedef void mpo_vnode_label_copy_t(
5568 @brief Destroy vnode label
5569 @param label The label to be destroyed
5571 Destroy a vnode label. Since the object is going out of scope,
5572 policy modules should free any internal storage associated with the
5573 label so that it may be destroyed.
5575 typedef void mpo_vnode_label_destroy_t(
5579 @brief Externalize a vnode label for auditing
5580 @param label Label to be externalized
5581 @param element_name Name of the label namespace for which labels should be
5583 @param sb String buffer to be filled with a text representation of the label
5585 Produce an external representation of the label on a vnode suitable for
5586 inclusion in an audit record. An externalized label consists of a text
5587 representation of the label contents that will be added to the audit record
5588 as part of a text token. Policy-agnostic user space tools will display
5589 this externalized version.
5591 @return 0 on success, return non-zero if an error occurs while
5592 externalizing the label data.
5595 typedef int mpo_vnode_label_externalize_audit_t(
5596 struct label
*label
,
5601 @brief Externalize a vnode label
5602 @param label Label to be externalized
5603 @param element_name Name of the label namespace for which labels should be
5605 @param sb String buffer to be filled with a text representation of the label
5607 Produce an external representation of the label on a vnode. An
5608 externalized label consists of a text representation of the label
5609 contents that can be used with user applications. Policy-agnostic
5610 user space tools will display this externalized version.
5612 @return 0 on success, return non-zero if an error occurs while
5613 externalizing the label data.
5616 typedef int mpo_vnode_label_externalize_t(
5617 struct label
*label
,
5622 @brief Initialize vnode label
5623 @param label New label to initialize
5625 Initialize label storage for use with a newly instantiated vnode, or
5626 for temporary storage associated with the copying in or out of a
5627 vnode label. While it is necessary to allocate space for a
5628 kernel-resident vnode label, it is not yet necessary to link this vnode
5629 with persistent label storage facilities, such as extended attributes.
5630 Sleeping is permitted.
5632 typedef void mpo_vnode_label_init_t(
5636 @brief Internalize a vnode label
5637 @param label Label to be internalized
5638 @param element_name Name of the label namespace for which the label should
5640 @param element_data Text data to be internalized
5642 Produce a vnode label from an external representation. An
5643 externalized label consists of a text representation of the label
5644 contents that can be used with user applications. Policy-agnostic
5645 user space tools will forward text version to the kernel for
5646 processing by individual policy modules.
5648 The policy's internalize entry points will be called only if the
5649 policy has registered interest in the label namespace.
5651 @return 0 on success, Otherwise, return non-zero if an error occurs
5652 while internalizing the label data.
5654 typedef int mpo_vnode_label_internalize_t(
5655 struct label
*label
,
5660 @brief Clean up a vnode label
5661 @param label The label to be cleaned for re-use
5663 Clean up a vnode label. Darwin (Tiger, 8.x) allocates vnodes on demand, but
5664 typically never frees them. Before vnodes are placed back on free lists for
5665 re-use, policies can cleanup or overwrite any information present in the label.
5667 typedef void mpo_vnode_label_recycle_t(
5671 @brief Write a label to a extended attribute
5672 @param cred Subject credential
5673 @param vp The vnode for which the label is being stored
5674 @param vlabel Label associated with vp
5675 @param intlabel The new label to store
5677 Store a new label in the extended attribute corresponding to the
5678 supplied vnode. The policy has already authorized the operation;
5679 this call must be implemented in order to perform the actual
5682 @return In the event of an error, an appropriate value for errno
5683 should be returned, otherwise return 0 upon success.
5685 @warning XXX After examining the extended attribute implementation on
5686 Apple's future release, this entry point may be changed.
5688 typedef int mpo_vnode_label_store_t(
5691 struct label
*vlabel
,
5692 struct label
*intlabel
5695 @brief Update vnode label from extended attributes
5696 @param mp File system mount point
5697 @param mntlabel Mount point label
5698 @param vp Vnode to label
5699 @param vlabel Label associated with vp
5700 @param name Name of the xattr
5701 @see mpo_vnode_check_setextattr_t
5703 When an extended attribute is updated via the Vendor attribute management
5704 functions, the MAC vnode label might also require an update.
5705 Policies should first determine if 'name' matches their xattr label
5706 name. If it does, the kernel is has either replaced or removed the
5707 named extended attribute that was previously associated with the
5708 vnode. Normally labels should only be modified via MAC Framework label
5709 management calls, but sometimes the user space components will directly
5710 modify extended attributes. For example, 'cp', 'tar', etc. manage
5711 extended attributes in userspace, not the kernel.
5713 This entry point is called after the label update has occurred, so
5714 it cannot return a failure. However, the operation is preceded by
5715 the mpo_vnode_check_setextattr() access control check.
5717 If the vnode label needs to be updated the policy should return
5718 a non-zero value. The vnode label will be marked for re-association
5721 typedef int mpo_vnode_label_update_extattr_t(
5723 struct label
*mntlabel
,
5725 struct label
*vlabel
,
5729 @brief Update a vnode label
5730 @param cred Subject credential
5731 @param vp The vnode to relabel
5732 @param vnodelabel Existing vnode label
5733 @param label New label to replace existing label
5734 @see mpo_vnode_check_label_update_t
5736 The subject identified by the credential has previously requested
5737 and was authorized to relabel the vnode; this entry point allows
5738 policies to perform the actual relabel operation. Policies should
5739 update vnodelabel using the label stored in the label parameter.
5741 typedef void mpo_vnode_label_update_t(
5744 struct label
*vnodelabel
,
5748 @brief Create a new vnode, backed by extended attributes
5749 @param cred User credential for the creating process
5750 @param mp File system mount point
5751 @param mntlabel File system mount point label
5752 @param dvp Parent directory vnode
5753 @param dlabel Parent directory vnode label
5754 @param vp Newly created vnode
5755 @param vlabel Label to associate with the new vnode
5756 @param cnp Component name for vp
5758 Write out the label for the newly created vnode, most likely storing
5759 the results in a file system extended attribute. Most policies will
5760 derive the new vnode label using information from a combination
5761 of the subject (user) credential, the file system label, the parent
5762 directory label, and potentially the path name component.
5764 @return If the operation succeeds, store the new label in vlabel and
5765 return 0. Otherwise, return an appropriate errno value.
5767 typedef int mpo_vnode_notify_create_t(
5770 struct label
*mntlabel
,
5772 struct label
*dlabel
,
5774 struct label
*vlabel
,
5775 struct componentname
*cnp
5779 * Placeholder for future events that may need mac hooks.
5781 typedef void mpo_reserved_hook_t(void);
5784 \struct mac_policy_ops
5786 #define MAC_POLICY_OPS_VERSION 2 /* inc when new reserved slots are taken */
5787 struct mac_policy_ops
{
5788 mpo_audit_check_postselect_t
*mpo_audit_check_postselect
;
5789 mpo_audit_check_preselect_t
*mpo_audit_check_preselect
;
5790 mpo_bpfdesc_label_associate_t
*mpo_bpfdesc_label_associate
;
5791 mpo_bpfdesc_label_destroy_t
*mpo_bpfdesc_label_destroy
;
5792 mpo_bpfdesc_label_init_t
*mpo_bpfdesc_label_init
;
5793 mpo_bpfdesc_check_receive_t
*mpo_bpfdesc_check_receive
;
5794 mpo_cred_check_label_update_execve_t
*mpo_cred_check_label_update_execve
;
5795 mpo_cred_check_label_update_t
*mpo_cred_check_label_update
;
5796 mpo_cred_check_visible_t
*mpo_cred_check_visible
;
5797 mpo_cred_label_associate_fork_t
*mpo_cred_label_associate_fork
;
5798 mpo_cred_label_associate_kernel_t
*mpo_cred_label_associate_kernel
;
5799 mpo_cred_label_associate_t
*mpo_cred_label_associate
;
5800 mpo_cred_label_associate_user_t
*mpo_cred_label_associate_user
;
5801 mpo_cred_label_destroy_t
*mpo_cred_label_destroy
;
5802 mpo_cred_label_externalize_audit_t
*mpo_cred_label_externalize_audit
;
5803 mpo_cred_label_externalize_t
*mpo_cred_label_externalize
;
5804 mpo_cred_label_init_t
*mpo_cred_label_init
;
5805 mpo_cred_label_internalize_t
*mpo_cred_label_internalize
;
5806 mpo_cred_label_update_execve_t
*mpo_cred_label_update_execve
;
5807 mpo_cred_label_update_t
*mpo_cred_label_update
;
5808 mpo_devfs_label_associate_device_t
*mpo_devfs_label_associate_device
;
5809 mpo_devfs_label_associate_directory_t
*mpo_devfs_label_associate_directory
;
5810 mpo_devfs_label_copy_t
*mpo_devfs_label_copy
;
5811 mpo_devfs_label_destroy_t
*mpo_devfs_label_destroy
;
5812 mpo_devfs_label_init_t
*mpo_devfs_label_init
;
5813 mpo_devfs_label_update_t
*mpo_devfs_label_update
;
5814 mpo_file_check_change_offset_t
*mpo_file_check_change_offset
;
5815 mpo_file_check_create_t
*mpo_file_check_create
;
5816 mpo_file_check_dup_t
*mpo_file_check_dup
;
5817 mpo_file_check_fcntl_t
*mpo_file_check_fcntl
;
5818 mpo_file_check_get_offset_t
*mpo_file_check_get_offset
;
5819 mpo_file_check_get_t
*mpo_file_check_get
;
5820 mpo_file_check_inherit_t
*mpo_file_check_inherit
;
5821 mpo_file_check_ioctl_t
*mpo_file_check_ioctl
;
5822 mpo_file_check_lock_t
*mpo_file_check_lock
;
5823 mpo_file_check_mmap_downgrade_t
*mpo_file_check_mmap_downgrade
;
5824 mpo_file_check_mmap_t
*mpo_file_check_mmap
;
5825 mpo_file_check_receive_t
*mpo_file_check_receive
;
5826 mpo_file_check_set_t
*mpo_file_check_set
;
5827 mpo_file_label_init_t
*mpo_file_label_init
;
5828 mpo_file_label_destroy_t
*mpo_file_label_destroy
;
5829 mpo_file_label_associate_t
*mpo_file_label_associate
;
5830 mpo_ifnet_check_label_update_t
*mpo_ifnet_check_label_update
;
5831 mpo_ifnet_check_transmit_t
*mpo_ifnet_check_transmit
;
5832 mpo_ifnet_label_associate_t
*mpo_ifnet_label_associate
;
5833 mpo_ifnet_label_copy_t
*mpo_ifnet_label_copy
;
5834 mpo_ifnet_label_destroy_t
*mpo_ifnet_label_destroy
;
5835 mpo_ifnet_label_externalize_t
*mpo_ifnet_label_externalize
;
5836 mpo_ifnet_label_init_t
*mpo_ifnet_label_init
;
5837 mpo_ifnet_label_internalize_t
*mpo_ifnet_label_internalize
;
5838 mpo_ifnet_label_update_t
*mpo_ifnet_label_update
;
5839 mpo_ifnet_label_recycle_t
*mpo_ifnet_label_recycle
;
5840 mpo_inpcb_check_deliver_t
*mpo_inpcb_check_deliver
;
5841 mpo_inpcb_label_associate_t
*mpo_inpcb_label_associate
;
5842 mpo_inpcb_label_destroy_t
*mpo_inpcb_label_destroy
;
5843 mpo_inpcb_label_init_t
*mpo_inpcb_label_init
;
5844 mpo_inpcb_label_recycle_t
*mpo_inpcb_label_recycle
;
5845 mpo_inpcb_label_update_t
*mpo_inpcb_label_update
;
5846 mpo_iokit_check_device_t
*mpo_iokit_check_device
;
5847 mpo_ipq_label_associate_t
*mpo_ipq_label_associate
;
5848 mpo_ipq_label_compare_t
*mpo_ipq_label_compare
;
5849 mpo_ipq_label_destroy_t
*mpo_ipq_label_destroy
;
5850 mpo_ipq_label_init_t
*mpo_ipq_label_init
;
5851 mpo_ipq_label_update_t
*mpo_ipq_label_update
;
5852 mpo_lctx_check_label_update_t
*mpo_lctx_check_label_update
;
5853 mpo_lctx_label_destroy_t
*mpo_lctx_label_destroy
;
5854 mpo_lctx_label_externalize_t
*mpo_lctx_label_externalize
;
5855 mpo_lctx_label_init_t
*mpo_lctx_label_init
;
5856 mpo_lctx_label_internalize_t
*mpo_lctx_label_internalize
;
5857 mpo_lctx_label_update_t
*mpo_lctx_label_update
;
5858 mpo_lctx_notify_create_t
*mpo_lctx_notify_create
;
5859 mpo_lctx_notify_join_t
*mpo_lctx_notify_join
;
5860 mpo_lctx_notify_leave_t
*mpo_lctx_notify_leave
;
5861 mpo_mbuf_label_associate_bpfdesc_t
*mpo_mbuf_label_associate_bpfdesc
;
5862 mpo_mbuf_label_associate_ifnet_t
*mpo_mbuf_label_associate_ifnet
;
5863 mpo_mbuf_label_associate_inpcb_t
*mpo_mbuf_label_associate_inpcb
;
5864 mpo_mbuf_label_associate_ipq_t
*mpo_mbuf_label_associate_ipq
;
5865 mpo_mbuf_label_associate_linklayer_t
*mpo_mbuf_label_associate_linklayer
;
5866 mpo_mbuf_label_associate_multicast_encap_t
*mpo_mbuf_label_associate_multicast_encap
;
5867 mpo_mbuf_label_associate_netlayer_t
*mpo_mbuf_label_associate_netlayer
;
5868 mpo_mbuf_label_associate_socket_t
*mpo_mbuf_label_associate_socket
;
5869 mpo_mbuf_label_copy_t
*mpo_mbuf_label_copy
;
5870 mpo_mbuf_label_destroy_t
*mpo_mbuf_label_destroy
;
5871 mpo_mbuf_label_init_t
*mpo_mbuf_label_init
;
5872 mpo_mount_check_fsctl_t
*mpo_mount_check_fsctl
;
5873 mpo_mount_check_getattr_t
*mpo_mount_check_getattr
;
5874 mpo_mount_check_label_update_t
*mpo_mount_check_label_update
;
5875 mpo_mount_check_mount_t
*mpo_mount_check_mount
;
5876 mpo_mount_check_remount_t
*mpo_mount_check_remount
;
5877 mpo_mount_check_setattr_t
*mpo_mount_check_setattr
;
5878 mpo_mount_check_stat_t
*mpo_mount_check_stat
;
5879 mpo_mount_check_umount_t
*mpo_mount_check_umount
;
5880 mpo_mount_label_associate_t
*mpo_mount_label_associate
;
5881 mpo_mount_label_destroy_t
*mpo_mount_label_destroy
;
5882 mpo_mount_label_externalize_t
*mpo_mount_label_externalize
;
5883 mpo_mount_label_init_t
*mpo_mount_label_init
;
5884 mpo_mount_label_internalize_t
*mpo_mount_label_internalize
;
5885 mpo_netinet_fragment_t
*mpo_netinet_fragment
;
5886 mpo_netinet_icmp_reply_t
*mpo_netinet_icmp_reply
;
5887 mpo_netinet_tcp_reply_t
*mpo_netinet_tcp_reply
;
5888 mpo_pipe_check_ioctl_t
*mpo_pipe_check_ioctl
;
5889 mpo_pipe_check_kqfilter_t
*mpo_pipe_check_kqfilter
;
5890 mpo_pipe_check_label_update_t
*mpo_pipe_check_label_update
;
5891 mpo_pipe_check_read_t
*mpo_pipe_check_read
;
5892 mpo_pipe_check_select_t
*mpo_pipe_check_select
;
5893 mpo_pipe_check_stat_t
*mpo_pipe_check_stat
;
5894 mpo_pipe_check_write_t
*mpo_pipe_check_write
;
5895 mpo_pipe_label_associate_t
*mpo_pipe_label_associate
;
5896 mpo_pipe_label_copy_t
*mpo_pipe_label_copy
;
5897 mpo_pipe_label_destroy_t
*mpo_pipe_label_destroy
;
5898 mpo_pipe_label_externalize_t
*mpo_pipe_label_externalize
;
5899 mpo_pipe_label_init_t
*mpo_pipe_label_init
;
5900 mpo_pipe_label_internalize_t
*mpo_pipe_label_internalize
;
5901 mpo_pipe_label_update_t
*mpo_pipe_label_update
;
5902 mpo_policy_destroy_t
*mpo_policy_destroy
;
5903 mpo_policy_init_t
*mpo_policy_init
;
5904 mpo_policy_initbsd_t
*mpo_policy_initbsd
;
5905 mpo_policy_syscall_t
*mpo_policy_syscall
;
5906 mpo_port_check_copy_send_t
*mpo_port_check_copy_send
;
5907 mpo_port_check_hold_receive_t
*mpo_port_check_hold_receive
;
5908 mpo_port_check_hold_send_once_t
*mpo_port_check_hold_send_once
;
5909 mpo_port_check_hold_send_t
*mpo_port_check_hold_send
;
5910 mpo_port_check_label_update_t
*mpo_port_check_label_update
;
5911 mpo_port_check_make_send_once_t
*mpo_port_check_make_send_once
;
5912 mpo_port_check_make_send_t
*mpo_port_check_make_send
;
5913 mpo_port_check_method_t
*mpo_port_check_method
;
5914 mpo_port_check_move_receive_t
*mpo_port_check_move_receive
;
5915 mpo_port_check_move_send_once_t
*mpo_port_check_move_send_once
;
5916 mpo_port_check_move_send_t
*mpo_port_check_move_send
;
5917 mpo_port_check_receive_t
*mpo_port_check_receive
;
5918 mpo_port_check_send_t
*mpo_port_check_send
;
5919 mpo_port_check_service_t
*mpo_port_check_service
;
5920 mpo_port_label_associate_kernel_t
*mpo_port_label_associate_kernel
;
5921 mpo_port_label_associate_t
*mpo_port_label_associate
;
5922 mpo_port_label_compute_t
*mpo_port_label_compute
;
5923 mpo_port_label_copy_t
*mpo_port_label_copy
;
5924 mpo_port_label_destroy_t
*mpo_port_label_destroy
;
5925 mpo_port_label_init_t
*mpo_port_label_init
;
5926 mpo_port_label_update_cred_t
*mpo_port_label_update_cred
;
5927 mpo_port_label_update_kobject_t
*mpo_port_label_update_kobject
;
5928 mpo_posixsem_check_create_t
*mpo_posixsem_check_create
;
5929 mpo_posixsem_check_open_t
*mpo_posixsem_check_open
;
5930 mpo_posixsem_check_post_t
*mpo_posixsem_check_post
;
5931 mpo_posixsem_check_unlink_t
*mpo_posixsem_check_unlink
;
5932 mpo_posixsem_check_wait_t
*mpo_posixsem_check_wait
;
5933 mpo_posixsem_label_associate_t
*mpo_posixsem_label_associate
;
5934 mpo_posixsem_label_destroy_t
*mpo_posixsem_label_destroy
;
5935 mpo_posixsem_label_init_t
*mpo_posixsem_label_init
;
5936 mpo_posixshm_check_create_t
*mpo_posixshm_check_create
;
5937 mpo_posixshm_check_mmap_t
*mpo_posixshm_check_mmap
;
5938 mpo_posixshm_check_open_t
*mpo_posixshm_check_open
;
5939 mpo_posixshm_check_stat_t
*mpo_posixshm_check_stat
;
5940 mpo_posixshm_check_truncate_t
*mpo_posixshm_check_truncate
;
5941 mpo_posixshm_check_unlink_t
*mpo_posixshm_check_unlink
;
5942 mpo_posixshm_label_associate_t
*mpo_posixshm_label_associate
;
5943 mpo_posixshm_label_destroy_t
*mpo_posixshm_label_destroy
;
5944 mpo_posixshm_label_init_t
*mpo_posixshm_label_init
;
5945 mpo_proc_check_debug_t
*mpo_proc_check_debug
;
5946 mpo_proc_check_fork_t
*mpo_proc_check_fork
;
5947 mpo_proc_check_get_task_name_t
*mpo_proc_check_get_task_name
;
5948 mpo_proc_check_get_task_t
*mpo_proc_check_get_task
;
5949 mpo_proc_check_getaudit_t
*mpo_proc_check_getaudit
;
5950 mpo_proc_check_getauid_t
*mpo_proc_check_getauid
;
5951 mpo_proc_check_getlcid_t
*mpo_proc_check_getlcid
;
5952 mpo_proc_check_mprotect_t
*mpo_proc_check_mprotect
;
5953 mpo_proc_check_sched_t
*mpo_proc_check_sched
;
5954 mpo_proc_check_setaudit_t
*mpo_proc_check_setaudit
;
5955 mpo_proc_check_setauid_t
*mpo_proc_check_setauid
;
5956 mpo_proc_check_setlcid_t
*mpo_proc_check_setlcid
;
5957 mpo_proc_check_signal_t
*mpo_proc_check_signal
;
5958 mpo_proc_check_wait_t
*mpo_proc_check_wait
;
5959 mpo_proc_label_destroy_t
*mpo_proc_label_destroy
;
5960 mpo_proc_label_init_t
*mpo_proc_label_init
;
5961 mpo_socket_check_accept_t
*mpo_socket_check_accept
;
5962 mpo_socket_check_accepted_t
*mpo_socket_check_accepted
;
5963 mpo_socket_check_bind_t
*mpo_socket_check_bind
;
5964 mpo_socket_check_connect_t
*mpo_socket_check_connect
;
5965 mpo_socket_check_create_t
*mpo_socket_check_create
;
5966 mpo_socket_check_deliver_t
*mpo_socket_check_deliver
;
5967 mpo_socket_check_kqfilter_t
*mpo_socket_check_kqfilter
;
5968 mpo_socket_check_label_update_t
*mpo_socket_check_label_update
;
5969 mpo_socket_check_listen_t
*mpo_socket_check_listen
;
5970 mpo_socket_check_receive_t
*mpo_socket_check_receive
;
5971 mpo_socket_check_received_t
*mpo_socket_check_received
;
5972 mpo_socket_check_select_t
*mpo_socket_check_select
;
5973 mpo_socket_check_send_t
*mpo_socket_check_send
;
5974 mpo_socket_check_stat_t
*mpo_socket_check_stat
;
5975 mpo_socket_check_setsockopt_t
*mpo_socket_check_setsockopt
;
5976 mpo_socket_check_getsockopt_t
*mpo_socket_check_getsockopt
;
5977 mpo_socket_label_associate_accept_t
*mpo_socket_label_associate_accept
;
5978 mpo_socket_label_associate_t
*mpo_socket_label_associate
;
5979 mpo_socket_label_copy_t
*mpo_socket_label_copy
;
5980 mpo_socket_label_destroy_t
*mpo_socket_label_destroy
;
5981 mpo_socket_label_externalize_t
*mpo_socket_label_externalize
;
5982 mpo_socket_label_init_t
*mpo_socket_label_init
;
5983 mpo_socket_label_internalize_t
*mpo_socket_label_internalize
;
5984 mpo_socket_label_update_t
*mpo_socket_label_update
;
5985 mpo_socketpeer_label_associate_mbuf_t
*mpo_socketpeer_label_associate_mbuf
;
5986 mpo_socketpeer_label_associate_socket_t
*mpo_socketpeer_label_associate_socket
;
5987 mpo_socketpeer_label_destroy_t
*mpo_socketpeer_label_destroy
;
5988 mpo_socketpeer_label_externalize_t
*mpo_socketpeer_label_externalize
;
5989 mpo_socketpeer_label_init_t
*mpo_socketpeer_label_init
;
5990 mpo_system_check_acct_t
*mpo_system_check_acct
;
5991 mpo_system_check_audit_t
*mpo_system_check_audit
;
5992 mpo_system_check_auditctl_t
*mpo_system_check_auditctl
;
5993 mpo_system_check_auditon_t
*mpo_system_check_auditon
;
5994 mpo_system_check_host_priv_t
*mpo_system_check_host_priv
;
5995 mpo_system_check_nfsd_t
*mpo_system_check_nfsd
;
5996 mpo_system_check_reboot_t
*mpo_system_check_reboot
;
5997 mpo_system_check_settime_t
*mpo_system_check_settime
;
5998 mpo_system_check_swapoff_t
*mpo_system_check_swapoff
;
5999 mpo_system_check_swapon_t
*mpo_system_check_swapon
;
6000 mpo_system_check_sysctl_t
*mpo_system_check_sysctl
;
6001 mpo_sysvmsg_label_associate_t
*mpo_sysvmsg_label_associate
;
6002 mpo_sysvmsg_label_destroy_t
*mpo_sysvmsg_label_destroy
;
6003 mpo_sysvmsg_label_init_t
*mpo_sysvmsg_label_init
;
6004 mpo_sysvmsg_label_recycle_t
*mpo_sysvmsg_label_recycle
;
6005 mpo_sysvmsq_check_enqueue_t
*mpo_sysvmsq_check_enqueue
;
6006 mpo_sysvmsq_check_msgrcv_t
*mpo_sysvmsq_check_msgrcv
;
6007 mpo_sysvmsq_check_msgrmid_t
*mpo_sysvmsq_check_msgrmid
;
6008 mpo_sysvmsq_check_msqctl_t
*mpo_sysvmsq_check_msqctl
;
6009 mpo_sysvmsq_check_msqget_t
*mpo_sysvmsq_check_msqget
;
6010 mpo_sysvmsq_check_msqrcv_t
*mpo_sysvmsq_check_msqrcv
;
6011 mpo_sysvmsq_check_msqsnd_t
*mpo_sysvmsq_check_msqsnd
;
6012 mpo_sysvmsq_label_associate_t
*mpo_sysvmsq_label_associate
;
6013 mpo_sysvmsq_label_destroy_t
*mpo_sysvmsq_label_destroy
;
6014 mpo_sysvmsq_label_init_t
*mpo_sysvmsq_label_init
;
6015 mpo_sysvmsq_label_recycle_t
*mpo_sysvmsq_label_recycle
;
6016 mpo_sysvsem_check_semctl_t
*mpo_sysvsem_check_semctl
;
6017 mpo_sysvsem_check_semget_t
*mpo_sysvsem_check_semget
;
6018 mpo_sysvsem_check_semop_t
*mpo_sysvsem_check_semop
;
6019 mpo_sysvsem_label_associate_t
*mpo_sysvsem_label_associate
;
6020 mpo_sysvsem_label_destroy_t
*mpo_sysvsem_label_destroy
;
6021 mpo_sysvsem_label_init_t
*mpo_sysvsem_label_init
;
6022 mpo_sysvsem_label_recycle_t
*mpo_sysvsem_label_recycle
;
6023 mpo_sysvshm_check_shmat_t
*mpo_sysvshm_check_shmat
;
6024 mpo_sysvshm_check_shmctl_t
*mpo_sysvshm_check_shmctl
;
6025 mpo_sysvshm_check_shmdt_t
*mpo_sysvshm_check_shmdt
;
6026 mpo_sysvshm_check_shmget_t
*mpo_sysvshm_check_shmget
;
6027 mpo_sysvshm_label_associate_t
*mpo_sysvshm_label_associate
;
6028 mpo_sysvshm_label_destroy_t
*mpo_sysvshm_label_destroy
;
6029 mpo_sysvshm_label_init_t
*mpo_sysvshm_label_init
;
6030 mpo_sysvshm_label_recycle_t
*mpo_sysvshm_label_recycle
;
6031 mpo_task_label_associate_kernel_t
*mpo_task_label_associate_kernel
;
6032 mpo_task_label_associate_t
*mpo_task_label_associate
;
6033 mpo_task_label_copy_t
*mpo_task_label_copy
;
6034 mpo_task_label_destroy_t
*mpo_task_label_destroy
;
6035 mpo_task_label_externalize_t
*mpo_task_label_externalize
;
6036 mpo_task_label_init_t
*mpo_task_label_init
;
6037 mpo_task_label_internalize_t
*mpo_task_label_internalize
;
6038 mpo_task_label_update_t
*mpo_task_label_update
;
6039 mpo_thread_userret_t
*mpo_thread_userret
;
6040 mpo_vnode_check_access_t
*mpo_vnode_check_access
;
6041 mpo_vnode_check_chdir_t
*mpo_vnode_check_chdir
;
6042 mpo_vnode_check_chroot_t
*mpo_vnode_check_chroot
;
6043 mpo_vnode_check_create_t
*mpo_vnode_check_create
;
6044 mpo_vnode_check_deleteextattr_t
*mpo_vnode_check_deleteextattr
;
6045 mpo_vnode_check_exchangedata_t
*mpo_vnode_check_exchangedata
;
6046 mpo_vnode_check_exec_t
*mpo_vnode_check_exec
;
6047 mpo_vnode_check_getattrlist_t
*mpo_vnode_check_getattrlist
;
6048 mpo_vnode_check_getextattr_t
*mpo_vnode_check_getextattr
;
6049 mpo_vnode_check_ioctl_t
*mpo_vnode_check_ioctl
;
6050 mpo_vnode_check_kqfilter_t
*mpo_vnode_check_kqfilter
;
6051 mpo_vnode_check_label_update_t
*mpo_vnode_check_label_update
;
6052 mpo_vnode_check_link_t
*mpo_vnode_check_link
;
6053 mpo_vnode_check_listextattr_t
*mpo_vnode_check_listextattr
;
6054 mpo_vnode_check_lookup_t
*mpo_vnode_check_lookup
;
6055 mpo_vnode_check_open_t
*mpo_vnode_check_open
;
6056 mpo_vnode_check_read_t
*mpo_vnode_check_read
;
6057 mpo_vnode_check_readdir_t
*mpo_vnode_check_readdir
;
6058 mpo_vnode_check_readlink_t
*mpo_vnode_check_readlink
;
6059 mpo_vnode_check_rename_from_t
*mpo_vnode_check_rename_from
;
6060 mpo_vnode_check_rename_to_t
*mpo_vnode_check_rename_to
;
6061 mpo_vnode_check_revoke_t
*mpo_vnode_check_revoke
;
6062 mpo_vnode_check_select_t
*mpo_vnode_check_select
;
6063 mpo_vnode_check_setattrlist_t
*mpo_vnode_check_setattrlist
;
6064 mpo_vnode_check_setextattr_t
*mpo_vnode_check_setextattr
;
6065 mpo_vnode_check_setflags_t
*mpo_vnode_check_setflags
;
6066 mpo_vnode_check_setmode_t
*mpo_vnode_check_setmode
;
6067 mpo_vnode_check_setowner_t
*mpo_vnode_check_setowner
;
6068 mpo_vnode_check_setutimes_t
*mpo_vnode_check_setutimes
;
6069 mpo_vnode_check_stat_t
*mpo_vnode_check_stat
;
6070 mpo_vnode_check_truncate_t
*mpo_vnode_check_truncate
;
6071 mpo_vnode_check_unlink_t
*mpo_vnode_check_unlink
;
6072 mpo_vnode_check_write_t
*mpo_vnode_check_write
;
6073 mpo_vnode_label_associate_devfs_t
*mpo_vnode_label_associate_devfs
;
6074 mpo_vnode_label_associate_extattr_t
*mpo_vnode_label_associate_extattr
;
6075 mpo_vnode_label_associate_file_t
*mpo_vnode_label_associate_file
;
6076 mpo_vnode_label_associate_pipe_t
*mpo_vnode_label_associate_pipe
;
6077 mpo_vnode_label_associate_posixsem_t
*mpo_vnode_label_associate_posixsem
;
6078 mpo_vnode_label_associate_posixshm_t
*mpo_vnode_label_associate_posixshm
;
6079 mpo_vnode_label_associate_singlelabel_t
*mpo_vnode_label_associate_singlelabel
;
6080 mpo_vnode_label_associate_socket_t
*mpo_vnode_label_associate_socket
;
6081 mpo_vnode_label_copy_t
*mpo_vnode_label_copy
;
6082 mpo_vnode_label_destroy_t
*mpo_vnode_label_destroy
;
6083 mpo_vnode_label_externalize_audit_t
*mpo_vnode_label_externalize_audit
;
6084 mpo_vnode_label_externalize_t
*mpo_vnode_label_externalize
;
6085 mpo_vnode_label_init_t
*mpo_vnode_label_init
;
6086 mpo_vnode_label_internalize_t
*mpo_vnode_label_internalize
;
6087 mpo_vnode_label_recycle_t
*mpo_vnode_label_recycle
;
6088 mpo_vnode_label_store_t
*mpo_vnode_label_store
;
6089 mpo_vnode_label_update_extattr_t
*mpo_vnode_label_update_extattr
;
6090 mpo_vnode_label_update_t
*mpo_vnode_label_update
;
6091 mpo_vnode_notify_create_t
*mpo_vnode_notify_create
;
6092 mpo_vnode_check_signature_t
*mpo_vnode_check_signature
;
6093 mpo_vnode_check_uipc_bind_t
*mpo_vnode_check_uipc_bind
;
6094 mpo_vnode_check_uipc_connect_t
*mpo_vnode_check_uipc_connect
;
6095 mac_proc_check_run_cs_invalid_t
*mpo_proc_check_run_cs_invalid
;
6096 mpo_proc_check_suspend_resume_t
*mpo_proc_check_suspend_resume
;
6097 mpo_reserved_hook_t
*mpo_reserved5
;
6098 mpo_reserved_hook_t
*mpo_reserved6
;
6099 mpo_reserved_hook_t
*mpo_reserved7
;
6100 mpo_reserved_hook_t
*mpo_reserved8
;
6101 mpo_reserved_hook_t
*mpo_reserved9
;
6105 @brief MAC policy handle type
6107 The MAC handle is used to uniquely identify a loaded policy within
6110 A variable of this type is set by mac_policy_register().
6112 typedef unsigned int mac_policy_handle_t
;
6114 #define mpc_t struct mac_policy_conf *
6117 @brief Mac policy configuration
6119 This structure specifies the configuration information for a
6120 MAC policy module. A policy module developer must supply
6121 a short unique policy name, a more descriptive full name, a list of label
6122 namespaces and count, a pointer to the registered enty point operations,
6123 any load time flags, and optionally, a pointer to a label slot identifier.
6125 The Framework will update the runtime flags (mpc_runtime_flags) to
6126 indicate that the module has been registered.
6128 If the label slot identifier (mpc_field_off) is NULL, the Framework
6129 will not provide label storage for the policy. Otherwise, the
6130 Framework will store the label location (slot) in this field.
6132 The mpc_list field is used by the Framework and should not be
6133 modified by policies.
6135 /* XXX - reorder these for better aligment on 64bit platforms */
6136 struct mac_policy_conf
{
6137 const char *mpc_name
; /** policy name */
6138 const char *mpc_fullname
; /** full name */
6139 const char **mpc_labelnames
; /** managed label namespaces */
6140 unsigned int mpc_labelname_count
; /** number of managed label namespaces */
6141 struct mac_policy_ops
*mpc_ops
; /** operation vector */
6142 int mpc_loadtime_flags
; /** load time flags */
6143 int *mpc_field_off
; /** label slot */
6144 int mpc_runtime_flags
; /** run time flags */
6145 mpc_t mpc_list
; /** List reference */
6146 void *mpc_data
; /** module data */
6150 @brief MAC policy module registration routine
6152 This function is called to register a policy with the
6153 MAC framework. A policy module will typically call this from the
6154 Darwin KEXT registration routine.
6156 int mac_policy_register(struct mac_policy_conf
*mpc
,
6157 mac_policy_handle_t
*handlep
, void *xd
);
6160 @brief MAC policy module de-registration routine
6162 This function is called to de-register a policy with theD
6163 MAC framework. A policy module will typically call this from the
6164 Darwin KEXT de-registration routine.
6166 int mac_policy_unregister(mac_policy_handle_t handle
);
6169 * Framework entry points for the policies to add audit data.
6171 int mac_audit_text(char *text
, mac_policy_handle_t handle
);
6174 * Calls to assist with use of Apple XATTRs within policy modules.
6176 int mac_vnop_setxattr(struct vnode
*, const char *, char *, size_t);
6177 int mac_vnop_getxattr(struct vnode
*, const char *, char *, size_t,
6179 int mac_vnop_removexattr(struct vnode
*, const char *);
6182 * Arbitrary limit on how much data will be logged by the audit
6183 * entry points above.
6185 #define MAC_AUDIT_DATA_LIMIT 1024
6188 * Values returned by mac_audit_{pre,post}select. To combine the responses
6189 * of the security policies into a single decision,
6190 * mac_audit_{pre,post}select() choose the greatest value returned.
6192 #define MAC_AUDIT_DEFAULT 0 /* use system behavior */
6193 #define MAC_AUDIT_NO 1 /* force not auditing this event */
6194 #define MAC_AUDIT_YES 2 /* force auditing this event */
6196 // \defgroup mpc_loadtime_flags Flags for the mpc_loadtime_flags field
6199 @name Flags for the mpc_loadtime_flags field
6200 @see mac_policy_conf
6202 This is the complete list of flags that are supported by the
6203 mpc_loadtime_flags field of the mac_policy_conf structure. These
6204 flags specify the load time behavior of MAC Framework policy
6211 @brief Flag to indicate registration preference
6213 This flag indicates that the policy module must be loaded and
6214 initialized early in the boot process. If the flag is specified,
6215 attempts to register the module following boot will be rejected. The
6216 flag may be used by policies that require pervasive labeling of all
6217 system objects, and cannot handle objects that have not been
6218 properly initialized by the policy.
6220 #define MPC_LOADTIME_FLAG_NOTLATE 0x00000001
6223 @brief Flag to indicate unload preference
6225 This flag indicates that the policy module may be unloaded. If this
6226 flag is not set, then the policy framework will reject requests to
6227 unload the module. This flag might be used by modules that allocate
6228 label state and are unable to free that state at runtime, or for
6229 modules that simply do not want to permit unload operations.
6231 #define MPC_LOADTIME_FLAG_UNLOADOK 0x00000002
6236 XXX This flag is not yet supported.
6238 #define MPC_LOADTIME_FLAG_LABELMBUFS 0x00000004
6241 @brief Flag to indicate a base policy
6243 This flag indicates that the policy module is a base policy. Only
6244 one module can declare itself as base, otherwise the boot process
6247 #define MPC_LOADTIME_BASE_POLICY 0x00000008
6252 @brief Policy registration flag
6253 @see mac_policy_conf
6255 This flag indicates that the policy module has been successfully
6256 registered with the TrustedBSD MAC Framework. The Framework will
6257 set this flag in the mpc_runtime_flags field of the policy's
6258 mac_policy_conf structure after registering the policy.
6260 #define MPC_RUNTIME_FLAG_REGISTERED 0x00000001
6263 * Depends on POLICY_VER
6267 #define POLICY_VER 1.0
6270 #define MAC_POLICY_SET(handle, mpops, mpname, mpfullname, lnames, lcount, slot, lflags, rflags) \
6271 static struct mac_policy_conf mpname##_mac_policy_conf = { \
6272 .mpc_name = #mpname, \
6273 .mpc_fullname = mpfullname, \
6274 .mpc_labelnames = lnames, \
6275 .mpc_labelname_count = lcount, \
6277 .mpc_loadtime_flags = lflags, \
6278 .mpc_field_off = slot, \
6279 .mpc_runtime_flags = rflags \
6282 static kern_return_t \
6283 kmod_start(kmod_info_t *ki, void *xd) \
6285 return mac_policy_register(&mpname##_mac_policy_conf, \
6289 static kern_return_t \
6290 kmod_stop(kmod_info_t *ki, void *xd) \
6292 return mac_policy_unregister(handle); \
6295 extern kern_return_t _start(kmod_info_t *ki, void *data); \
6296 extern kern_return_t _stop(kmod_info_t *ki, void *data); \
6298 KMOD_EXPLICIT_DECL(security.mpname, POLICY_VER, _start, _stop) \
6299 kmod_start_func_t *_realmain = kmod_start; \
6300 kmod_stop_func_t *_antimain = kmod_stop; \
6301 int _kext_apple_cc = __APPLE_CC__
6304 #define LABEL_TO_SLOT(l, s) (l)->l_perpolicy[s]
6307 * Policy interface to map a struct label pointer to per-policy data.
6308 * Typically, policies wrap this in their own accessor macro that casts an
6309 * intptr_t to a policy-specific data type.
6311 intptr_t mac_label_get(struct label
*l
, int slot
);
6312 void mac_label_set(struct label
*l
, int slot
, intptr_t v
);
6314 #define mac_get_mpc(h) (mac_policy_list.entries[h].mpc)
6317 @name Flags for MAC allocator interfaces
6319 These flags are passed to the Darwin kernel allocator routines to
6320 indicate whether the allocation is permitted to block or not.
6321 Caution should be taken; some operations are not permitted to sleep,
6322 and some types of locks cannot be held when sleeping.
6328 @brief Allocation operations may block
6330 If memory is not immediately available, the allocation routine
6331 will block (typically sleeping) until memory is available.
6333 @warning Inappropriate use of this flag may cause kernel panics.
6335 #define MAC_WAITOK 0
6338 @brief Allocation operations may not block
6340 Rather than blocking, the allocator may return an error if memory
6341 is not immediately available. This type of allocation will not
6342 sleep, preserving locking semantics.
6344 #define MAC_NOWAIT 1
6348 #endif /* !_SECURITY_MAC_POLICY_H_ */