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(
4411 @brief Assign a label to a new kernelspace Mach task
4412 @param kproc New task
4413 @param tasklabel Label for new task
4414 @param portlabel Label for new task port
4415 @see mpo_cred_label_associate_kernel_t
4417 Assign labels to a new kernel task and its task port. Both the task and
4418 task port labels should be specified. Both new labels are initialized.
4419 If there is an associated BSD process structure, it will be labelled
4420 with calls to mpo_cred_label_associate_kernel.
4422 typedef void mpo_task_label_associate_kernel_t(
4424 struct label
*tasklabel
,
4425 struct label
*portlabel
4428 @brief Assign a label to a new (userspace) Mach task
4429 @param parent Parent task
4430 @param child New (child) task
4431 @param parentlabel Label of parent task
4432 @param childlabel Label for new task
4433 @param childportlabel Label for new task's task port
4435 Assign labels to a new task and its task port. Both the task and task port
4436 labels should be specified. Both new labels are initialized. If the task
4437 will have an associated BSD process, that information will be made available
4438 by the task_label_update and port_label_update_cred entry points.
4440 typedef void mpo_task_label_associate_t(
4441 struct task
*parent
,
4443 struct label
*parentlabel
,
4444 struct label
*childlabel
,
4445 struct label
*childportlabel
4448 @brief Copy a Mach task label
4449 @param src Source task label
4450 @param dest Destination task label
4452 Copy the Mach task label information from src to dest. This is used
4453 when duplicating label handles to implement copy-on-write semantics.
4455 typedef void mpo_task_label_copy_t(
4460 @brief Destroy Mach task label
4461 @param label The label to be destroyed
4463 Destroy a Mach task label. Since the object is going out of
4464 scope, policy modules should free any internal storage associated
4465 with the label so that it may be destroyed.
4467 typedef void mpo_task_label_destroy_t(
4471 @brief Externalize a task label
4472 @param label Label to be externalized
4473 @param element_name Name of the label namespace for which labels should be
4475 @param sb String buffer to be filled with a text representation of the label
4477 Produce an external representation of the label on a task. An
4478 externalized label consists of a text representation of the label
4479 contents that can be used with user applications. Policy-agnostic
4480 user space tools will display this externalized version.
4482 @return 0 on success, return non-zero if an error occurs while
4483 externalizing the label data.
4486 typedef int mpo_task_label_externalize_t(
4487 struct label
*label
,
4492 @brief Initialize Mach task label
4493 @param label New label to initialize
4495 Initialize the label for a newly instantiated Mach task. Sleeping
4498 typedef void mpo_task_label_init_t(
4502 @brief Internalize a task label
4503 @param label Label to be internalized
4504 @param element_name Name of the label namespace for which the label should
4506 @param element_data Text data to be internalized
4508 Produce a task label from an external representation. An
4509 externalized label consists of a text representation of the label
4510 contents that can be used with user applications. Policy-agnostic
4511 user space tools will forward text version to the kernel for
4512 processing by individual policy modules.
4514 The policy's internalize entry points will be called only if the
4515 policy has registered interest in the label namespace.
4517 @return 0 on success, Otherwise, return non-zero if an error occurs
4518 while internalizing the label data.
4521 typedef int mpo_task_label_internalize_t(
4522 struct label
*label
,
4527 @brief Update a Mach task label
4528 @param cred User credential label to be used as the source
4529 @param task Mach task label to be used as the destination
4530 @see mpo_cred_label_update_t
4531 @see mpo_cred_label_update_execve_t
4533 Update the label on a Mach task, using the supplied user credential
4534 label. When a mac_cred_label_update_execve or a mac_cred_label_update operation
4535 causes the label on a user credential to change, the Mach task label
4536 also needs to be updated to reflect the change. Both labels are
4537 already valid (initialized and created).
4539 @warning XXX We may change the name of this entry point in a future
4540 version of the MAC framework.
4542 typedef void mpo_task_label_update_t(
4547 @brief Perform MAC-related events when a thread returns to user space
4548 @param code The number of the syscall/trap that has finished
4549 @param error The error code that will be returned to user space
4550 @param thread Mach (not BSD) thread that is returning
4552 This entry point permits policy modules to perform MAC-related
4553 events when a thread returns to user space, via a system call
4554 return, trap return, or otherwise.
4556 typedef void mpo_thread_userret_t(
4559 struct thread
*thread
4562 @brief Check vnode access
4563 @param cred Subject credential
4564 @param vp Object vnode
4565 @param label Label for vp
4566 @param acc_mode access(2) flags
4568 Determine how invocations of access(2) and related calls by the
4569 subject identified by the credential should return when performed
4570 on the passed vnode using the passed access flags. This should
4571 generally be implemented using the same semantics used in
4572 mpo_vnode_check_open.
4574 @return Return 0 if access is granted, otherwise an appropriate value for
4575 errno should be returned. Suggested failure: EACCES for label mismatch or
4576 EPERM for lack of privilege.
4578 typedef int mpo_vnode_check_access_t(
4581 struct label
*label
,
4585 @brief Access control check for changing working directory
4586 @param cred Subject credential
4587 @param dvp Object; vnode to chdir(2) into
4588 @param dlabel Policy label for dvp
4590 Determine whether the subject identified by the credential can change
4591 the process working directory to the passed vnode.
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_chdir_t(
4600 struct label
*dlabel
4603 @brief Access control check for changing root directory
4604 @param cred Subject credential
4605 @param dvp Directory vnode
4606 @param dlabel Policy label associated with dvp
4607 @param cnp Component name for dvp
4609 Determine whether the subject identified by the credential should be
4610 allowed to chroot(2) into the specified directory (dvp).
4612 @return In the event of an error, an appropriate value for errno
4613 should be returned, otherwise return 0 upon success.
4615 typedef int mpo_vnode_check_chroot_t(
4618 struct label
*dlabel
,
4619 struct componentname
*cnp
4622 @brief Access control check for creating vnode
4623 @param cred Subject credential
4624 @param dvp Directory vnode
4625 @param dlabel Policy label for dvp
4626 @param cnp Component name for dvp
4627 @param vap vnode attributes for vap
4629 Determine whether the subject identified by the credential can create
4630 a vnode with the passed parent directory, passed name information,
4631 and passed attribute information. This call may be made in a number of
4632 situations, including as a result of calls to open(2) with O_CREAT,
4633 mknod(2), mkfifo(2), and others.
4635 @return Return 0 if access is granted, otherwise an appropriate value for
4636 errno should be returned. Suggested failure: EACCES for label mismatch or
4637 EPERM for lack of privilege.
4639 typedef int mpo_vnode_check_create_t(
4642 struct label
*dlabel
,
4643 struct componentname
*cnp
,
4644 struct vnode_attr
*vap
4647 @brief Access control check for deleting extended attribute
4648 @param cred Subject credential
4649 @param vp Object vnode
4650 @param vlabel Label associated with vp
4651 @param name Extended attribute name
4653 Determine whether the subject identified by the credential can delete
4654 the extended attribute from the passed vnode.
4656 @return Return 0 if access is granted, otherwise an appropriate value for
4657 errno should be returned. Suggested failure: EACCES for label mismatch or
4658 EPERM for lack of privilege.
4660 typedef int mpo_vnode_check_deleteextattr_t(
4663 struct label
*vlabel
,
4667 @brief Access control check for exchanging file data
4668 @param cred Subject credential
4669 @param v1 vnode 1 to swap
4670 @param vl1 Policy label for v1
4671 @param v2 vnode 2 to swap
4672 @param vl2 Policy label for v2
4674 Determine whether the subject identified by the credential can swap the data
4675 in the two supplied vnodes.
4677 @return Return 0 if access is granted, otherwise an appropriate value for
4678 errno should be returned. Suggested failure: EACCES for label mismatch or
4679 EPERM for lack of privilege.
4681 typedef int mpo_vnode_check_exchangedata_t(
4689 @brief Access control check for executing the vnode
4690 @param cred Subject credential
4691 @param vp Object vnode to execute
4692 @param label Policy label for vp
4693 @param execlabel Userspace provided execution label
4694 @param cnp Component name for file being executed
4696 Determine whether the subject identified by the credential can execute
4697 the passed vnode. Determination of execute privilege is made separately
4698 from decisions about any process label transitioning event.
4700 The final label, execlabel, corresponds to a label supplied by a
4701 user space application through the use of the mac_execve system call.
4702 This label will be NULL if the user application uses the the vendor
4703 execve(2) call instead of the MAC Framework mac_execve() call.
4705 @return Return 0 if access is granted, otherwise an appropriate value for
4706 errno should be returned. Suggested failure: EACCES for label mismatch or
4707 EPERM for lack of privilege.
4709 typedef int mpo_vnode_check_exec_t(
4712 struct label
*label
,
4713 struct label
*execlabel
, /* NULLOK */
4714 struct componentname
*cnp
,
4718 @brief Access control check for retrieving file attributes
4719 @param cred Subject credential
4720 @param vp Object vnode
4721 @param vlabel Policy label for vp
4722 @param alist List of attributes to retrieve
4724 Determine whether the subject identified by the credential can read
4725 various attributes of the specified vnode, or the filesystem or volume on
4726 which that vnode resides. See <sys/attr.h> for definitions of the
4729 @return Return 0 if access is granted, otherwise an appropriate value for
4730 errno should be returned. Suggested failure: EACCES for label mismatch or
4731 EPERM for lack of privilege. Access control covers all attributes requested
4732 with this call; the security policy is not permitted to change the set of
4733 attributes requested.
4735 typedef int mpo_vnode_check_getattrlist_t(
4738 struct label
*vlabel
,
4739 struct attrlist
*alist
4742 @brief Access control check for retrieving an extended attribute
4743 @param cred Subject credential
4744 @param vp Object vnode
4745 @param label Policy label for vp
4746 @param name Extended attribute name
4747 @param uio I/O structure pointer
4749 Determine whether the subject identified by the credential can retrieve
4750 the extended attribute from the passed vnode. The uio parameter
4751 will be NULL when the getxattr(2) call has been made with a NULL data
4752 value; this is done to request the size of the data only.
4754 @return Return 0 if access is granted, otherwise an appropriate value for
4755 errno should be returned. Suggested failure: EACCES for label mismatch or
4756 EPERM for lack of privilege.
4758 typedef int mpo_vnode_check_getextattr_t(
4761 struct label
*label
, /* NULLOK */
4763 struct uio
*uio
/* NULLOK */
4766 @brief Access control check for ioctl
4767 @param cred Subject credential
4768 @param vp Object vnode
4769 @param label Policy label for vp
4770 @param com Device-dependent request code; see ioctl(2)
4772 Determine whether the subject identified by the credential can perform
4773 the ioctl operation indicated by com.
4775 @warning Since ioctl data is opaque from the standpoint of the MAC
4776 framework, and since ioctls can affect many aspects of system
4777 operation, policies must exercise extreme care when implementing
4778 access control checks.
4780 @return Return 0 if access is granted, otherwise an appropriate value for
4781 errno should be returned.
4783 typedef int mpo_vnode_check_ioctl_t(
4786 struct label
*label
,
4790 @brief Access control check for vnode kqfilter
4791 @param cred Subject credential
4792 @param kn Object knote
4793 @param vp Object vnode
4794 @param label Policy label for vp
4796 Determine whether the subject identified by the credential can
4797 receive the knote on the passed vnode.
4799 @return Return 0 if access if granted, otherwise an appropriate
4800 value for errno should be returned.
4802 typedef int mpo_vnode_check_kqfilter_t(
4803 kauth_cred_t active_cred
,
4804 kauth_cred_t file_cred
, /* NULLOK */
4810 @brief Access control check for relabel
4811 @param cred Subject credential
4812 @param vp Object vnode
4813 @param vnodelabel Existing policy label for vp
4814 @param newlabel Policy label update to later be applied to vp
4815 @see mpo_relable_vnode_t
4817 Determine whether the subject identified by the credential can relabel
4818 the passed vnode to the passed label update. If all policies permit
4819 the label change, the actual relabel entry point (mpo_vnode_label_update)
4822 @return Return 0 if access is granted, otherwise an appropriate value for
4823 errno should be returned.
4825 typedef int mpo_vnode_check_label_update_t(
4828 struct label
*vnodelabel
,
4829 struct label
*newlabel
4832 @brief Access control check for creating link
4833 @param cred Subject credential
4834 @param dvp Directory vnode
4835 @param dlabel Policy label associated with dvp
4836 @param vp Link destination vnode
4837 @param label Policy label associated with vp
4838 @param cnp Component name for the link being created
4840 Determine whether the subject identified by the credential should be
4841 allowed to create a link to the vnode vp with the name specified by cnp.
4843 @return Return 0 if access is granted, otherwise an appropriate value for
4844 errno should be returned.
4846 typedef int mpo_vnode_check_link_t(
4849 struct label
*dlabel
,
4851 struct label
*label
,
4852 struct componentname
*cnp
4855 @brief Access control check for listing extended attributes
4856 @param cred Subject credential
4857 @param vp Object vnode
4858 @param vlabel Policy label associated with vp
4860 Determine whether the subject identified by the credential can retrieve
4861 a list of named extended attributes from a vnode.
4863 @return Return 0 if access is granted, otherwise an appropriate value for
4864 errno should be returned.
4866 typedef int mpo_vnode_check_listextattr_t(
4869 struct label
*vlabel
4872 @brief Access control check for lookup
4873 @param cred Subject credential
4874 @param dvp Object vnode
4875 @param dlabel Policy label for dvp
4876 @param cnp Component name being looked up
4878 Determine whether the subject identified by the credential can perform
4879 a lookup in the passed directory vnode for the passed name (cnp).
4881 @return Return 0 if access is granted, otherwise an appropriate value for
4882 errno should be returned. Suggested failure: EACCES for label mismatch or
4883 EPERM for lack of privilege.
4885 typedef int mpo_vnode_check_lookup_t(
4888 struct label
*dlabel
,
4889 struct componentname
*cnp
4892 @brief Access control check for open
4893 @param cred Subject credential
4894 @param vp Object vnode
4895 @param label Policy label associated with vp
4896 @param acc_mode open(2) access mode
4898 Determine whether the subject identified by the credential can perform
4899 an open operation on the passed vnode with the passed access mode.
4901 @return Return 0 if access is granted, otherwise an appropriate value for
4902 errno should be returned. Suggested failure: EACCES for label mismatch or
4903 EPERM for lack of privilege.
4905 typedef int mpo_vnode_check_open_t(
4908 struct label
*label
,
4912 @brief Access control check for read
4913 @param active_cred Subject credential
4914 @param file_cred Credential associated with the struct fileproc
4915 @param vp Object vnode
4916 @param label Policy label for vp
4918 Determine whether the subject identified by the credential can perform
4919 a read operation on the passed vnode. The active_cred hold the credentials
4920 of the subject performing the operation, and file_cred holds the
4921 credentials of the subject that originally opened the file.
4923 @return Return 0 if access is granted, otherwise an appropriate value for
4924 errno should be returned. Suggested failure: EACCES for label mismatch or
4925 EPERM for lack of privilege.
4927 typedef int mpo_vnode_check_read_t(
4928 kauth_cred_t active_cred
, /* SUBJECT */
4929 kauth_cred_t file_cred
, /* NULLOK */
4930 struct vnode
*vp
, /* OBJECT */
4931 struct label
*label
/* LABEL */
4934 @brief Access control check for read directory
4935 @param cred Subject credential
4936 @param dvp Object directory vnode
4937 @param dlabel Policy label for dvp
4939 Determine whether the subject identified by the credential can
4940 perform a readdir operation on the passed directory vnode.
4942 @return Return 0 if access is granted, otherwise an appropriate value for
4943 errno should be returned. Suggested failure: EACCES for label mismatch or
4944 EPERM for lack of privilege.
4946 typedef int mpo_vnode_check_readdir_t(
4947 kauth_cred_t cred
, /* SUBJECT */
4948 struct vnode
*dvp
, /* OBJECT */
4949 struct label
*dlabel
/* LABEL */
4952 @brief Access control check for read link
4953 @param cred Subject credential
4954 @param vp Object vnode
4955 @param label Policy label for vp
4957 Determine whether the subject identified by the credential can perform
4958 a readlink operation on the passed symlink vnode. This call can be made
4959 in a number of situations, including an explicit readlink call by the
4960 user process, or as a result of an implicit readlink during a name
4961 lookup by the process.
4963 @return Return 0 if access is granted, otherwise an appropriate value for
4964 errno should be returned. Suggested failure: EACCES for label mismatch or
4965 EPERM for lack of privilege.
4967 typedef int mpo_vnode_check_readlink_t(
4973 @brief Access control check for rename from
4974 @param cred Subject credential
4975 @param dvp Directory vnode
4976 @param dlabel Policy label associated with dvp
4977 @param vp vnode to be renamed
4978 @param label Policy label associated with vp
4979 @param cnp Component name for vp
4980 @see mpo_vnode_check_rename_to_t
4982 Determine whether the subject identified by the credential should be
4983 allowed to rename the vnode vp to something else.
4985 Due to VFS locking constraints (to make sure proper vnode locks are
4986 held during this entry point), the vnode relabel checks had to be
4987 split into two parts: relabel_from and relabel to.
4989 @return Return 0 if access is granted, otherwise an appropriate value for
4990 errno should be returned.
4992 typedef int mpo_vnode_check_rename_from_t(
4995 struct label
*dlabel
,
4997 struct label
*label
,
4998 struct componentname
*cnp
5001 @brief Access control check for rename to
5002 @param cred Subject credential
5003 @param dvp Directory vnode
5004 @param dlabel Policy label associated with dvp
5005 @param vp Overwritten vnode
5006 @param label Policy label associated with vp
5007 @param samedir Boolean; 1 if the source and destination directories are the same
5008 @param cnp Destination component name
5009 @see mpo_vnode_check_rename_from_t
5011 Determine whether the subject identified by the credential should be
5012 allowed to rename to the vnode vp, into the directory dvp, or to the
5013 name represented by cnp. If there is no existing file to overwrite,
5014 vp and label will be NULL.
5016 Due to VFS locking constraints (to make sure proper vnode locks are
5017 held during this entry point), the vnode relabel checks had to be
5018 split into two parts: relabel_from and relabel to.
5020 @return Return 0 if access is granted, otherwise an appropriate value for
5021 errno should be returned.
5023 typedef int mpo_vnode_check_rename_to_t(
5026 struct label
*dlabel
,
5027 struct vnode
*vp
, /* NULLOK */
5028 struct label
*label
, /* NULLOK */
5030 struct componentname
*cnp
5033 @brief Access control check for revoke
5034 @param cred Subject credential
5035 @param vp Object vnode
5036 @param label Policy label for vp
5038 Determine whether the subject identified by the credential can revoke
5039 access to the passed vnode.
5041 @return Return 0 if access is granted, otherwise an appropriate value for
5042 errno should be returned. Suggested failure: EACCES for label mismatch or
5043 EPERM for lack of privilege.
5045 typedef int mpo_vnode_check_revoke_t(
5051 @brief Access control check for select
5052 @param cred Subject credential
5053 @param vp Object vnode
5054 @param label Policy label for vp
5055 @param which The operation selected on: FREAD or FWRITE
5057 Determine whether the subject identified by the credential can select
5060 @return Return 0 if access is granted, otherwise an appropriate value for
5061 errno should be returned.
5063 typedef int mpo_vnode_check_select_t(
5066 struct label
*label
,
5070 @brief Access control check for setting file attributes
5071 @param cred Subject credential
5072 @param vp Object vnode
5073 @param vlabel Policy label for vp
5074 @param alist List of attributes to set
5076 Determine whether the subject identified by the credential can set
5077 various attributes of the specified vnode, or the filesystem or volume on
5078 which that vnode resides. See <sys/attr.h> for definitions of the
5081 @return Return 0 if access is granted, otherwise an appropriate value for
5082 errno should be returned. Suggested failure: EACCES for label mismatch or
5083 EPERM for lack of privilege. Access control covers all attributes requested
5086 typedef int mpo_vnode_check_setattrlist_t(
5089 struct label
*vlabel
,
5090 struct attrlist
*alist
5093 @brief Access control check for setting extended attribute
5094 @param cred Subject credential
5095 @param vp Object vnode
5096 @param label Policy label for vp
5097 @param name Extended attribute name
5098 @param uio I/O structure pointer
5100 Determine whether the subject identified by the credential can set the
5101 extended attribute of passed name and passed namespace on the passed
5102 vnode. Policies implementing security labels backed into extended
5103 attributes may want to provide additional protections for those
5104 attributes. Additionally, policies should avoid making decisions based
5105 on the data referenced from uio, as there is a potential race condition
5106 between this check and the actual operation. The uio may also be NULL
5107 if a delete operation is being performed.
5109 @return Return 0 if access is granted, otherwise an appropriate value for
5110 errno should be returned. Suggested failure: EACCES for label mismatch or
5111 EPERM for lack of privilege.
5113 typedef int mpo_vnode_check_setextattr_t(
5116 struct label
*label
,
5121 @brief Access control check for setting flags
5122 @param cred Subject credential
5123 @param vp Object vnode
5124 @param label Policy label for vp
5125 @param flags File flags; see chflags(2)
5127 Determine whether the subject identified by the credential can set
5128 the passed flags on the passed vnode.
5130 @return Return 0 if access is granted, otherwise an appropriate value for
5131 errno should be returned. Suggested failure: EACCES for label mismatch or
5132 EPERM for lack of privilege.
5134 typedef int mpo_vnode_check_setflags_t(
5137 struct label
*label
,
5141 @brief Access control check for setting mode
5142 @param cred Subject credential
5143 @param vp Object vnode
5144 @param label Policy label for vp
5145 @param mode File mode; see chmod(2)
5147 Determine whether the subject identified by the credential can set
5148 the passed mode on the passed vnode.
5150 @return Return 0 if access is granted, otherwise an appropriate value for
5151 errno should be returned. Suggested failure: EACCES for label mismatch or
5152 EPERM for lack of privilege.
5154 typedef int mpo_vnode_check_setmode_t(
5157 struct label
*label
,
5161 @brief Access control check for setting uid and gid
5162 @param cred Subject credential
5163 @param vp Object vnode
5164 @param label Policy label for vp
5168 Determine whether the subject identified by the credential can set
5169 the passed uid and passed gid as file uid and file gid on the passed
5170 vnode. The IDs may be set to (-1) to request no update.
5172 @return Return 0 if access is granted, otherwise an appropriate value for
5173 errno should be returned. Suggested failure: EACCES for label mismatch or
5174 EPERM for lack of privilege.
5176 typedef int mpo_vnode_check_setowner_t(
5179 struct label
*label
,
5184 @brief Access control check for setting timestamps
5185 @param cred Subject credential
5186 @param vp Object vnode
5187 @param label Policy label for vp
5188 @param atime Access time; see utimes(2)
5189 @param mtime Modification time; see utimes(2)
5191 Determine whether the subject identified by the credential can set
5192 the passed access timestamps on the passed vnode.
5194 @return Return 0 if access is granted, otherwise an appropriate value for
5195 errno should be returned. Suggested failure: EACCES for label mismatch or
5196 EPERM for lack of privilege.
5198 typedef int mpo_vnode_check_setutimes_t(
5201 struct label
*label
,
5202 struct timespec atime
,
5203 struct timespec mtime
5206 @brief Access control check for stat
5207 @param active_cred Subject credential
5208 @param file_cred Credential associated with the struct fileproc
5209 @param vp Object vnode
5210 @param label Policy label for vp
5212 Determine whether the subject identified by the credential can stat
5213 the passed vnode. See stat(2) for more information. The active_cred
5214 hold the credentials of the subject performing the operation, and
5215 file_cred holds the credentials of the subject that originally
5218 @return Return 0 if access is granted, otherwise an appropriate value for
5219 errno should be returned. Suggested failure: EACCES for label mismatch or
5220 EPERM for lack of privilege.
5222 typedef int mpo_vnode_check_stat_t(
5223 struct ucred
*active_cred
,
5224 struct ucred
*file_cred
, /* NULLOK */
5229 @brief Access control check for truncate/ftruncate
5230 @param active_cred Subject credential
5231 @param file_cred Credential associated with the struct fileproc
5232 @param vp Object vnode
5233 @param label Policy label for vp
5235 Determine whether the subject identified by the credential can
5236 perform a truncate operation on the passed vnode. The active_cred hold
5237 the credentials of the subject performing the operation, and
5238 file_cred holds the credentials of the subject that originally
5241 @return Return 0 if access is granted, otherwise an appropriate value for
5242 errno should be returned. Suggested failure: EACCES for label mismatch or
5243 EPERM for lack of privilege.
5245 typedef int mpo_vnode_check_truncate_t(
5246 kauth_cred_t active_cred
,
5247 kauth_cred_t file_cred
, /* NULLOK */
5252 @brief Access control check for deleting vnode
5253 @param cred Subject credential
5254 @param dvp Parent directory vnode
5255 @param dlabel Policy label for dvp
5256 @param vp Object vnode to delete
5257 @param label Policy label for vp
5258 @param cnp Component name for vp
5259 @see mpo_check_rename_to_t
5261 Determine whether the subject identified by the credential can delete
5262 a vnode from the passed parent directory and passed name information.
5263 This call may be made in a number of situations, including as a
5264 results of calls to unlink(2) and rmdir(2). Policies implementing
5265 this entry point should also implement mpo_check_rename_to to
5266 authorize deletion of objects as a result of being the target of a rename.
5268 @return Return 0 if access is granted, otherwise an appropriate value for
5269 errno should be returned. Suggested failure: EACCES for label mismatch or
5270 EPERM for lack of privilege.
5272 typedef int mpo_vnode_check_unlink_t(
5275 struct label
*dlabel
,
5277 struct label
*label
,
5278 struct componentname
*cnp
5281 @brief Access control check for write
5282 @param active_cred Subject credential
5283 @param file_cred Credential associated with the struct fileproc
5284 @param vp Object vnode
5285 @param label Policy label for vp
5287 Determine whether the subject identified by the credential can
5288 perform a write operation on the passed vnode. The active_cred hold
5289 the credentials of the subject performing the operation, and
5290 file_cred holds the credentials of the subject that originally
5293 @return Return 0 if access is granted, otherwise an appropriate value for
5294 errno should be returned. Suggested failure: EACCES for label mismatch or
5295 EPERM for lack of privilege.
5297 typedef int mpo_vnode_check_write_t(
5298 kauth_cred_t active_cred
,
5299 kauth_cred_t file_cred
, /* NULLOK */
5304 @brief Associate a vnode with a devfs entry
5305 @param mp Devfs mount point
5306 @param mntlabel Devfs mount point label
5307 @param de Devfs directory entry
5308 @param delabel Label associated with de
5309 @param vp vnode associated with de
5310 @param vlabel Label associated with vp
5312 Fill in the label (vlabel) for a newly created devfs vnode. The
5313 label is typically derived from the label on the devfs directory
5314 entry or the label on the filesystem, supplied as parameters.
5316 typedef void mpo_vnode_label_associate_devfs_t(
5318 struct label
*mntlabel
,
5320 struct label
*delabel
,
5322 struct label
*vlabel
5325 @brief Associate a label with a vnode
5326 @param mp File system mount point
5327 @param mntlabel File system mount point label
5328 @param vp Vnode to label
5329 @param vlabel Label associated with vp
5331 Attempt to retrieve label information for the vnode, vp, from the
5332 file system extended attribute store. The label should be stored in
5333 the supplied vlabel parameter. If a policy cannot retrieve an
5334 extended attribute, sometimes it is acceptible to fallback to using
5337 If the policy requires vnodes to have a valid label elsewhere it
5338 MUST NOT return other than temporary errors, and must always provide
5339 a valid label of some sort. Returning an error will cause vnode
5340 labeling to be retried at a later access. Failure to handle policy
5341 centric errors internally (corrupt labels etc.) will result in
5344 @return In the event of an error, an appropriate value for errno
5345 should be returned, otherwise return 0 upon success.
5347 typedef int mpo_vnode_label_associate_extattr_t(
5349 struct label
*mntlabel
,
5351 struct label
*vlabel
5354 @brief Associate a file label with a vnode
5355 @param cred User credential
5356 @param mp Fdesc mount point
5357 @param mntlabel Fdesc mount point label
5358 @param fg Fileglob structure
5359 @param label Policy label for fg
5360 @param vp Vnode to label
5361 @param vlabel Label associated with vp
5363 Associate label information for the vnode, vp, with the label of
5364 the open file descriptor described by fg.
5365 The label should be stored in the supplied vlabel parameter.
5367 typedef void mpo_vnode_label_associate_file_t(
5370 struct label
*mntlabel
,
5371 struct fileglob
*fg
,
5372 struct label
*label
,
5374 struct label
*vlabel
5377 @brief Associate a pipe label with a vnode
5378 @param cred User credential for the process that opened the pipe
5379 @param cpipe Pipe structure
5380 @param pipelabel Label associated with pipe
5381 @param vp Vnode to label
5382 @param vlabel Label associated with vp
5384 Associate label information for the vnode, vp, with the label of
5385 the pipe described by the pipe structure cpipe.
5386 The label should be stored in the supplied vlabel parameter.
5388 typedef void mpo_vnode_label_associate_pipe_t(
5391 struct label
*pipelabel
,
5393 struct label
*vlabel
5396 @brief Associate a POSIX semaphore label with a vnode
5397 @param cred User credential for the process that create psem
5398 @param psem POSIX semaphore structure
5399 @param psemlabel Label associated with psem
5400 @param vp Vnode to label
5401 @param vlabel Label associated with vp
5403 Associate label information for the vnode, vp, with the label of
5404 the POSIX semaphore described by psem.
5405 The label should be stored in the supplied vlabel parameter.
5407 typedef void mpo_vnode_label_associate_posixsem_t(
5409 struct pseminfo
*psem
,
5410 struct label
*psemlabel
,
5412 struct label
*vlabel
5415 @brief Associate a POSIX shared memory label with a vnode
5416 @param cred User credential for the process that created pshm
5417 @param pshm POSIX shared memory structure
5418 @param pshmlabel Label associated with pshm
5419 @param vp Vnode to label
5420 @param vlabel Label associated with vp
5422 Associate label information for the vnode, vp, with the label of
5423 the POSIX shared memory region described by pshm.
5424 The label should be stored in the supplied vlabel parameter.
5426 typedef void mpo_vnode_label_associate_posixshm_t(
5428 struct pshminfo
*pshm
,
5429 struct label
*pshmlabel
,
5431 struct label
*vlabel
5434 @brief Associate a label with a vnode
5435 @param mp File system mount point
5436 @param mntlabel File system mount point label
5437 @param vp Vnode to label
5438 @param vlabel Label associated with vp
5440 On non-multilabel file systems, set the label for a vnode. The
5441 label will most likely be based on the file system label.
5443 typedef void mpo_vnode_label_associate_singlelabel_t(
5445 struct label
*mntlabel
,
5447 struct label
*vlabel
5450 @brief Associate a socket label with a vnode
5451 @param cred User credential for the process that opened the socket
5452 @param so Socket structure
5453 @param solabel Label associated with so
5454 @param vp Vnode to label
5455 @param vlabel Label associated with vp
5457 Associate label information for the vnode, vp, with the label of
5458 the open socket described by the socket structure so.
5459 The label should be stored in the supplied vlabel parameter.
5461 typedef void mpo_vnode_label_associate_socket_t(
5464 struct label
*solabel
,
5466 struct label
*vlabel
5469 @brief Copy a vnode label
5470 @param src Source vnode label
5471 @param dest Destination vnode label
5473 Copy the vnode label information from src to dest. On Darwin, this
5474 is currently only necessary when executing interpreted scripts, but
5475 will later be used if vnode label externalization cannot be an
5478 typedef void mpo_vnode_label_copy_t(
5483 @brief Destroy vnode label
5484 @param label The label to be destroyed
5486 Destroy a vnode label. Since the object is going out of scope,
5487 policy modules should free any internal storage associated with the
5488 label so that it may be destroyed.
5490 typedef void mpo_vnode_label_destroy_t(
5494 @brief Externalize a vnode label for auditing
5495 @param label Label to be externalized
5496 @param element_name Name of the label namespace for which labels should be
5498 @param sb String buffer to be filled with a text representation of the label
5500 Produce an external representation of the label on a vnode suitable for
5501 inclusion in an audit record. An externalized label consists of a text
5502 representation of the label contents that will be added to the audit record
5503 as part of a text token. Policy-agnostic user space tools will display
5504 this externalized version.
5506 @return 0 on success, return non-zero if an error occurs while
5507 externalizing the label data.
5510 typedef int mpo_vnode_label_externalize_audit_t(
5511 struct label
*label
,
5516 @brief Externalize a vnode label
5517 @param label Label to be externalized
5518 @param element_name Name of the label namespace for which labels should be
5520 @param sb String buffer to be filled with a text representation of the label
5522 Produce an external representation of the label on a vnode. An
5523 externalized label consists of a text representation of the label
5524 contents that can be used with user applications. Policy-agnostic
5525 user space tools will display this externalized version.
5527 @return 0 on success, return non-zero if an error occurs while
5528 externalizing the label data.
5531 typedef int mpo_vnode_label_externalize_t(
5532 struct label
*label
,
5537 @brief Initialize vnode label
5538 @param label New label to initialize
5540 Initialize label storage for use with a newly instantiated vnode, or
5541 for temporary storage associated with the copying in or out of a
5542 vnode label. While it is necessary to allocate space for a
5543 kernel-resident vnode label, it is not yet necessary to link this vnode
5544 with persistent label storage facilities, such as extended attributes.
5545 Sleeping is permitted.
5547 typedef void mpo_vnode_label_init_t(
5551 @brief Internalize a vnode label
5552 @param label Label to be internalized
5553 @param element_name Name of the label namespace for which the label should
5555 @param element_data Text data to be internalized
5557 Produce a vnode label from an external representation. An
5558 externalized label consists of a text representation of the label
5559 contents that can be used with user applications. Policy-agnostic
5560 user space tools will forward text version to the kernel for
5561 processing by individual policy modules.
5563 The policy's internalize entry points will be called only if the
5564 policy has registered interest in the label namespace.
5566 @return 0 on success, Otherwise, return non-zero if an error occurs
5567 while internalizing the label data.
5569 typedef int mpo_vnode_label_internalize_t(
5570 struct label
*label
,
5575 @brief Clean up a vnode label
5576 @param label The label to be cleaned for re-use
5578 Clean up a vnode label. Darwin (Tiger, 8.x) allocates vnodes on demand, but
5579 typically never frees them. Before vnodes are placed back on free lists for
5580 re-use, policies can cleanup or overwrite any information present in the label.
5582 typedef void mpo_vnode_label_recycle_t(
5586 @brief Write a label to a extended attribute
5587 @param cred Subject credential
5588 @param vp The vnode for which the label is being stored
5589 @param vlabel Label associated with vp
5590 @param intlabel The new label to store
5592 Store a new label in the extended attribute corresponding to the
5593 supplied vnode. The policy has already authorized the operation;
5594 this call must be implemented in order to perform the actual
5597 @return In the event of an error, an appropriate value for errno
5598 should be returned, otherwise return 0 upon success.
5600 @warning XXX After examining the extended attribute implementation on
5601 Apple's future release, this entry point may be changed.
5603 typedef int mpo_vnode_label_store_t(
5606 struct label
*vlabel
,
5607 struct label
*intlabel
5610 @brief Update vnode label from extended attributes
5611 @param mp File system mount point
5612 @param mntlabel Mount point label
5613 @param vp Vnode to label
5614 @param vlabel Label associated with vp
5615 @param name Name of the xattr
5616 @see mpo_vnode_check_setextattr_t
5618 When an extended attribute is updated via the Vendor attribute management
5619 functions, the MAC vnode label might also require an update.
5620 Policies should first determine if 'name' matches their xattr label
5621 name. If it does, the kernel is has either replaced or removed the
5622 named extended attribute that was previously associated with the
5623 vnode. Normally labels should only be modified via MAC Framework label
5624 management calls, but sometimes the user space components will directly
5625 modify extended attributes. For example, 'cp', 'tar', etc. manage
5626 extended attributes in userspace, not the kernel.
5628 This entry point is called after the label update has occurred, so
5629 it cannot return a failure. However, the operation is preceded by
5630 the mpo_vnode_check_setextattr() access control check.
5632 If the vnode label needs to be updated the policy should return
5633 a non-zero value. The vnode label will be marked for re-association
5636 typedef int mpo_vnode_label_update_extattr_t(
5638 struct label
*mntlabel
,
5640 struct label
*vlabel
,
5644 @brief Update a vnode label
5645 @param cred Subject credential
5646 @param vp The vnode to relabel
5647 @param vnodelabel Existing vnode label
5648 @param label New label to replace existing label
5649 @see mpo_vnode_check_label_update_t
5651 The subject identified by the credential has previously requested
5652 and was authorized to relabel the vnode; this entry point allows
5653 policies to perform the actual relabel operation. Policies should
5654 update vnodelabel using the label stored in the label parameter.
5656 typedef void mpo_vnode_label_update_t(
5659 struct label
*vnodelabel
,
5663 @brief Create a new vnode, backed by extended attributes
5664 @param cred User credential for the creating process
5665 @param mp File system mount point
5666 @param mntlabel File system mount point label
5667 @param dvp Parent directory vnode
5668 @param dlabel Parent directory vnode label
5669 @param vp Newly created vnode
5670 @param vlabel Label to associate with the new vnode
5671 @param cnp Component name for vp
5673 Write out the label for the newly created vnode, most likely storing
5674 the results in a file system extended attribute. Most policies will
5675 derive the new vnode label using information from a combination
5676 of the subject (user) credential, the file system label, the parent
5677 directory label, and potentially the path name component.
5679 @return If the operation succeeds, store the new label in vlabel and
5680 return 0. Otherwise, return an appropriate errno value.
5682 typedef int mpo_vnode_notify_create_t(
5685 struct label
*mntlabel
,
5687 struct label
*dlabel
,
5689 struct label
*vlabel
,
5690 struct componentname
*cnp
5694 * Placeholder for future events that may need mac hooks.
5696 typedef void mpo_reserved_hook_t(void);
5699 \struct mac_policy_ops
5701 struct mac_policy_ops
{
5702 mpo_audit_check_postselect_t
*mpo_audit_check_postselect
;
5703 mpo_audit_check_preselect_t
*mpo_audit_check_preselect
;
5704 mpo_bpfdesc_label_associate_t
*mpo_bpfdesc_label_associate
;
5705 mpo_bpfdesc_label_destroy_t
*mpo_bpfdesc_label_destroy
;
5706 mpo_bpfdesc_label_init_t
*mpo_bpfdesc_label_init
;
5707 mpo_bpfdesc_check_receive_t
*mpo_bpfdesc_check_receive
;
5708 mpo_cred_check_label_update_execve_t
*mpo_cred_check_label_update_execve
;
5709 mpo_cred_check_label_update_t
*mpo_cred_check_label_update
;
5710 mpo_cred_check_visible_t
*mpo_cred_check_visible
;
5711 mpo_cred_label_associate_fork_t
*mpo_cred_label_associate_fork
;
5712 mpo_cred_label_associate_kernel_t
*mpo_cred_label_associate_kernel
;
5713 mpo_cred_label_associate_t
*mpo_cred_label_associate
;
5714 mpo_cred_label_associate_user_t
*mpo_cred_label_associate_user
;
5715 mpo_cred_label_destroy_t
*mpo_cred_label_destroy
;
5716 mpo_cred_label_externalize_audit_t
*mpo_cred_label_externalize_audit
;
5717 mpo_cred_label_externalize_t
*mpo_cred_label_externalize
;
5718 mpo_cred_label_init_t
*mpo_cred_label_init
;
5719 mpo_cred_label_internalize_t
*mpo_cred_label_internalize
;
5720 mpo_cred_label_update_execve_t
*mpo_cred_label_update_execve
;
5721 mpo_cred_label_update_t
*mpo_cred_label_update
;
5722 mpo_devfs_label_associate_device_t
*mpo_devfs_label_associate_device
;
5723 mpo_devfs_label_associate_directory_t
*mpo_devfs_label_associate_directory
;
5724 mpo_devfs_label_copy_t
*mpo_devfs_label_copy
;
5725 mpo_devfs_label_destroy_t
*mpo_devfs_label_destroy
;
5726 mpo_devfs_label_init_t
*mpo_devfs_label_init
;
5727 mpo_devfs_label_update_t
*mpo_devfs_label_update
;
5728 mpo_file_check_change_offset_t
*mpo_file_check_change_offset
;
5729 mpo_file_check_create_t
*mpo_file_check_create
;
5730 mpo_file_check_dup_t
*mpo_file_check_dup
;
5731 mpo_file_check_fcntl_t
*mpo_file_check_fcntl
;
5732 mpo_file_check_get_offset_t
*mpo_file_check_get_offset
;
5733 mpo_file_check_get_t
*mpo_file_check_get
;
5734 mpo_file_check_inherit_t
*mpo_file_check_inherit
;
5735 mpo_file_check_ioctl_t
*mpo_file_check_ioctl
;
5736 mpo_file_check_lock_t
*mpo_file_check_lock
;
5737 mpo_file_check_mmap_downgrade_t
*mpo_file_check_mmap_downgrade
;
5738 mpo_file_check_mmap_t
*mpo_file_check_mmap
;
5739 mpo_file_check_receive_t
*mpo_file_check_receive
;
5740 mpo_file_check_set_t
*mpo_file_check_set
;
5741 mpo_file_label_init_t
*mpo_file_label_init
;
5742 mpo_file_label_destroy_t
*mpo_file_label_destroy
;
5743 mpo_file_label_associate_t
*mpo_file_label_associate
;
5744 mpo_ifnet_check_label_update_t
*mpo_ifnet_check_label_update
;
5745 mpo_ifnet_check_transmit_t
*mpo_ifnet_check_transmit
;
5746 mpo_ifnet_label_associate_t
*mpo_ifnet_label_associate
;
5747 mpo_ifnet_label_copy_t
*mpo_ifnet_label_copy
;
5748 mpo_ifnet_label_destroy_t
*mpo_ifnet_label_destroy
;
5749 mpo_ifnet_label_externalize_t
*mpo_ifnet_label_externalize
;
5750 mpo_ifnet_label_init_t
*mpo_ifnet_label_init
;
5751 mpo_ifnet_label_internalize_t
*mpo_ifnet_label_internalize
;
5752 mpo_ifnet_label_update_t
*mpo_ifnet_label_update
;
5753 mpo_ifnet_label_recycle_t
*mpo_ifnet_label_recycle
;
5754 mpo_inpcb_check_deliver_t
*mpo_inpcb_check_deliver
;
5755 mpo_inpcb_label_associate_t
*mpo_inpcb_label_associate
;
5756 mpo_inpcb_label_destroy_t
*mpo_inpcb_label_destroy
;
5757 mpo_inpcb_label_init_t
*mpo_inpcb_label_init
;
5758 mpo_inpcb_label_recycle_t
*mpo_inpcb_label_recycle
;
5759 mpo_inpcb_label_update_t
*mpo_inpcb_label_update
;
5760 mpo_iokit_check_device_t
*mpo_iokit_check_device
;
5761 mpo_ipq_label_associate_t
*mpo_ipq_label_associate
;
5762 mpo_ipq_label_compare_t
*mpo_ipq_label_compare
;
5763 mpo_ipq_label_destroy_t
*mpo_ipq_label_destroy
;
5764 mpo_ipq_label_init_t
*mpo_ipq_label_init
;
5765 mpo_ipq_label_update_t
*mpo_ipq_label_update
;
5766 mpo_lctx_check_label_update_t
*mpo_lctx_check_label_update
;
5767 mpo_lctx_label_destroy_t
*mpo_lctx_label_destroy
;
5768 mpo_lctx_label_externalize_t
*mpo_lctx_label_externalize
;
5769 mpo_lctx_label_init_t
*mpo_lctx_label_init
;
5770 mpo_lctx_label_internalize_t
*mpo_lctx_label_internalize
;
5771 mpo_lctx_label_update_t
*mpo_lctx_label_update
;
5772 mpo_lctx_notify_create_t
*mpo_lctx_notify_create
;
5773 mpo_lctx_notify_join_t
*mpo_lctx_notify_join
;
5774 mpo_lctx_notify_leave_t
*mpo_lctx_notify_leave
;
5775 mpo_mbuf_label_associate_bpfdesc_t
*mpo_mbuf_label_associate_bpfdesc
;
5776 mpo_mbuf_label_associate_ifnet_t
*mpo_mbuf_label_associate_ifnet
;
5777 mpo_mbuf_label_associate_inpcb_t
*mpo_mbuf_label_associate_inpcb
;
5778 mpo_mbuf_label_associate_ipq_t
*mpo_mbuf_label_associate_ipq
;
5779 mpo_mbuf_label_associate_linklayer_t
*mpo_mbuf_label_associate_linklayer
;
5780 mpo_mbuf_label_associate_multicast_encap_t
*mpo_mbuf_label_associate_multicast_encap
;
5781 mpo_mbuf_label_associate_netlayer_t
*mpo_mbuf_label_associate_netlayer
;
5782 mpo_mbuf_label_associate_socket_t
*mpo_mbuf_label_associate_socket
;
5783 mpo_mbuf_label_copy_t
*mpo_mbuf_label_copy
;
5784 mpo_mbuf_label_destroy_t
*mpo_mbuf_label_destroy
;
5785 mpo_mbuf_label_init_t
*mpo_mbuf_label_init
;
5786 mpo_mount_check_fsctl_t
*mpo_mount_check_fsctl
;
5787 mpo_mount_check_getattr_t
*mpo_mount_check_getattr
;
5788 mpo_mount_check_label_update_t
*mpo_mount_check_label_update
;
5789 mpo_mount_check_mount_t
*mpo_mount_check_mount
;
5790 mpo_mount_check_remount_t
*mpo_mount_check_remount
;
5791 mpo_mount_check_setattr_t
*mpo_mount_check_setattr
;
5792 mpo_mount_check_stat_t
*mpo_mount_check_stat
;
5793 mpo_mount_check_umount_t
*mpo_mount_check_umount
;
5794 mpo_mount_label_associate_t
*mpo_mount_label_associate
;
5795 mpo_mount_label_destroy_t
*mpo_mount_label_destroy
;
5796 mpo_mount_label_externalize_t
*mpo_mount_label_externalize
;
5797 mpo_mount_label_init_t
*mpo_mount_label_init
;
5798 mpo_mount_label_internalize_t
*mpo_mount_label_internalize
;
5799 mpo_netinet_fragment_t
*mpo_netinet_fragment
;
5800 mpo_netinet_icmp_reply_t
*mpo_netinet_icmp_reply
;
5801 mpo_netinet_tcp_reply_t
*mpo_netinet_tcp_reply
;
5802 mpo_pipe_check_ioctl_t
*mpo_pipe_check_ioctl
;
5803 mpo_pipe_check_kqfilter_t
*mpo_pipe_check_kqfilter
;
5804 mpo_pipe_check_label_update_t
*mpo_pipe_check_label_update
;
5805 mpo_pipe_check_read_t
*mpo_pipe_check_read
;
5806 mpo_pipe_check_select_t
*mpo_pipe_check_select
;
5807 mpo_pipe_check_stat_t
*mpo_pipe_check_stat
;
5808 mpo_pipe_check_write_t
*mpo_pipe_check_write
;
5809 mpo_pipe_label_associate_t
*mpo_pipe_label_associate
;
5810 mpo_pipe_label_copy_t
*mpo_pipe_label_copy
;
5811 mpo_pipe_label_destroy_t
*mpo_pipe_label_destroy
;
5812 mpo_pipe_label_externalize_t
*mpo_pipe_label_externalize
;
5813 mpo_pipe_label_init_t
*mpo_pipe_label_init
;
5814 mpo_pipe_label_internalize_t
*mpo_pipe_label_internalize
;
5815 mpo_pipe_label_update_t
*mpo_pipe_label_update
;
5816 mpo_policy_destroy_t
*mpo_policy_destroy
;
5817 mpo_policy_init_t
*mpo_policy_init
;
5818 mpo_policy_initbsd_t
*mpo_policy_initbsd
;
5819 mpo_policy_syscall_t
*mpo_policy_syscall
;
5820 mpo_port_check_copy_send_t
*mpo_port_check_copy_send
;
5821 mpo_port_check_hold_receive_t
*mpo_port_check_hold_receive
;
5822 mpo_port_check_hold_send_once_t
*mpo_port_check_hold_send_once
;
5823 mpo_port_check_hold_send_t
*mpo_port_check_hold_send
;
5824 mpo_port_check_label_update_t
*mpo_port_check_label_update
;
5825 mpo_port_check_make_send_once_t
*mpo_port_check_make_send_once
;
5826 mpo_port_check_make_send_t
*mpo_port_check_make_send
;
5827 mpo_port_check_method_t
*mpo_port_check_method
;
5828 mpo_port_check_move_receive_t
*mpo_port_check_move_receive
;
5829 mpo_port_check_move_send_once_t
*mpo_port_check_move_send_once
;
5830 mpo_port_check_move_send_t
*mpo_port_check_move_send
;
5831 mpo_port_check_receive_t
*mpo_port_check_receive
;
5832 mpo_port_check_send_t
*mpo_port_check_send
;
5833 mpo_port_check_service_t
*mpo_port_check_service
;
5834 mpo_port_label_associate_kernel_t
*mpo_port_label_associate_kernel
;
5835 mpo_port_label_associate_t
*mpo_port_label_associate
;
5836 mpo_port_label_compute_t
*mpo_port_label_compute
;
5837 mpo_port_label_copy_t
*mpo_port_label_copy
;
5838 mpo_port_label_destroy_t
*mpo_port_label_destroy
;
5839 mpo_port_label_init_t
*mpo_port_label_init
;
5840 mpo_port_label_update_cred_t
*mpo_port_label_update_cred
;
5841 mpo_port_label_update_kobject_t
*mpo_port_label_update_kobject
;
5842 mpo_posixsem_check_create_t
*mpo_posixsem_check_create
;
5843 mpo_posixsem_check_open_t
*mpo_posixsem_check_open
;
5844 mpo_posixsem_check_post_t
*mpo_posixsem_check_post
;
5845 mpo_posixsem_check_unlink_t
*mpo_posixsem_check_unlink
;
5846 mpo_posixsem_check_wait_t
*mpo_posixsem_check_wait
;
5847 mpo_posixsem_label_associate_t
*mpo_posixsem_label_associate
;
5848 mpo_posixsem_label_destroy_t
*mpo_posixsem_label_destroy
;
5849 mpo_posixsem_label_init_t
*mpo_posixsem_label_init
;
5850 mpo_posixshm_check_create_t
*mpo_posixshm_check_create
;
5851 mpo_posixshm_check_mmap_t
*mpo_posixshm_check_mmap
;
5852 mpo_posixshm_check_open_t
*mpo_posixshm_check_open
;
5853 mpo_posixshm_check_stat_t
*mpo_posixshm_check_stat
;
5854 mpo_posixshm_check_truncate_t
*mpo_posixshm_check_truncate
;
5855 mpo_posixshm_check_unlink_t
*mpo_posixshm_check_unlink
;
5856 mpo_posixshm_label_associate_t
*mpo_posixshm_label_associate
;
5857 mpo_posixshm_label_destroy_t
*mpo_posixshm_label_destroy
;
5858 mpo_posixshm_label_init_t
*mpo_posixshm_label_init
;
5859 mpo_proc_check_debug_t
*mpo_proc_check_debug
;
5860 mpo_proc_check_fork_t
*mpo_proc_check_fork
;
5861 mpo_proc_check_get_task_name_t
*mpo_proc_check_get_task_name
;
5862 mpo_proc_check_get_task_t
*mpo_proc_check_get_task
;
5863 mpo_proc_check_getaudit_t
*mpo_proc_check_getaudit
;
5864 mpo_proc_check_getauid_t
*mpo_proc_check_getauid
;
5865 mpo_proc_check_getlcid_t
*mpo_proc_check_getlcid
;
5866 mpo_proc_check_mprotect_t
*mpo_proc_check_mprotect
;
5867 mpo_proc_check_sched_t
*mpo_proc_check_sched
;
5868 mpo_proc_check_setaudit_t
*mpo_proc_check_setaudit
;
5869 mpo_proc_check_setauid_t
*mpo_proc_check_setauid
;
5870 mpo_proc_check_setlcid_t
*mpo_proc_check_setlcid
;
5871 mpo_proc_check_signal_t
*mpo_proc_check_signal
;
5872 mpo_proc_check_wait_t
*mpo_proc_check_wait
;
5873 mpo_proc_label_destroy_t
*mpo_proc_label_destroy
;
5874 mpo_proc_label_init_t
*mpo_proc_label_init
;
5875 mpo_socket_check_accept_t
*mpo_socket_check_accept
;
5876 mpo_socket_check_accepted_t
*mpo_socket_check_accepted
;
5877 mpo_socket_check_bind_t
*mpo_socket_check_bind
;
5878 mpo_socket_check_connect_t
*mpo_socket_check_connect
;
5879 mpo_socket_check_create_t
*mpo_socket_check_create
;
5880 mpo_socket_check_deliver_t
*mpo_socket_check_deliver
;
5881 mpo_socket_check_kqfilter_t
*mpo_socket_check_kqfilter
;
5882 mpo_socket_check_label_update_t
*mpo_socket_check_label_update
;
5883 mpo_socket_check_listen_t
*mpo_socket_check_listen
;
5884 mpo_socket_check_receive_t
*mpo_socket_check_receive
;
5885 mpo_socket_check_received_t
*mpo_socket_check_received
;
5886 mpo_socket_check_select_t
*mpo_socket_check_select
;
5887 mpo_socket_check_send_t
*mpo_socket_check_send
;
5888 mpo_socket_check_stat_t
*mpo_socket_check_stat
;
5889 mpo_socket_check_setsockopt_t
*mpo_socket_check_setsockopt
;
5890 mpo_socket_check_getsockopt_t
*mpo_socket_check_getsockopt
;
5891 mpo_socket_label_associate_accept_t
*mpo_socket_label_associate_accept
;
5892 mpo_socket_label_associate_t
*mpo_socket_label_associate
;
5893 mpo_socket_label_copy_t
*mpo_socket_label_copy
;
5894 mpo_socket_label_destroy_t
*mpo_socket_label_destroy
;
5895 mpo_socket_label_externalize_t
*mpo_socket_label_externalize
;
5896 mpo_socket_label_init_t
*mpo_socket_label_init
;
5897 mpo_socket_label_internalize_t
*mpo_socket_label_internalize
;
5898 mpo_socket_label_update_t
*mpo_socket_label_update
;
5899 mpo_socketpeer_label_associate_mbuf_t
*mpo_socketpeer_label_associate_mbuf
;
5900 mpo_socketpeer_label_associate_socket_t
*mpo_socketpeer_label_associate_socket
;
5901 mpo_socketpeer_label_destroy_t
*mpo_socketpeer_label_destroy
;
5902 mpo_socketpeer_label_externalize_t
*mpo_socketpeer_label_externalize
;
5903 mpo_socketpeer_label_init_t
*mpo_socketpeer_label_init
;
5904 mpo_system_check_acct_t
*mpo_system_check_acct
;
5905 mpo_system_check_audit_t
*mpo_system_check_audit
;
5906 mpo_system_check_auditctl_t
*mpo_system_check_auditctl
;
5907 mpo_system_check_auditon_t
*mpo_system_check_auditon
;
5908 mpo_system_check_host_priv_t
*mpo_system_check_host_priv
;
5909 mpo_system_check_nfsd_t
*mpo_system_check_nfsd
;
5910 mpo_system_check_reboot_t
*mpo_system_check_reboot
;
5911 mpo_system_check_settime_t
*mpo_system_check_settime
;
5912 mpo_system_check_swapoff_t
*mpo_system_check_swapoff
;
5913 mpo_system_check_swapon_t
*mpo_system_check_swapon
;
5914 mpo_system_check_sysctl_t
*mpo_system_check_sysctl
;
5915 mpo_sysvmsg_label_associate_t
*mpo_sysvmsg_label_associate
;
5916 mpo_sysvmsg_label_destroy_t
*mpo_sysvmsg_label_destroy
;
5917 mpo_sysvmsg_label_init_t
*mpo_sysvmsg_label_init
;
5918 mpo_sysvmsg_label_recycle_t
*mpo_sysvmsg_label_recycle
;
5919 mpo_sysvmsq_check_enqueue_t
*mpo_sysvmsq_check_enqueue
;
5920 mpo_sysvmsq_check_msgrcv_t
*mpo_sysvmsq_check_msgrcv
;
5921 mpo_sysvmsq_check_msgrmid_t
*mpo_sysvmsq_check_msgrmid
;
5922 mpo_sysvmsq_check_msqctl_t
*mpo_sysvmsq_check_msqctl
;
5923 mpo_sysvmsq_check_msqget_t
*mpo_sysvmsq_check_msqget
;
5924 mpo_sysvmsq_check_msqrcv_t
*mpo_sysvmsq_check_msqrcv
;
5925 mpo_sysvmsq_check_msqsnd_t
*mpo_sysvmsq_check_msqsnd
;
5926 mpo_sysvmsq_label_associate_t
*mpo_sysvmsq_label_associate
;
5927 mpo_sysvmsq_label_destroy_t
*mpo_sysvmsq_label_destroy
;
5928 mpo_sysvmsq_label_init_t
*mpo_sysvmsq_label_init
;
5929 mpo_sysvmsq_label_recycle_t
*mpo_sysvmsq_label_recycle
;
5930 mpo_sysvsem_check_semctl_t
*mpo_sysvsem_check_semctl
;
5931 mpo_sysvsem_check_semget_t
*mpo_sysvsem_check_semget
;
5932 mpo_sysvsem_check_semop_t
*mpo_sysvsem_check_semop
;
5933 mpo_sysvsem_label_associate_t
*mpo_sysvsem_label_associate
;
5934 mpo_sysvsem_label_destroy_t
*mpo_sysvsem_label_destroy
;
5935 mpo_sysvsem_label_init_t
*mpo_sysvsem_label_init
;
5936 mpo_sysvsem_label_recycle_t
*mpo_sysvsem_label_recycle
;
5937 mpo_sysvshm_check_shmat_t
*mpo_sysvshm_check_shmat
;
5938 mpo_sysvshm_check_shmctl_t
*mpo_sysvshm_check_shmctl
;
5939 mpo_sysvshm_check_shmdt_t
*mpo_sysvshm_check_shmdt
;
5940 mpo_sysvshm_check_shmget_t
*mpo_sysvshm_check_shmget
;
5941 mpo_sysvshm_label_associate_t
*mpo_sysvshm_label_associate
;
5942 mpo_sysvshm_label_destroy_t
*mpo_sysvshm_label_destroy
;
5943 mpo_sysvshm_label_init_t
*mpo_sysvshm_label_init
;
5944 mpo_sysvshm_label_recycle_t
*mpo_sysvshm_label_recycle
;
5945 mpo_task_label_associate_kernel_t
*mpo_task_label_associate_kernel
;
5946 mpo_task_label_associate_t
*mpo_task_label_associate
;
5947 mpo_task_label_copy_t
*mpo_task_label_copy
;
5948 mpo_task_label_destroy_t
*mpo_task_label_destroy
;
5949 mpo_task_label_externalize_t
*mpo_task_label_externalize
;
5950 mpo_task_label_init_t
*mpo_task_label_init
;
5951 mpo_task_label_internalize_t
*mpo_task_label_internalize
;
5952 mpo_task_label_update_t
*mpo_task_label_update
;
5953 mpo_thread_userret_t
*mpo_thread_userret
;
5954 mpo_vnode_check_access_t
*mpo_vnode_check_access
;
5955 mpo_vnode_check_chdir_t
*mpo_vnode_check_chdir
;
5956 mpo_vnode_check_chroot_t
*mpo_vnode_check_chroot
;
5957 mpo_vnode_check_create_t
*mpo_vnode_check_create
;
5958 mpo_vnode_check_deleteextattr_t
*mpo_vnode_check_deleteextattr
;
5959 mpo_vnode_check_exchangedata_t
*mpo_vnode_check_exchangedata
;
5960 mpo_vnode_check_exec_t
*mpo_vnode_check_exec
;
5961 mpo_vnode_check_getattrlist_t
*mpo_vnode_check_getattrlist
;
5962 mpo_vnode_check_getextattr_t
*mpo_vnode_check_getextattr
;
5963 mpo_vnode_check_ioctl_t
*mpo_vnode_check_ioctl
;
5964 mpo_vnode_check_kqfilter_t
*mpo_vnode_check_kqfilter
;
5965 mpo_vnode_check_label_update_t
*mpo_vnode_check_label_update
;
5966 mpo_vnode_check_link_t
*mpo_vnode_check_link
;
5967 mpo_vnode_check_listextattr_t
*mpo_vnode_check_listextattr
;
5968 mpo_vnode_check_lookup_t
*mpo_vnode_check_lookup
;
5969 mpo_vnode_check_open_t
*mpo_vnode_check_open
;
5970 mpo_vnode_check_read_t
*mpo_vnode_check_read
;
5971 mpo_vnode_check_readdir_t
*mpo_vnode_check_readdir
;
5972 mpo_vnode_check_readlink_t
*mpo_vnode_check_readlink
;
5973 mpo_vnode_check_rename_from_t
*mpo_vnode_check_rename_from
;
5974 mpo_vnode_check_rename_to_t
*mpo_vnode_check_rename_to
;
5975 mpo_vnode_check_revoke_t
*mpo_vnode_check_revoke
;
5976 mpo_vnode_check_select_t
*mpo_vnode_check_select
;
5977 mpo_vnode_check_setattrlist_t
*mpo_vnode_check_setattrlist
;
5978 mpo_vnode_check_setextattr_t
*mpo_vnode_check_setextattr
;
5979 mpo_vnode_check_setflags_t
*mpo_vnode_check_setflags
;
5980 mpo_vnode_check_setmode_t
*mpo_vnode_check_setmode
;
5981 mpo_vnode_check_setowner_t
*mpo_vnode_check_setowner
;
5982 mpo_vnode_check_setutimes_t
*mpo_vnode_check_setutimes
;
5983 mpo_vnode_check_stat_t
*mpo_vnode_check_stat
;
5984 mpo_vnode_check_truncate_t
*mpo_vnode_check_truncate
;
5985 mpo_vnode_check_unlink_t
*mpo_vnode_check_unlink
;
5986 mpo_vnode_check_write_t
*mpo_vnode_check_write
;
5987 mpo_vnode_label_associate_devfs_t
*mpo_vnode_label_associate_devfs
;
5988 mpo_vnode_label_associate_extattr_t
*mpo_vnode_label_associate_extattr
;
5989 mpo_vnode_label_associate_file_t
*mpo_vnode_label_associate_file
;
5990 mpo_vnode_label_associate_pipe_t
*mpo_vnode_label_associate_pipe
;
5991 mpo_vnode_label_associate_posixsem_t
*mpo_vnode_label_associate_posixsem
;
5992 mpo_vnode_label_associate_posixshm_t
*mpo_vnode_label_associate_posixshm
;
5993 mpo_vnode_label_associate_singlelabel_t
*mpo_vnode_label_associate_singlelabel
;
5994 mpo_vnode_label_associate_socket_t
*mpo_vnode_label_associate_socket
;
5995 mpo_vnode_label_copy_t
*mpo_vnode_label_copy
;
5996 mpo_vnode_label_destroy_t
*mpo_vnode_label_destroy
;
5997 mpo_vnode_label_externalize_audit_t
*mpo_vnode_label_externalize_audit
;
5998 mpo_vnode_label_externalize_t
*mpo_vnode_label_externalize
;
5999 mpo_vnode_label_init_t
*mpo_vnode_label_init
;
6000 mpo_vnode_label_internalize_t
*mpo_vnode_label_internalize
;
6001 mpo_vnode_label_recycle_t
*mpo_vnode_label_recycle
;
6002 mpo_vnode_label_store_t
*mpo_vnode_label_store
;
6003 mpo_vnode_label_update_extattr_t
*mpo_vnode_label_update_extattr
;
6004 mpo_vnode_label_update_t
*mpo_vnode_label_update
;
6005 mpo_vnode_notify_create_t
*mpo_vnode_notify_create
;
6006 mpo_reserved_hook_t
*mpo_reserved0
;
6007 mpo_reserved_hook_t
*mpo_reserved1
;
6008 mpo_reserved_hook_t
*mpo_reserved2
;
6009 mpo_reserved_hook_t
*mpo_reserved3
;
6010 mpo_reserved_hook_t
*mpo_reserved4
;
6011 mpo_reserved_hook_t
*mpo_reserved5
;
6012 mpo_reserved_hook_t
*mpo_reserved6
;
6013 mpo_reserved_hook_t
*mpo_reserved7
;
6014 mpo_reserved_hook_t
*mpo_reserved8
;
6015 mpo_reserved_hook_t
*mpo_reserved9
;
6019 @brief MAC policy handle type
6021 The MAC handle is used to uniquely identify a loaded policy within
6024 A variable of this type is set by mac_policy_register().
6026 typedef unsigned int mac_policy_handle_t
;
6028 #define mpc_t struct mac_policy_conf *
6031 @brief Mac policy configuration
6033 This structure specifies the configuration information for a
6034 MAC policy module. A policy module developer must supply
6035 a short unique policy name, a more descriptive full name, a list of label
6036 namespaces and count, a pointer to the registered enty point operations,
6037 any load time flags, and optionally, a pointer to a label slot identifier.
6039 The Framework will update the runtime flags (mpc_runtime_flags) to
6040 indicate that the module has been registered.
6042 If the label slot identifier (mpc_field_off) is NULL, the Framework
6043 will not provide label storage for the policy. Otherwise, the
6044 Framework will store the label location (slot) in this field.
6046 The mpc_list field is used by the Framework and should not be
6047 modified by policies.
6049 /* XXX - reorder these for better aligment on 64bit platforms */
6050 struct mac_policy_conf
{
6051 const char *mpc_name
; /** policy name */
6052 const char *mpc_fullname
; /** full name */
6053 const char **mpc_labelnames
; /** managed label namespaces */
6054 unsigned int mpc_labelname_count
; /** number of managed label namespaces */
6055 struct mac_policy_ops
*mpc_ops
; /** operation vector */
6056 int mpc_loadtime_flags
; /** load time flags */
6057 int *mpc_field_off
; /** label slot */
6058 int mpc_runtime_flags
; /** run time flags */
6059 mpc_t mpc_list
; /** List reference */
6060 void *mpc_data
; /** module data */
6064 @brief MAC policy module registration routine
6066 This function is called to register a policy with the
6067 MAC framework. A policy module will typically call this from the
6068 Darwin KEXT registration routine.
6070 int mac_policy_register(struct mac_policy_conf
*mpc
,
6071 mac_policy_handle_t
*handlep
, void *xd
);
6074 @brief MAC policy module de-registration routine
6076 This function is called to de-register a policy with theD
6077 MAC framework. A policy module will typically call this from the
6078 Darwin KEXT de-registration routine.
6080 int mac_policy_unregister(mac_policy_handle_t handle
);
6083 * Framework entry points for the policies to add audit data.
6085 int mac_audit_text(char *text
, mac_policy_handle_t handle
);
6088 * Calls to assist with use of Apple XATTRs within policy modules.
6090 int mac_vnop_setxattr(struct vnode
*, const char *, char *, size_t);
6091 int mac_vnop_getxattr(struct vnode
*, const char *, char *, size_t,
6093 int mac_vnop_removexattr(struct vnode
*, const char *);
6096 * Arbitrary limit on how much data will be logged by the audit
6097 * entry points above.
6099 #define MAC_AUDIT_DATA_LIMIT 1024
6102 * Values returned by mac_audit_{pre,post}select. To combine the responses
6103 * of the security policies into a single decision,
6104 * mac_audit_{pre,post}select() choose the greatest value returned.
6106 #define MAC_AUDIT_DEFAULT 0 /* use system behavior */
6107 #define MAC_AUDIT_NO 1 /* force not auditing this event */
6108 #define MAC_AUDIT_YES 2 /* force auditing this event */
6110 // \defgroup mpc_loadtime_flags Flags for the mpc_loadtime_flags field
6113 @name Flags for the mpc_loadtime_flags field
6114 @see mac_policy_conf
6116 This is the complete list of flags that are supported by the
6117 mpc_loadtime_flags field of the mac_policy_conf structure. These
6118 flags specify the load time behavior of MAC Framework policy
6125 @brief Flag to indicate registration preference
6127 This flag indicates that the policy module must be loaded and
6128 initialized early in the boot process. If the flag is specified,
6129 attempts to register the module following boot will be rejected. The
6130 flag may be used by policies that require pervasive labeling of all
6131 system objects, and cannot handle objects that have not been
6132 properly initialized by the policy.
6134 #define MPC_LOADTIME_FLAG_NOTLATE 0x00000001
6137 @brief Flag to indicate unload preference
6139 This flag indicates that the policy module may be unloaded. If this
6140 flag is not set, then the policy framework will reject requests to
6141 unload the module. This flag might be used by modules that allocate
6142 label state and are unable to free that state at runtime, or for
6143 modules that simply do not want to permit unload operations.
6145 #define MPC_LOADTIME_FLAG_UNLOADOK 0x00000002
6150 XXX This flag is not yet supported.
6152 #define MPC_LOADTIME_FLAG_LABELMBUFS 0x00000004
6155 @brief Flag to indicate a base policy
6157 This flag indicates that the policy module is a base policy. Only
6158 one module can declare itself as base, otherwise the boot process
6161 #define MPC_LOADTIME_BASE_POLICY 0x00000008
6166 @brief Policy registration flag
6167 @see mac_policy_conf
6169 This flag indicates that the policy module has been successfully
6170 registered with the TrustedBSD MAC Framework. The Framework will
6171 set this flag in the mpc_runtime_flags field of the policy's
6172 mac_policy_conf structure after registering the policy.
6174 #define MPC_RUNTIME_FLAG_REGISTERED 0x00000001
6177 * Depends on POLICY_VER
6181 #define POLICY_VER 1.0
6184 #define MAC_POLICY_SET(handle, mpops, mpname, mpfullname, lnames, lcount, slot, lflags, rflags) \
6185 static struct mac_policy_conf mpname##_mac_policy_conf = { \
6186 .mpc_name = #mpname, \
6187 .mpc_fullname = mpfullname, \
6188 .mpc_labelnames = lnames, \
6189 .mpc_labelname_count = lcount, \
6191 .mpc_loadtime_flags = lflags, \
6192 .mpc_field_off = slot, \
6193 .mpc_runtime_flags = rflags \
6196 static kern_return_t \
6197 kmod_start(kmod_info_t *ki, void *xd) \
6199 return mac_policy_register(&mpname##_mac_policy_conf, \
6203 static kern_return_t \
6204 kmod_stop(kmod_info_t *ki, void *xd) \
6206 return mac_policy_unregister(handle); \
6209 extern kern_return_t _start(kmod_info_t *ki, void *data); \
6210 extern kern_return_t _stop(kmod_info_t *ki, void *data); \
6212 KMOD_EXPLICIT_DECL(security.mpname, POLICY_VER, _start, _stop) \
6213 kmod_start_func_t *_realmain = kmod_start; \
6214 kmod_stop_func_t *_antimain = kmod_stop; \
6215 int _kext_apple_cc = __APPLE_CC__
6218 #define LABEL_TO_SLOT(l, s) (l)->l_perpolicy[s]
6220 #define mac_get_mpc(h) (mac_policy_list.entries[h].mpc)
6223 @name Flags for MAC allocator interfaces
6225 These flags are passed to the Darwin kernel allocator routines to
6226 indicate whether the allocation is permitted to block or not.
6227 Caution should be taken; some operations are not permitted to sleep,
6228 and some types of locks cannot be held when sleeping.
6234 @brief Allocation operations may block
6236 If memory is not immediately available, the allocation routine
6237 will block (typically sleeping) until memory is available.
6239 @warning Inappropriate use of this flag may cause kernel panics.
6241 #define MAC_WAITOK 0
6244 @brief Allocation operations may not block
6246 Rather than blocking, the allocator may return an error if memory
6247 is not immediately available. This type of allocation will not
6248 sleep, preserving locking semantics.
6250 #define MAC_NOWAIT 1
6254 #endif /* !_SECURITY_MAC_POLICY_H_ */