2 * Copyright (c) 2007 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 The vnode lock is held during this operation. No changes should be
532 made to the old credential structure.
534 typedef void mpo_cred_label_update_execve_t(
535 kauth_cred_t old_cred
,
536 kauth_cred_t new_cred
,
538 struct label
*vnodelabel
,
539 struct label
*scriptvnodelabel
,
540 struct label
*execlabel
543 @brief Update a credential label
544 @param cred The existing credential
545 @param newlabel A new label to apply to the credential
546 @see mpo_cred_check_label_update_t
549 Update the label on a user credential, using the supplied new label.
550 This is called as a result of a process relabel operation. Access
551 control was already confirmed by mpo_cred_check_label_update.
553 typedef void mpo_cred_label_update_t(
555 struct label
*newlabel
558 @brief Create a new devfs device
559 @param dev Major and minor numbers of special file
560 @param de "inode" of new device file
561 @param label Destination label
562 @param fullpath Path relative to mount (e.g. /dev) of new device file
564 This entry point labels a new devfs device. The label will likely be based
565 on the path to the device, or the major and minor numbers.
566 The policy should store an appropriate label into 'label'.
568 typedef void mpo_devfs_label_associate_device_t(
575 @brief Create a new devfs directory
576 @param dirname Name of new directory
577 @param dirnamelen Length of 'dirname'
578 @param de "inode" of new directory
579 @param label Destination label
580 @param fullpath Path relative to mount (e.g. /dev) of new directory
582 This entry point labels a new devfs directory. The label will likely be
583 based on the path of the new directory. The policy should store an appropriate
584 label into 'label'. The devfs root directory is labelled in this way.
586 typedef void mpo_devfs_label_associate_directory_t(
594 @brief Copy a devfs label
595 @param src Source devfs label
596 @param dest Destination devfs label
598 Copy the label information from src to dest. The devfs file system
599 often duplicates (splits) existing device nodes rather than creating
602 typedef void mpo_devfs_label_copy_t(
607 @brief Destroy devfs label
608 @param label The label to be destroyed
610 Destroy a devfs entry label. Since the object is going out
611 of scope, policy modules should free any internal storage associated
612 with the label so that it may be destroyed.
614 typedef void mpo_devfs_label_destroy_t(
618 @brief Initialize devfs label
619 @param label New label to initialize
621 Initialize the label for a newly instantiated devfs entry. Sleeping
624 typedef void mpo_devfs_label_init_t(
628 @brief Update a devfs label after relabelling its vnode
629 @param mp Devfs mount point
630 @param de Affected devfs directory entry
631 @param delabel Label of devfs directory entry
632 @param vp Vnode associated with de
633 @param vnodelabel New label of vnode
635 Update a devfs label when its vnode is manually relabelled,
636 for example with setfmac(1). Typically, this will simply copy
637 the vnode label into the devfs label.
639 typedef void mpo_devfs_label_update_t(
642 struct label
*delabel
,
644 struct label
*vnodelabel
647 @brief Access control for changing the offset of a file descriptor
648 @param cred Subject credential
649 @param fg Fileglob structure
650 @param label Policy label for fg
652 Determine whether the subject identified by the credential can
653 change the offset of the file represented by fg.
655 @return Return 0 if access if granted, otherwise an appropriate
656 value for errno should be returned.
658 typedef int mpo_file_check_change_offset_t(
664 @brief Access control for creating a file descriptor
665 @param cred Subject credential
667 Determine whether the subject identified by the credential can
668 allocate a new file descriptor.
670 @return Return 0 if access if granted, otherwise an appropriate
671 value for errno should be returned.
673 typedef int mpo_file_check_create_t(
677 @brief Access control for duplicating a file descriptor
678 @param cred Subject credential
679 @param fg Fileglob structure
680 @param label Policy label for fg
681 @param newfd New file descriptor number
683 Determine whether the subject identified by the credential can
684 duplicate the fileglob structure represented by fg and as file
685 descriptor number newfd.
687 @return Return 0 if access if granted, otherwise an appropriate
688 value for errno should be returned.
690 typedef int mpo_file_check_dup_t(
697 @brief Access control check for fcntl
698 @param cred Subject credential
699 @param fg Fileglob structure
700 @param label Policy label for fg
701 @param cmd Control operation to be performed; see fcntl(2)
702 @param arg fcnt arguments; see fcntl(2)
704 Determine whether the subject identified by the credential can perform
705 the file control operation indicated by cmd.
707 @return Return 0 if access is granted, otherwise an appropriate value for
708 errno should be returned.
710 typedef int mpo_file_check_fcntl_t(
718 @brief Access control check for mac_get_fd
719 @param cred Subject credential
720 @param fg Fileglob structure
721 @param elements Element buffer
722 @param len Length of buffer
724 Determine whether the subject identified by the credential should be allowed
725 to get an externalized version of the label on the object indicated by fd.
727 @return Return 0 if access is granted, otherwise an appropriate value for
728 errno should be returned.
730 typedef int mpo_file_check_get_t(
737 @brief Access control for getting the offset of a file descriptor
738 @param cred Subject credential
739 @param fg Fileglob structure
740 @param label Policy label for fg
742 Determine whether the subject identified by the credential can
743 get the offset of the file represented by fg.
745 @return Return 0 if access if granted, otherwise an appropriate
746 value for errno should be returned.
748 typedef int mpo_file_check_get_offset_t(
754 @brief Access control for inheriting a file descriptor
755 @param cred Subject credential
756 @param fg Fileglob structure
757 @param label Policy label for fg
759 Determine whether the subject identified by the credential can
760 inherit the fileglob structure represented by fg.
762 @return Return 0 if access if granted, otherwise an appropriate
763 value for errno should be returned.
765 typedef int mpo_file_check_inherit_t(
771 @brief Access control check for file ioctl
772 @param cred Subject credential
773 @param fg Fileglob structure
774 @param label Policy label for fg
775 @param cmd The ioctl command; see ioctl(2)
777 Determine whether the subject identified by the credential can perform
778 the ioctl operation indicated by cmd.
780 @warning Since ioctl data is opaque from the standpoint of the MAC
781 framework, policies must exercise extreme care when implementing
782 access control checks.
784 @return Return 0 if access is granted, otherwise an appropriate value for
785 errno should be returned.
788 typedef int mpo_file_check_ioctl_t(
795 @brief Access control check for file locking
796 @param cred Subject credential
797 @param fg Fileglob structure
798 @param label Policy label for fg
799 @param op The lock operation (F_GETLK, F_SETLK, F_UNLK)
800 @param fl The flock structure
802 Determine whether the subject identified by the credential can perform
803 the lock operation indicated by op and fl on the file represented by fg.
805 @return Return 0 if access is granted, otherwise an appropriate value for
806 errno should be returned.
809 typedef int mpo_file_check_lock_t(
817 @brief Access control check for mapping a file
818 @param cred Subject credential
819 @param fg fileglob representing file to map
820 @param label Policy label associated with vp
821 @param prot mmap protections; see mmap(2)
822 @param flags Type of mapped object; see mmap(2)
823 @param maxprot Maximum rights
825 Determine whether the subject identified by the credential should be
826 allowed to map the file represented by fg with the protections specified
827 in prot. The maxprot field holds the maximum permissions on the new
828 mapping, a combination of VM_PROT_READ, VM_PROT_WRITE, and VM_PROT_EXECUTE.
829 To avoid overriding prior access control checks, a policy should only
830 remove flags from maxprot.
832 @return Return 0 if access is granted, otherwise an appropriate value for
833 errno should be returned. Suggested failure: EACCES for label mismatch or
834 EPERM for lack of privilege.
836 typedef int mpo_file_check_mmap_t(
845 @brief Downgrade the mmap protections
846 @param cred Subject credential
847 @param fg file to map
848 @param label Policy label associated with vp
849 @param prot mmap protections to be downgraded
851 Downgrade the mmap protections based on the subject and object labels.
853 typedef void mpo_file_check_mmap_downgrade_t(
860 @brief Access control for receiving a file descriptor
861 @param cred Subject credential
862 @param fg Fileglob structure
863 @param label Policy label for fg
865 Determine whether the subject identified by the credential can
866 receive the fileglob structure represented by fg.
868 @return Return 0 if access if granted, otherwise an appropriate
869 value for errno should be returned.
871 typedef int mpo_file_check_receive_t(
877 @brief Access control check for mac_set_fd
878 @param cred Subject credential
879 @param fg Fileglob structure
880 @param elements Elements buffer
881 @param len Length of elements buffer
883 Determine whether the subject identified by the credential can
884 perform the mac_set_fd operation. The mac_set_fd operation is used
885 to associate a MAC label with a file.
887 @return Return 0 if access is granted, otherwise an appropriate value for
888 errno should be returned.
890 typedef int mpo_file_check_set_t(
897 @brief Create file label
898 @param cred Subject credential
899 @param fg Fileglob structure
900 @param label Policy label for fg
902 typedef void mpo_file_label_associate_t(
908 @brief Destroy file label
909 @param label The label to be destroyed
911 Destroy the label on a file descriptor. In this entry point, a
912 policy module should free any internal storage associated with
913 label so that it may be destroyed.
915 typedef void mpo_file_label_destroy_t(
919 @brief Initialize file label
920 @param label New label to initialize
922 typedef void mpo_file_label_init_t(
926 @brief Access control check for relabeling network interfaces
927 @param cred Subject credential
928 @param ifp network interface being relabeled
929 @param ifnetlabel Current label of the network interfaces
930 @param newlabel New label to apply to the network interfaces
931 @see mpo_ifnet_label_update_t
933 Determine whether the subject identified by the credential can
934 relabel the network interface represented by ifp to the supplied
935 new label (newlabel).
937 @return Return 0 if access is granted, otherwise an appropriate value for
938 errno should be returned.
940 typedef int mpo_ifnet_check_label_update_t(
943 struct label
*ifnetlabel
,
944 struct label
*newlabel
947 @brief Access control check for relabeling network interfaces
948 @param ifp Network interface mbuf will be transmitted through
949 @param ifnetlabel Label of the network interfaces
950 @param m The mbuf to be transmitted
951 @param mbuflabel Label of the mbuf to be transmitted
952 @param family Address Family, AF_*
953 @param type Type of socket, SOCK_{STREAM,DGRAM,RAW}
955 Determine whether the mbuf with label mbuflabel may be transmitted
956 through the network interface represented by ifp that has the
959 @return Return 0 if access is granted, otherwise an appropriate value for
960 errno should be returned.
962 typedef int mpo_ifnet_check_transmit_t(
964 struct label
*ifnetlabel
,
966 struct label
*mbuflabel
,
971 @brief Create a network interface label
972 @param ifp Network interface labeled
973 @param ifnetlabel Label for the network interface
975 Set the label of a newly created network interface, most likely
976 using the information in the supplied network interface struct.
978 typedef void mpo_ifnet_label_associate_t(
980 struct label
*ifnetlabel
983 @brief Copy an ifnet label
984 @param src Source ifnet label
985 @param dest Destination ifnet label
987 Copy the label information from src to dest.
989 typedef void mpo_ifnet_label_copy_t(
994 @brief Destroy ifnet label
995 @param label The label to be destroyed
997 Destroy the label on an ifnet label. In this entry point, a
998 policy module should free any internal storage associated with
999 label so that it may be destroyed.
1001 typedef void mpo_ifnet_label_destroy_t(
1005 @brief Externalize an ifnet label
1006 @param label Label to be externalized
1007 @param element_name Name of the label namespace for which labels should be
1009 @param sb String buffer to be filled with a text representation of the label
1011 Produce an external representation of the label on an interface.
1012 An externalized label consists of a text representation of the
1013 label contents that can be used with user applications.
1014 Policy-agnostic user space tools will display this externalized
1017 @return 0 on success, return non-zero if an error occurs while
1018 externalizing the label data.
1021 typedef int mpo_ifnet_label_externalize_t(
1022 struct label
*label
,
1027 @brief Initialize ifnet label
1028 @param label New label to initialize
1030 typedef void mpo_ifnet_label_init_t(
1034 @brief Internalize an interface label
1035 @param label Label to be internalized
1036 @param element_name Name of the label namespace for which the label should
1038 @param element_data Text data to be internalized
1040 Produce an interface label from an external representation. An
1041 externalized label consists of a text representation of the label
1042 contents that can be used with user applications. Policy-agnostic
1043 user space tools will forward text version to the kernel for
1044 processing by individual policy modules.
1046 The policy's internalize entry points will be called only if the
1047 policy has registered interest in the label namespace.
1049 @return 0 on success, Otherwise, return non-zero if an error occurs
1050 while internalizing the label data.
1053 typedef int mpo_ifnet_label_internalize_t(
1054 struct label
*label
,
1059 @brief Recycle up a network interface label
1060 @param label The label to be recycled
1062 Recycle a network interface label. Darwin caches the struct ifnet
1063 of detached ifnets in a "free pool". Before ifnets are returned
1064 to the "free pool", policies can cleanup or overwrite any information
1065 present in the label.
1067 typedef void mpo_ifnet_label_recycle_t(
1071 @brief Update a network interface label
1072 @param cred Subject credential
1073 @param ifp The network interface to be relabeled
1074 @param ifnetlabel The current label of the network interface
1075 @param newlabel A new label to apply to the network interface
1076 @see mpo_ifnet_check_label_update_t
1078 Update the label on a network interface, using the supplied new label.
1080 typedef void mpo_ifnet_label_update_t(
1083 struct label
*ifnetlabel
,
1084 struct label
*newlabel
1087 @brief Access control check for delivering a packet to a socket
1088 @param inp inpcb the socket is associated with
1089 @param inplabel Label of the inpcb
1090 @param m The mbuf being received
1091 @param mbuflabel Label of the mbuf being received
1092 @param family Address family, AF_*
1093 @param type Type of socket, SOCK_{STREAM,DGRAM,RAW}
1095 Determine whether the mbuf with label mbuflabel may be received
1096 by the socket associated with inpcb that has the label inplabel.
1098 @return Return 0 if access is granted, otherwise an appropriate value for
1099 errno should be returned.
1101 typedef int mpo_inpcb_check_deliver_t(
1103 struct label
*inplabel
,
1105 struct label
*mbuflabel
,
1110 @brief Create an inpcb label
1111 @param so Socket containing the inpcb to be labeled
1112 @param solabel Label of the socket
1113 @param inp inpcb to be labeled
1114 @param inplabel Label for the inpcb
1116 Set the label of a newly created inpcb, most likely
1117 using the information in the socket and/or socket label.
1119 typedef void mpo_inpcb_label_associate_t(
1121 struct label
*solabel
,
1123 struct label
*inplabel
1126 @brief Destroy inpcb label
1127 @param label The label to be destroyed
1129 Destroy the label on an inpcb label. In this entry point, a
1130 policy module should free any internal storage associated with
1131 label so that it may be destroyed.
1133 typedef void mpo_inpcb_label_destroy_t(
1137 @brief Initialize inpcb label
1138 @param label New label to initialize
1139 @param flag M_WAITOK or M_NOWAIT
1141 typedef int mpo_inpcb_label_init_t(
1142 struct label
*label
,
1146 @brief Recycle up an inpcb label
1147 @param label The label to be recycled
1149 Recycle an inpcb label. Darwin allocates the inpcb as part of
1150 the socket structure in some cases. For this case we must recycle
1151 rather than destroy the inpcb as it will be reused later.
1153 typedef void mpo_inpcb_label_recycle_t(
1157 @brief Update an inpcb label from a socket label
1158 @param so Socket containing the inpcb to be relabeled
1159 @param solabel New label of the socket
1160 @param inp inpcb to be labeled
1161 @param inplabel Label for the inpcb
1163 Set the label of a newly created inpcb due to a change in the
1164 underlying socket label.
1166 typedef void mpo_inpcb_label_update_t(
1168 struct label
*solabel
,
1170 struct label
*inplabel
1173 @brief Device hardware access control
1174 @param devtype Type of device connected
1175 @param properties XML-formatted property list
1176 @param proplen Length of the property list
1178 This is the MAC Framework device access control, which is called by the I/O
1179 Kit when a new device is connected to the system to determine whether that
1180 device should be trusted. A list of properties associated with the device
1181 is passed as an XML-formatted string. The routine should examine these
1182 properties to determine the trustworthiness of the device. A return value
1183 of EPERM forces the device to be claimed by a special device driver that
1184 will prevent its operation.
1186 @warning This is an experimental interface and may change in the future.
1188 @return Return EPERM to indicate that the device is untrusted and should
1189 not be allowed to operate. Return zero to indicate that the device is
1190 trusted and should be allowed to operate normally.
1193 typedef int mpo_iokit_check_device_t(
1195 struct mac_module_data
*mdata
1198 @brief Create an IP reassembly queue label
1199 @param fragment First received IP fragment
1200 @param fragmentlabel Policy label for fragment
1201 @param ipq IP reassembly queue to be labeled
1202 @param ipqlabel Policy label to be filled in for ipq
1204 Set the label on a newly created IP reassembly queue from
1205 the mbuf header of the first received fragment.
1207 typedef void mpo_ipq_label_associate_t(
1208 struct mbuf
*fragment
,
1209 struct label
*fragmentlabel
,
1211 struct label
*ipqlabel
1214 @brief Compare an mbuf header label to an ipq label
1215 @param fragment IP datagram fragment
1216 @param fragmentlabel Policy label for fragment
1217 @param ipq IP fragment reassembly queue
1218 @param ipqlabel Policy label for ipq
1220 Compare the label of the mbuf header containing an IP datagram
1221 (fragment) fragment with the label of the passed IP fragment
1222 reassembly queue (ipq). Return (1) for a successful match, or (0)
1223 for no match. This call is made when the IP stack attempts to
1224 find an existing fragment reassembly queue for a newly received
1225 fragment; if this fails, a new fragment reassembly queue may be
1226 instantiated for the fragment. Policies may use this entry point
1227 to prevent the reassembly of otherwise matching IP fragments if
1228 policy does not permit them to be reassembled based on the label
1229 or other information.
1231 typedef int mpo_ipq_label_compare_t(
1232 struct mbuf
*fragment
,
1233 struct label
*fragmentlabel
,
1235 struct label
*ipqlabel
1238 @brief Destroy IP reassembly queue label
1239 @param label The label to be destroyed
1241 Destroy the label on an IP fragment queue. In this entry point, a
1242 policy module should free any internal storage associated with
1243 label so that it may be destroyed.
1245 typedef void mpo_ipq_label_destroy_t(
1249 @brief Initialize IP reassembly queue label
1250 @param label New label to initialize
1251 @param flag M_WAITOK or M_NOWAIT
1253 Initialize the label on a newly instantiated IP fragment reassembly
1254 queue. The flag field may be one of M_WAITOK and M_NOWAIT, and
1255 should be employed to avoid performing a sleeping malloc(9) during
1256 this initialization call. IP fragment reassembly queue allocation
1257 frequently occurs in performance sensitive environments, and the
1258 implementation should be careful to avoid sleeping or long-lived
1259 operations. This entry point is permitted to fail resulting in
1260 the failure to allocate the IP fragment reassembly queue.
1262 typedef int mpo_ipq_label_init_t(
1263 struct label
*label
,
1267 @brief Update the label on an IP fragment reassembly queue
1268 @param fragment IP fragment
1269 @param fragmentlabel Policy label for fragment
1270 @param ipq IP fragment reassembly queue
1271 @param ipqlabel Policy label to be updated for ipq
1273 Update the label on an IP fragment reassembly queue (ipq) based
1274 on the acceptance of the passed IP fragment mbuf header (fragment).
1276 typedef void mpo_ipq_label_update_t(
1277 struct mbuf
*fragment
,
1278 struct label
*fragmentlabel
,
1280 struct label
*ipqlabel
1283 @brief Access control check for relabelling Login Context
1284 @param l Subject credential
1285 @param newlabel New label to apply to the Login Context
1286 @see mpo_lctx_label_update_t
1290 Determine whether the subject identified by the credential can relabel
1291 itself to the supplied new label (newlabel). This access control check
1292 is called when the mac_set_lctx/lcid system call is invoked. A user space
1293 application will supply a new value, the value will be internalized
1294 and provided in newlabel.
1296 @return Return 0 if access is granted, otherwise an appropriate value for
1297 errno should be returned.
1299 typedef int mpo_lctx_check_label_update_t(
1301 struct label
*newlabel
1304 @brief Destroy Login Context label
1305 @param label The label to be destroyed
1307 typedef void mpo_lctx_label_destroy_t(
1311 @brief Externalize a Login Context label
1312 @param label Label to be externalized
1313 @param element_name Name of the label namespace for which labels should be
1315 @param sb String buffer to be filled with a text representation of the label
1317 Produce an external representation of the label on a Login Context.
1318 An externalized label consists of a text representation
1319 of the label contents that can be used with user applications.
1320 Policy-agnostic user space tools will display this externalized
1323 @return 0 on success, return non-zero if an error occurs while
1324 externalizing the label data.
1327 typedef int mpo_lctx_label_externalize_t(
1328 struct label
*label
,
1333 @brief Initialize Login Context label
1334 @param label New label to initialize
1336 typedef void mpo_lctx_label_init_t(
1340 @brief Internalize a Login Context label
1341 @param label Label to be internalized
1342 @param element_name Name of the label namespace for which the label should
1344 @param element_data Text data to be internalized
1346 Produce a Login Context label from an external representation. An
1347 externalized label consists of a text representation of the label
1348 contents that can be used with user applications. Policy-agnostic
1349 user space tools will forward text version to the kernel for
1350 processing by individual policy modules.
1352 The policy's internalize entry points will be called only if the
1353 policy has registered interest in the label namespace.
1355 @return 0 on success, Otherwise, return non-zero if an error occurs
1356 while internalizing the label data.
1359 typedef int mpo_lctx_label_internalize_t(
1360 struct label
*label
,
1365 @brief Update a Login Context label
1367 @param newlabel A new label to apply to the Login Context
1368 @see mpo_lctx_check_label_update_t
1372 Update the label on a login context, using the supplied new label.
1373 This is called as a result of a login context relabel operation. Access
1374 control was already confirmed by mpo_lctx_check_label_update.
1376 typedef void mpo_lctx_label_update_t(
1378 struct label
*newlabel
1381 @brief A process has created a login context
1383 @param l Login Context
1385 When a process creates a login context (via setlcid()) this entrypoint
1386 is called to notify the policy that the process 'p' has created login
1389 typedef void mpo_lctx_notify_create_t(
1394 @brief A process has joined a login context
1396 @param l Login Context
1398 When a process joins a login context, either via setlcid() or via
1399 fork() this entrypoint is called to notify the policy that process
1400 'p' is now a member of login context 'l'.
1402 typedef void mpo_lctx_notify_join_t(
1407 @brief A process has left a login context
1409 @param l Login Context
1411 When a process leaves a login context either via setlcid() or as a
1412 result of the process exiting this entrypoint is called to notify
1413 the policy that the process 'p' is no longer a member of login context 'l'.
1415 typedef void mpo_lctx_notify_leave_t(
1420 @brief Assign a label to a new mbuf
1421 @param bpf_d BPF descriptor
1422 @param b_label Policy label for bpf_d
1423 @param m Object; mbuf
1424 @param m_label Policy label to fill in for m
1426 Set the label on the mbuf header of a newly created datagram
1427 generated using the passed BPF descriptor. This call is made when
1428 a write is performed to the BPF device associated with the passed
1431 typedef void mpo_mbuf_label_associate_bpfdesc_t(
1432 struct bpf_d
*bpf_d
,
1433 struct label
*b_label
,
1435 struct label
*m_label
1438 @brief Assign a label to a new mbuf
1439 @param ifp Interface descriptor
1440 @param i_label Existing label of ifp
1441 @param m Object; mbuf
1442 @param m_label Policy label to fill in for m
1444 Label an mbuf based on the interface from which it was received.
1446 typedef void mpo_mbuf_label_associate_ifnet_t(
1448 struct label
*i_label
,
1450 struct label
*m_label
1453 @brief Assign a label to a new mbuf
1454 @param inp inpcb structure
1455 @param i_label Existing label of inp
1456 @param m Object; mbuf
1457 @param m_label Policy label to fill in for m
1459 Label an mbuf based on the inpcb from which it was derived.
1461 typedef void mpo_mbuf_label_associate_inpcb_t(
1463 struct label
*i_label
,
1465 struct label
*m_label
1468 @brief Set the label on a newly reassembled IP datagram
1469 @param ipq IP fragment reassembly queue
1470 @param ipqlabel Policy label for ipq
1471 @param mbuf IP datagram to be labeled
1472 @param mbuflabel Policy label to be filled in for mbuf
1474 Set the label on a newly reassembled IP datagram (mbuf) from the IP
1475 fragment reassembly queue (ipq) from which it was generated.
1477 typedef void mpo_mbuf_label_associate_ipq_t(
1479 struct label
*ipqlabel
,
1481 struct label
*mbuflabel
1484 @brief Assign a label to a new mbuf
1485 @param ifp Subject; network interface
1486 @param i_label Existing label of ifp
1487 @param m Object; mbuf
1488 @param m_label Policy label to fill in for m
1490 Set the label on the mbuf header of a newly created datagram
1491 generated for the purposes of a link layer response for the passed
1492 interface. This call may be made in a number of situations, including
1493 for ARP or ND6 responses in the IPv4 and IPv6 stacks.
1495 typedef void mpo_mbuf_label_associate_linklayer_t(
1497 struct label
*i_label
,
1499 struct label
*m_label
1502 @brief Assign a label to a new mbuf
1503 @param oldmbuf mbuf headerder for existing datagram for existing datagram
1504 @param oldmbuflabel Policy label for oldmbuf
1505 @param ifp Network interface
1506 @param ifplabel Policy label for ifp
1507 @param newmbuf mbuf header to be labeled for new datagram
1508 @param newmbuflabel Policy label for newmbuf
1510 Set the label on the mbuf header of a newly created datagram
1511 generated from the existing passed datagram when it is processed
1512 by the passed multicast encapsulation interface. This call is made
1513 when an mbuf is to be delivered using the virtual interface.
1515 typedef void mpo_mbuf_label_associate_multicast_encap_t(
1516 struct mbuf
*oldmbuf
,
1517 struct label
*oldmbuflabel
,
1519 struct label
*ifplabel
,
1520 struct mbuf
*newmbuf
,
1521 struct label
*newmbuflabel
1524 @brief Assign a label to a new mbuf
1525 @param oldmbuf Received datagram
1526 @param oldmbuflabel Policy label for oldmbuf
1527 @param newmbuf Newly created datagram
1528 @param newmbuflabel Policy label for newmbuf
1530 Set the label on the mbuf header of a newly created datagram generated
1531 by the IP stack in response to an existing received datagram (oldmbuf).
1532 This call may be made in a number of situations, including when responding
1533 to ICMP request datagrams.
1535 typedef void mpo_mbuf_label_associate_netlayer_t(
1536 struct mbuf
*oldmbuf
,
1537 struct label
*oldmbuflabel
,
1538 struct mbuf
*newmbuf
,
1539 struct label
*newmbuflabel
1542 @brief Assign a label to a new mbuf
1543 @param so Socket to label
1544 @param so_label Policy label for socket
1545 @param m Object; mbuf
1546 @param m_label Policy label to fill in for m
1548 An mbuf structure is used to store network traffic in transit.
1549 When an application sends data to a socket or a pipe, it is wrapped
1550 in an mbuf first. This function sets the label on a newly created mbuf header
1551 based on the socket sending the data. The contents of the label should be
1552 suitable for performing an access check on the receiving side of the
1555 Only labeled MBUFs will be presented to the policy via this entrypoint.
1557 typedef void mpo_mbuf_label_associate_socket_t(
1559 struct label
*so_label
,
1561 struct label
*m_label
1564 @brief Copy a mbuf label
1565 @param src Source label
1566 @param dest Destination label
1568 Copy the mbuf label information in src into dest.
1570 Only called when both source and destination mbufs have labels.
1572 typedef void mpo_mbuf_label_copy_t(
1577 @brief Destroy mbuf label
1578 @param label The label to be destroyed
1580 Destroy a mbuf label. Since the
1581 object is going out of scope, policy modules should free any
1582 internal storage associated with the label so that it may be
1585 typedef void mpo_mbuf_label_destroy_t(
1589 @brief Initialize mbuf label
1590 @param label New label to initialize
1591 @param flag Malloc flags
1593 Initialize the label for a newly instantiated mbuf.
1595 @warning Since it is possible for the flags to be set to
1596 M_NOWAIT, the malloc operation may fail.
1598 @return On success, 0, otherwise, an appropriate errno return value.
1600 typedef int mpo_mbuf_label_init_t(
1601 struct label
*label
,
1605 @brief Access control check for fsctl
1606 @param cred Subject credential
1607 @param mp The mount point
1608 @param label Label associated with the mount point
1609 @param com Filesystem-dependent request code; see fsctl(2)
1611 Determine whether the subject identified by the credential can perform
1612 the volume operation indicated by com.
1614 @warning The fsctl() system call is directly analogous to ioctl(); since
1615 the associated data is opaque from the standpoint of the MAC framework
1616 and since these operations can affect many aspects of system operation,
1617 policies must exercise extreme care when implementing access control checks.
1619 @return Return 0 if access is granted, otherwise an appropriate value for
1620 errno should be returned.
1622 typedef int mpo_mount_check_fsctl_t(
1625 struct label
*label
,
1629 @brief Access control check for the retrieval of file system attributes
1630 @param cred Subject credential
1631 @param mp The mount structure of the file system
1632 @param vfa The attributes requested
1634 This entry point determines whether given subject can get information
1635 about the given file system. This check happens during statfs() syscalls,
1636 but is also used by other parts within the kernel such as the audit system.
1638 @return Return 0 if access is granted, otherwise an appropriate value for
1639 errno should be returned.
1642 typedef int mpo_mount_check_getattr_t(
1645 struct label
*mp_label
,
1646 struct vfs_attr
*vfa
1649 @brief Access control check for mount point relabeling
1650 @param cred Subject credential
1651 @param mp Object file system mount point
1652 @param mntlabel Policy label for fle system mount point
1654 Determine whether the subject identified by the credential can relabel
1655 the mount point. This call is made when a file system mount is updated.
1657 @return Return 0 if access is granted, otherwise an appropriate value for
1658 errno should be returned. Suggested failure: EACCES for label mismatch
1659 or EPERM for lack of privilege.
1661 typedef int mpo_mount_check_label_update_t(
1664 struct label
*mntlabel
1667 @brief Access control check for mounting a file system
1668 @param cred Subject credential
1669 @param vp Vnode that is to be the mount point
1670 @param vlabel Label associated with the vnode
1671 @param cnp Component name for vp
1672 @param vfc_name Filesystem type name
1674 Determine whether the subject identified by the credential can perform
1675 the mount operation on the target vnode.
1677 @return Return 0 if access is granted, otherwise an appropriate value for
1678 errno should be returned.
1680 typedef int mpo_mount_check_mount_t(
1683 struct label
*vlabel
,
1684 struct componentname
*cnp
,
1685 const char *vfc_name
1688 @brief Access control check remounting a filesystem
1689 @param cred Subject credential
1690 @param mp The mount point
1691 @param mlabel Label currently associated with the mount point
1693 Determine whether the subject identified by the credential can perform
1694 the remount operation on the target vnode.
1696 @return Return 0 if access is granted, otherwise an appropriate value for
1697 errno should be returned.
1699 typedef int mpo_mount_check_remount_t(
1702 struct label
*mlabel
1705 @brief Access control check for the settting of file system attributes
1706 @param cred Subject credential
1707 @param mp The mount structure of the file system
1708 @param vfa The attributes requested
1710 This entry point determines whether given subject can set information
1711 about the given file system, for example the volume name.
1713 @return Return 0 if access is granted, otherwise an appropriate value for
1714 errno should be returned.
1717 typedef int mpo_mount_check_setattr_t(
1720 struct label
*mp_label
,
1721 struct vfs_attr
*vfa
1724 @brief Access control check for file system statistics
1725 @param cred Subject credential
1726 @param mp Object file system mount
1727 @param mntlabel Policy label for mp
1729 Determine whether the subject identified by the credential can see
1730 the results of a statfs performed on the file system. This call may
1731 be made in a number of situations, including during invocations of
1732 statfs(2) and related calls, as well as to determine what file systems
1733 to exclude from listings of file systems, such as when getfsstat(2)
1736 @return Return 0 if access is granted, otherwise an appropriate value for
1737 errno should be returned. Suggested failure: EACCES for label mismatch
1738 or EPERM for lack of privilege.
1740 typedef int mpo_mount_check_stat_t(
1743 struct label
*mntlabel
1746 @brief Access control check for unmounting a filesystem
1747 @param cred Subject credential
1748 @param mp The mount point
1749 @param mlabel Label associated with the mount point
1751 Determine whether the subject identified by the credential can perform
1752 the unmount operation on the target vnode.
1754 @return Return 0 if access is granted, otherwise an appropriate value for
1755 errno should be returned.
1757 typedef int mpo_mount_check_umount_t(
1760 struct label
*mlabel
1763 @brief Create mount labels
1764 @param cred Subject credential
1765 @param mp Mount point of file system being mounted
1766 @param mntlabel Label to associate with the new mount point
1767 @see mpo_mount_label_init_t
1769 Fill out the labels on the mount point being created by the supplied
1770 user credential. This call is made when file systems are first mounted.
1772 typedef void mpo_mount_label_associate_t(
1775 struct label
*mntlabel
1778 @brief Destroy mount label
1779 @param label The label to be destroyed
1781 Destroy a file system mount label. Since the
1782 object is going out of scope, policy modules should free any
1783 internal storage associated with the label so that it may be
1786 typedef void mpo_mount_label_destroy_t(
1790 @brief Externalize a mount point label
1791 @param label Label to be externalized
1792 @param element_name Name of the label namespace for which labels should be
1794 @param sb String buffer to be filled with a text representation of the label
1796 Produce an external representation of the mount point label. An
1797 externalized label consists of a text representation of the label
1798 contents that can be used with user applications. Policy-agnostic
1799 user space tools will display this externalized version.
1801 The policy's externalize entry points will be called only if the
1802 policy has registered interest in the label namespace.
1804 @return 0 on success, return non-zero if an error occurs while
1805 externalizing the label data.
1808 typedef int mpo_mount_label_externalize_t(
1809 struct label
*label
,
1814 @brief Initialize mount point label
1815 @param label New label to initialize
1817 Initialize the label for a newly instantiated mount structure.
1818 This label is typically used to store a default label in the case
1819 that the file system has been mounted singlelabel. Since some
1820 file systems do not support persistent labels (extended attributes)
1821 or are read-only (such as CD-ROMs), it is often necessary to store
1822 a default label separately from the label of the mount point
1823 itself. Sleeping is permitted.
1825 typedef void mpo_mount_label_init_t(
1829 @brief Internalize a mount point label
1830 @param label Label to be internalized
1831 @param element_name Name of the label namespace for which the label should
1833 @param element_data Text data to be internalized
1835 Produce a mount point file system label from an external representation.
1836 An externalized label consists of a text representation of the label
1837 contents that can be used with user applications. Policy-agnostic
1838 user space tools will forward text version to the kernel for
1839 processing by individual policy modules.
1841 The policy's internalize entry points will be called only if the
1842 policy has registered interest in the label namespace.
1844 @return 0 on success, Otherwise, return non-zero if an error occurs
1845 while internalizing the label data.
1848 typedef int mpo_mount_label_internalize_t(
1849 struct label
*label
,
1854 @brief Set the label on an IPv4 datagram fragment
1855 @param datagram Datagram being fragmented
1856 @param datagramlabel Policy label for datagram
1857 @param fragment New fragment
1858 @param fragmentlabel Policy label for fragment
1860 Called when an IPv4 datagram is fragmented into several smaller datagrams.
1861 Policies implementing mbuf labels will typically copy the label from the
1862 source datagram to the new fragment.
1864 typedef void mpo_netinet_fragment_t(
1865 struct mbuf
*datagram
,
1866 struct label
*datagramlabel
,
1867 struct mbuf
*fragment
,
1868 struct label
*fragmentlabel
1871 @brief Set the label on an ICMP reply
1872 @param m mbuf containing the ICMP reply
1873 @param mlabel Policy label for m
1875 A policy may wish to update the label of an mbuf that refers to
1876 an ICMP packet being sent in response to an IP packet. This may
1877 be called in response to a bad packet or an ICMP request.
1879 typedef void mpo_netinet_icmp_reply_t(
1881 struct label
*mlabel
1884 @brief Set the label on a TCP reply
1885 @param m mbuf containing the TCP reply
1886 @param mlabel Policy label for m
1888 Called for outgoing TCP packets not associated with an actual socket.
1890 typedef void mpo_netinet_tcp_reply_t(
1892 struct label
*mlabel
1895 @brief Access control check for pipe ioctl
1896 @param cred Subject credential
1897 @param cpipe Object to be accessed
1898 @param pipelabel The label on the pipe
1899 @param cmd The ioctl command; see ioctl(2)
1901 Determine whether the subject identified by the credential can perform
1902 the ioctl operation indicated by cmd.
1904 @warning Since ioctl data is opaque from the standpoint of the MAC
1905 framework, policies must exercise extreme care when implementing
1906 access control checks.
1908 @return Return 0 if access is granted, otherwise an appropriate value for
1909 errno should be returned.
1912 typedef int mpo_pipe_check_ioctl_t(
1915 struct label
*pipelabel
,
1919 @brief Access control check for pipe kqfilter
1920 @param cred Subject credential
1921 @param kn Object knote
1922 @param cpipe Object to be accessed
1923 @param pipelabel Policy label for the pipe
1925 Determine whether the subject identified by the credential can
1926 receive the knote on the passed pipe.
1928 @return Return 0 if access if granted, otherwise an appropriate
1929 value for errno should be returned.
1931 typedef int mpo_pipe_check_kqfilter_t(
1935 struct label
*pipelabel
1938 @brief Access control check for pipe relabel
1939 @param cred Subject credential
1940 @param cpipe Object to be accessed
1941 @param pipelabel The current label on the pipe
1942 @param newlabel The new label to be used
1944 Determine whether the subject identified by the credential can
1945 perform a relabel operation on the passed pipe. The cred object holds
1946 the credentials of the subject performing the operation.
1948 @return Return 0 if access is granted, otherwise an appropriate value for
1949 errno should be returned.
1952 typedef int mpo_pipe_check_label_update_t(
1955 struct label
*pipelabel
,
1956 struct label
*newlabel
1959 @brief Access control check for pipe read
1960 @param cred Subject credential
1961 @param cpipe Object to be accessed
1962 @param pipelabel The label on the pipe
1964 Determine whether the subject identified by the credential can
1965 perform a read operation on the passed pipe. The cred object holds
1966 the credentials of the subject performing the operation.
1968 @return Return 0 if access is granted, otherwise an appropriate value for
1969 errno should be returned.
1972 typedef int mpo_pipe_check_read_t(
1975 struct label
*pipelabel
1978 @brief Access control check for pipe select
1979 @param cred Subject credential
1980 @param cpipe Object to be accessed
1981 @param pipelabel The label on the pipe
1982 @param which The operation selected on: FREAD or FWRITE
1984 Determine whether the subject identified by the credential can
1985 perform a select operation on the passed pipe. The cred object holds
1986 the credentials of the subject performing the operation.
1988 @return Return 0 if access is granted, otherwise an appropriate value for
1989 errno should be returned.
1992 typedef int mpo_pipe_check_select_t(
1995 struct label
*pipelabel
,
1999 @brief Access control check for pipe stat
2000 @param cred Subject credential
2001 @param cpipe Object to be accessed
2002 @param pipelabel The label on the pipe
2004 Determine whether the subject identified by the credential can
2005 perform a stat operation on the passed pipe. The cred object holds
2006 the credentials of the subject performing the operation.
2008 @return Return 0 if access is granted, otherwise an appropriate value for
2009 errno should be returned.
2012 typedef int mpo_pipe_check_stat_t(
2015 struct label
*pipelabel
2018 @brief Access control check for pipe write
2019 @param cred Subject credential
2020 @param cpipe Object to be accessed
2021 @param pipelabel The label on the pipe
2023 Determine whether the subject identified by the credential can
2024 perform a write operation on the passed pipe. The cred object holds
2025 the credentials of the subject performing the operation.
2027 @return Return 0 if access is granted, otherwise an appropriate value for
2028 errno should be returned.
2031 typedef int mpo_pipe_check_write_t(
2034 struct label
*pipelabel
2037 @brief Create a pipe label
2038 @param cred Subject credential
2039 @param cpipe object to be labeled
2040 @param label Label for the pipe object
2042 Create a label for the pipe object being created by the supplied
2043 user credential. This call is made when the pipe is being created
2044 XXXPIPE(for one or both sides of the pipe?).
2047 typedef void mpo_pipe_label_associate_t(
2050 struct label
*pipelabel
2053 @brief Copy a pipe label
2054 @param src Source pipe label
2055 @param dest Destination pipe label
2057 Copy the pipe label associated with src to dest.
2058 XXXPIPE Describe when this is used: most likely during pipe creation to
2059 copy from rpipe to wpipe.
2061 typedef void mpo_pipe_label_copy_t(
2066 @brief Destroy pipe label
2067 @param label The label to be destroyed
2069 Destroy a pipe label. Since the object is going out of scope,
2070 policy modules should free any internal storage associated with the
2071 label so that it may be destroyed.
2073 typedef void mpo_pipe_label_destroy_t(
2077 @brief Externalize a pipe label
2078 @param label Label to be externalized
2079 @param element_name Name of the label namespace for which labels should be
2081 @param sb String buffer to be filled with a text representation of the label
2083 Produce an external representation of the label on a pipe.
2084 An externalized label consists of a text representation
2085 of the label contents that can be used with user applications.
2086 Policy-agnostic user space tools will display this externalized
2089 The policy's externalize entry points will be called only if the
2090 policy has registered interest in the label namespace.
2092 @return 0 on success, return non-zero if an error occurs while
2093 externalizing the label data.
2096 typedef int mpo_pipe_label_externalize_t(
2097 struct label
*label
,
2102 @brief Initialize pipe label
2103 @param label New label to initialize
2105 Initialize label storage for use with a newly instantiated pipe object.
2106 Sleeping is permitted.
2108 typedef void mpo_pipe_label_init_t(
2112 @brief Internalize a pipe label
2113 @param label Label to be internalized
2114 @param element_name Name of the label namespace for which the label should
2116 @param element_data Text data to be internalized
2118 Produce a pipe label from an external representation. An
2119 externalized label consists of a text representation of the label
2120 contents that can be used with user applications. Policy-agnostic
2121 user space tools will forward text version to the kernel for
2122 processing by individual policy modules.
2124 The policy's internalize entry points will be called only if the
2125 policy has registered interest in the label namespace.
2127 @return 0 on success, Otherwise, return non-zero if an error occurs
2128 while internalizing the label data.
2131 typedef int mpo_pipe_label_internalize_t(
2132 struct label
*label
,
2137 @brief Update a pipe label
2138 @param cred Subject credential
2139 @param cpipe Object to be labeled
2140 @param oldlabel Existing pipe label
2141 @param newlabel New label to replace existing label
2142 @see mpo_pipe_check_label_update_t
2144 The subject identified by the credential has previously requested
2145 and was authorized to relabel the pipe; this entry point allows
2146 policies to perform the actual relabel operation. Policies should
2147 update oldlabel using the label stored in the newlabel parameter.
2150 typedef void mpo_pipe_label_update_t(
2153 struct label
*oldlabel
,
2154 struct label
*newlabel
2157 @brief Policy unload event
2158 @param mpc MAC policy configuration
2160 This is the MAC Framework policy unload event. This entry point will
2161 only be called if the module's policy configuration allows unload (if
2162 the MPC_LOADTIME_FLAG_UNLOADOK is set). Most security policies won't
2163 want to be unloaded; they should set their flags to prevent this
2164 entry point from being called.
2166 @warning During this call, the mac policy list mutex is held, so
2167 sleep operations cannot be performed, and calls out to other kernel
2168 subsystems must be made with caution.
2170 @see MPC_LOADTIME_FLAG_UNLOADOK
2172 typedef void mpo_policy_destroy_t(
2173 struct mac_policy_conf
*mpc
2176 @brief Policy initialization event
2177 @param mpc MAC policy configuration
2178 @see mac_policy_register
2179 @see mpo_policy_initbsd_t
2181 This is the MAC Framework policy initialization event. This entry
2182 point is called during mac_policy_register, when the policy module
2183 is first registered with the MAC Framework. This is often done very
2184 early in the boot process, after the kernel Mach subsystem has been
2185 initialized, but prior to the BSD subsystem being initialized.
2186 Since the kernel BSD services are not yet available, it is possible
2187 that some initialization must occur later, possibly in the
2188 mpo_policy_initbsd_t policy entry point, such as registering BSD system
2189 controls (sysctls). Policy modules loaded at boot time will be
2190 registered and initialized before labeled Mach objects are created.
2192 @warning During this call, the mac policy list mutex is held, so
2193 sleep operations cannot be performed, and calls out to other kernel
2194 subsystems must be made with caution.
2196 typedef void mpo_policy_init_t(
2197 struct mac_policy_conf
*mpc
2200 @brief Policy BSD initialization event
2201 @param mpc MAC policy configuration
2202 @see mpo_policy_init_t
2204 This entry point is called after the kernel BSD subsystem has been
2205 initialized. By this point, the module should already be loaded,
2206 registered, and initialized. Since policy modules are initialized
2207 before kernel BSD services are available, this second initialization
2208 phase is necessary. At this point, BSD services (memory management,
2209 synchronization primitives, vfs, etc.) are available, but the first
2210 process has not yet been created. Mach-related objects and tasks
2211 will already be fully initialized and may be in use--policies requiring
2212 ubiquitous labeling may also want to implement mpo_policy_init_t.
2214 @warning During this call, the mac policy list mutex is held, so
2215 sleep operations cannot be performed, and calls out to other kernel
2216 subsystems must be made with caution.
2218 typedef void mpo_policy_initbsd_t(
2219 struct mac_policy_conf
*mpc
2222 @brief Policy extension service
2223 @param p Calling process
2224 @param call Policy-specific syscall number
2225 @param arg Pointer to syscall arguments
2227 This entry point provides a policy-multiplexed system call so that
2228 policies may provide additional services to user processes without
2229 registering specific system calls. The policy name provided during
2230 registration is used to demux calls from userland, and the arguments
2231 will be forwarded to this entry point. When implementing new
2232 services, security modules should be sure to invoke appropriate
2233 access control checks from the MAC framework as needed. For
2234 example, if a policy implements an augmented signal functionality,
2235 it should call the necessary signal access control checks to invoke
2236 the MAC framework and other registered policies.
2238 @warning Since the format and contents of the policy-specific
2239 arguments are unknown to the MAC Framework, modules must perform the
2240 required copyin() of the syscall data on their own. No policy
2241 mediation is performed, so policies must perform any necessary
2242 access control checks themselves. If multiple policies are loaded,
2243 they will currently be unable to mediate calls to other policies.
2245 @return In the event of an error, an appropriate value for errno
2246 should be returned, otherwise return 0 upon success.
2248 typedef int mpo_policy_syscall_t(
2254 @brief Access control check for copying a send right to another task
2255 @param task Label of the sender task
2256 @param port Label of the affected port
2258 Access control check for copying send rights to the port from the
2259 specified task. A complementary entry point, mpo_port_check_hold_send,
2260 handles the receiving task. port_check_copy_send is called as part of
2261 a group of policy invocations when messages with port rights are sent.
2262 All access control checks made for a particular message must be successful
2263 for the message to be sent.
2265 The task label and the port are locked. Sleeping is permitted.
2267 @return Return 0 if access is granted, non-zero otherwise.
2269 typedef int mpo_port_check_copy_send_t(
2274 @brief Access control check for obtaining a receive right
2275 @param task Label of the receiving task
2276 @param port Label of the affected port
2278 Access control check for a task obtaining receive rights to a
2279 port. Usually, these are port rights that were obtained with a call
2280 to mach_port_allocate. This entry point is called as part of a
2281 group of policy invocations when messages with port rights are
2282 received. All of these access control checks must succeed in order
2283 to receive the message.
2285 The task label and the port are locked. Sleeping is permitted.
2287 @return Return 0 if access is granted, non-zero otherwise.
2289 typedef int mpo_port_check_hold_receive_t(
2294 @brief Access control check for obtaining a send once right
2295 @param task Label of the receiving task
2296 @param port Label of the affected port
2298 Access control check for a task obtaining send once rights to a port. Usually,
2299 these are port rights that were part of a message sent by another userspace
2300 task. port_check_hold_send_once is called as part of a group of policy
2301 invocations when messages with port rights are received. All of these access
2302 control checks must succeed in order to receive the message.
2304 The task label and the port are locked. Sleeping is permitted.
2306 @return Return 0 if access is granted, non-zero otherwise.
2308 typedef int mpo_port_check_hold_send_once_t(
2313 @brief Access control check for obtaining a send right
2314 @param task Label of the receiving task
2315 @param port Label of the affected port
2317 Access control check for a task obtaining send rights to a port. Usually,
2318 these are port rights that were part of a message sent by another userspace
2319 task. port_check_hold_send is called as part of a group of policy
2320 invocations when messages with port rights are received. All of these access
2321 control checks must succeed in order to receive the message.
2323 The task label and the port are locked. Sleeping is permitted.
2325 @return Return 0 if access is granted, non-zero otherwise.
2327 typedef int mpo_port_check_hold_send_t(
2332 @brief Access control check for relabelling ports
2333 @param task Subject's task label
2334 @param oldlabel Original label of port
2335 @param newlabel New label for port
2337 Access control check for relabelling ports. The policy should
2338 indicate whether the subject is permitted to change the label
2339 of a port from oldlabel to newlabel. The port is locked, but
2340 the subject's task label is not locked.
2342 @warning XXX In future releases, the task label lock will likely
2345 @return Return 0 if access is granted, non-zero otherwise.
2347 typedef int mpo_port_check_label_update_t(
2349 struct label
*oldlabel
,
2350 struct label
*newlabel
2353 @brief Access control check for producing a send once right from a receive right
2354 @param task Label of the sender task
2355 @param port Label of the affected port
2357 Access control check for obtaining send once rights from receive rights.
2358 The new send once right may be destined for the calling task, or a different
2359 task. In either case the mpo_port_check_hold_send_once entry point handles
2360 the receiving task. port_check_make_send_once may be called as part of a
2361 group of policy invocations when messages with port rights are sent.
2362 All access control checks made for a particular message must be successful
2363 for the message to be sent.
2365 The task label and the port are locked. Sleeping is permitted.
2367 @return Return 0 if access is granted, non-zero otherwise.
2369 typedef int mpo_port_check_make_send_once_t(
2374 @brief Access control check for producing a send right from a receive right
2375 @param task Label of the sender task
2376 @param port Label of the affected port
2378 Access control check for obtaining send rights from receive rights. The new
2379 send right may be destined for the calling task, or a different task.
2380 In either case the mpo_port_check_hold_send entry point
2381 handles the receiving task. port_check_make_send may be called as part of
2382 a group of policy invocations when messages with port rights are sent.
2383 All access control checks made for a particular message must be successful
2384 for the message to be sent.
2386 The task label and the port are locked. Sleeping is permitted.
2388 @return Return 0 if access is granted, non-zero otherwise.
2390 typedef int mpo_port_check_make_send_t(
2395 @brief Compute access control check for a Mach message-based service
2396 @param proc Sender's process structure (may be NULL)
2397 @param task Sender's task label
2398 @param port Destination port label
2399 @param msgid Message id
2401 Access control computation for message-based services. This entry point
2402 computes permission to the service requested by the specified port and message
2403 id, for example a single MiG server routine, and is unrelated to the access
2404 check for sending messages to ports (but that check must succeed for the
2405 message to be sent to the destination). The result of this access computation
2406 is stored in the message trailer field msgh_ad (only if requested by the
2407 recipient); it does not actually inhibit the message from being sent or
2410 @return 0 for access granted, nonzero for access denied.
2413 typedef int mpo_port_check_method_t(
2420 @brief Access control check for transferring a receive right
2421 @param task Label of the sender task
2422 @param port Label of the affected port
2424 Access control check for transferring the receive right to a port out
2425 of the specified task. A complementary entry point,
2426 mpo_port_check_hold_receive, handles the receiving task.
2427 port_check_move_receive is called as part of
2428 a group of policy invocations when messages with port rights are sent.
2429 All access control checks made for a particular message must be successful
2430 for the message to be sent.
2432 The task label and the port are locked. Sleeping is permitted.
2434 @return Return 0 if access is granted, non-zero otherwise.
2436 typedef int mpo_port_check_move_receive_t(
2441 @brief Access control check for transferring a send once right
2442 @param task Label of the sender task
2443 @param port Label of the affected port
2445 Access control check for transferring a send once right from one task to
2446 the task listening to the specified port. A complementary entry point,
2447 mpo_port_check_hold_send_once, handles the receiving task.
2448 port_check_move_send_once is called as part of a group of policy invocations
2449 when messages with port rights are sent. All access control checks made
2450 for a particular message must be successful for the message to be sent.
2452 The task label and the port are locked. Sleeping is permitted.
2454 @return Return 0 if access is granted, non-zero otherwise.
2456 typedef int mpo_port_check_move_send_once_t(
2461 @brief Access control check for transferring a send right
2462 @param task Label of the sender task
2463 @param port Label of the affected port
2465 Access control check for transferring a send right from one task to the
2466 task listening to the specified port. A complementary entry point,
2467 mpo_port_check_hold_send, handles the receiving task.
2468 port_check_move_send is called as part of a group of policy invocations
2469 when messages with port rights are sent. All access control checks made
2470 for a particular message must be successful for the message to be sent.
2472 The task label and the port are locked. Sleeping is permitted.
2474 @return Return 0 if access is granted, non-zero otherwise.
2476 typedef int mpo_port_check_move_send_t(
2481 @brief Access control check for receiving Mach messsages
2482 @param task Label of the receiving task
2483 @param sender Label of the sending task
2485 Access control check for receiving messages. The two labels are locked.
2487 @warning This entry point can be invoked from many places inside the
2488 kernel, with arbitrary other locks held. The implementation of this
2489 entry point must not cause page faults, as those are handled by mach
2492 @return Return 0 if access is granted, non-zero otherwise.
2494 typedef int mpo_port_check_receive_t(
2496 struct label
*sender
2499 @brief Access control check for sending Mach messsages
2500 @param task Label of the sender task
2501 @param port Label of the destination port
2503 Access control check for sending messages. The task label and the
2506 @warning This entry point can be invoked from many places inside the
2507 kernel, with arbitrary other locks held. The implementation of this
2508 entry point must not cause page faults, as those are handled by mach
2511 @return Return 0 if access is granted, non-zero otherwise.
2513 typedef int mpo_port_check_send_t(
2518 @brief Generic access control check
2519 @param subj Caller-provided subject label
2520 @param obj Caller-provided object label
2521 @param serv Service or object class name
2522 @param perm Permission, or method, within the specified service
2524 This function provides a general way for a user process to query
2525 an arbitrary access control decision from the system's security policies.
2526 Currently, there are no standards for the format of the service and
2527 permission names. Labels may be either cred or port labels; the policy
2528 must accept either. The userspace interfaces to this entry point allow
2529 label strings or label handles (ports) to be provided.
2531 @return Return 0 if access is granted, non-zero otherwise.
2533 typedef int mpo_port_check_service_t(
2540 @brief Assign a label to a new Mach port created by the kernel
2541 @param portlabel Label for the new port
2542 @param isreply True if the port is for a reply message from the kernel
2544 Assign a label to a new port created by the kernel. If the port is being
2545 used to reply to a message, isreply is 1 (0 otherwise). The port is locked.
2547 typedef void mpo_port_label_associate_kernel_t(
2548 struct label
*portlabel
,
2552 @brief Assign a label to a new Mach port
2553 @param it Task label of issuer
2554 @param st Task label of target
2555 @param portlabel Label for the new port
2557 Assign a label to a new port. The policy can base this label on
2558 the label of the calling task, as well as the label of the target task.
2559 The target task is the one which recieves the first right for this port.
2560 Both task labels and the port are locked.
2562 typedef void mpo_port_label_associate_t(
2565 struct label
*portlabel
2568 @brief Request label for new (userspace) object
2569 @param subj Subject label
2570 @param obj Parent or existing object label
2571 @param serv Name of service
2572 @param out Computed label
2574 Ask the loaded policies to compute a label based on the two input labels
2575 and the service name. There is currently no standard for the service name,
2576 or even what the input labels represent (Subject and parent object are only
2577 a suggestion). If successful, the computed label is stored in out. All labels
2578 must be port (or task) labels. The userspace interfaces to this entry point
2579 allow label handles (ports) to be provided.
2581 @return 0 on success, or an errno value for failure.
2583 typedef int mpo_port_label_compute_t(
2590 @brief Copy a Mach port label
2591 @param src Source port label
2592 @param dest Destination port label
2594 Copy the Mach port label information from src to dest. This is used
2595 to copy user-suplied labels into an existing port.
2597 typedef void mpo_port_label_copy_t(
2602 @brief Destroy Mach port label
2603 @param label The label to be destroyed
2605 Destroy a Mach port label. Since the object is going out of
2606 scope, policy modules should free any internal storage associated
2607 with the label so that it may be destroyed.
2609 typedef void mpo_port_label_destroy_t(
2613 @brief Initialize Mach port label
2614 @param label New label to initialize
2616 Initialize the label for a newly instantiated Mach port. Sleeping
2619 typedef void mpo_port_label_init_t(
2623 @brief Update a Mach task port label
2624 @param cred User credential label to be used as the source
2625 @param task Mach port label to be used as the destination
2626 @see mpo_cred_label_update_t
2627 @see mpo_cred_label_update_execve_t
2629 Update the label on a Mach task port, using the supplied user
2630 credential label. When a mac_cred_label_update_execve or a mac_cred_label_update
2631 operation causes the label on a user credential to change, the Mach
2632 task port label also needs to be updated to reflect the change.
2633 Both labels are already valid (initialized and created).
2635 typedef void mpo_port_label_update_cred_t(
2640 @brief Assign a label to a Mach port connected to a kernel object
2641 @param portlabel Label for the port
2642 @param kotype Type of kernel object
2644 Label a kernel port based on the type of object behind it. The
2645 kotype parameter is one of the IKOT constants in
2646 <kern/ipc_kobject.h>. The port already has a valid label from either
2647 mpo_port_label_associate_kernel, or because it is a task port and has a label
2648 derived from the process and task labels. The port is locked.
2650 typedef void mpo_port_label_update_kobject_t(
2651 struct label
*portlabel
,
2655 @brief Access control check for POSIX semaphore create
2656 @param cred Subject credential
2657 @param name String name of the semaphore
2659 Determine whether the subject identified by the credential can create
2660 a POSIX semaphore specified by name.
2662 @return Return 0 if access is granted, otherwise an appropriate value for
2663 errno should be returned.
2665 typedef int mpo_posixsem_check_create_t(
2670 @brief Access control check for POSIX semaphore open
2671 @param cred Subject credential
2672 @param ps Pointer to semaphore information structure
2673 @param semlabel Label associated with the semaphore
2675 Determine whether the subject identified by the credential can open
2676 the named POSIX semaphore with label semlabel.
2678 @return Return 0 if access is granted, otherwise an appropriate value for
2679 errno should be returned.
2681 typedef int mpo_posixsem_check_open_t(
2683 struct pseminfo
*ps
,
2684 struct label
*semlabel
2687 @brief Access control check for POSIX semaphore post
2688 @param cred Subject credential
2689 @param ps Pointer to semaphore information structure
2690 @param semlabel Label associated with the semaphore
2692 Determine whether the subject identified by the credential can unlock
2693 the named POSIX semaphore with label semlabel.
2695 @return Return 0 if access is granted, otherwise an appropriate value for
2696 errno should be returned.
2698 typedef int mpo_posixsem_check_post_t(
2700 struct pseminfo
*ps
,
2701 struct label
*semlabel
2704 @brief Access control check for POSIX semaphore unlink
2705 @param cred Subject credential
2706 @param ps Pointer to semaphore information structure
2707 @param semlabel Label associated with the semaphore
2708 @param name String name of the semaphore
2710 Determine whether the subject identified by the credential can remove
2711 the named POSIX semaphore with label semlabel.
2713 @return Return 0 if access is granted, otherwise an appropriate value for
2714 errno should be returned.
2716 typedef int mpo_posixsem_check_unlink_t(
2718 struct pseminfo
*ps
,
2719 struct label
*semlabel
,
2723 @brief Access control check for POSIX semaphore wait
2724 @param cred Subject credential
2725 @param ps Pointer to semaphore information structure
2726 @param semlabel Label associated with the semaphore
2728 Determine whether the subject identified by the credential can lock
2729 the named POSIX semaphore with label semlabel.
2731 @return Return 0 if access is granted, otherwise an appropriate value for
2732 errno should be returned.
2734 typedef int mpo_posixsem_check_wait_t(
2736 struct pseminfo
*ps
,
2737 struct label
*semlabel
2740 @brief Create a POSIX semaphore label
2741 @param cred Subject credential
2742 @param ps Pointer to semaphore information structure
2743 @param semlabel Label to associate with the new semaphore
2744 @param name String name of the semaphore
2746 Label a new POSIX semaphore. The label was previously
2747 initialized and associated with the semaphore. At this time, an
2748 appropriate initial label value should be assigned to the object and
2749 stored in semalabel.
2751 typedef void mpo_posixsem_label_associate_t(
2753 struct pseminfo
*ps
,
2754 struct label
*semlabel
,
2758 @brief Destroy POSIX semaphore label
2759 @param label The label to be destroyed
2761 Destroy a POSIX semaphore label. Since the object is
2762 going out of scope, policy modules should free any internal storage
2763 associated with the label so that it may be destroyed.
2765 typedef void mpo_posixsem_label_destroy_t(
2769 @brief Initialize POSIX semaphore label
2770 @param label New label to initialize
2772 Initialize the label for a newly instantiated POSIX semaphore. Sleeping
2775 typedef void mpo_posixsem_label_init_t(
2779 @brief Access control check for POSIX shared memory region create
2780 @param cred Subject credential
2781 @param name String name of the shared memory region
2783 Determine whether the subject identified by the credential can create
2784 the POSIX shared memory region referenced by name.
2786 @return Return 0 if access is granted, otherwise an appropriate value for
2787 errno should be returned.
2789 typedef int mpo_posixshm_check_create_t(
2794 @brief Access control check for mapping POSIX shared memory
2795 @param cred Subject credential
2796 @param ps Pointer to shared memory information structure
2797 @param shmlabel Label associated with the shared memory region
2798 @param prot mmap protections; see mmap(2)
2799 @param flags shmat flags; see shmat(2)
2801 Determine whether the subject identified by the credential can map
2802 the POSIX shared memory segment associated with shmlabel.
2804 @return Return 0 if access is granted, otherwise an appropriate value for
2805 errno should be returned.
2807 typedef int mpo_posixshm_check_mmap_t(
2809 struct pshminfo
*ps
,
2810 struct label
*shmlabel
,
2815 @brief Access control check for POSIX shared memory region open
2816 @param cred Subject credential
2817 @param ps Pointer to shared memory information structure
2818 @param shmlabel Label associated with the shared memory region
2820 Determine whether the subject identified by the credential can open
2821 the POSIX shared memory region.
2823 @return Return 0 if access is granted, otherwise an appropriate value for
2824 errno should be returned.
2826 typedef int mpo_posixshm_check_open_t(
2828 struct pshminfo
*ps
,
2829 struct label
*shmlabel
2832 @brief Access control check for POSIX shared memory stat
2833 @param cred Subject credential
2834 @param ps Pointer to shared memory information structure
2835 @param shmlabel Label associated with the shared memory region
2837 Determine whether the subject identified by the credential can obtain
2838 status for the POSIX shared memory segment associated with shmlabel.
2840 @return Return 0 if access is granted, otherwise an appropriate value for
2841 errno should be returned.
2843 typedef int mpo_posixshm_check_stat_t(
2845 struct pshminfo
*ps
,
2846 struct label
*shmlabel
2849 @brief Access control check for POSIX shared memory truncate
2850 @param cred Subject credential
2851 @param ps Pointer to shared memory information structure
2852 @param shmlabel Label associated with the shared memory region
2853 @param len Length to truncate or extend shared memory segment
2855 Determine whether the subject identified by the credential can truncate
2856 or extend (to len) the POSIX shared memory segment associated with shmlabel.
2858 @return Return 0 if access is granted, otherwise an appropriate value for
2859 errno should be returned.
2861 typedef int mpo_posixshm_check_truncate_t(
2863 struct pshminfo
*ps
,
2864 struct label
*shmlabel
,
2868 @brief Access control check for POSIX shared memory unlink
2869 @param cred Subject credential
2870 @param ps Pointer to shared memory information structure
2871 @param shmlabel Label associated with the shared memory region
2872 @param name String name of the shared memory region
2874 Determine whether the subject identified by the credential can delete
2875 the POSIX shared memory segment associated with shmlabel.
2877 @return Return 0 if access is granted, otherwise an appropriate value for
2878 errno should be returned.
2880 typedef int mpo_posixshm_check_unlink_t(
2882 struct pshminfo
*ps
,
2883 struct label
*shmlabel
,
2887 @brief Create a POSIX shared memory region label
2888 @param cred Subject credential
2889 @param ps Pointer to shared memory information structure
2890 @param shmlabel Label to associate with the new shared memory region
2891 @param name String name of the shared memory region
2893 Label a new POSIX shared memory region. The label was previously
2894 initialized and associated with the shared memory region. At this
2895 time, an appropriate initial label value should be assigned to the
2896 object and stored in shmlabel.
2898 typedef void mpo_posixshm_label_associate_t(
2900 struct pshminfo
*ps
,
2901 struct label
*shmlabel
,
2905 @brief Destroy POSIX shared memory label
2906 @param label The label to be destroyed
2908 Destroy a POSIX shared memory region label. Since the
2909 object is going out of scope, policy modules should free any
2910 internal storage associated with the label so that it may be
2913 typedef void mpo_posixshm_label_destroy_t(
2917 @brief Initialize POSIX Shared Memory region label
2918 @param label New label to initialize
2920 Initialize the label for newly a instantiated POSIX Shared Memory
2921 region. Sleeping is permitted.
2923 typedef void mpo_posixshm_label_init_t(
2927 @brief Access control check for debugging process
2928 @param cred Subject credential
2929 @param proc Object process
2931 Determine whether the subject identified by the credential can debug
2932 the passed process. This call may be made in a number of situations,
2933 including use of the ptrace(2) and ktrace(2) APIs, as well as for some
2934 types of procfs operations.
2936 @return Return 0 if access is granted, otherwise an appropriate value for
2937 errno should be returned. Suggested failure: EACCES for label mismatch,
2938 EPERM for lack of privilege, or ESRCH to hide visibility of the target.
2940 typedef int mpo_proc_check_debug_t(
2945 @brief Access control over fork
2946 @param cred Subject credential
2947 @param proc Subject process trying to fork
2949 Determine whether the subject identified is allowed to fork.
2951 @return Return 0 if access is granted, otherwise an appropriate value for
2952 errno should be returned.
2954 typedef int mpo_proc_check_fork_t(
2959 @brief Access control check for retrieving audit information
2960 @param cred Subject credential
2962 Determine whether the subject identified by the credential can get
2963 audit information such as the audit user ID, the preselection mask,
2964 the terminal ID and the audit session ID, using the getaudit() system call.
2966 @return Return 0 if access is granted, otherwise an appropriate value for
2967 errno should be returned.
2969 typedef int mpo_proc_check_getaudit_t(
2973 @brief Access control check for retrieving audit user ID
2974 @param cred Subject credential
2976 Determine whether the subject identified by the credential can get
2977 the user identity being used by the auditing system, using the getauid()
2980 @return Return 0 if access is granted, otherwise an appropriate value for
2981 errno should be returned.
2983 typedef int mpo_proc_check_getauid_t(
2987 @brief Access control check for retrieving Login Context ID
2988 @param p0 Calling process
2989 @param p Effected process
2990 @param pid syscall PID argument
2992 Determine if getlcid(2) system call is permitted.
2994 Information returned by this system call is similar to that returned via
2995 process listings etc.
2997 @return Return 0 if access is granted, otherwise an appropriate value for
2998 errno should be returned.
3000 typedef int mpo_proc_check_getlcid_t(
3006 @brief Access control check for setting memory protections
3007 @param cred Subject credential
3008 @param proc User process requesting the change
3009 @param addr Start address of the memory range
3010 @param size Length address of the memory range
3011 @param prot Memory protections, see mmap(2)
3013 Determine whether the subject identified by the credential should
3014 be allowed to set the specified memory protections on memory mapped
3015 in the process proc.
3017 @return Return 0 if access is granted, otherwise an appropriate value for
3018 errno should be returned.
3020 typedef int mpo_proc_check_mprotect_t(
3028 @brief Access control check for changing scheduling parameters
3029 @param cred Subject credential
3030 @param proc Object process
3032 Determine whether the subject identified by the credential can change
3033 the scheduling parameters of the passed process.
3035 @return Return 0 if access is granted, otherwise an appropriate value for
3036 errno should be returned. Suggested failure: EACCES for label mismatch,
3037 EPERM for lack of privilege, or ESRCH to limit visibility.
3039 typedef int mpo_proc_check_sched_t(
3044 @brief Access control check for setting audit information
3045 @param cred Subject credential
3046 @param ai Audit information
3048 Determine whether the subject identified by the credential can set
3049 audit information such as the the preselection mask, the terminal ID
3050 and the audit session ID, using the setaudit() system call.
3052 @return Return 0 if access is granted, otherwise an appropriate value for
3053 errno should be returned.
3055 typedef int mpo_proc_check_setaudit_t(
3057 struct auditinfo
*ai
3060 @brief Access control check for setting audit user ID
3061 @param cred Subject credential
3062 @param auid Audit user ID
3064 Determine whether the subject identified by the credential can set
3065 the user identity used by the auditing system, using the setauid()
3068 @return Return 0 if access is granted, otherwise an appropriate value for
3069 errno should be returned.
3071 typedef int mpo_proc_check_setauid_t(
3076 @brief Access control check for setting the Login Context
3077 @param p0 Calling process
3078 @param p Effected process
3079 @param pid syscall PID argument
3080 @param lcid syscall LCID argument
3082 Determine if setlcid(2) system call is permitted.
3084 See xnu/bsd/kern/kern_prot.c:setlcid() implementation for example of
3085 decoding syscall arguments to determine action desired by caller.
3087 Five distinct actions are possible: CREATE JOIN LEAVE ADOPT ORPHAN
3089 @return Return 0 if access is granted, otherwise an appropriate value for
3090 errno should be returned.
3092 typedef int mpo_proc_check_setlcid_t(
3099 @brief Access control check for delivering signal
3100 @param cred Subject credential
3101 @param proc Object process
3102 @param signum Signal number; see kill(2)
3104 Determine whether the subject identified by the credential can deliver
3105 the passed signal to the passed process.
3107 @warning Programs typically expect to be able to send and receive
3108 signals as part or their normal process lifecycle; caution should be
3109 exercised when implementing access controls over signal events.
3111 @return Return 0 if access is granted, otherwise an appropriate value for
3112 errno should be returned. Suggested failure: EACCES for label mismatch,
3113 EPERM for lack of privilege, or ESRCH to limit visibility.
3115 typedef int mpo_proc_check_signal_t(
3121 @brief Access control check for wait
3122 @param cred Subject credential
3123 @param proc Object process
3125 Determine whether the subject identified by the credential can wait
3126 for process termination.
3128 @warning Caution should be exercised when implementing access
3129 controls for wait, since programs often wait for child processes to
3130 exit. Failure to be notified of a child process terminating may
3131 cause the parent process to hang, or may produce zombie processes.
3133 @return Return 0 if access is granted, otherwise an appropriate value for
3134 errno should be returned.
3136 typedef int mpo_proc_check_wait_t(
3141 @brief Destroy process label
3142 @param label The label to be destroyed
3144 Destroy a process label. Since the object is going
3145 out of scope, policy modules should free any internal storage
3146 associated with the label so that it may be destroyed.
3148 typedef void mpo_proc_label_destroy_t(
3152 @brief Initialize process label
3153 @param label New label to initialize
3154 @see mpo_cred_label_init_t
3156 Initialize the label for a newly instantiated BSD process structure.
3157 Normally, security policies will store the process label in the user
3158 credential rather than here in the process structure. However,
3159 there are some floating label policies that may need to temporarily
3160 store a label in the process structure until it is safe to update
3161 the user credential label. Sleeping is permitted.
3163 typedef void mpo_proc_label_init_t(
3167 @brief Access control check for socket accept
3168 @param cred Subject credential
3169 @param socket Object socket
3170 @param socklabel Policy label for socket
3172 Determine whether the subject identified by the credential can accept()
3173 a new connection on the socket from the host specified by addr.
3175 @return Return 0 if access if granted, otherwise an appropriate
3176 value for errno should be returned.
3178 typedef int mpo_socket_check_accept_t(
3181 struct label
*socklabel
3184 @brief Access control check for a pending socket accept
3185 @param cred Subject credential
3186 @param so Object socket
3187 @param socklabel Policy label for socket
3188 @param addr Address of the listening socket (coming soon)
3190 Determine whether the subject identified by the credential can accept()
3191 a pending connection on the socket from the host specified by addr.
3193 @return Return 0 if access if granted, otherwise an appropriate
3194 value for errno should be returned.
3196 typedef int mpo_socket_check_accepted_t(
3199 struct label
*socklabel
,
3200 struct sockaddr
*addr
3203 @brief Access control check for socket bind
3204 @param cred Subject credential
3205 @param so Object socket
3206 @param socklabel Policy label for socket
3207 @param addr Name to assign to the socket
3209 Determine whether the subject identified by the credential can bind()
3210 the name (addr) to the socket.
3212 @return Return 0 if access if granted, otherwise an appropriate
3213 value for errno should be returned.
3215 typedef int mpo_socket_check_bind_t(
3218 struct label
*socklabel
,
3219 struct sockaddr
*addr
3222 @brief Access control check for socket connect
3223 @param cred Subject credential
3224 @param so Object socket
3225 @param socklabel Policy label for socket
3226 @param addr Name to assign to the socket
3228 Determine whether the subject identified by the credential can
3229 connect() the passed socket to the remote host specified by addr.
3231 @return Return 0 if access if granted, otherwise an appropriate
3232 value for errno should be returned.
3234 typedef int mpo_socket_check_connect_t(
3237 struct label
*socklabel
,
3238 struct sockaddr
*addr
3241 @brief Access control check for socket() system call.
3242 @param cred Subject credential
3243 @param domain communication domain
3244 @param type socket type
3245 @param protocol socket protocol
3247 Determine whether the subject identified by the credential can
3248 make the socket() call.
3250 @return Return 0 if access if granted, otherwise an appropriate
3251 value for errno should be returned.
3253 typedef int mpo_socket_check_create_t(
3260 @brief Access control check for delivering data to a user's receieve queue
3261 @param so The socket data is being delivered to
3262 @param so_label The label of so
3263 @param m The mbuf whose data will be deposited into the receive queue
3264 @param m_label The label of the sender of the data.
3266 A socket has a queue for receiving incoming data. When a packet arrives
3267 on the wire, it eventually gets deposited into this queue, which the
3268 owner of the socket drains when they read from the socket's file descriptor.
3270 This function determines whether the socket can receive data from
3271 the sender specified by m_label.
3273 @warning There is an outstanding design issue surrounding the placement
3274 of this function. The check must be placed either before or after the
3275 TCP sequence and ACK counters are updated. Placing the check before
3276 the counters are updated causes the incoming packet to be resent by
3277 the remote if the check rejects it. Placing the check after the counters
3278 are updated results in a completely silent drop. As far as each TCP stack
3279 is concerned the packet was received, however, the data will not be in the
3280 socket's receive queue. Another consideration is that the current design
3281 requires using the "failed label" occasionally. In that case, on rejection,
3282 we want the remote TCP to resend the data. Because of this, we chose to
3283 place this check before the counters are updated, so rejected packets will be
3284 resent by the remote host.
3286 If a policy keeps rejecting the same packet, eventually the connection will
3287 be dropped. Policies have several options if this design causes problems.
3288 For example, one options is to sanitize the mbuf such that it is acceptable,
3289 then accept it. That may require negotiation between policies as the
3290 Framework will not know to re-check the packet.
3292 The policy must handle NULL MBUF labels. This will likely be the case
3293 for non-local TCP sockets for example.
3295 @return Return 0 if access if granted, otherwise an appropriate
3296 value for errno should be returned.
3298 typedef int mpo_socket_check_deliver_t(
3300 struct label
*so_label
,
3302 struct label
*m_label
3305 @brief Access control check for socket kqfilter
3306 @param cred Subject credential
3307 @param kn Object knote
3308 @param so Object socket
3309 @param socklabel Policy label for socket
3311 Determine whether the subject identified by the credential can
3312 receive the knote on the passed socket.
3314 @return Return 0 if access if granted, otherwise an appropriate
3315 value for errno should be returned.
3317 typedef int mpo_socket_check_kqfilter_t(
3321 struct label
*socklabel
3324 @brief Access control check for socket relabel
3325 @param cred Subject credential
3326 @param so Object socket
3327 @param so_label The current label of so
3328 @param newlabel The label to be assigned to so
3330 Determine whether the subject identified by the credential can
3331 change the label on the socket.
3333 @return Return 0 if access if granted, otherwise an appropriate
3334 value for errno should be returned.
3336 typedef int mpo_socket_check_label_update_t(
3339 struct label
*so_label
,
3340 struct label
*newlabel
3343 @brief Access control check for socket listen
3344 @param cred Subject credential
3345 @param so Object socket
3346 @param socklabel Policy label for socket
3348 Determine whether the subject identified by the credential can
3349 listen() on the passed socket.
3351 @return Return 0 if access if granted, otherwise an appropriate
3352 value for errno should be returned.
3354 typedef int mpo_socket_check_listen_t(
3357 struct label
*socklabel
3360 @brief Access control check for socket receive
3361 @param cred Subject credential
3362 @param so Object socket
3363 @param socklabel Policy label for socket
3365 Determine whether the subject identified by the credential can
3366 receive data from the socket.
3368 @return Return 0 if access if granted, otherwise an appropriate
3369 value for errno should be returned.
3371 typedef int mpo_socket_check_receive_t(
3374 struct label
*socklabel
3378 @brief Access control check for socket receive
3379 @param cred Subject credential
3380 @param socket Object socket
3381 @param socklabel Policy label for socket
3382 @param addr Name of the remote socket
3384 Determine whether the subject identified by the credential can
3385 receive data from the remote host specified by addr.
3387 @return Return 0 if access if granted, otherwise an appropriate
3388 value for errno should be returned.
3390 typedef int mpo_socket_check_received_t(
3392 struct socket
*sock
,
3393 struct label
*socklabel
,
3394 struct sockaddr
*saddr
3399 @brief Access control check for socket select
3400 @param cred Subject credential
3401 @param so Object socket
3402 @param socklabel Policy label for socket
3403 @param which The operation selected on: FREAD or FWRITE
3405 Determine whether the subject identified by the credential can use the
3406 socket in a call to select().
3408 @return Return 0 if access if granted, otherwise an appropriate
3409 value for errno should be returned.
3411 typedef int mpo_socket_check_select_t(
3414 struct label
*socklabel
,
3418 @brief Access control check for socket send
3419 @param cred Subject credential
3420 @param so Object socket
3421 @param socklabel Policy label for socket
3422 @param addr Address being sent to
3424 Determine whether the subject identified by the credential can send
3427 @return Return 0 if access if granted, otherwise an appropriate
3428 value for errno should be returned.
3430 typedef int mpo_socket_check_send_t(
3433 struct label
*socklabel
,
3434 struct sockaddr
*addr
3437 @brief Access control check for retrieving socket status
3438 @param cred Subject credential
3439 @param so Object socket
3440 @param socklabel Policy label for so
3442 Determine whether the subject identified by the credential can
3443 execute the stat() system call on the given socket.
3445 @return Return 0 if access if granted, otherwise an appropriate
3446 value for errno should be returned.
3448 typedef int mpo_socket_check_stat_t(
3451 struct label
*socklabel
3454 @brief Access control check for setting socket options
3455 @param cred Subject credential
3456 @param so Object socket
3457 @param socklabel Policy label for so
3458 @param sopt The options being set
3460 Determine whether the subject identified by the credential can
3461 execute the setsockopt system call on the given socket.
3463 @return Return 0 if access if granted, otherwise an appropriate
3464 value for errno should be returned.
3466 typedef int mpo_socket_check_setsockopt_t(
3469 struct label
*socklabel
,
3470 struct sockopt
*sopt
3473 @brief Access control check for getting socket options
3474 @param cred Subject credential
3475 @param so Object socket
3476 @param socklabel Policy label for so
3477 @param sopt The options to get
3479 Determine whether the subject identified by the credential can
3480 execute the getsockopt system call on the given socket.
3482 @return Return 0 if access if granted, otherwise an appropriate
3483 value for errno should be returned.
3485 typedef int mpo_socket_check_getsockopt_t(
3488 struct label
*socklabel
,
3489 struct sockopt
*sopt
3492 @brief Label a socket
3493 @param oldsock Listening socket
3494 @param oldlabel Policy label associated with oldsock
3495 @param newsock New socket
3496 @param newlabel Policy label associated with newsock
3498 A new socket is created when a connection is accept(2)ed. This
3499 function labels the new socket based on the existing listen(2)ing
3502 typedef void mpo_socket_label_associate_accept_t(
3504 struct label
*oldlabel
,
3506 struct label
*newlabel
3509 @brief Assign a label to a new socket
3510 @param cred Credential of the owning process
3511 @param so The socket being labeled
3512 @param solabel The label
3513 @warning cred can be NULL
3515 Set the label on a newly created socket from the passed subject
3516 credential. This call is made when a socket is created. The
3517 credentials may be null if the socket is being created by the
3520 typedef void mpo_socket_label_associate_t(
3523 struct label
*solabel
3526 @brief Copy a socket label
3527 @param src Source label
3528 @param dest Destination label
3530 Copy the socket label information in src into dest.
3532 typedef void mpo_socket_label_copy_t(
3537 @brief Destroy socket label
3538 @param label The label to be destroyed
3540 Destroy a socket label. Since the object is going out of
3541 scope, policy modules should free any internal storage associated
3542 with the label so that it may be destroyed.
3544 typedef void mpo_socket_label_destroy_t(
3548 @brief Externalize a socket label
3549 @param label Label to be externalized
3550 @param element_name Name of the label namespace for which labels should be
3552 @param sb String buffer to be filled with a text representation of label
3554 Produce an externalized socket label based on the label structure passed.
3555 An externalized label consists of a text representation of the label
3556 contents that can be used with userland applications and read by the
3557 user. If element_name does not match a namespace managed by the policy,
3558 simply return 0. Only return nonzero if an error occurs while externalizing
3561 @return In the event of an error, an appropriate value for errno
3562 should be returned, otherwise return 0 upon success.
3564 typedef int mpo_socket_label_externalize_t(
3565 struct label
*label
,
3570 @brief Initialize socket label
3571 @param label New label to initialize
3572 @param waitok Malloc flags
3574 Initialize the label of a newly instantiated socket. The waitok
3575 field may be one of M_WAITOK and M_NOWAIT, and should be employed to
3576 avoid performing a sleeping malloc(9) during this initialization
3577 call. It it not always safe to sleep during this entry point.
3579 @warning Since it is possible for the waitok flags to be set to
3580 M_NOWAIT, the malloc operation may fail.
3582 @return In the event of an error, an appropriate value for errno
3583 should be returned, otherwise return 0 upon success.
3585 typedef int mpo_socket_label_init_t(
3586 struct label
*label
,
3590 @brief Internalize a socket label
3591 @param label Label to be filled in
3592 @param element_name Name of the label namespace for which the label should
3594 @param element_data Text data to be internalized
3596 Produce an internal socket label structure based on externalized label
3597 data in text format.
3599 The policy's internalize entry points will be called only if the
3600 policy has registered interest in the label namespace.
3602 @return In the event of an error, an appropriate value for errno
3603 should be returned, otherwise return 0 upon success.
3605 typedef int mpo_socket_label_internalize_t(
3606 struct label
*label
,
3611 @brief Relabel socket
3612 @param cred Subject credential
3613 @param so Object; socket
3614 @param so_label Current label of the socket
3615 @param newlabel The label to be assigned to so
3617 The subject identified by the credential has previously requested
3618 and was authorized to relabel the socket; this entry point allows
3619 policies to perform the actual label update operation.
3621 @warning XXX This entry point will likely change in future versions.
3623 typedef void mpo_socket_label_update_t(
3626 struct label
*so_label
,
3627 struct label
*newlabel
3630 @brief Set the peer label on a socket from mbuf
3631 @param m Mbuf chain received on socket so
3632 @param m_label Label for m
3633 @param so Current label for the socket
3634 @param so_label Policy label to be filled out for the socket
3636 Set the peer label of a socket based on the label of the sender of the
3639 This is called for every TCP/IP packet received. The first call for a given
3640 socket operates on a newly initialized label, and subsequent calls operate
3641 on existing label data.
3643 @warning Because this can affect performance significantly, it has
3644 different sematics than other 'set' operations. Typically, 'set' operations
3645 operate on newly initialzed labels and policies do not need to worry about
3646 clobbering existing values. In this case, it is too inefficient to
3647 initialize and destroy a label every time data is received for the socket.
3648 Instead, it is up to the policies to determine how to replace the label data.
3649 Most policies should be able to replace the data inline.
3651 typedef void mpo_socketpeer_label_associate_mbuf_t(
3653 struct label
*m_label
,
3655 struct label
*so_label
3658 @brief Set the peer label on a socket from socket
3659 @param source Local socket
3660 @param sourcelabel Policy label for source
3661 @param target Peer socket
3662 @param targetlabel Policy label to fill in for target
3664 Set the peer label on a stream UNIX domain socket from the passed
3665 remote socket endpoint. This call will be made when the socket pair
3666 is connected, and will be made for both endpoints.
3668 Note that this call is only made on connection; it is currently not updated
3669 during communication.
3671 typedef void mpo_socketpeer_label_associate_socket_t(
3673 struct label
*sourcelabel
,
3675 struct label
*targetlabel
3678 @brief Destroy socket peer label
3679 @param label The peer label to be destroyed
3681 Destroy a socket peer label. Since the object is going out of
3682 scope, policy modules should free any internal storage associated
3683 with the label so that it may be destroyed.
3685 typedef void mpo_socketpeer_label_destroy_t(
3689 @brief Externalize a socket peer label
3690 @param label Label to be externalized
3691 @param element_name Name of the label namespace for which labels should be
3693 @param sb String buffer to be filled with a text representation of label
3695 Produce an externalized socket peer label based on the label structure
3696 passed. An externalized label consists of a text representation of the
3697 label contents that can be used with userland applications and read by the
3698 user. If element_name does not match a namespace managed by the policy,
3699 simply return 0. Only return nonzero if an error occurs while externalizing
3702 @return In the event of an error, an appropriate value for errno
3703 should be returned, otherwise return 0 upon success.
3705 typedef int mpo_socketpeer_label_externalize_t(
3706 struct label
*label
,
3711 @brief Initialize socket peer label
3712 @param label New label to initialize
3713 @param waitok Malloc flags
3715 Initialize the peer label of a newly instantiated socket. The
3716 waitok field may be one of M_WAITOK and M_NOWAIT, and should be
3717 employed to avoid performing a sleeping malloc(9) during this
3718 initialization call. It it not always safe to sleep during this
3721 @warning Since it is possible for the waitok flags to be set to
3722 M_NOWAIT, the malloc operation may fail.
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_init_t(
3728 struct label
*label
,
3732 @brief Access control check for enabling accounting
3733 @param cred Subject credential
3734 @param vp Accounting file
3735 @param vlabel Label associated with vp
3737 Determine whether the subject should be allowed to enable accounting,
3738 based on its label and the label of the accounting log file. See
3739 acct(5) for more information.
3741 As accounting is disabled by passing NULL to the acct(2) system call,
3742 the policy should be prepared for both 'vp' and 'vlabel' to be NULL.
3744 @return Return 0 if access is granted, otherwise an appropriate value for
3745 errno should be returned.
3747 typedef int mpo_system_check_acct_t(
3750 struct label
*vlabel
3753 @brief Access control check for audit
3754 @param cred Subject credential
3755 @param record Audit record
3756 @param length Audit record length
3758 Determine whether the subject identified by the credential can submit
3759 an audit record for inclusion in the audit log via the audit() system call.
3761 @return Return 0 if access is granted, otherwise an appropriate value for
3762 errno should be returned.
3764 typedef int mpo_system_check_audit_t(
3770 @brief Access control check for controlling audit
3771 @param cred Subject credential
3772 @param vp Audit file
3773 @param vl Label associated with vp
3775 Determine whether the subject should be allowed to enable auditing using
3776 the auditctl() system call, based on its label and the label of the proposed
3779 @return Return 0 if access is granted, otherwise an appropriate value for
3780 errno should be returned.
3782 typedef int mpo_system_check_auditctl_t(
3788 @brief Access control check for manipulating auditing
3789 @param cred Subject credential
3790 @param cmd Audit control command
3792 Determine whether the subject identified by the credential can perform
3793 the audit subsystem control operation cmd via the auditon() system call.
3795 @return Return 0 if access is granted, otherwise an appropriate value for
3796 errno should be returned.
3798 typedef int mpo_system_check_auditon_t(
3803 @brief Access control check for obtaining the host control port
3804 @param cred Subject credential
3806 Determine whether the subject identified by the credential can
3807 obtain the host control port.
3809 @return Return 0 if access is granted, or non-zero otherwise.
3811 typedef int mpo_system_check_host_priv_t(
3815 @brief Access control check for calling NFS services
3816 @param cred Subject credential
3818 Determine whether the subject identified by the credential should be
3819 allowed to call nfssrv(2).
3821 @return Return 0 if access is granted, otherwise an appropriate value for
3822 errno should be returned.
3824 typedef int mpo_system_check_nfsd_t(
3828 @brief Access control check for reboot
3829 @param cred Subject credential
3830 @param howto howto parameter from reboot(2)
3832 Determine whether the subject identified by the credential should be
3833 allowed to reboot the system in the specified manner.
3835 @return Return 0 if access is granted, otherwise an appropriate value for
3836 errno should be returned.
3838 typedef int mpo_system_check_reboot_t(
3843 @brief Access control check for setting system clock
3844 @param cred Subject credential
3846 Determine whether the subject identified by the credential should be
3847 allowed to set the system clock.
3849 @return Return 0 if access is granted, otherwise an appropriate value for
3850 errno should be returned.
3852 typedef int mpo_system_check_settime_t(
3856 @brief Access control check for removing swap devices
3857 @param cred Subject credential
3858 @param vp Swap device
3859 @param label Label associated with vp
3861 Determine whether the subject identified by the credential should be
3862 allowed to remove vp as a swap device.
3864 @return Return 0 if access is granted, otherwise an appropriate value for
3865 errno should be returned.
3867 typedef int mpo_system_check_swapoff_t(
3873 @brief Access control check for adding swap devices
3874 @param cred Subject credential
3875 @param vp Swap device
3876 @param label Label associated with vp
3878 Determine whether the subject identified by the credential should be
3879 allowed to add vp as a swap device.
3881 @return Return 0 if access is granted, otherwise an appropriate value for
3882 errno should be returned.
3884 typedef int mpo_system_check_swapon_t(
3890 @brief Access control check for sysctl
3891 @param cred Subject credential
3892 @param name Integer name; see sysctl(3)
3893 @param namelen Length of name array of integers; see sysctl(3)
3894 @param old 0 or address where to store old value; see sysctl(3)
3895 @param oldlenp Pointer to length of old buffer; see sysctl(3)
3896 @param inkernel Boolean; 1 if called from kernel
3897 @param newvalue 0 or address of new value; see sysctl(3)
3898 @param newlen Length of new buffer; see sysctl(3)
3900 Determine whether the subject identified by the credential should be
3901 allowed to make the specified sysctl(3) transaction.
3903 The sysctl(3) call specifies that if the old value is not desired,
3904 oldp and oldlenp should be set to NULL. Likewise, if a new value is
3905 not to be set, newp should be set to NULL and newlen set to 0.
3907 @return Return 0 if access is granted, otherwise an appropriate value for
3908 errno should be returned.
3910 typedef int mpo_system_check_sysctl_t(
3914 user_addr_t old
, /* NULLOK */
3915 user_addr_t oldlenp
, /* NULLOK */
3917 user_addr_t newvalue
, /* NULLOK */
3921 @brief Create a System V message label
3922 @param cred Subject credential
3923 @param msqkptr The message queue the message will be placed in
3924 @param msqlabel The label of the message queue
3925 @param msgptr The message
3926 @param msglabel The label of the message
3928 Label the message as its placed in the message queue.
3930 typedef void mpo_sysvmsg_label_associate_t(
3932 struct msqid_kernel
*msqptr
,
3933 struct label
*msqlabel
,
3935 struct label
*msglabel
3938 @brief Destroy System V message label
3939 @param label The label to be destroyed
3941 Destroy a System V message label. Since the object is
3942 going out of scope, policy modules should free any internal storage
3943 associated with the label so that it may be destroyed.
3945 typedef void mpo_sysvmsg_label_destroy_t(
3949 @brief Initialize System V message label
3950 @param label New label to initialize
3952 Initialize the label for a newly instantiated System V message.
3954 typedef void mpo_sysvmsg_label_init_t(
3958 @brief Clean up a System V message label
3959 @param label The label to be destroyed
3961 Clean up a System V message label. Darwin pre-allocates
3962 messages at system boot time and re-uses them rather than
3963 allocating new ones. Before messages are returned to the "free
3964 pool", policies can cleanup or overwrite any information present in
3967 typedef void mpo_sysvmsg_label_recycle_t(
3971 @brief Access control check for System V message enqueuing
3972 @param cred Subject credential
3973 @param msgptr The message
3974 @param msglabel The message's label
3975 @param msqkptr The message queue
3976 @param msqlabel The message queue's label
3978 Determine whether the subject identified by the credential can add the
3979 given message to the given message queue.
3981 @return Return 0 if access is granted, otherwise an appropriate value for
3982 errno should be returned.
3984 typedef int mpo_sysvmsq_check_enqueue_t(
3987 struct label
*msglabel
,
3988 struct msqid_kernel
*msqptr
,
3989 struct label
*msqlabel
3992 @brief Access control check for System V message reception
3993 @param cred The credential of the intended recipient
3994 @param msgptr The message
3995 @param msglabel The message's label
3997 Determine whether the subject identified by the credential can receive
4000 @return Return 0 if access is granted, otherwise an appropriate value for
4001 errno should be returned.
4003 typedef int mpo_sysvmsq_check_msgrcv_t(
4006 struct label
*msglabel
4009 @brief Access control check for System V message queue removal
4010 @param cred The credential of the caller
4011 @param msgptr The message
4012 @param msglabel The message's label
4014 System V message queues are removed using the msgctl() system call.
4015 The system will iterate over each messsage in the queue, calling this
4016 function for each, to determine whether the caller has the appropriate
4019 @return Return 0 if access is granted, otherwise an appropriate value for
4020 errno should be returned.
4022 typedef int mpo_sysvmsq_check_msgrmid_t(
4025 struct label
*msglabel
4028 @brief Access control check for msgctl()
4029 @param cred The credential of the caller
4030 @param msqptr The message queue
4031 @param msqlabel The message queue's label
4033 This access check is performed to validate calls to msgctl().
4035 @return Return 0 if access is granted, otherwise an appropriate value for
4036 errno should be returned.
4038 typedef int mpo_sysvmsq_check_msqctl_t(
4040 struct msqid_kernel
*msqptr
,
4041 struct label
*msqlabel
,
4045 @brief Access control check to get a System V message queue
4046 @param cred The credential of the caller
4047 @param msqptr The message queue requested
4048 @param msqlabel The message queue's label
4050 On a call to msgget(), if the queue requested already exists,
4051 and it is a public queue, this check will be performed before the
4052 queue's ID is returned to the user.
4054 @return Return 0 if access is granted, otherwise an appropriate value for
4055 errno should be returned.
4057 typedef int mpo_sysvmsq_check_msqget_t(
4059 struct msqid_kernel
*msqptr
,
4060 struct label
*msqlabel
4063 @brief Access control check to receive a System V message from the given queue
4064 @param cred The credential of the caller
4065 @param msqptr The message queue to receive from
4066 @param msqlabel The message queue's label
4068 On a call to msgrcv(), this check is performed to determine whether the
4069 caller has receive rights on the given queue.
4071 @return Return 0 if access is granted, otherwise an appropriate value for
4072 errno should be returned.
4074 typedef int mpo_sysvmsq_check_msqrcv_t(
4076 struct msqid_kernel
*msqptr
,
4077 struct label
*msqlabel
4080 @brief Access control check to send a System V message to the given queue
4081 @param cred The credential of the caller
4082 @param msqptr The message queue to send to
4083 @param msqlabel The message queue's label
4085 On a call to msgsnd(), this check is performed to determine whether the
4086 caller has send rights on the given queue.
4088 @return Return 0 if access is granted, otherwise an appropriate value for
4089 errno should be returned.
4091 typedef int mpo_sysvmsq_check_msqsnd_t(
4093 struct msqid_kernel
*msqptr
,
4094 struct label
*msqlabel
4097 @brief Create a System V message queue label
4098 @param cred Subject credential
4099 @param msqkptr The message queue
4100 @param msqlabel The label of the message queue
4103 typedef void mpo_sysvmsq_label_associate_t(
4105 struct msqid_kernel
*msqptr
,
4106 struct label
*msqlabel
4109 @brief Destroy System V message queue label
4110 @param label The label to be destroyed
4112 Destroy a System V message queue label. Since the object is
4113 going out of scope, policy modules should free any internal storage
4114 associated with the label so that it may be destroyed.
4116 typedef void mpo_sysvmsq_label_destroy_t(
4120 @brief Initialize System V message queue label
4121 @param label New label to initialize
4123 Initialize the label for a newly instantiated System V message queue.
4125 typedef void mpo_sysvmsq_label_init_t(
4129 @brief Clean up a System V message queue label
4130 @param label The label to be destroyed
4132 Clean up a System V message queue label. Darwin pre-allocates
4133 message queues at system boot time and re-uses them rather than
4134 allocating new ones. Before message queues are returned to the "free
4135 pool", policies can cleanup or overwrite any information present in
4138 typedef void mpo_sysvmsq_label_recycle_t(
4142 @brief Access control check for System V semaphore control operation
4143 @param cred Subject credential
4144 @param semakptr Pointer to semaphore identifier
4145 @param semaklabel Label associated with semaphore
4146 @param cmd Control operation to be performed; see semctl(2)
4148 Determine whether the subject identified by the credential can perform
4149 the operation indicated by cmd on the System V semaphore semakptr.
4151 @return Return 0 if access is granted, otherwise an appropriate value for
4152 errno should be returned.
4154 typedef int mpo_sysvsem_check_semctl_t(
4156 struct semid_kernel
*semakptr
,
4157 struct label
*semaklabel
,
4161 @brief Access control check for obtaining a System V semaphore
4162 @param cred Subject credential
4163 @param semakptr Pointer to semaphore identifier
4164 @param semaklabel Label to associate with the semaphore
4166 Determine whether the subject identified by the credential can
4167 obtain a System V semaphore.
4169 @return Return 0 if access is granted, otherwise an appropriate value for
4170 errno should be returned.
4172 typedef int mpo_sysvsem_check_semget_t(
4174 struct semid_kernel
*semakptr
,
4175 struct label
*semaklabel
4178 @brief Access control check for System V semaphore operations
4179 @param cred Subject credential
4180 @param semakptr Pointer to semaphore identifier
4181 @param semaklabel Label associated with the semaphore
4182 @param accesstype Flags to indicate access (read and/or write)
4184 Determine whether the subject identified by the credential can
4185 perform the operations on the System V semaphore indicated by
4186 semakptr. The accesstype flags hold the maximum set of permissions
4187 from the sem_op array passed to the semop system call. It may
4188 contain SEM_R for read-only operations or SEM_A for read/write
4191 @return Return 0 if access is granted, otherwise an appropriate value for
4192 errno should be returned.
4194 typedef int mpo_sysvsem_check_semop_t(
4196 struct semid_kernel
*semakptr
,
4197 struct label
*semaklabel
,
4201 @brief Create a System V semaphore label
4202 @param cred Subject credential
4203 @param semakptr The semaphore being created
4204 @param semalabel Label to associate with the new semaphore
4206 Label a new System V semaphore. The label was previously
4207 initialized and associated with the semaphore. At this time, an
4208 appropriate initial label value should be assigned to the object and
4209 stored in semalabel.
4211 typedef void mpo_sysvsem_label_associate_t(
4213 struct semid_kernel
*semakptr
,
4214 struct label
*semalabel
4217 @brief Destroy System V semaphore label
4218 @param label The label to be destroyed
4220 Destroy a System V semaphore label. Since the object is
4221 going out of scope, policy modules should free any internal storage
4222 associated with the label so that it may be destroyed.
4224 typedef void mpo_sysvsem_label_destroy_t(
4228 @brief Initialize System V semaphore label
4229 @param label New label to initialize
4231 Initialize the label for a newly instantiated System V semaphore. Sleeping
4234 typedef void mpo_sysvsem_label_init_t(
4238 @brief Clean up a System V semaphore label
4239 @param label The label to be cleaned
4241 Clean up a System V semaphore label. Darwin pre-allocates
4242 semaphores at system boot time and re-uses them rather than
4243 allocating new ones. Before semaphores are returned to the "free
4244 pool", policies can cleanup or overwrite any information present in
4247 typedef void mpo_sysvsem_label_recycle_t(
4251 @brief Access control check for mapping System V shared memory
4252 @param cred Subject credential
4253 @param shmsegptr Pointer to shared memory segment identifier
4254 @param shmseglabel Label associated with the shared memory segment
4255 @param shmflg shmat flags; see shmat(2)
4257 Determine whether the subject identified by the credential can map
4258 the System V shared memory segment associated with shmsegptr.
4260 @return Return 0 if access is granted, otherwise an appropriate value for
4261 errno should be returned.
4263 typedef int mpo_sysvshm_check_shmat_t(
4265 struct shmid_kernel
*shmsegptr
,
4266 struct label
*shmseglabel
,
4270 @brief Access control check for System V shared memory control operation
4271 @param cred Subject credential
4272 @param shmsegptr Pointer to shared memory segment identifier
4273 @param shmseglabel Label associated with the shared memory segment
4274 @param cmd Control operation to be performed; see shmctl(2)
4276 Determine whether the subject identified by the credential can perform
4277 the operation indicated by cmd on the System V shared memory segment
4280 @return Return 0 if access is granted, otherwise an appropriate value for
4281 errno should be returned.
4283 typedef int mpo_sysvshm_check_shmctl_t(
4285 struct shmid_kernel
*shmsegptr
,
4286 struct label
*shmseglabel
,
4290 @brief Access control check for unmapping System V shared memory
4291 @param cred Subject credential
4292 @param shmsegptr Pointer to shared memory segment identifier
4293 @param shmseglabel Label associated with the shared memory segment
4295 Determine whether the subject identified by the credential can unmap
4296 the System V shared memory segment associated with shmsegptr.
4298 @return Return 0 if access is granted, otherwise an appropriate value for
4299 errno should be returned.
4301 typedef int mpo_sysvshm_check_shmdt_t(
4303 struct shmid_kernel
*shmsegptr
,
4304 struct label
*shmseglabel
4307 @brief Access control check obtaining System V shared memory identifier
4308 @param cred Subject credential
4309 @param shmsegptr Pointer to shared memory segment identifier
4310 @param shmseglabel Label associated with the shared memory segment
4311 @param shmflg shmget flags; see shmget(2)
4313 Determine whether the subject identified by the credential can get
4314 the System V shared memory segment address.
4316 @return Return 0 if access is granted, otherwise an appropriate value for
4317 errno should be returned.
4319 typedef int mpo_sysvshm_check_shmget_t(
4321 struct shmid_kernel
*shmsegptr
,
4322 struct label
*shmseglabel
,
4326 @brief Create a System V shared memory region label
4327 @param cred Subject credential
4328 @param shmsegptr The shared memory region being created
4329 @param shmlabel Label to associate with the new shared memory region
4331 Label a new System V shared memory region. The label was previously
4332 initialized and associated with the shared memory region. At this
4333 time, an appropriate initial label value should be assigned to the
4334 object and stored in shmlabel.
4336 typedef void mpo_sysvshm_label_associate_t(
4338 struct shmid_kernel
*shmsegptr
,
4339 struct label
*shmlabel
4342 @brief Destroy System V shared memory label
4343 @param label The label to be destroyed
4345 Destroy a System V shared memory region label. Since the
4346 object is going out of scope, policy modules should free any
4347 internal storage associated with the label so that it may be
4350 typedef void mpo_sysvshm_label_destroy_t(
4354 @brief Initialize System V Shared Memory region label
4355 @param label New label to initialize
4357 Initialize the label for a newly instantiated System V Shared Memory
4358 region. Sleeping is permitted.
4360 typedef void mpo_sysvshm_label_init_t(
4364 @brief Clean up a System V Share Memory Region label
4365 @param shmlabel The label to be cleaned
4367 Clean up a System V Shared Memory Region label. Darwin
4368 pre-allocates these objects at system boot time and re-uses them
4369 rather than allocating new ones. Before the memory regions are
4370 returned to the "free pool", policies can cleanup or overwrite any
4371 information present in the label.
4373 typedef void mpo_sysvshm_label_recycle_t(
4374 struct label
*shmlabel
4377 @brief Access control check for getting a process's task name
4378 @param cred Subject credential
4379 @param proc Object process
4381 Determine whether the subject identified by the credential can get
4382 the passed process's task name port.
4383 This call is used by the task_name_for_pid(2) API.
4385 @return Return 0 if access is granted, otherwise an appropriate value for
4386 errno should be returned. Suggested failure: EACCES for label mismatch,
4387 EPERM for lack of privilege, or ESRCH to hide visibility of the target.
4389 typedef int mpo_proc_check_get_task_name_t(
4394 @brief Access control check for getting a process's task port
4395 @param cred Subject credential
4396 @param proc Object process
4398 Determine whether the subject identified by the credential can get
4399 the passed process's task control port.
4400 This call is used by the task_for_pid(2) API.
4402 @return Return 0 if access is granted, otherwise an appropriate value for
4403 errno should be returned. Suggested failure: EACCES for label mismatch,
4404 EPERM for lack of privilege, or ESRCH to hide visibility of the target.
4406 typedef int mpo_proc_check_get_task_t(
4413 @brief Access control check for manipulating a proc's vm_map
4414 @param cred Subject credential
4415 @param proc Object process
4417 Determine whether the vm_map map belonging to process proc with
4418 credential cred allows the VM_PROT_COPY operation.
4420 @return Return 0 if access is granted, otherwise an appropriate value for
4421 errno should be returned.
4423 typedef int mpo_proc_check_map_prot_copy_allow_t(
4430 @brief Assign a label to a new kernelspace Mach task
4431 @param kproc New task
4432 @param tasklabel Label for new task
4433 @param portlabel Label for new task port
4434 @see mpo_cred_label_associate_kernel_t
4436 Assign labels to a new kernel task and its task port. Both the task and
4437 task port labels should be specified. Both new labels are initialized.
4438 If there is an associated BSD process structure, it will be labelled
4439 with calls to mpo_cred_label_associate_kernel.
4441 typedef void mpo_task_label_associate_kernel_t(
4443 struct label
*tasklabel
,
4444 struct label
*portlabel
4447 @brief Assign a label to a new (userspace) Mach task
4448 @param parent Parent task
4449 @param child New (child) task
4450 @param parentlabel Label of parent task
4451 @param childlabel Label for new task
4452 @param childportlabel Label for new task's task port
4454 Assign labels to a new task and its task port. Both the task and task port
4455 labels should be specified. Both new labels are initialized. If the task
4456 will have an associated BSD process, that information will be made available
4457 by the task_label_update and port_label_update_cred entry points.
4459 typedef void mpo_task_label_associate_t(
4460 struct task
*parent
,
4462 struct label
*parentlabel
,
4463 struct label
*childlabel
,
4464 struct label
*childportlabel
4467 @brief Copy a Mach task label
4468 @param src Source task label
4469 @param dest Destination task label
4471 Copy the Mach task label information from src to dest. This is used
4472 when duplicating label handles to implement copy-on-write semantics.
4474 typedef void mpo_task_label_copy_t(
4479 @brief Destroy Mach task label
4480 @param label The label to be destroyed
4482 Destroy a Mach task label. Since the object is going out of
4483 scope, policy modules should free any internal storage associated
4484 with the label so that it may be destroyed.
4486 typedef void mpo_task_label_destroy_t(
4490 @brief Externalize a task label
4491 @param label Label to be externalized
4492 @param element_name Name of the label namespace for which labels should be
4494 @param sb String buffer to be filled with a text representation of the label
4496 Produce an external representation of the label on a task. An
4497 externalized label consists of a text representation of the label
4498 contents that can be used with user applications. Policy-agnostic
4499 user space tools will display this externalized version.
4501 @return 0 on success, return non-zero if an error occurs while
4502 externalizing the label data.
4505 typedef int mpo_task_label_externalize_t(
4506 struct label
*label
,
4511 @brief Initialize Mach task label
4512 @param label New label to initialize
4514 Initialize the label for a newly instantiated Mach task. Sleeping
4517 typedef void mpo_task_label_init_t(
4521 @brief Internalize a task label
4522 @param label Label to be internalized
4523 @param element_name Name of the label namespace for which the label should
4525 @param element_data Text data to be internalized
4527 Produce a task label from an external representation. An
4528 externalized label consists of a text representation of the label
4529 contents that can be used with user applications. Policy-agnostic
4530 user space tools will forward text version to the kernel for
4531 processing by individual policy modules.
4533 The policy's internalize entry points will be called only if the
4534 policy has registered interest in the label namespace.
4536 @return 0 on success, Otherwise, return non-zero if an error occurs
4537 while internalizing the label data.
4540 typedef int mpo_task_label_internalize_t(
4541 struct label
*label
,
4546 @brief Update a Mach task label
4547 @param cred User credential label to be used as the source
4548 @param task Mach task label to be used as the destination
4549 @see mpo_cred_label_update_t
4550 @see mpo_cred_label_update_execve_t
4552 Update the label on a Mach task, using the supplied user credential
4553 label. When a mac_cred_label_update_execve or a mac_cred_label_update operation
4554 causes the label on a user credential to change, the Mach task label
4555 also needs to be updated to reflect the change. Both labels are
4556 already valid (initialized and created).
4558 @warning XXX We may change the name of this entry point in a future
4559 version of the MAC framework.
4561 typedef void mpo_task_label_update_t(
4566 @brief Perform MAC-related events when a thread returns to user space
4567 @param code The number of the syscall/trap that has finished
4568 @param error The error code that will be returned to user space
4569 @param thread Mach (not BSD) thread that is returning
4571 This entry point permits policy modules to perform MAC-related
4572 events when a thread returns to user space, via a system call
4573 return, trap return, or otherwise.
4575 typedef void mpo_thread_userret_t(
4578 struct thread
*thread
4581 @brief Check vnode access
4582 @param cred Subject credential
4583 @param vp Object vnode
4584 @param label Label for vp
4585 @param acc_mode access(2) flags
4587 Determine how invocations of access(2) and related calls by the
4588 subject identified by the credential should return when performed
4589 on the passed vnode using the passed access flags. This should
4590 generally be implemented using the same semantics used in
4591 mpo_vnode_check_open.
4593 @return Return 0 if access is granted, otherwise an appropriate value for
4594 errno should be returned. Suggested failure: EACCES for label mismatch or
4595 EPERM for lack of privilege.
4597 typedef int mpo_vnode_check_access_t(
4600 struct label
*label
,
4604 @brief Access control check for changing working directory
4605 @param cred Subject credential
4606 @param dvp Object; vnode to chdir(2) into
4607 @param dlabel Policy label for dvp
4609 Determine whether the subject identified by the credential can change
4610 the process working directory to the passed vnode.
4612 @return Return 0 if access is granted, otherwise an appropriate value for
4613 errno should be returned. Suggested failure: EACCES for label mismatch or
4614 EPERM for lack of privilege.
4616 typedef int mpo_vnode_check_chdir_t(
4619 struct label
*dlabel
4622 @brief Access control check for changing root directory
4623 @param cred Subject credential
4624 @param dvp Directory vnode
4625 @param dlabel Policy label associated with dvp
4626 @param cnp Component name for dvp
4628 Determine whether the subject identified by the credential should be
4629 allowed to chroot(2) into the specified directory (dvp).
4631 @return In the event of an error, an appropriate value for errno
4632 should be returned, otherwise return 0 upon success.
4634 typedef int mpo_vnode_check_chroot_t(
4637 struct label
*dlabel
,
4638 struct componentname
*cnp
4641 @brief Access control check for creating vnode
4642 @param cred Subject credential
4643 @param dvp Directory vnode
4644 @param dlabel Policy label for dvp
4645 @param cnp Component name for dvp
4646 @param vap vnode attributes for vap
4648 Determine whether the subject identified by the credential can create
4649 a vnode with the passed parent directory, passed name information,
4650 and passed attribute information. This call may be made in a number of
4651 situations, including as a result of calls to open(2) with O_CREAT,
4652 mknod(2), mkfifo(2), and others.
4654 @return Return 0 if access is granted, otherwise an appropriate value for
4655 errno should be returned. Suggested failure: EACCES for label mismatch or
4656 EPERM for lack of privilege.
4658 typedef int mpo_vnode_check_create_t(
4661 struct label
*dlabel
,
4662 struct componentname
*cnp
,
4663 struct vnode_attr
*vap
4666 @brief Access control check for deleting extended attribute
4667 @param cred Subject credential
4668 @param vp Object vnode
4669 @param vlabel Label associated with vp
4670 @param name Extended attribute name
4672 Determine whether the subject identified by the credential can delete
4673 the extended attribute from the passed vnode.
4675 @return Return 0 if access is granted, otherwise an appropriate value for
4676 errno should be returned. Suggested failure: EACCES for label mismatch or
4677 EPERM for lack of privilege.
4679 typedef int mpo_vnode_check_deleteextattr_t(
4682 struct label
*vlabel
,
4686 @brief Access control check for exchanging file data
4687 @param cred Subject credential
4688 @param v1 vnode 1 to swap
4689 @param vl1 Policy label for v1
4690 @param v2 vnode 2 to swap
4691 @param vl2 Policy label for v2
4693 Determine whether the subject identified by the credential can swap the data
4694 in the two supplied vnodes.
4696 @return Return 0 if access is granted, otherwise an appropriate value for
4697 errno should be returned. Suggested failure: EACCES for label mismatch or
4698 EPERM for lack of privilege.
4700 typedef int mpo_vnode_check_exchangedata_t(
4708 @brief Access control check for executing the vnode
4709 @param cred Subject credential
4710 @param vp Object vnode to execute
4711 @param label Policy label for vp
4712 @param execlabel Userspace provided execution label
4713 @param cnp Component name for file being executed
4715 Determine whether the subject identified by the credential can execute
4716 the passed vnode. Determination of execute privilege is made separately
4717 from decisions about any process label transitioning event.
4719 The final label, execlabel, corresponds to a label supplied by a
4720 user space application through the use of the mac_execve system call.
4721 This label will be NULL if the user application uses the the vendor
4722 execve(2) call instead of the MAC Framework mac_execve() call.
4724 @return Return 0 if access is granted, otherwise an appropriate value for
4725 errno should be returned. Suggested failure: EACCES for label mismatch or
4726 EPERM for lack of privilege.
4728 typedef int mpo_vnode_check_exec_t(
4731 struct label
*label
,
4732 struct label
*execlabel
, /* NULLOK */
4733 struct componentname
*cnp
,
4737 @brief Access control check after determining the code directory hash
4739 typedef int mpo_vnode_check_signature_t(struct vnode
*vp
, struct label
*label
,
4740 unsigned char *sha1
, void *signature
,
4744 @brief Access control check for retrieving file attributes
4745 @param cred Subject credential
4746 @param vp Object vnode
4747 @param vlabel Policy label for vp
4748 @param alist List of attributes to retrieve
4750 Determine whether the subject identified by the credential can read
4751 various attributes of the specified vnode, or the filesystem or volume on
4752 which that vnode resides. See <sys/attr.h> for definitions of the
4755 @return Return 0 if access is granted, otherwise an appropriate value for
4756 errno should be returned. Suggested failure: EACCES for label mismatch or
4757 EPERM for lack of privilege. Access control covers all attributes requested
4758 with this call; the security policy is not permitted to change the set of
4759 attributes requested.
4761 typedef int mpo_vnode_check_getattrlist_t(
4764 struct label
*vlabel
,
4765 struct attrlist
*alist
4768 @brief Access control check for retrieving an extended attribute
4769 @param cred Subject credential
4770 @param vp Object vnode
4771 @param label Policy label for vp
4772 @param name Extended attribute name
4773 @param uio I/O structure pointer
4775 Determine whether the subject identified by the credential can retrieve
4776 the extended attribute from the passed vnode. The uio parameter
4777 will be NULL when the getxattr(2) call has been made with a NULL data
4778 value; this is done to request the size of the data only.
4780 @return Return 0 if access is granted, otherwise an appropriate value for
4781 errno should be returned. Suggested failure: EACCES for label mismatch or
4782 EPERM for lack of privilege.
4784 typedef int mpo_vnode_check_getextattr_t(
4787 struct label
*label
, /* NULLOK */
4789 struct uio
*uio
/* NULLOK */
4792 @brief Access control check for ioctl
4793 @param cred Subject credential
4794 @param vp Object vnode
4795 @param label Policy label for vp
4796 @param com Device-dependent request code; see ioctl(2)
4798 Determine whether the subject identified by the credential can perform
4799 the ioctl operation indicated by com.
4801 @warning Since ioctl data is opaque from the standpoint of the MAC
4802 framework, and since ioctls can affect many aspects of system
4803 operation, policies must exercise extreme care when implementing
4804 access control checks.
4806 @return Return 0 if access is granted, otherwise an appropriate value for
4807 errno should be returned.
4809 typedef int mpo_vnode_check_ioctl_t(
4812 struct label
*label
,
4816 @brief Access control check for vnode kqfilter
4817 @param cred Subject credential
4818 @param kn Object knote
4819 @param vp Object vnode
4820 @param label Policy label for vp
4822 Determine whether the subject identified by the credential can
4823 receive the knote on the passed vnode.
4825 @return Return 0 if access if granted, otherwise an appropriate
4826 value for errno should be returned.
4828 typedef int mpo_vnode_check_kqfilter_t(
4829 kauth_cred_t active_cred
,
4830 kauth_cred_t file_cred
, /* NULLOK */
4836 @brief Access control check for relabel
4837 @param cred Subject credential
4838 @param vp Object vnode
4839 @param vnodelabel Existing policy label for vp
4840 @param newlabel Policy label update to later be applied to vp
4841 @see mpo_relable_vnode_t
4843 Determine whether the subject identified by the credential can relabel
4844 the passed vnode to the passed label update. If all policies permit
4845 the label change, the actual relabel entry point (mpo_vnode_label_update)
4848 @return Return 0 if access is granted, otherwise an appropriate value for
4849 errno should be returned.
4851 typedef int mpo_vnode_check_label_update_t(
4854 struct label
*vnodelabel
,
4855 struct label
*newlabel
4858 @brief Access control check for creating link
4859 @param cred Subject credential
4860 @param dvp Directory vnode
4861 @param dlabel Policy label associated with dvp
4862 @param vp Link destination vnode
4863 @param label Policy label associated with vp
4864 @param cnp Component name for the link being created
4866 Determine whether the subject identified by the credential should be
4867 allowed to create a link to the vnode vp with the name specified by cnp.
4869 @return Return 0 if access is granted, otherwise an appropriate value for
4870 errno should be returned.
4872 typedef int mpo_vnode_check_link_t(
4875 struct label
*dlabel
,
4877 struct label
*label
,
4878 struct componentname
*cnp
4881 @brief Access control check for listing extended attributes
4882 @param cred Subject credential
4883 @param vp Object vnode
4884 @param vlabel Policy label associated with vp
4886 Determine whether the subject identified by the credential can retrieve
4887 a list of named extended attributes from a vnode.
4889 @return Return 0 if access is granted, otherwise an appropriate value for
4890 errno should be returned.
4892 typedef int mpo_vnode_check_listextattr_t(
4895 struct label
*vlabel
4898 @brief Access control check for lookup
4899 @param cred Subject credential
4900 @param dvp Object vnode
4901 @param dlabel Policy label for dvp
4902 @param cnp Component name being looked up
4904 Determine whether the subject identified by the credential can perform
4905 a lookup in the passed directory vnode for the passed name (cnp).
4907 @return Return 0 if access is granted, otherwise an appropriate value for
4908 errno should be returned. Suggested failure: EACCES for label mismatch or
4909 EPERM for lack of privilege.
4911 typedef int mpo_vnode_check_lookup_t(
4914 struct label
*dlabel
,
4915 struct componentname
*cnp
4918 @brief Access control check for open
4919 @param cred Subject credential
4920 @param vp Object vnode
4921 @param label Policy label associated with vp
4922 @param acc_mode open(2) access mode
4924 Determine whether the subject identified by the credential can perform
4925 an open operation on the passed vnode with the passed access mode.
4927 @return Return 0 if access is granted, otherwise an appropriate value for
4928 errno should be returned. Suggested failure: EACCES for label mismatch or
4929 EPERM for lack of privilege.
4931 typedef int mpo_vnode_check_open_t(
4934 struct label
*label
,
4938 @brief Access control check for read
4939 @param active_cred Subject credential
4940 @param file_cred Credential associated with the struct fileproc
4941 @param vp Object vnode
4942 @param label Policy label for vp
4944 Determine whether the subject identified by the credential can perform
4945 a read operation on the passed vnode. The active_cred hold the credentials
4946 of the subject performing the operation, and file_cred holds the
4947 credentials of the subject that originally opened the file.
4949 @return Return 0 if access is granted, otherwise an appropriate value for
4950 errno should be returned. Suggested failure: EACCES for label mismatch or
4951 EPERM for lack of privilege.
4953 typedef int mpo_vnode_check_read_t(
4954 kauth_cred_t active_cred
, /* SUBJECT */
4955 kauth_cred_t file_cred
, /* NULLOK */
4956 struct vnode
*vp
, /* OBJECT */
4957 struct label
*label
/* LABEL */
4960 @brief Access control check for read directory
4961 @param cred Subject credential
4962 @param dvp Object directory vnode
4963 @param dlabel Policy label for dvp
4965 Determine whether the subject identified by the credential can
4966 perform a readdir operation on the passed directory vnode.
4968 @return Return 0 if access is granted, otherwise an appropriate value for
4969 errno should be returned. Suggested failure: EACCES for label mismatch or
4970 EPERM for lack of privilege.
4972 typedef int mpo_vnode_check_readdir_t(
4973 kauth_cred_t cred
, /* SUBJECT */
4974 struct vnode
*dvp
, /* OBJECT */
4975 struct label
*dlabel
/* LABEL */
4978 @brief Access control check for read link
4979 @param cred Subject credential
4980 @param vp Object vnode
4981 @param label Policy label for vp
4983 Determine whether the subject identified by the credential can perform
4984 a readlink operation on the passed symlink vnode. This call can be made
4985 in a number of situations, including an explicit readlink call by the
4986 user process, or as a result of an implicit readlink during a name
4987 lookup by the process.
4989 @return Return 0 if access is granted, otherwise an appropriate value for
4990 errno should be returned. Suggested failure: EACCES for label mismatch or
4991 EPERM for lack of privilege.
4993 typedef int mpo_vnode_check_readlink_t(
4999 @brief Access control check for rename from
5000 @param cred Subject credential
5001 @param dvp Directory vnode
5002 @param dlabel Policy label associated with dvp
5003 @param vp vnode to be renamed
5004 @param label Policy label associated with vp
5005 @param cnp Component name for vp
5006 @see mpo_vnode_check_rename_to_t
5008 Determine whether the subject identified by the credential should be
5009 allowed to rename the vnode vp to something else.
5011 Due to VFS locking constraints (to make sure proper vnode locks are
5012 held during this entry point), the vnode relabel checks had to be
5013 split into two parts: relabel_from and relabel to.
5015 @return Return 0 if access is granted, otherwise an appropriate value for
5016 errno should be returned.
5018 typedef int mpo_vnode_check_rename_from_t(
5021 struct label
*dlabel
,
5023 struct label
*label
,
5024 struct componentname
*cnp
5027 @brief Access control check for rename to
5028 @param cred Subject credential
5029 @param dvp Directory vnode
5030 @param dlabel Policy label associated with dvp
5031 @param vp Overwritten vnode
5032 @param label Policy label associated with vp
5033 @param samedir Boolean; 1 if the source and destination directories are the same
5034 @param cnp Destination component name
5035 @see mpo_vnode_check_rename_from_t
5037 Determine whether the subject identified by the credential should be
5038 allowed to rename to the vnode vp, into the directory dvp, or to the
5039 name represented by cnp. If there is no existing file to overwrite,
5040 vp and label will be NULL.
5042 Due to VFS locking constraints (to make sure proper vnode locks are
5043 held during this entry point), the vnode relabel checks had to be
5044 split into two parts: relabel_from and relabel to.
5046 @return Return 0 if access is granted, otherwise an appropriate value for
5047 errno should be returned.
5049 typedef int mpo_vnode_check_rename_to_t(
5052 struct label
*dlabel
,
5053 struct vnode
*vp
, /* NULLOK */
5054 struct label
*label
, /* NULLOK */
5056 struct componentname
*cnp
5059 @brief Access control check for revoke
5060 @param cred Subject credential
5061 @param vp Object vnode
5062 @param label Policy label for vp
5064 Determine whether the subject identified by the credential can revoke
5065 access to the passed vnode.
5067 @return Return 0 if access is granted, otherwise an appropriate value for
5068 errno should be returned. Suggested failure: EACCES for label mismatch or
5069 EPERM for lack of privilege.
5071 typedef int mpo_vnode_check_revoke_t(
5077 @brief Access control check for select
5078 @param cred Subject credential
5079 @param vp Object vnode
5080 @param label Policy label for vp
5081 @param which The operation selected on: FREAD or FWRITE
5083 Determine whether the subject identified by the credential can select
5086 @return Return 0 if access is granted, otherwise an appropriate value for
5087 errno should be returned.
5089 typedef int mpo_vnode_check_select_t(
5092 struct label
*label
,
5096 @brief Access control check for setting file attributes
5097 @param cred Subject credential
5098 @param vp Object vnode
5099 @param vlabel Policy label for vp
5100 @param alist List of attributes to set
5102 Determine whether the subject identified by the credential can set
5103 various attributes of the specified vnode, or the filesystem or volume on
5104 which that vnode resides. See <sys/attr.h> for definitions of the
5107 @return Return 0 if access is granted, otherwise an appropriate value for
5108 errno should be returned. Suggested failure: EACCES for label mismatch or
5109 EPERM for lack of privilege. Access control covers all attributes requested
5112 typedef int mpo_vnode_check_setattrlist_t(
5115 struct label
*vlabel
,
5116 struct attrlist
*alist
5119 @brief Access control check for setting extended attribute
5120 @param cred Subject credential
5121 @param vp Object vnode
5122 @param label Policy label for vp
5123 @param name Extended attribute name
5124 @param uio I/O structure pointer
5126 Determine whether the subject identified by the credential can set the
5127 extended attribute of passed name and passed namespace on the passed
5128 vnode. Policies implementing security labels backed into extended
5129 attributes may want to provide additional protections for those
5130 attributes. Additionally, policies should avoid making decisions based
5131 on the data referenced from uio, as there is a potential race condition
5132 between this check and the actual operation. The uio may also be NULL
5133 if a delete operation is being performed.
5135 @return Return 0 if access is granted, otherwise an appropriate value for
5136 errno should be returned. Suggested failure: EACCES for label mismatch or
5137 EPERM for lack of privilege.
5139 typedef int mpo_vnode_check_setextattr_t(
5142 struct label
*label
,
5147 @brief Access control check for setting flags
5148 @param cred Subject credential
5149 @param vp Object vnode
5150 @param label Policy label for vp
5151 @param flags File flags; see chflags(2)
5153 Determine whether the subject identified by the credential can set
5154 the passed flags on the passed vnode.
5156 @return Return 0 if access is granted, otherwise an appropriate value for
5157 errno should be returned. Suggested failure: EACCES for label mismatch or
5158 EPERM for lack of privilege.
5160 typedef int mpo_vnode_check_setflags_t(
5163 struct label
*label
,
5167 @brief Access control check for setting mode
5168 @param cred Subject credential
5169 @param vp Object vnode
5170 @param label Policy label for vp
5171 @param mode File mode; see chmod(2)
5173 Determine whether the subject identified by the credential can set
5174 the passed mode on the passed vnode.
5176 @return Return 0 if access is granted, otherwise an appropriate value for
5177 errno should be returned. Suggested failure: EACCES for label mismatch or
5178 EPERM for lack of privilege.
5180 typedef int mpo_vnode_check_setmode_t(
5183 struct label
*label
,
5187 @brief Access control check for setting uid and gid
5188 @param cred Subject credential
5189 @param vp Object vnode
5190 @param label Policy label for vp
5194 Determine whether the subject identified by the credential can set
5195 the passed uid and passed gid as file uid and file gid on the passed
5196 vnode. The IDs may be set to (-1) to request no update.
5198 @return Return 0 if access is granted, otherwise an appropriate value for
5199 errno should be returned. Suggested failure: EACCES for label mismatch or
5200 EPERM for lack of privilege.
5202 typedef int mpo_vnode_check_setowner_t(
5205 struct label
*label
,
5210 @brief Access control check for setting timestamps
5211 @param cred Subject credential
5212 @param vp Object vnode
5213 @param label Policy label for vp
5214 @param atime Access time; see utimes(2)
5215 @param mtime Modification time; see utimes(2)
5217 Determine whether the subject identified by the credential can set
5218 the passed access timestamps on the passed vnode.
5220 @return Return 0 if access is granted, otherwise an appropriate value for
5221 errno should be returned. Suggested failure: EACCES for label mismatch or
5222 EPERM for lack of privilege.
5224 typedef int mpo_vnode_check_setutimes_t(
5227 struct label
*label
,
5228 struct timespec atime
,
5229 struct timespec mtime
5232 @brief Access control check for stat
5233 @param active_cred Subject credential
5234 @param file_cred Credential associated with the struct fileproc
5235 @param vp Object vnode
5236 @param label Policy label for vp
5238 Determine whether the subject identified by the credential can stat
5239 the passed vnode. See stat(2) for more information. The active_cred
5240 hold the credentials of the subject performing the operation, and
5241 file_cred holds the credentials of the subject that originally
5244 @return Return 0 if access is granted, otherwise an appropriate value for
5245 errno should be returned. Suggested failure: EACCES for label mismatch or
5246 EPERM for lack of privilege.
5248 typedef int mpo_vnode_check_stat_t(
5249 struct ucred
*active_cred
,
5250 struct ucred
*file_cred
, /* NULLOK */
5255 @brief Access control check for truncate/ftruncate
5256 @param active_cred Subject credential
5257 @param file_cred Credential associated with the struct fileproc
5258 @param vp Object vnode
5259 @param label Policy label for vp
5261 Determine whether the subject identified by the credential can
5262 perform a truncate operation on the passed vnode. The active_cred hold
5263 the credentials of the subject performing the operation, and
5264 file_cred holds the credentials of the subject that originally
5267 @return Return 0 if access is granted, otherwise an appropriate value for
5268 errno should be returned. Suggested failure: EACCES for label mismatch or
5269 EPERM for lack of privilege.
5271 typedef int mpo_vnode_check_truncate_t(
5272 kauth_cred_t active_cred
,
5273 kauth_cred_t file_cred
, /* NULLOK */
5278 @brief Access control check for deleting vnode
5279 @param cred Subject credential
5280 @param dvp Parent directory vnode
5281 @param dlabel Policy label for dvp
5282 @param vp Object vnode to delete
5283 @param label Policy label for vp
5284 @param cnp Component name for vp
5285 @see mpo_check_rename_to_t
5287 Determine whether the subject identified by the credential can delete
5288 a vnode from the passed parent directory and passed name information.
5289 This call may be made in a number of situations, including as a
5290 results of calls to unlink(2) and rmdir(2). Policies implementing
5291 this entry point should also implement mpo_check_rename_to to
5292 authorize deletion of objects as a result of being the target of a rename.
5294 @return Return 0 if access is granted, otherwise an appropriate value for
5295 errno should be returned. Suggested failure: EACCES for label mismatch or
5296 EPERM for lack of privilege.
5298 typedef int mpo_vnode_check_unlink_t(
5301 struct label
*dlabel
,
5303 struct label
*label
,
5304 struct componentname
*cnp
5307 @brief Access control check for write
5308 @param active_cred Subject credential
5309 @param file_cred Credential associated with the struct fileproc
5310 @param vp Object vnode
5311 @param label Policy label for vp
5313 Determine whether the subject identified by the credential can
5314 perform a write operation on the passed vnode. The active_cred hold
5315 the credentials of the subject performing the operation, and
5316 file_cred holds the credentials of the subject that originally
5319 @return Return 0 if access is granted, otherwise an appropriate value for
5320 errno should be returned. Suggested failure: EACCES for label mismatch or
5321 EPERM for lack of privilege.
5323 typedef int mpo_vnode_check_write_t(
5324 kauth_cred_t active_cred
,
5325 kauth_cred_t file_cred
, /* NULLOK */
5330 @brief Associate a vnode with a devfs entry
5331 @param mp Devfs mount point
5332 @param mntlabel Devfs mount point label
5333 @param de Devfs directory entry
5334 @param delabel Label associated with de
5335 @param vp vnode associated with de
5336 @param vlabel Label associated with vp
5338 Fill in the label (vlabel) for a newly created devfs vnode. The
5339 label is typically derived from the label on the devfs directory
5340 entry or the label on the filesystem, supplied as parameters.
5342 typedef void mpo_vnode_label_associate_devfs_t(
5344 struct label
*mntlabel
,
5346 struct label
*delabel
,
5348 struct label
*vlabel
5351 @brief Associate a label with a vnode
5352 @param mp File system mount point
5353 @param mntlabel File system mount point label
5354 @param vp Vnode to label
5355 @param vlabel Label associated with vp
5357 Attempt to retrieve label information for the vnode, vp, from the
5358 file system extended attribute store. The label should be stored in
5359 the supplied vlabel parameter. If a policy cannot retrieve an
5360 extended attribute, sometimes it is acceptible to fallback to using
5363 If the policy requires vnodes to have a valid label elsewhere it
5364 MUST NOT return other than temporary errors, and must always provide
5365 a valid label of some sort. Returning an error will cause vnode
5366 labeling to be retried at a later access. Failure to handle policy
5367 centric errors internally (corrupt labels etc.) will result in
5370 @return In the event of an error, an appropriate value for errno
5371 should be returned, otherwise return 0 upon success.
5373 typedef int mpo_vnode_label_associate_extattr_t(
5375 struct label
*mntlabel
,
5377 struct label
*vlabel
5380 @brief Associate a file label with a vnode
5381 @param cred User credential
5382 @param mp Fdesc mount point
5383 @param mntlabel Fdesc mount point label
5384 @param fg Fileglob structure
5385 @param label Policy label for fg
5386 @param vp Vnode to label
5387 @param vlabel Label associated with vp
5389 Associate label information for the vnode, vp, with the label of
5390 the open file descriptor described by fg.
5391 The label should be stored in the supplied vlabel parameter.
5393 typedef void mpo_vnode_label_associate_file_t(
5396 struct label
*mntlabel
,
5397 struct fileglob
*fg
,
5398 struct label
*label
,
5400 struct label
*vlabel
5403 @brief Associate a pipe label with a vnode
5404 @param cred User credential for the process that opened the pipe
5405 @param cpipe Pipe structure
5406 @param pipelabel Label associated with pipe
5407 @param vp Vnode to label
5408 @param vlabel Label associated with vp
5410 Associate label information for the vnode, vp, with the label of
5411 the pipe described by the pipe structure cpipe.
5412 The label should be stored in the supplied vlabel parameter.
5414 typedef void mpo_vnode_label_associate_pipe_t(
5417 struct label
*pipelabel
,
5419 struct label
*vlabel
5422 @brief Associate a POSIX semaphore label with a vnode
5423 @param cred User credential for the process that create psem
5424 @param psem POSIX semaphore structure
5425 @param psemlabel Label associated with psem
5426 @param vp Vnode to label
5427 @param vlabel Label associated with vp
5429 Associate label information for the vnode, vp, with the label of
5430 the POSIX semaphore described by psem.
5431 The label should be stored in the supplied vlabel parameter.
5433 typedef void mpo_vnode_label_associate_posixsem_t(
5435 struct pseminfo
*psem
,
5436 struct label
*psemlabel
,
5438 struct label
*vlabel
5441 @brief Associate a POSIX shared memory label with a vnode
5442 @param cred User credential for the process that created pshm
5443 @param pshm POSIX shared memory structure
5444 @param pshmlabel Label associated with pshm
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 POSIX shared memory region described by pshm.
5450 The label should be stored in the supplied vlabel parameter.
5452 typedef void mpo_vnode_label_associate_posixshm_t(
5454 struct pshminfo
*pshm
,
5455 struct label
*pshmlabel
,
5457 struct label
*vlabel
5460 @brief Associate a label with a vnode
5461 @param mp File system mount point
5462 @param mntlabel File system mount point label
5463 @param vp Vnode to label
5464 @param vlabel Label associated with vp
5466 On non-multilabel file systems, set the label for a vnode. The
5467 label will most likely be based on the file system label.
5469 typedef void mpo_vnode_label_associate_singlelabel_t(
5471 struct label
*mntlabel
,
5473 struct label
*vlabel
5476 @brief Associate a socket label with a vnode
5477 @param cred User credential for the process that opened the socket
5478 @param so Socket structure
5479 @param solabel Label associated with so
5480 @param vp Vnode to label
5481 @param vlabel Label associated with vp
5483 Associate label information for the vnode, vp, with the label of
5484 the open socket described by the socket structure so.
5485 The label should be stored in the supplied vlabel parameter.
5487 typedef void mpo_vnode_label_associate_socket_t(
5490 struct label
*solabel
,
5492 struct label
*vlabel
5495 @brief Copy a vnode label
5496 @param src Source vnode label
5497 @param dest Destination vnode label
5499 Copy the vnode label information from src to dest. On Darwin, this
5500 is currently only necessary when executing interpreted scripts, but
5501 will later be used if vnode label externalization cannot be an
5504 typedef void mpo_vnode_label_copy_t(
5509 @brief Destroy vnode label
5510 @param label The label to be destroyed
5512 Destroy a vnode label. Since the object is going out of scope,
5513 policy modules should free any internal storage associated with the
5514 label so that it may be destroyed.
5516 typedef void mpo_vnode_label_destroy_t(
5520 @brief Externalize a vnode label for auditing
5521 @param label Label to be externalized
5522 @param element_name Name of the label namespace for which labels should be
5524 @param sb String buffer to be filled with a text representation of the label
5526 Produce an external representation of the label on a vnode suitable for
5527 inclusion in an audit record. An externalized label consists of a text
5528 representation of the label contents that will be added to the audit record
5529 as part of a text token. Policy-agnostic user space tools will display
5530 this externalized version.
5532 @return 0 on success, return non-zero if an error occurs while
5533 externalizing the label data.
5536 typedef int mpo_vnode_label_externalize_audit_t(
5537 struct label
*label
,
5542 @brief Externalize a vnode label
5543 @param label Label to be externalized
5544 @param element_name Name of the label namespace for which labels should be
5546 @param sb String buffer to be filled with a text representation of the label
5548 Produce an external representation of the label on a vnode. An
5549 externalized label consists of a text representation of the label
5550 contents that can be used with user applications. Policy-agnostic
5551 user space tools will display this externalized version.
5553 @return 0 on success, return non-zero if an error occurs while
5554 externalizing the label data.
5557 typedef int mpo_vnode_label_externalize_t(
5558 struct label
*label
,
5563 @brief Initialize vnode label
5564 @param label New label to initialize
5566 Initialize label storage for use with a newly instantiated vnode, or
5567 for temporary storage associated with the copying in or out of a
5568 vnode label. While it is necessary to allocate space for a
5569 kernel-resident vnode label, it is not yet necessary to link this vnode
5570 with persistent label storage facilities, such as extended attributes.
5571 Sleeping is permitted.
5573 typedef void mpo_vnode_label_init_t(
5577 @brief Internalize a vnode label
5578 @param label Label to be internalized
5579 @param element_name Name of the label namespace for which the label should
5581 @param element_data Text data to be internalized
5583 Produce a vnode label from an external representation. An
5584 externalized label consists of a text representation of the label
5585 contents that can be used with user applications. Policy-agnostic
5586 user space tools will forward text version to the kernel for
5587 processing by individual policy modules.
5589 The policy's internalize entry points will be called only if the
5590 policy has registered interest in the label namespace.
5592 @return 0 on success, Otherwise, return non-zero if an error occurs
5593 while internalizing the label data.
5595 typedef int mpo_vnode_label_internalize_t(
5596 struct label
*label
,
5601 @brief Clean up a vnode label
5602 @param label The label to be cleaned for re-use
5604 Clean up a vnode label. Darwin (Tiger, 8.x) allocates vnodes on demand, but
5605 typically never frees them. Before vnodes are placed back on free lists for
5606 re-use, policies can cleanup or overwrite any information present in the label.
5608 typedef void mpo_vnode_label_recycle_t(
5612 @brief Write a label to a extended attribute
5613 @param cred Subject credential
5614 @param vp The vnode for which the label is being stored
5615 @param vlabel Label associated with vp
5616 @param intlabel The new label to store
5618 Store a new label in the extended attribute corresponding to the
5619 supplied vnode. The policy has already authorized the operation;
5620 this call must be implemented in order to perform the actual
5623 @return In the event of an error, an appropriate value for errno
5624 should be returned, otherwise return 0 upon success.
5626 @warning XXX After examining the extended attribute implementation on
5627 Apple's future release, this entry point may be changed.
5629 typedef int mpo_vnode_label_store_t(
5632 struct label
*vlabel
,
5633 struct label
*intlabel
5636 @brief Update vnode label from extended attributes
5637 @param mp File system mount point
5638 @param mntlabel Mount point label
5639 @param vp Vnode to label
5640 @param vlabel Label associated with vp
5641 @param name Name of the xattr
5642 @see mpo_vnode_check_setextattr_t
5644 When an extended attribute is updated via the Vendor attribute management
5645 functions, the MAC vnode label might also require an update.
5646 Policies should first determine if 'name' matches their xattr label
5647 name. If it does, the kernel is has either replaced or removed the
5648 named extended attribute that was previously associated with the
5649 vnode. Normally labels should only be modified via MAC Framework label
5650 management calls, but sometimes the user space components will directly
5651 modify extended attributes. For example, 'cp', 'tar', etc. manage
5652 extended attributes in userspace, not the kernel.
5654 This entry point is called after the label update has occurred, so
5655 it cannot return a failure. However, the operation is preceded by
5656 the mpo_vnode_check_setextattr() access control check.
5658 If the vnode label needs to be updated the policy should return
5659 a non-zero value. The vnode label will be marked for re-association
5662 typedef int mpo_vnode_label_update_extattr_t(
5664 struct label
*mntlabel
,
5666 struct label
*vlabel
,
5670 @brief Update a vnode label
5671 @param cred Subject credential
5672 @param vp The vnode to relabel
5673 @param vnodelabel Existing vnode label
5674 @param label New label to replace existing label
5675 @see mpo_vnode_check_label_update_t
5677 The subject identified by the credential has previously requested
5678 and was authorized to relabel the vnode; this entry point allows
5679 policies to perform the actual relabel operation. Policies should
5680 update vnodelabel using the label stored in the label parameter.
5682 typedef void mpo_vnode_label_update_t(
5685 struct label
*vnodelabel
,
5689 @brief Create a new vnode, backed by extended attributes
5690 @param cred User credential for the creating process
5691 @param mp File system mount point
5692 @param mntlabel File system mount point label
5693 @param dvp Parent directory vnode
5694 @param dlabel Parent directory vnode label
5695 @param vp Newly created vnode
5696 @param vlabel Label to associate with the new vnode
5697 @param cnp Component name for vp
5699 Write out the label for the newly created vnode, most likely storing
5700 the results in a file system extended attribute. Most policies will
5701 derive the new vnode label using information from a combination
5702 of the subject (user) credential, the file system label, the parent
5703 directory label, and potentially the path name component.
5705 @return If the operation succeeds, store the new label in vlabel and
5706 return 0. Otherwise, return an appropriate errno value.
5708 typedef int mpo_vnode_notify_create_t(
5711 struct label
*mntlabel
,
5713 struct label
*dlabel
,
5715 struct label
*vlabel
,
5716 struct componentname
*cnp
5720 * Placeholder for future events that may need mac hooks.
5722 typedef void mpo_reserved_hook_t(void);
5725 \struct mac_policy_ops
5727 struct mac_policy_ops
{
5728 mpo_audit_check_postselect_t
*mpo_audit_check_postselect
;
5729 mpo_audit_check_preselect_t
*mpo_audit_check_preselect
;
5730 mpo_bpfdesc_label_associate_t
*mpo_bpfdesc_label_associate
;
5731 mpo_bpfdesc_label_destroy_t
*mpo_bpfdesc_label_destroy
;
5732 mpo_bpfdesc_label_init_t
*mpo_bpfdesc_label_init
;
5733 mpo_bpfdesc_check_receive_t
*mpo_bpfdesc_check_receive
;
5734 mpo_cred_check_label_update_execve_t
*mpo_cred_check_label_update_execve
;
5735 mpo_cred_check_label_update_t
*mpo_cred_check_label_update
;
5736 mpo_cred_check_visible_t
*mpo_cred_check_visible
;
5737 mpo_cred_label_associate_fork_t
*mpo_cred_label_associate_fork
;
5738 mpo_cred_label_associate_kernel_t
*mpo_cred_label_associate_kernel
;
5739 mpo_cred_label_associate_t
*mpo_cred_label_associate
;
5740 mpo_cred_label_associate_user_t
*mpo_cred_label_associate_user
;
5741 mpo_cred_label_destroy_t
*mpo_cred_label_destroy
;
5742 mpo_cred_label_externalize_audit_t
*mpo_cred_label_externalize_audit
;
5743 mpo_cred_label_externalize_t
*mpo_cred_label_externalize
;
5744 mpo_cred_label_init_t
*mpo_cred_label_init
;
5745 mpo_cred_label_internalize_t
*mpo_cred_label_internalize
;
5746 mpo_cred_label_update_execve_t
*mpo_cred_label_update_execve
;
5747 mpo_cred_label_update_t
*mpo_cred_label_update
;
5748 mpo_devfs_label_associate_device_t
*mpo_devfs_label_associate_device
;
5749 mpo_devfs_label_associate_directory_t
*mpo_devfs_label_associate_directory
;
5750 mpo_devfs_label_copy_t
*mpo_devfs_label_copy
;
5751 mpo_devfs_label_destroy_t
*mpo_devfs_label_destroy
;
5752 mpo_devfs_label_init_t
*mpo_devfs_label_init
;
5753 mpo_devfs_label_update_t
*mpo_devfs_label_update
;
5754 mpo_file_check_change_offset_t
*mpo_file_check_change_offset
;
5755 mpo_file_check_create_t
*mpo_file_check_create
;
5756 mpo_file_check_dup_t
*mpo_file_check_dup
;
5757 mpo_file_check_fcntl_t
*mpo_file_check_fcntl
;
5758 mpo_file_check_get_offset_t
*mpo_file_check_get_offset
;
5759 mpo_file_check_get_t
*mpo_file_check_get
;
5760 mpo_file_check_inherit_t
*mpo_file_check_inherit
;
5761 mpo_file_check_ioctl_t
*mpo_file_check_ioctl
;
5762 mpo_file_check_lock_t
*mpo_file_check_lock
;
5763 mpo_file_check_mmap_downgrade_t
*mpo_file_check_mmap_downgrade
;
5764 mpo_file_check_mmap_t
*mpo_file_check_mmap
;
5765 mpo_file_check_receive_t
*mpo_file_check_receive
;
5766 mpo_file_check_set_t
*mpo_file_check_set
;
5767 mpo_file_label_init_t
*mpo_file_label_init
;
5768 mpo_file_label_destroy_t
*mpo_file_label_destroy
;
5769 mpo_file_label_associate_t
*mpo_file_label_associate
;
5770 mpo_ifnet_check_label_update_t
*mpo_ifnet_check_label_update
;
5771 mpo_ifnet_check_transmit_t
*mpo_ifnet_check_transmit
;
5772 mpo_ifnet_label_associate_t
*mpo_ifnet_label_associate
;
5773 mpo_ifnet_label_copy_t
*mpo_ifnet_label_copy
;
5774 mpo_ifnet_label_destroy_t
*mpo_ifnet_label_destroy
;
5775 mpo_ifnet_label_externalize_t
*mpo_ifnet_label_externalize
;
5776 mpo_ifnet_label_init_t
*mpo_ifnet_label_init
;
5777 mpo_ifnet_label_internalize_t
*mpo_ifnet_label_internalize
;
5778 mpo_ifnet_label_update_t
*mpo_ifnet_label_update
;
5779 mpo_ifnet_label_recycle_t
*mpo_ifnet_label_recycle
;
5780 mpo_inpcb_check_deliver_t
*mpo_inpcb_check_deliver
;
5781 mpo_inpcb_label_associate_t
*mpo_inpcb_label_associate
;
5782 mpo_inpcb_label_destroy_t
*mpo_inpcb_label_destroy
;
5783 mpo_inpcb_label_init_t
*mpo_inpcb_label_init
;
5784 mpo_inpcb_label_recycle_t
*mpo_inpcb_label_recycle
;
5785 mpo_inpcb_label_update_t
*mpo_inpcb_label_update
;
5786 mpo_iokit_check_device_t
*mpo_iokit_check_device
;
5787 mpo_ipq_label_associate_t
*mpo_ipq_label_associate
;
5788 mpo_ipq_label_compare_t
*mpo_ipq_label_compare
;
5789 mpo_ipq_label_destroy_t
*mpo_ipq_label_destroy
;
5790 mpo_ipq_label_init_t
*mpo_ipq_label_init
;
5791 mpo_ipq_label_update_t
*mpo_ipq_label_update
;
5792 mpo_lctx_check_label_update_t
*mpo_lctx_check_label_update
;
5793 mpo_lctx_label_destroy_t
*mpo_lctx_label_destroy
;
5794 mpo_lctx_label_externalize_t
*mpo_lctx_label_externalize
;
5795 mpo_lctx_label_init_t
*mpo_lctx_label_init
;
5796 mpo_lctx_label_internalize_t
*mpo_lctx_label_internalize
;
5797 mpo_lctx_label_update_t
*mpo_lctx_label_update
;
5798 mpo_lctx_notify_create_t
*mpo_lctx_notify_create
;
5799 mpo_lctx_notify_join_t
*mpo_lctx_notify_join
;
5800 mpo_lctx_notify_leave_t
*mpo_lctx_notify_leave
;
5801 mpo_mbuf_label_associate_bpfdesc_t
*mpo_mbuf_label_associate_bpfdesc
;
5802 mpo_mbuf_label_associate_ifnet_t
*mpo_mbuf_label_associate_ifnet
;
5803 mpo_mbuf_label_associate_inpcb_t
*mpo_mbuf_label_associate_inpcb
;
5804 mpo_mbuf_label_associate_ipq_t
*mpo_mbuf_label_associate_ipq
;
5805 mpo_mbuf_label_associate_linklayer_t
*mpo_mbuf_label_associate_linklayer
;
5806 mpo_mbuf_label_associate_multicast_encap_t
*mpo_mbuf_label_associate_multicast_encap
;
5807 mpo_mbuf_label_associate_netlayer_t
*mpo_mbuf_label_associate_netlayer
;
5808 mpo_mbuf_label_associate_socket_t
*mpo_mbuf_label_associate_socket
;
5809 mpo_mbuf_label_copy_t
*mpo_mbuf_label_copy
;
5810 mpo_mbuf_label_destroy_t
*mpo_mbuf_label_destroy
;
5811 mpo_mbuf_label_init_t
*mpo_mbuf_label_init
;
5812 mpo_mount_check_fsctl_t
*mpo_mount_check_fsctl
;
5813 mpo_mount_check_getattr_t
*mpo_mount_check_getattr
;
5814 mpo_mount_check_label_update_t
*mpo_mount_check_label_update
;
5815 mpo_mount_check_mount_t
*mpo_mount_check_mount
;
5816 mpo_mount_check_remount_t
*mpo_mount_check_remount
;
5817 mpo_mount_check_setattr_t
*mpo_mount_check_setattr
;
5818 mpo_mount_check_stat_t
*mpo_mount_check_stat
;
5819 mpo_mount_check_umount_t
*mpo_mount_check_umount
;
5820 mpo_mount_label_associate_t
*mpo_mount_label_associate
;
5821 mpo_mount_label_destroy_t
*mpo_mount_label_destroy
;
5822 mpo_mount_label_externalize_t
*mpo_mount_label_externalize
;
5823 mpo_mount_label_init_t
*mpo_mount_label_init
;
5824 mpo_mount_label_internalize_t
*mpo_mount_label_internalize
;
5825 mpo_netinet_fragment_t
*mpo_netinet_fragment
;
5826 mpo_netinet_icmp_reply_t
*mpo_netinet_icmp_reply
;
5827 mpo_netinet_tcp_reply_t
*mpo_netinet_tcp_reply
;
5828 mpo_pipe_check_ioctl_t
*mpo_pipe_check_ioctl
;
5829 mpo_pipe_check_kqfilter_t
*mpo_pipe_check_kqfilter
;
5830 mpo_pipe_check_label_update_t
*mpo_pipe_check_label_update
;
5831 mpo_pipe_check_read_t
*mpo_pipe_check_read
;
5832 mpo_pipe_check_select_t
*mpo_pipe_check_select
;
5833 mpo_pipe_check_stat_t
*mpo_pipe_check_stat
;
5834 mpo_pipe_check_write_t
*mpo_pipe_check_write
;
5835 mpo_pipe_label_associate_t
*mpo_pipe_label_associate
;
5836 mpo_pipe_label_copy_t
*mpo_pipe_label_copy
;
5837 mpo_pipe_label_destroy_t
*mpo_pipe_label_destroy
;
5838 mpo_pipe_label_externalize_t
*mpo_pipe_label_externalize
;
5839 mpo_pipe_label_init_t
*mpo_pipe_label_init
;
5840 mpo_pipe_label_internalize_t
*mpo_pipe_label_internalize
;
5841 mpo_pipe_label_update_t
*mpo_pipe_label_update
;
5842 mpo_policy_destroy_t
*mpo_policy_destroy
;
5843 mpo_policy_init_t
*mpo_policy_init
;
5844 mpo_policy_initbsd_t
*mpo_policy_initbsd
;
5845 mpo_policy_syscall_t
*mpo_policy_syscall
;
5846 mpo_port_check_copy_send_t
*mpo_port_check_copy_send
;
5847 mpo_port_check_hold_receive_t
*mpo_port_check_hold_receive
;
5848 mpo_port_check_hold_send_once_t
*mpo_port_check_hold_send_once
;
5849 mpo_port_check_hold_send_t
*mpo_port_check_hold_send
;
5850 mpo_port_check_label_update_t
*mpo_port_check_label_update
;
5851 mpo_port_check_make_send_once_t
*mpo_port_check_make_send_once
;
5852 mpo_port_check_make_send_t
*mpo_port_check_make_send
;
5853 mpo_port_check_method_t
*mpo_port_check_method
;
5854 mpo_port_check_move_receive_t
*mpo_port_check_move_receive
;
5855 mpo_port_check_move_send_once_t
*mpo_port_check_move_send_once
;
5856 mpo_port_check_move_send_t
*mpo_port_check_move_send
;
5857 mpo_port_check_receive_t
*mpo_port_check_receive
;
5858 mpo_port_check_send_t
*mpo_port_check_send
;
5859 mpo_port_check_service_t
*mpo_port_check_service
;
5860 mpo_port_label_associate_kernel_t
*mpo_port_label_associate_kernel
;
5861 mpo_port_label_associate_t
*mpo_port_label_associate
;
5862 mpo_port_label_compute_t
*mpo_port_label_compute
;
5863 mpo_port_label_copy_t
*mpo_port_label_copy
;
5864 mpo_port_label_destroy_t
*mpo_port_label_destroy
;
5865 mpo_port_label_init_t
*mpo_port_label_init
;
5866 mpo_port_label_update_cred_t
*mpo_port_label_update_cred
;
5867 mpo_port_label_update_kobject_t
*mpo_port_label_update_kobject
;
5868 mpo_posixsem_check_create_t
*mpo_posixsem_check_create
;
5869 mpo_posixsem_check_open_t
*mpo_posixsem_check_open
;
5870 mpo_posixsem_check_post_t
*mpo_posixsem_check_post
;
5871 mpo_posixsem_check_unlink_t
*mpo_posixsem_check_unlink
;
5872 mpo_posixsem_check_wait_t
*mpo_posixsem_check_wait
;
5873 mpo_posixsem_label_associate_t
*mpo_posixsem_label_associate
;
5874 mpo_posixsem_label_destroy_t
*mpo_posixsem_label_destroy
;
5875 mpo_posixsem_label_init_t
*mpo_posixsem_label_init
;
5876 mpo_posixshm_check_create_t
*mpo_posixshm_check_create
;
5877 mpo_posixshm_check_mmap_t
*mpo_posixshm_check_mmap
;
5878 mpo_posixshm_check_open_t
*mpo_posixshm_check_open
;
5879 mpo_posixshm_check_stat_t
*mpo_posixshm_check_stat
;
5880 mpo_posixshm_check_truncate_t
*mpo_posixshm_check_truncate
;
5881 mpo_posixshm_check_unlink_t
*mpo_posixshm_check_unlink
;
5882 mpo_posixshm_label_associate_t
*mpo_posixshm_label_associate
;
5883 mpo_posixshm_label_destroy_t
*mpo_posixshm_label_destroy
;
5884 mpo_posixshm_label_init_t
*mpo_posixshm_label_init
;
5885 mpo_proc_check_debug_t
*mpo_proc_check_debug
;
5886 mpo_proc_check_fork_t
*mpo_proc_check_fork
;
5887 mpo_proc_check_get_task_name_t
*mpo_proc_check_get_task_name
;
5888 mpo_proc_check_get_task_t
*mpo_proc_check_get_task
;
5889 mpo_proc_check_getaudit_t
*mpo_proc_check_getaudit
;
5890 mpo_proc_check_getauid_t
*mpo_proc_check_getauid
;
5891 mpo_proc_check_getlcid_t
*mpo_proc_check_getlcid
;
5892 mpo_proc_check_mprotect_t
*mpo_proc_check_mprotect
;
5893 mpo_proc_check_sched_t
*mpo_proc_check_sched
;
5894 mpo_proc_check_setaudit_t
*mpo_proc_check_setaudit
;
5895 mpo_proc_check_setauid_t
*mpo_proc_check_setauid
;
5896 mpo_proc_check_setlcid_t
*mpo_proc_check_setlcid
;
5897 mpo_proc_check_signal_t
*mpo_proc_check_signal
;
5898 mpo_proc_check_wait_t
*mpo_proc_check_wait
;
5899 mpo_proc_label_destroy_t
*mpo_proc_label_destroy
;
5900 mpo_proc_label_init_t
*mpo_proc_label_init
;
5901 mpo_socket_check_accept_t
*mpo_socket_check_accept
;
5902 mpo_socket_check_accepted_t
*mpo_socket_check_accepted
;
5903 mpo_socket_check_bind_t
*mpo_socket_check_bind
;
5904 mpo_socket_check_connect_t
*mpo_socket_check_connect
;
5905 mpo_socket_check_create_t
*mpo_socket_check_create
;
5906 mpo_socket_check_deliver_t
*mpo_socket_check_deliver
;
5907 mpo_socket_check_kqfilter_t
*mpo_socket_check_kqfilter
;
5908 mpo_socket_check_label_update_t
*mpo_socket_check_label_update
;
5909 mpo_socket_check_listen_t
*mpo_socket_check_listen
;
5910 mpo_socket_check_receive_t
*mpo_socket_check_receive
;
5911 mpo_socket_check_received_t
*mpo_socket_check_received
;
5912 mpo_socket_check_select_t
*mpo_socket_check_select
;
5913 mpo_socket_check_send_t
*mpo_socket_check_send
;
5914 mpo_socket_check_stat_t
*mpo_socket_check_stat
;
5915 mpo_socket_check_setsockopt_t
*mpo_socket_check_setsockopt
;
5916 mpo_socket_check_getsockopt_t
*mpo_socket_check_getsockopt
;
5917 mpo_socket_label_associate_accept_t
*mpo_socket_label_associate_accept
;
5918 mpo_socket_label_associate_t
*mpo_socket_label_associate
;
5919 mpo_socket_label_copy_t
*mpo_socket_label_copy
;
5920 mpo_socket_label_destroy_t
*mpo_socket_label_destroy
;
5921 mpo_socket_label_externalize_t
*mpo_socket_label_externalize
;
5922 mpo_socket_label_init_t
*mpo_socket_label_init
;
5923 mpo_socket_label_internalize_t
*mpo_socket_label_internalize
;
5924 mpo_socket_label_update_t
*mpo_socket_label_update
;
5925 mpo_socketpeer_label_associate_mbuf_t
*mpo_socketpeer_label_associate_mbuf
;
5926 mpo_socketpeer_label_associate_socket_t
*mpo_socketpeer_label_associate_socket
;
5927 mpo_socketpeer_label_destroy_t
*mpo_socketpeer_label_destroy
;
5928 mpo_socketpeer_label_externalize_t
*mpo_socketpeer_label_externalize
;
5929 mpo_socketpeer_label_init_t
*mpo_socketpeer_label_init
;
5930 mpo_system_check_acct_t
*mpo_system_check_acct
;
5931 mpo_system_check_audit_t
*mpo_system_check_audit
;
5932 mpo_system_check_auditctl_t
*mpo_system_check_auditctl
;
5933 mpo_system_check_auditon_t
*mpo_system_check_auditon
;
5934 mpo_system_check_host_priv_t
*mpo_system_check_host_priv
;
5935 mpo_system_check_nfsd_t
*mpo_system_check_nfsd
;
5936 mpo_system_check_reboot_t
*mpo_system_check_reboot
;
5937 mpo_system_check_settime_t
*mpo_system_check_settime
;
5938 mpo_system_check_swapoff_t
*mpo_system_check_swapoff
;
5939 mpo_system_check_swapon_t
*mpo_system_check_swapon
;
5940 mpo_system_check_sysctl_t
*mpo_system_check_sysctl
;
5941 mpo_sysvmsg_label_associate_t
*mpo_sysvmsg_label_associate
;
5942 mpo_sysvmsg_label_destroy_t
*mpo_sysvmsg_label_destroy
;
5943 mpo_sysvmsg_label_init_t
*mpo_sysvmsg_label_init
;
5944 mpo_sysvmsg_label_recycle_t
*mpo_sysvmsg_label_recycle
;
5945 mpo_sysvmsq_check_enqueue_t
*mpo_sysvmsq_check_enqueue
;
5946 mpo_sysvmsq_check_msgrcv_t
*mpo_sysvmsq_check_msgrcv
;
5947 mpo_sysvmsq_check_msgrmid_t
*mpo_sysvmsq_check_msgrmid
;
5948 mpo_sysvmsq_check_msqctl_t
*mpo_sysvmsq_check_msqctl
;
5949 mpo_sysvmsq_check_msqget_t
*mpo_sysvmsq_check_msqget
;
5950 mpo_sysvmsq_check_msqrcv_t
*mpo_sysvmsq_check_msqrcv
;
5951 mpo_sysvmsq_check_msqsnd_t
*mpo_sysvmsq_check_msqsnd
;
5952 mpo_sysvmsq_label_associate_t
*mpo_sysvmsq_label_associate
;
5953 mpo_sysvmsq_label_destroy_t
*mpo_sysvmsq_label_destroy
;
5954 mpo_sysvmsq_label_init_t
*mpo_sysvmsq_label_init
;
5955 mpo_sysvmsq_label_recycle_t
*mpo_sysvmsq_label_recycle
;
5956 mpo_sysvsem_check_semctl_t
*mpo_sysvsem_check_semctl
;
5957 mpo_sysvsem_check_semget_t
*mpo_sysvsem_check_semget
;
5958 mpo_sysvsem_check_semop_t
*mpo_sysvsem_check_semop
;
5959 mpo_sysvsem_label_associate_t
*mpo_sysvsem_label_associate
;
5960 mpo_sysvsem_label_destroy_t
*mpo_sysvsem_label_destroy
;
5961 mpo_sysvsem_label_init_t
*mpo_sysvsem_label_init
;
5962 mpo_sysvsem_label_recycle_t
*mpo_sysvsem_label_recycle
;
5963 mpo_sysvshm_check_shmat_t
*mpo_sysvshm_check_shmat
;
5964 mpo_sysvshm_check_shmctl_t
*mpo_sysvshm_check_shmctl
;
5965 mpo_sysvshm_check_shmdt_t
*mpo_sysvshm_check_shmdt
;
5966 mpo_sysvshm_check_shmget_t
*mpo_sysvshm_check_shmget
;
5967 mpo_sysvshm_label_associate_t
*mpo_sysvshm_label_associate
;
5968 mpo_sysvshm_label_destroy_t
*mpo_sysvshm_label_destroy
;
5969 mpo_sysvshm_label_init_t
*mpo_sysvshm_label_init
;
5970 mpo_sysvshm_label_recycle_t
*mpo_sysvshm_label_recycle
;
5971 mpo_task_label_associate_kernel_t
*mpo_task_label_associate_kernel
;
5972 mpo_task_label_associate_t
*mpo_task_label_associate
;
5973 mpo_task_label_copy_t
*mpo_task_label_copy
;
5974 mpo_task_label_destroy_t
*mpo_task_label_destroy
;
5975 mpo_task_label_externalize_t
*mpo_task_label_externalize
;
5976 mpo_task_label_init_t
*mpo_task_label_init
;
5977 mpo_task_label_internalize_t
*mpo_task_label_internalize
;
5978 mpo_task_label_update_t
*mpo_task_label_update
;
5979 mpo_thread_userret_t
*mpo_thread_userret
;
5980 mpo_vnode_check_access_t
*mpo_vnode_check_access
;
5981 mpo_vnode_check_chdir_t
*mpo_vnode_check_chdir
;
5982 mpo_vnode_check_chroot_t
*mpo_vnode_check_chroot
;
5983 mpo_vnode_check_create_t
*mpo_vnode_check_create
;
5984 mpo_vnode_check_deleteextattr_t
*mpo_vnode_check_deleteextattr
;
5985 mpo_vnode_check_exchangedata_t
*mpo_vnode_check_exchangedata
;
5986 mpo_vnode_check_exec_t
*mpo_vnode_check_exec
;
5987 mpo_vnode_check_getattrlist_t
*mpo_vnode_check_getattrlist
;
5988 mpo_vnode_check_getextattr_t
*mpo_vnode_check_getextattr
;
5989 mpo_vnode_check_ioctl_t
*mpo_vnode_check_ioctl
;
5990 mpo_vnode_check_kqfilter_t
*mpo_vnode_check_kqfilter
;
5991 mpo_vnode_check_label_update_t
*mpo_vnode_check_label_update
;
5992 mpo_vnode_check_link_t
*mpo_vnode_check_link
;
5993 mpo_vnode_check_listextattr_t
*mpo_vnode_check_listextattr
;
5994 mpo_vnode_check_lookup_t
*mpo_vnode_check_lookup
;
5995 mpo_vnode_check_open_t
*mpo_vnode_check_open
;
5996 mpo_vnode_check_read_t
*mpo_vnode_check_read
;
5997 mpo_vnode_check_readdir_t
*mpo_vnode_check_readdir
;
5998 mpo_vnode_check_readlink_t
*mpo_vnode_check_readlink
;
5999 mpo_vnode_check_rename_from_t
*mpo_vnode_check_rename_from
;
6000 mpo_vnode_check_rename_to_t
*mpo_vnode_check_rename_to
;
6001 mpo_vnode_check_revoke_t
*mpo_vnode_check_revoke
;
6002 mpo_vnode_check_select_t
*mpo_vnode_check_select
;
6003 mpo_vnode_check_setattrlist_t
*mpo_vnode_check_setattrlist
;
6004 mpo_vnode_check_setextattr_t
*mpo_vnode_check_setextattr
;
6005 mpo_vnode_check_setflags_t
*mpo_vnode_check_setflags
;
6006 mpo_vnode_check_setmode_t
*mpo_vnode_check_setmode
;
6007 mpo_vnode_check_setowner_t
*mpo_vnode_check_setowner
;
6008 mpo_vnode_check_setutimes_t
*mpo_vnode_check_setutimes
;
6009 mpo_vnode_check_stat_t
*mpo_vnode_check_stat
;
6010 mpo_vnode_check_truncate_t
*mpo_vnode_check_truncate
;
6011 mpo_vnode_check_unlink_t
*mpo_vnode_check_unlink
;
6012 mpo_vnode_check_write_t
*mpo_vnode_check_write
;
6013 mpo_vnode_label_associate_devfs_t
*mpo_vnode_label_associate_devfs
;
6014 mpo_vnode_label_associate_extattr_t
*mpo_vnode_label_associate_extattr
;
6015 mpo_vnode_label_associate_file_t
*mpo_vnode_label_associate_file
;
6016 mpo_vnode_label_associate_pipe_t
*mpo_vnode_label_associate_pipe
;
6017 mpo_vnode_label_associate_posixsem_t
*mpo_vnode_label_associate_posixsem
;
6018 mpo_vnode_label_associate_posixshm_t
*mpo_vnode_label_associate_posixshm
;
6019 mpo_vnode_label_associate_singlelabel_t
*mpo_vnode_label_associate_singlelabel
;
6020 mpo_vnode_label_associate_socket_t
*mpo_vnode_label_associate_socket
;
6021 mpo_vnode_label_copy_t
*mpo_vnode_label_copy
;
6022 mpo_vnode_label_destroy_t
*mpo_vnode_label_destroy
;
6023 mpo_vnode_label_externalize_audit_t
*mpo_vnode_label_externalize_audit
;
6024 mpo_vnode_label_externalize_t
*mpo_vnode_label_externalize
;
6025 mpo_vnode_label_init_t
*mpo_vnode_label_init
;
6026 mpo_vnode_label_internalize_t
*mpo_vnode_label_internalize
;
6027 mpo_vnode_label_recycle_t
*mpo_vnode_label_recycle
;
6028 mpo_vnode_label_store_t
*mpo_vnode_label_store
;
6029 mpo_vnode_label_update_extattr_t
*mpo_vnode_label_update_extattr
;
6030 mpo_vnode_label_update_t
*mpo_vnode_label_update
;
6031 mpo_vnode_notify_create_t
*mpo_vnode_notify_create
;
6032 mpo_vnode_check_signature_t
*mpo_vnode_check_signature
;
6033 mpo_proc_check_map_prot_copy_allow_t
*mpo_proc_check_map_prot_copy_allow
;
6034 mpo_reserved_hook_t
*mpo_reserved2
;
6035 mpo_reserved_hook_t
*mpo_reserved3
;
6036 mpo_reserved_hook_t
*mpo_reserved4
;
6037 mpo_reserved_hook_t
*mpo_reserved5
;
6038 mpo_reserved_hook_t
*mpo_reserved6
;
6039 mpo_reserved_hook_t
*mpo_reserved7
;
6040 mpo_reserved_hook_t
*mpo_reserved8
;
6041 mpo_reserved_hook_t
*mpo_reserved9
;
6045 @brief MAC policy handle type
6047 The MAC handle is used to uniquely identify a loaded policy within
6050 A variable of this type is set by mac_policy_register().
6052 typedef unsigned int mac_policy_handle_t
;
6054 #define mpc_t struct mac_policy_conf *
6057 @brief Mac policy configuration
6059 This structure specifies the configuration information for a
6060 MAC policy module. A policy module developer must supply
6061 a short unique policy name, a more descriptive full name, a list of label
6062 namespaces and count, a pointer to the registered enty point operations,
6063 any load time flags, and optionally, a pointer to a label slot identifier.
6065 The Framework will update the runtime flags (mpc_runtime_flags) to
6066 indicate that the module has been registered.
6068 If the label slot identifier (mpc_field_off) is NULL, the Framework
6069 will not provide label storage for the policy. Otherwise, the
6070 Framework will store the label location (slot) in this field.
6072 The mpc_list field is used by the Framework and should not be
6073 modified by policies.
6075 /* XXX - reorder these for better aligment on 64bit platforms */
6076 struct mac_policy_conf
{
6077 const char *mpc_name
; /** policy name */
6078 const char *mpc_fullname
; /** full name */
6079 const char **mpc_labelnames
; /** managed label namespaces */
6080 unsigned int mpc_labelname_count
; /** number of managed label namespaces */
6081 struct mac_policy_ops
*mpc_ops
; /** operation vector */
6082 int mpc_loadtime_flags
; /** load time flags */
6083 int *mpc_field_off
; /** label slot */
6084 int mpc_runtime_flags
; /** run time flags */
6085 mpc_t mpc_list
; /** List reference */
6086 void *mpc_data
; /** module data */
6090 @brief MAC policy module registration routine
6092 This function is called to register a policy with the
6093 MAC framework. A policy module will typically call this from the
6094 Darwin KEXT registration routine.
6096 int mac_policy_register(struct mac_policy_conf
*mpc
,
6097 mac_policy_handle_t
*handlep
, void *xd
);
6100 @brief MAC policy module de-registration routine
6102 This function is called to de-register a policy with theD
6103 MAC framework. A policy module will typically call this from the
6104 Darwin KEXT de-registration routine.
6106 int mac_policy_unregister(mac_policy_handle_t handle
);
6109 * Framework entry points for the policies to add audit data.
6111 int mac_audit_text(char *text
, mac_policy_handle_t handle
);
6114 * Calls to assist with use of Apple XATTRs within policy modules.
6116 int mac_vnop_setxattr(struct vnode
*, const char *, char *, size_t);
6117 int mac_vnop_getxattr(struct vnode
*, const char *, char *, size_t,
6119 int mac_vnop_removexattr(struct vnode
*, const char *);
6122 * Arbitrary limit on how much data will be logged by the audit
6123 * entry points above.
6125 #define MAC_AUDIT_DATA_LIMIT 1024
6128 * Values returned by mac_audit_{pre,post}select. To combine the responses
6129 * of the security policies into a single decision,
6130 * mac_audit_{pre,post}select() choose the greatest value returned.
6132 #define MAC_AUDIT_DEFAULT 0 /* use system behavior */
6133 #define MAC_AUDIT_NO 1 /* force not auditing this event */
6134 #define MAC_AUDIT_YES 2 /* force auditing this event */
6136 // \defgroup mpc_loadtime_flags Flags for the mpc_loadtime_flags field
6139 @name Flags for the mpc_loadtime_flags field
6140 @see mac_policy_conf
6142 This is the complete list of flags that are supported by the
6143 mpc_loadtime_flags field of the mac_policy_conf structure. These
6144 flags specify the load time behavior of MAC Framework policy
6151 @brief Flag to indicate registration preference
6153 This flag indicates that the policy module must be loaded and
6154 initialized early in the boot process. If the flag is specified,
6155 attempts to register the module following boot will be rejected. The
6156 flag may be used by policies that require pervasive labeling of all
6157 system objects, and cannot handle objects that have not been
6158 properly initialized by the policy.
6160 #define MPC_LOADTIME_FLAG_NOTLATE 0x00000001
6163 @brief Flag to indicate unload preference
6165 This flag indicates that the policy module may be unloaded. If this
6166 flag is not set, then the policy framework will reject requests to
6167 unload the module. This flag might be used by modules that allocate
6168 label state and are unable to free that state at runtime, or for
6169 modules that simply do not want to permit unload operations.
6171 #define MPC_LOADTIME_FLAG_UNLOADOK 0x00000002
6176 XXX This flag is not yet supported.
6178 #define MPC_LOADTIME_FLAG_LABELMBUFS 0x00000004
6181 @brief Flag to indicate a base policy
6183 This flag indicates that the policy module is a base policy. Only
6184 one module can declare itself as base, otherwise the boot process
6187 #define MPC_LOADTIME_BASE_POLICY 0x00000008
6192 @brief Policy registration flag
6193 @see mac_policy_conf
6195 This flag indicates that the policy module has been successfully
6196 registered with the TrustedBSD MAC Framework. The Framework will
6197 set this flag in the mpc_runtime_flags field of the policy's
6198 mac_policy_conf structure after registering the policy.
6200 #define MPC_RUNTIME_FLAG_REGISTERED 0x00000001
6203 * Depends on POLICY_VER
6207 #define POLICY_VER 1.0
6210 #define MAC_POLICY_SET(handle, mpops, mpname, mpfullname, lnames, lcount, slot, lflags, rflags) \
6211 static struct mac_policy_conf mpname##_mac_policy_conf = { \
6212 .mpc_name = #mpname, \
6213 .mpc_fullname = mpfullname, \
6214 .mpc_labelnames = lnames, \
6215 .mpc_labelname_count = lcount, \
6217 .mpc_loadtime_flags = lflags, \
6218 .mpc_field_off = slot, \
6219 .mpc_runtime_flags = rflags \
6222 static kern_return_t \
6223 kmod_start(kmod_info_t *ki, void *xd) \
6225 return mac_policy_register(&mpname##_mac_policy_conf, \
6229 static kern_return_t \
6230 kmod_stop(kmod_info_t *ki, void *xd) \
6232 return mac_policy_unregister(handle); \
6235 extern kern_return_t _start(kmod_info_t *ki, void *data); \
6236 extern kern_return_t _stop(kmod_info_t *ki, void *data); \
6238 KMOD_EXPLICIT_DECL(security.mpname, POLICY_VER, _start, _stop) \
6239 kmod_start_func_t *_realmain = kmod_start; \
6240 kmod_stop_func_t *_antimain = kmod_stop; \
6241 int _kext_apple_cc = __APPLE_CC__
6244 #define LABEL_TO_SLOT(l, s) (l)->l_perpolicy[s]
6246 #define mac_get_mpc(h) (mac_policy_list.entries[h].mpc)
6249 @name Flags for MAC allocator interfaces
6251 These flags are passed to the Darwin kernel allocator routines to
6252 indicate whether the allocation is permitted to block or not.
6253 Caution should be taken; some operations are not permitted to sleep,
6254 and some types of locks cannot be held when sleeping.
6260 @brief Allocation operations may block
6262 If memory is not immediately available, the allocation routine
6263 will block (typically sleeping) until memory is available.
6265 @warning Inappropriate use of this flag may cause kernel panics.
6267 #define MAC_WAITOK 0
6270 @brief Allocation operations may not block
6272 Rather than blocking, the allocator may return an error if memory
6273 is not immediately available. This type of allocation will not
6274 sleep, preserving locking semantics.
6276 #define MAC_NOWAIT 1
6280 #endif /* !_SECURITY_MAC_POLICY_H_ */