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