]> git.saurik.com Git - apple/xnu.git/blame - security/mac_policy.h
xnu-4570.51.1.tar.gz
[apple/xnu.git] / security / mac_policy.h
CommitLineData
2d21ac55 1/*
39037602 2 * Copyright (c) 2007-2016 Apple Inc. All rights reserved.
2d21ac55
A
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
39236c6e
A
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
2d21ac55
A
87#include <security/_label.h>
88
89struct attrlist;
90struct auditinfo;
91struct bpf_d;
39037602 92struct cs_blob;
2d21ac55 93struct devnode;
39037602 94struct exception_action;
2d21ac55
A
95struct fileglob;
96struct ifnet;
97struct inpcb;
98struct ipq;
99struct label;
2d21ac55
A
100struct mac_module_data;
101struct mac_policy_conf;
102struct mbuf;
103struct mount;
39236c6e
A
104struct msg;
105struct msqid_kernel;
2d21ac55
A
106struct pipe;
107struct pseminfo;
108struct pshminfo;
109struct sbuf;
110struct semid_kernel;
111struct shmid_kernel;
39236c6e
A
112struct socket;
113struct sockopt;
2d21ac55
A
114struct task;
115struct thread;
39236c6e 116struct tty;
2d21ac55 117struct ucred;
39236c6e 118struct vfs_attr;
2d21ac55
A
119struct vnode;
120/** @struct dummy */
121
122
123
124#ifndef _KAUTH_CRED_T
125#define _KAUTH_CRED_T
126typedef struct ucred *kauth_cred_t;
127#endif /* !_KAUTH_CRED_T */
128
6d2010ae
A
129#ifndef __IOKIT_PORTS_DEFINED__
130#define __IOKIT_PORTS_DEFINED__
131#ifdef __cplusplus
132class OSObject;
133typedef OSObject *io_object_t;
134#else
135struct OSObject;
136typedef struct OSObject *io_object_t;
137#endif
138#endif /* __IOKIT_PORTS_DEFINED__ */
2d21ac55
A
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*/
202typedef 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*/
238typedef 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*/
250typedef 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*/
261typedef 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*/
274typedef 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*/
292typedef 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
fe8ab488
A
302 @param offset Offset of binary within file being executed
303 @param scriptvp Script being executed by interpreter, if any.
2d21ac55
A
304 @param vnodelabel Label corresponding to vp
305 @param scriptvnodelabel Script vnode label
306 @param execlabel Userspace provided execution label
39037602 307 @param p Object process
39236c6e
A
308 @param macpolicyattr MAC policy-specific spawn attribute data
309 @param macpolicyattrlen Length of policy-specific spawn attribute data
2d21ac55
A
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*/
340typedef int mpo_cred_check_label_update_execve_t(
341 kauth_cred_t old,
342 struct vnode *vp,
fe8ab488 343 off_t offset,
39236c6e 344 struct vnode *scriptvp,
2d21ac55
A
345 struct label *vnodelabel,
346 struct label *scriptvnodelabel,
347 struct label *execlabel,
39236c6e
A
348 struct proc *p,
349 void *macpolicyattr,
350 size_t macpolicyattrlen
2d21ac55
A
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*/
368typedef 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*/
386typedef 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*/
401typedef 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*/
413typedef 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*/
428typedef 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*/
440typedef 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*/
451typedef 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*/
471typedef 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*/
493typedef 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*/
505typedef 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*/
528typedef 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
39236c6e 537 @param p Object process.
2d21ac55 538 @param vp File being executed
fe8ab488
A
539 @param offset Offset of binary within file being executed
540 @param scriptvp Script being executed by interpreter, if any.
2d21ac55
A
541 @param vnodelabel Label corresponding to vp
542 @param scriptvnodelabel Script vnode label
543 @param execlabel Userspace provided execution label
fe8ab488 544 @param csflags Code signing flags to be set after exec
39236c6e
A
545 @param macpolicyattr MAC policy-specific spawn attribute data.
546 @param macpolicyattrlen Length of policy-specific spawn attribute data.
2d21ac55
A
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
c910b4d9
A
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
2d21ac55
A
570 The vnode lock is held during this operation. No changes should be
571 made to the old credential structure.
fe8ab488
A
572 @return 0 on success, Otherwise, return non-zero if update results in
573 termination of child.
2d21ac55 574*/
fe8ab488 575typedef int mpo_cred_label_update_execve_t(
2d21ac55
A
576 kauth_cred_t old_cred,
577 kauth_cred_t new_cred,
39236c6e 578 struct proc *p,
2d21ac55 579 struct vnode *vp,
fe8ab488 580 off_t offset,
39236c6e 581 struct vnode *scriptvp,
2d21ac55
A
582 struct label *vnodelabel,
583 struct label *scriptvnodelabel,
c910b4d9 584 struct label *execlabel,
fe8ab488 585 u_int *csflags,
39236c6e
A
586 void *macpolicyattr,
587 size_t macpolicyattrlen,
c910b4d9 588 int *disjointp
2d21ac55
A
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*/
601typedef 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*/
616typedef 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*/
634typedef 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*/
650typedef 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*/
662typedef 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*/
672typedef 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*/
687typedef 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);
39037602
A
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
5ba3f43e
A
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.
39037602
A
708
709 @return Return 0 if the message can be sent, otherwise an
710 appropriate value for errno should be returned.
711*/
712typedef int mpo_exc_action_check_exception_send_t(
713 struct label *crashlabel,
714 struct exception_action *action,
715 struct label *exclabel
716);
717/**
5ba3f43e 718 @brief Associate an exception action label
39037602
A
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*/
724typedef void mpo_exc_action_label_associate_t(
725 struct exception_action *action,
726 struct label *exclabel
727);
39037602
A
728/**
729 @brief Destroy exception action label
730 @param label The label to be destroyed
731
5ba3f43e
A
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.
39037602
A
736*/
737typedef void mpo_exc_action_label_destroy_t(
738 struct label *label
739);
5ba3f43e
A
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*/
752typedef void mpo_exc_action_label_populate_t(
753 struct label *label,
754 struct proc *proc
755);
39037602
A
756/**
757 @brief Initialize exception action label
758 @param label New label to initialize
759
5ba3f43e
A
760 Initialize a label for an exception action. Usually performs
761 policy specific allocations. Sleeping is permitted.
39037602
A
762*/
763typedef int mpo_exc_action_label_init_t(
764 struct label *label
765);
766/**
767 @brief Update the label on an exception action
5ba3f43e
A
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
39037602 772
5ba3f43e
A
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.
39037602 777*/
5ba3f43e
A
778typedef int mpo_exc_action_label_update_t(
779 struct exception_action *action,
780 struct label *label,
781 struct label *newlabel
39037602 782);
2d21ac55
A
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*/
795typedef 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*/
810typedef 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*/
827typedef 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*/
847typedef 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*/
867typedef 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*/
885typedef 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*/
902typedef 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*/
925typedef 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*/
946typedef 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);
39037602
A
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*/
971typedef 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);
2d21ac55
A
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*/
998typedef 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,
3e170ce0 1004 uint64_t file_pos,
2d21ac55
A
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*/
1016typedef 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*/
1034typedef 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*/
1053typedef 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*/
1065typedef 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*/
1078typedef 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*/
1085typedef 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*/
1103typedef 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*/
1125typedef 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*/
1141typedef 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*/
1152typedef 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*/
1164typedef 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*/
1184typedef 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*/
1193typedef 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*/
1216typedef 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*/
1230typedef 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*/
1243typedef 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*/
1264typedef 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*/
1282typedef 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*/
1296typedef 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*/
1304typedef 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*/
1316typedef 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*/
1329typedef 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
2d21ac55
A
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*/
1354typedef int mpo_iokit_check_device_t(
1355 char *devtype,
1356 struct mac_module_data *mdata
1357);
6d2010ae
A
1358/**
1359 @brief Access control check for opening an I/O Kit device
1360 @param cred Subject credential
6d2010ae
A
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*/
1371typedef 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
fe8ab488 1379 @param entry Target device
6d2010ae
A
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*/
1388typedef int mpo_iokit_check_set_properties_t(
1389 kauth_cred_t cred,
1390 io_object_t entry,
1391 io_object_t properties
1392);
fe8ab488
A
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 */
1416typedef 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*/
1432typedef int mpo_iokit_check_get_property_t(
1433 kauth_cred_t cred,
1434 io_object_t entry,
1435 const char *name
1436);
6d2010ae
A
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*/
1448typedef int mpo_iokit_check_hid_control_t(
1449 kauth_cred_t cred
1450);
2d21ac55
A
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*/
1461typedef 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*/
1485typedef 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*/
1499typedef 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*/
1516typedef 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*/
1530typedef void mpo_ipq_label_update_t(
1531 struct mbuf *fragment,
1532 struct label *fragmentlabel,
1533 struct ipq *ipq,
1534 struct label *ipqlabel
1535);
2d21ac55
A
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*/
1548typedef 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*/
1563typedef 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*/
1578typedef 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*/
1594typedef 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*/
1612typedef 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*/
1632typedef 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*/
1652typedef 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*/
1674typedef 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*/
1689typedef 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*/
1702typedef 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*/
1717typedef 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
39037602 1726 @param cmd Filesystem-dependent request code; see fsctl(2)
2d21ac55
A
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*/
1739typedef 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.
743345f9
A
1757
1758 @note Policies may change the contents of vfa to alter the list of
1759 file system attributes returned.
2d21ac55
A
1760*/
1761
1762typedef 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*/
1781typedef 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*/
1800typedef 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);
39037602
A
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*/
1819typedef 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*/
1837typedef int mpo_mount_check_snapshot_delete_t(
1838 kauth_cred_t cred,
1839 struct mount *mp,
1840 const char *name
1841);
813fb2f6
A
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*/
1854typedef int mpo_mount_check_snapshot_revert_t(
1855 kauth_cred_t cred,
1856 struct mount *mp,
1857 const char *name
1858);
2d21ac55
A
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*/
1871typedef 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
1889typedef 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*/
1912typedef 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*/
1929typedef 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*/
1944typedef 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*/
1958typedef 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*/
1980typedef 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*/
1997typedef 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*/
2020typedef 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*/
2036typedef 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*/
2051typedef 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*/
2062typedef 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*/
2084typedef 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*/
2103typedef 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*/
2124typedef 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*/
2144typedef 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*/
2164typedef 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*/
2184typedef 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*/
2203typedef 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
39037602 2212 @param pipelabel Label for the pipe object
2d21ac55
A
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*/
2219typedef 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*/
2233typedef 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*/
2245typedef 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*/
2268typedef 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*/
2280typedef 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*/
2303typedef 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*/
2322typedef 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*/
2344typedef 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*/
2368typedef 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*/
2390typedef 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*/
2420typedef int mpo_policy_syscall_t(
2421 struct proc *p,
2422 int call,
2423 user_addr_t arg
2424);
2d21ac55
A
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*/
2436typedef 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*/
2452typedef 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*/
2469typedef 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*/
2487typedef 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*/
2505typedef 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*/
2522typedef 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*/
2536typedef 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*/
2546typedef 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*/
2560typedef 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*/
2578typedef 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
316670eb 2590 @param fflags shm_open(2) open flags ('fflags' encoded)
2d21ac55
A
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*/
2598typedef int mpo_posixshm_check_open_t(
2599 kauth_cred_t cred,
2600 struct pshminfo *ps,
316670eb
A
2601 struct label *shmlabel,
2602 int fflags
2d21ac55
A
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*/
2616typedef 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*/
2634typedef int mpo_posixshm_check_truncate_t(
2635 kauth_cred_t cred,
2636 struct pshminfo *ps,
2637 struct label *shmlabel,
6d2010ae 2638 off_t len
2d21ac55
A
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*/
2653typedef 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*/
2671typedef 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*/
2686typedef 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*/
2696typedef void mpo_posixshm_label_init_t(
2697 struct label *label
2698);
6d2010ae
A
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*/
2711typedef 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*/
2734typedef int mpo_priv_grant_t(
2735 kauth_cred_t cred,
2736 int priv
2737);
2d21ac55
A
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*/
2752typedef 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*/
2766typedef int mpo_proc_check_fork_t(
2767 kauth_cred_t cred,
2768 struct proc *proc
2769);
3e170ce0
A
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*/
2779typedef 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
39037602 2787 @param exception Exception port to set
3e170ce0
A
2788
2789 @return Return 0 if access is granted, otherwise an appropriate value for
2790 errno should be returned.
2791*/
2792typedef int mpo_proc_check_set_host_exception_port_t(
2793 kauth_cred_t cred,
2794 unsigned int exception
2795);
d1ecb069
A
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*/
2808typedef int mpo_proc_check_suspend_resume_t(
2809 kauth_cred_t cred,
2810 struct proc *proc,
2811 int sr
2812);
2d21ac55
A
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*/
2824typedef 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*/
2838typedef 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*/
2855typedef int mpo_proc_check_getlcid_t(
2856 struct proc *p0,
2857 struct proc *p,
2858 pid_t pid
2859);
316670eb
A
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*/
2874typedef int mpo_proc_check_ledger_t(
2875 kauth_cred_t cred,
2876 struct proc *target,
2877 int op
2878);
39236c6e
A
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*/
2890typedef int mpo_proc_check_proc_info_t(
2891 kauth_cred_t cred,
2892 struct proc *target,
2893 int callnum,
2894 int flavor
2895);
7e41aa88
A
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*/
2908typedef 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*/
2925typedef int mpo_proc_check_set_cs_info_t(
2926 kauth_cred_t cred,
2927 struct proc *target,
2928 unsigned int op
2929);
6d2010ae
A
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*/
2952typedef 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);
2d21ac55
A
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*/
2976typedef 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*/
2995typedef 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*/
3011typedef int mpo_proc_check_setaudit_t(
3012 kauth_cred_t cred,
b0d623f7 3013 struct auditinfo_addr *ai
2d21ac55
A
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*/
3027typedef 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*/
3048typedef 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*/
3071typedef 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*/
3092typedef int mpo_proc_check_wait_t(
3093 kauth_cred_t cred,
3094 struct proc *proc
3095);
5ba3f43e
A
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*/
3106typedef void mpo_proc_notify_exit_t(
3107 struct proc *proc
3108);
2d21ac55
A
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*/
3117typedef 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*/
3132typedef void mpo_proc_label_init_t(
3133 struct label *label
3134);
5ba3f43e
A
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*/
3150typedef 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*/
3172typedef 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);
2d21ac55
A
3179/**
3180 @brief Access control check for socket accept
3181 @param cred Subject credential
39037602 3182 @param so Object socket
2d21ac55
A
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*/
3191typedef 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*/
3209typedef 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*/
3228typedef 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*/
3247typedef 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*/
3266typedef 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*/
3311typedef 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);
5ba3f43e
A
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*/
3335typedef int mpo_socket_check_ioctl_t(
3336 kauth_cred_t cred,
3337 socket_t so,
3338 unsigned int cmd,
3339 struct label *socklabel
3340);
2d21ac55
A
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*/
3354typedef 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*/
3373typedef 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*/
3391typedef 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*/
3408typedef 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
39037602 3417 @param sock Object socket
2d21ac55 3418 @param socklabel Policy label for socket
39037602 3419 @param saddr Name of the remote socket
2d21ac55
A
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*/
3427typedef 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*/
3448typedef 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*/
3467typedef 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*/
3485typedef 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*/
3503typedef 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*/
3522typedef 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*/
3539typedef 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*/
3557typedef 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*/
3569typedef 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*/
3581typedef 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*/
3601typedef 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*/
3622typedef 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*/
3642typedef 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*/
3660typedef 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*/
3688typedef 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*/
3708typedef 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*/
3722typedef 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*/
3742typedef 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*/
3764typedef 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*/
3784typedef 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*/
3801typedef 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*/
3819typedef 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*/
3835typedef int mpo_system_check_auditon_t(
3836 kauth_cred_t cred,
3837 int cmd
3838);
6d2010ae
A
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
a39ff7e2
A
3844 performance-related tasks using the CHUD system call. This interface is
3845 deprecated.
6d2010ae
A
3846
3847 @return Return 0 if access is granted, otherwise an appropriate value for
3848 errno should be returned.
3849*/
3850typedef int mpo_system_check_chud_t(
a39ff7e2 3851 kauth_cred_t cred
6d2010ae 3852);
2d21ac55
A
3853/**
3854 @brief Access control check for obtaining the host control port
3855 @param cred Subject credential
3856
3857 Determine whether the subject identified by the credential can
3858 obtain the host control port.
3859
3860 @return Return 0 if access is granted, or non-zero otherwise.
3861*/
3862typedef int mpo_system_check_host_priv_t(
3863 kauth_cred_t cred
3864);
39236c6e
A
3865/**
3866 @brief Access control check for obtaining system information
3867 @param cred Subject credential
3868 @param info_type A description of the information requested
3869
3870 Determine whether the subject identified by the credential should be
3871 allowed to obtain information about the system.
3872
3873 This is a generic hook that can be used in a variety of situations where
3874 information is being returned that might be considered sensitive.
3875 Rather than adding a new MAC hook for every such interface, this hook can
3876 be called with a string identifying the type of information requested.
3877
3878 @return Return 0 if access is granted, otherwise an appropriate value for
3879 errno should be returned.
3880*/
3881typedef int mpo_system_check_info_t(
3882 kauth_cred_t cred,
3883 const char *info_type
3884);
2d21ac55
A
3885/**
3886 @brief Access control check for calling NFS services
3887 @param cred Subject credential
3888
3889 Determine whether the subject identified by the credential should be
3890 allowed to call nfssrv(2).
3891
3892 @return Return 0 if access is granted, otherwise an appropriate value for
3893 errno should be returned.
3894*/
3895typedef int mpo_system_check_nfsd_t(
3896 kauth_cred_t cred
3897);
3898/**
3899 @brief Access control check for reboot
3900 @param cred Subject credential
3901 @param howto howto parameter from reboot(2)
3902
3903 Determine whether the subject identified by the credential should be
3904 allowed to reboot the system in the specified manner.
3905
3906 @return Return 0 if access is granted, otherwise an appropriate value for
3907 errno should be returned.
3908*/
3909typedef int mpo_system_check_reboot_t(
3910 kauth_cred_t cred,
3911 int howto
3912);
3913/**
3914 @brief Access control check for setting system clock
3915 @param cred Subject credential
3916
3917 Determine whether the subject identified by the credential should be
3918 allowed to set the system clock.
3919
3920 @return Return 0 if access is granted, otherwise an appropriate value for
3921 errno should be returned.
3922*/
3923typedef int mpo_system_check_settime_t(
3924 kauth_cred_t cred
3925);
3926/**
3927 @brief Access control check for removing swap devices
3928 @param cred Subject credential
3929 @param vp Swap device
3930 @param label Label associated with vp
3931
3932 Determine whether the subject identified by the credential should be
3933 allowed to remove vp as a swap device.
3934
3935 @return Return 0 if access is granted, otherwise an appropriate value for
3936 errno should be returned.
3937*/
3938typedef int mpo_system_check_swapoff_t(
3939 kauth_cred_t cred,
3940 struct vnode *vp,
3941 struct label *label
3942);
3943/**
3944 @brief Access control check for adding swap devices
3945 @param cred Subject credential
3946 @param vp Swap device
3947 @param label Label associated with vp
3948
3949 Determine whether the subject identified by the credential should be
3950 allowed to add vp as a swap device.
3951
3952 @return Return 0 if access is granted, otherwise an appropriate value for
3953 errno should be returned.
3954*/
3955typedef int mpo_system_check_swapon_t(
3956 kauth_cred_t cred,
3957 struct vnode *vp,
3958 struct label *label
3959);
3960/**
3961 @brief Access control check for sysctl
3962 @param cred Subject credential
fe8ab488 3963 @param namestring String representation of sysctl name.
2d21ac55
A
3964 @param name Integer name; see sysctl(3)
3965 @param namelen Length of name array of integers; see sysctl(3)
3966 @param old 0 or address where to store old value; see sysctl(3)
fe8ab488 3967 @param oldlen Length of old buffer; see sysctl(3)
2d21ac55
A
3968 @param newvalue 0 or address of new value; see sysctl(3)
3969 @param newlen Length of new buffer; see sysctl(3)
3970
3971 Determine whether the subject identified by the credential should be
3972 allowed to make the specified sysctl(3) transaction.
3973
3974 The sysctl(3) call specifies that if the old value is not desired,
3975 oldp and oldlenp should be set to NULL. Likewise, if a new value is
3976 not to be set, newp should be set to NULL and newlen set to 0.
3977
3978 @return Return 0 if access is granted, otherwise an appropriate value for
3979 errno should be returned.
3980*/
fe8ab488 3981typedef int mpo_system_check_sysctlbyname_t(
2d21ac55 3982 kauth_cred_t cred,
fe8ab488 3983 const char *namestring,
2d21ac55
A
3984 int *name,
3985 u_int namelen,
3986 user_addr_t old, /* NULLOK */
fe8ab488 3987 size_t oldlen,
2d21ac55
A
3988 user_addr_t newvalue, /* NULLOK */
3989 size_t newlen
3990);
316670eb
A
3991/**
3992 @brief Access control check for kas_info
3993 @param cred Subject credential
3994 @param selector Category of information to return. See kas_info.h
3995
3996 Determine whether the subject identified by the credential can perform
3997 introspection of the kernel address space layout for
3998 debugging/performance analysis.
3999
4000 @return Return 0 if access is granted, otherwise an appropriate value for
4001 errno should be returned.
4002*/
4003typedef int mpo_system_check_kas_info_t(
4004 kauth_cred_t cred,
4005 int selector
4006);
2d21ac55
A
4007/**
4008 @brief Create a System V message label
4009 @param cred Subject credential
39037602 4010 @param msqptr The message queue the message will be placed in
2d21ac55
A
4011 @param msqlabel The label of the message queue
4012 @param msgptr The message
4013 @param msglabel The label of the message
4014
4015 Label the message as its placed in the message queue.
4016*/
4017typedef void mpo_sysvmsg_label_associate_t(
4018 kauth_cred_t cred,
4019 struct msqid_kernel *msqptr,
4020 struct label *msqlabel,
4021 struct msg *msgptr,
4022 struct label *msglabel
4023);
4024/**
4025 @brief Destroy System V message label
4026 @param label The label to be destroyed
4027
4028 Destroy a System V message label. Since the object is
4029 going out of scope, policy modules should free any internal storage
4030 associated with the label so that it may be destroyed.
4031*/
4032typedef void mpo_sysvmsg_label_destroy_t(
4033 struct label *label
4034);
4035/**
4036 @brief Initialize System V message label
4037 @param label New label to initialize
4038
4039 Initialize the label for a newly instantiated System V message.
4040*/
4041typedef void mpo_sysvmsg_label_init_t(
4042 struct label *label
4043);
4044/**
4045 @brief Clean up a System V message label
4046 @param label The label to be destroyed
4047
4048 Clean up a System V message label. Darwin pre-allocates
4049 messages at system boot time and re-uses them rather than
4050 allocating new ones. Before messages are returned to the "free
4051 pool", policies can cleanup or overwrite any information present in
4052 the label.
4053*/
4054typedef void mpo_sysvmsg_label_recycle_t(
4055 struct label *label
4056);
4057/**
4058 @brief Access control check for System V message enqueuing
4059 @param cred Subject credential
4060 @param msgptr The message
4061 @param msglabel The message's label
39037602 4062 @param msqptr The message queue
2d21ac55
A
4063 @param msqlabel The message queue's label
4064
4065 Determine whether the subject identified by the credential can add the
4066 given message to the given message queue.
4067
4068 @return Return 0 if access is granted, otherwise an appropriate value for
4069 errno should be returned.
4070*/
4071typedef int mpo_sysvmsq_check_enqueue_t(
4072 kauth_cred_t cred,
4073 struct msg *msgptr,
4074 struct label *msglabel,
4075 struct msqid_kernel *msqptr,
4076 struct label *msqlabel
4077);
4078/**
4079 @brief Access control check for System V message reception
4080 @param cred The credential of the intended recipient
4081 @param msgptr The message
4082 @param msglabel The message's label
4083
4084 Determine whether the subject identified by the credential can receive
4085 the given message.
4086
4087 @return Return 0 if access is granted, otherwise an appropriate value for
4088 errno should be returned.
4089*/
4090typedef int mpo_sysvmsq_check_msgrcv_t(
4091 kauth_cred_t cred,
4092 struct msg *msgptr,
4093 struct label *msglabel
4094);
4095/**
4096 @brief Access control check for System V message queue removal
4097 @param cred The credential of the caller
4098 @param msgptr The message
4099 @param msglabel The message's label
4100
4101 System V message queues are removed using the msgctl() system call.
4102 The system will iterate over each messsage in the queue, calling this
4103 function for each, to determine whether the caller has the appropriate
4104 credentials.
4105
4106 @return Return 0 if access is granted, otherwise an appropriate value for
4107 errno should be returned.
4108*/
4109typedef int mpo_sysvmsq_check_msgrmid_t(
4110 kauth_cred_t cred,
4111 struct msg *msgptr,
4112 struct label *msglabel
4113);
4114/**
4115 @brief Access control check for msgctl()
4116 @param cred The credential of the caller
4117 @param msqptr The message queue
4118 @param msqlabel The message queue's label
4119
4120 This access check is performed to validate calls to msgctl().
4121
4122 @return Return 0 if access is granted, otherwise an appropriate value for
4123 errno should be returned.
4124*/
4125typedef int mpo_sysvmsq_check_msqctl_t(
4126 kauth_cred_t cred,
4127 struct msqid_kernel *msqptr,
4128 struct label *msqlabel,
4129 int cmd
4130);
4131/**
4132 @brief Access control check to get a System V message queue
4133 @param cred The credential of the caller
4134 @param msqptr The message queue requested
4135 @param msqlabel The message queue's label
4136
4137 On a call to msgget(), if the queue requested already exists,
4138 and it is a public queue, this check will be performed before the
4139 queue's ID is returned to the user.
4140
4141 @return Return 0 if access is granted, otherwise an appropriate value for
4142 errno should be returned.
4143*/
4144typedef int mpo_sysvmsq_check_msqget_t(
4145 kauth_cred_t cred,
4146 struct msqid_kernel *msqptr,
4147 struct label *msqlabel
4148);
4149/**
4150 @brief Access control check to receive a System V message from the given queue
4151 @param cred The credential of the caller
4152 @param msqptr The message queue to receive from
4153 @param msqlabel The message queue's label
4154
4155 On a call to msgrcv(), this check is performed to determine whether the
4156 caller has receive rights on the given queue.
4157
4158 @return Return 0 if access is granted, otherwise an appropriate value for
4159 errno should be returned.
4160*/
4161typedef int mpo_sysvmsq_check_msqrcv_t(
4162 kauth_cred_t cred,
4163 struct msqid_kernel *msqptr,
4164 struct label *msqlabel
4165);
4166/**
4167 @brief Access control check to send a System V message to the given queue
4168 @param cred The credential of the caller
4169 @param msqptr The message queue to send to
4170 @param msqlabel The message queue's label
4171
4172 On a call to msgsnd(), this check is performed to determine whether the
4173 caller has send rights on the given queue.
4174
4175 @return Return 0 if access is granted, otherwise an appropriate value for
4176 errno should be returned.
4177*/
4178typedef int mpo_sysvmsq_check_msqsnd_t(
4179 kauth_cred_t cred,
4180 struct msqid_kernel *msqptr,
4181 struct label *msqlabel
4182);
4183/**
4184 @brief Create a System V message queue label
4185 @param cred Subject credential
39037602 4186 @param msqptr The message queue
2d21ac55
A
4187 @param msqlabel The label of the message queue
4188
4189*/
4190typedef void mpo_sysvmsq_label_associate_t(
4191 kauth_cred_t cred,
4192 struct msqid_kernel *msqptr,
4193 struct label *msqlabel
4194);
4195/**
4196 @brief Destroy System V message queue label
4197 @param label The label to be destroyed
4198
4199 Destroy a System V message queue label. Since the object is
4200 going out of scope, policy modules should free any internal storage
4201 associated with the label so that it may be destroyed.
4202*/
4203typedef void mpo_sysvmsq_label_destroy_t(
4204 struct label *label
4205);
4206/**
4207 @brief Initialize System V message queue label
4208 @param label New label to initialize
4209
4210 Initialize the label for a newly instantiated System V message queue.
4211*/
4212typedef void mpo_sysvmsq_label_init_t(
4213 struct label *label
4214);
4215/**
4216 @brief Clean up a System V message queue label
4217 @param label The label to be destroyed
4218
4219 Clean up a System V message queue label. Darwin pre-allocates
4220 message queues at system boot time and re-uses them rather than
4221 allocating new ones. Before message queues are returned to the "free
4222 pool", policies can cleanup or overwrite any information present in
4223 the label.
4224*/
4225typedef void mpo_sysvmsq_label_recycle_t(
4226 struct label *label
4227);
4228/**
4229 @brief Access control check for System V semaphore control operation
4230 @param cred Subject credential
4231 @param semakptr Pointer to semaphore identifier
4232 @param semaklabel Label associated with semaphore
4233 @param cmd Control operation to be performed; see semctl(2)
4234
4235 Determine whether the subject identified by the credential can perform
4236 the operation indicated by cmd on the System V semaphore semakptr.
4237
4238 @return Return 0 if access is granted, otherwise an appropriate value for
4239 errno should be returned.
4240*/
4241typedef int mpo_sysvsem_check_semctl_t(
4242 kauth_cred_t cred,
4243 struct semid_kernel *semakptr,
4244 struct label *semaklabel,
4245 int cmd
4246);
4247/**
4248 @brief Access control check for obtaining a System V semaphore
4249 @param cred Subject credential
4250 @param semakptr Pointer to semaphore identifier
4251 @param semaklabel Label to associate with the semaphore
4252
4253 Determine whether the subject identified by the credential can
4254 obtain a System V semaphore.
4255
4256 @return Return 0 if access is granted, otherwise an appropriate value for
4257 errno should be returned.
4258*/
4259typedef int mpo_sysvsem_check_semget_t(
4260 kauth_cred_t cred,
4261 struct semid_kernel *semakptr,
4262 struct label *semaklabel
4263);
4264/**
4265 @brief Access control check for System V semaphore operations
4266 @param cred Subject credential
4267 @param semakptr Pointer to semaphore identifier
4268 @param semaklabel Label associated with the semaphore
4269 @param accesstype Flags to indicate access (read and/or write)
4270
4271 Determine whether the subject identified by the credential can
4272 perform the operations on the System V semaphore indicated by
4273 semakptr. The accesstype flags hold the maximum set of permissions
4274 from the sem_op array passed to the semop system call. It may
4275 contain SEM_R for read-only operations or SEM_A for read/write
4276 operations.
4277
4278 @return Return 0 if access is granted, otherwise an appropriate value for
4279 errno should be returned.
4280*/
4281typedef int mpo_sysvsem_check_semop_t(
4282 kauth_cred_t cred,
4283 struct semid_kernel *semakptr,
4284 struct label *semaklabel,
4285 size_t accesstype
4286);
4287/**
4288 @brief Create a System V semaphore label
4289 @param cred Subject credential
4290 @param semakptr The semaphore being created
4291 @param semalabel Label to associate with the new semaphore
4292
4293 Label a new System V semaphore. The label was previously
4294 initialized and associated with the semaphore. At this time, an
4295 appropriate initial label value should be assigned to the object and
4296 stored in semalabel.
4297*/
4298typedef void mpo_sysvsem_label_associate_t(
4299 kauth_cred_t cred,
4300 struct semid_kernel *semakptr,
4301 struct label *semalabel
4302);
4303/**
4304 @brief Destroy System V semaphore label
4305 @param label The label to be destroyed
4306
4307 Destroy a System V semaphore label. Since the object is
4308 going out of scope, policy modules should free any internal storage
4309 associated with the label so that it may be destroyed.
4310*/
4311typedef void mpo_sysvsem_label_destroy_t(
4312 struct label *label
4313);
4314/**
4315 @brief Initialize System V semaphore label
4316 @param label New label to initialize
4317
4318 Initialize the label for a newly instantiated System V semaphore. Sleeping
4319 is permitted.
4320*/
4321typedef void mpo_sysvsem_label_init_t(
4322 struct label *label
4323);
4324/**
4325 @brief Clean up a System V semaphore label
4326 @param label The label to be cleaned
4327
4328 Clean up a System V semaphore label. Darwin pre-allocates
4329 semaphores at system boot time and re-uses them rather than
4330 allocating new ones. Before semaphores are returned to the "free
4331 pool", policies can cleanup or overwrite any information present in
4332 the label.
4333*/
4334typedef void mpo_sysvsem_label_recycle_t(
4335 struct label *label
4336);
4337/**
4338 @brief Access control check for mapping System V shared memory
4339 @param cred Subject credential
4340 @param shmsegptr Pointer to shared memory segment identifier
4341 @param shmseglabel Label associated with the shared memory segment
4342 @param shmflg shmat flags; see shmat(2)
4343
4344 Determine whether the subject identified by the credential can map
4345 the System V shared memory segment associated with shmsegptr.
4346
4347 @return Return 0 if access is granted, otherwise an appropriate value for
4348 errno should be returned.
4349*/
4350typedef int mpo_sysvshm_check_shmat_t(
4351 kauth_cred_t cred,
4352 struct shmid_kernel *shmsegptr,
4353 struct label *shmseglabel,
4354 int shmflg
4355);
4356/**
4357 @brief Access control check for System V shared memory control operation
4358 @param cred Subject credential
4359 @param shmsegptr Pointer to shared memory segment identifier
4360 @param shmseglabel Label associated with the shared memory segment
4361 @param cmd Control operation to be performed; see shmctl(2)
4362
4363 Determine whether the subject identified by the credential can perform
4364 the operation indicated by cmd on the System V shared memory segment
4365 shmsegptr.
4366
4367 @return Return 0 if access is granted, otherwise an appropriate value for
4368 errno should be returned.
4369*/
4370typedef int mpo_sysvshm_check_shmctl_t(
4371 kauth_cred_t cred,
4372 struct shmid_kernel *shmsegptr,
4373 struct label *shmseglabel,
4374 int cmd
4375);
4376/**
4377 @brief Access control check for unmapping System V shared memory
4378 @param cred Subject credential
4379 @param shmsegptr Pointer to shared memory segment identifier
4380 @param shmseglabel Label associated with the shared memory segment
4381
4382 Determine whether the subject identified by the credential can unmap
4383 the System V shared memory segment associated with shmsegptr.
4384
4385 @return Return 0 if access is granted, otherwise an appropriate value for
4386 errno should be returned.
4387*/
4388typedef int mpo_sysvshm_check_shmdt_t(
4389 kauth_cred_t cred,
4390 struct shmid_kernel *shmsegptr,
4391 struct label *shmseglabel
4392);
4393/**
4394 @brief Access control check obtaining System V shared memory identifier
4395 @param cred Subject credential
4396 @param shmsegptr Pointer to shared memory segment identifier
4397 @param shmseglabel Label associated with the shared memory segment
4398 @param shmflg shmget flags; see shmget(2)
4399
4400 Determine whether the subject identified by the credential can get
4401 the System V shared memory segment address.
4402
4403 @return Return 0 if access is granted, otherwise an appropriate value for
4404 errno should be returned.
4405*/
4406typedef int mpo_sysvshm_check_shmget_t(
4407 kauth_cred_t cred,
4408 struct shmid_kernel *shmsegptr,
4409 struct label *shmseglabel,
4410 int shmflg
4411);
4412/**
4413 @brief Create a System V shared memory region label
4414 @param cred Subject credential
4415 @param shmsegptr The shared memory region being created
4416 @param shmlabel Label to associate with the new shared memory region
4417
4418 Label a new System V shared memory region. The label was previously
4419 initialized and associated with the shared memory region. At this
4420 time, an appropriate initial label value should be assigned to the
4421 object and stored in shmlabel.
4422*/
4423typedef void mpo_sysvshm_label_associate_t(
4424 kauth_cred_t cred,
4425 struct shmid_kernel *shmsegptr,
4426 struct label *shmlabel
4427);
4428/**
4429 @brief Destroy System V shared memory label
4430 @param label The label to be destroyed
4431
4432 Destroy a System V shared memory region label. Since the
4433 object is going out of scope, policy modules should free any
4434 internal storage associated with the label so that it may be
4435 destroyed.
4436*/
4437typedef void mpo_sysvshm_label_destroy_t(
4438 struct label *label
4439);
4440/**
4441 @brief Initialize System V Shared Memory region label
4442 @param label New label to initialize
4443
4444 Initialize the label for a newly instantiated System V Shared Memory
4445 region. Sleeping is permitted.
4446*/
4447typedef void mpo_sysvshm_label_init_t(
4448 struct label *label
4449);
4450/**
4451 @brief Clean up a System V Share Memory Region label
4452 @param shmlabel The label to be cleaned
4453
4454 Clean up a System V Shared Memory Region label. Darwin
4455 pre-allocates these objects at system boot time and re-uses them
4456 rather than allocating new ones. Before the memory regions are
4457 returned to the "free pool", policies can cleanup or overwrite any
4458 information present in the label.
4459*/
4460typedef void mpo_sysvshm_label_recycle_t(
4461 struct label *shmlabel
4462);
4463/**
4464 @brief Access control check for getting a process's task name
4465 @param cred Subject credential
39037602 4466 @param p Object process
2d21ac55
A
4467
4468 Determine whether the subject identified by the credential can get
4469 the passed process's task name port.
4470 This call is used by the task_name_for_pid(2) API.
4471
4472 @return Return 0 if access is granted, otherwise an appropriate value for
4473 errno should be returned. Suggested failure: EACCES for label mismatch,
4474 EPERM for lack of privilege, or ESRCH to hide visibility of the target.
4475*/
4476typedef int mpo_proc_check_get_task_name_t(
4477 kauth_cred_t cred,
4478 struct proc *p
4479);
4480/**
4481 @brief Access control check for getting a process's task port
4482 @param cred Subject credential
39037602 4483 @param p Object process
2d21ac55
A
4484
4485 Determine whether the subject identified by the credential can get
4486 the passed process's task control port.
4487 This call is used by the task_for_pid(2) API.
4488
4489 @return Return 0 if access is granted, otherwise an appropriate value for
4490 errno should be returned. Suggested failure: EACCES for label mismatch,
4491 EPERM for lack of privilege, or ESRCH to hide visibility of the target.
4492*/
4493typedef int mpo_proc_check_get_task_t(
4494 kauth_cred_t cred,
4495 struct proc *p
4496);
fe8ab488 4497
3e170ce0
A
4498/**
4499 @brief Access control check for exposing a process's task port
4500 @param cred Subject credential
39037602 4501 @param p Object process
3e170ce0
A
4502
4503 Determine whether the subject identified by the credential can expose
4504 the passed process's task control port.
4505 This call is used by the accessor APIs like processor_set_tasks() and
4506 processor_set_threads().
4507
4508 @return Return 0 if access is granted, otherwise an appropriate value for
4509 errno should be returned. Suggested failure: EACCES for label mismatch,
4510 EPERM for lack of privilege, or ESRCH to hide visibility of the target.
4511*/
4512typedef int mpo_proc_check_expose_task_t(
4513 kauth_cred_t cred,
4514 struct proc *p
4515);
4516
fe8ab488
A
4517/**
4518 @brief Check whether task's IPC may inherit across process exec
39037602 4519 @param p current process instance
fe8ab488
A
4520 @param cur_vp vnode pointer to current instance
4521 @param cur_offset offset of binary of currently executing image
4522 @param img_vp vnode pointer to to be exec'ed image
4523 @param img_offset offset into file which is selected for execution
4524 @param scriptvp vnode pointer of script file if any.
4525 @return Return 0 if access is granted.
4526 EPERM if parent does not have any entitlements.
4527 EACCESS if mismatch in entitlements
4528*/
4529typedef int mpo_proc_check_inherit_ipc_ports_t(
4530 struct proc *p,
3e170ce0
A
4531 struct vnode *cur_vp,
4532 off_t cur_offset,
4533 struct vnode *img_vp,
4534 off_t img_offset,
4535 struct vnode *scriptvp
fe8ab488
A
4536);
4537
593a1d5f 4538/**
b0d623f7 4539 @brief Privilege check for a process to run invalid
39037602 4540 @param p Object process
593a1d5f 4541
b0d623f7
A
4542 Determine whether the process may execute even though the system determined
4543 that it is untrusted (eg unidentified / modified code).
593a1d5f
A
4544
4545 @return Return 0 if access is granted, otherwise an appropriate value for
4546 errno should be returned.
4547 */
3e170ce0 4548typedef int mpo_proc_check_run_cs_invalid_t(
593a1d5f
A
4549 struct proc *p
4550);
4551
316670eb
A
4552/**
4553 @brief Perform MAC-related events when a thread returns to user space
4554 @param thread Mach (not BSD) thread that is returning
4555
4556 This entry point permits policy modules to perform MAC-related
4557 events when a thread returns to user space, via a system call
4558 return or trap return.
4559*/
4560typedef void mpo_thread_userret_t(
4561 struct thread *thread
4562);
316670eb 4563
2d21ac55
A
4564/**
4565 @brief Check vnode access
4566 @param cred Subject credential
4567 @param vp Object vnode
4568 @param label Label for vp
4569 @param acc_mode access(2) flags
4570
4571 Determine how invocations of access(2) and related calls by the
4572 subject identified by the credential should return when performed
4573 on the passed vnode using the passed access flags. This should
4574 generally be implemented using the same semantics used in
4575 mpo_vnode_check_open.
4576
4577 @return Return 0 if access is granted, otherwise an appropriate value for
4578 errno should be returned. Suggested failure: EACCES for label mismatch or
4579 EPERM for lack of privilege.
4580*/
4581typedef int mpo_vnode_check_access_t(
4582 kauth_cred_t cred,
4583 struct vnode *vp,
4584 struct label *label,
4585 int acc_mode
4586);
4587/**
4588 @brief Access control check for changing working directory
4589 @param cred Subject credential
4590 @param dvp Object; vnode to chdir(2) into
4591 @param dlabel Policy label for dvp
4592
4593 Determine whether the subject identified by the credential can change
4594 the process working directory to the passed vnode.
4595
4596 @return Return 0 if access is granted, otherwise an appropriate value for
4597 errno should be returned. Suggested failure: EACCES for label mismatch or
4598 EPERM for lack of privilege.
4599*/
4600typedef int mpo_vnode_check_chdir_t(
4601 kauth_cred_t cred,
4602 struct vnode *dvp,
4603 struct label *dlabel
4604);
4605/**
4606 @brief Access control check for changing root directory
4607 @param cred Subject credential
4608 @param dvp Directory vnode
4609 @param dlabel Policy label associated with dvp
4610 @param cnp Component name for dvp
4611
4612 Determine whether the subject identified by the credential should be
4613 allowed to chroot(2) into the specified directory (dvp).
4614
4615 @return In the event of an error, an appropriate value for errno
4616 should be returned, otherwise return 0 upon success.
4617*/
4618typedef int mpo_vnode_check_chroot_t(
4619 kauth_cred_t cred,
4620 struct vnode *dvp,
4621 struct label *dlabel,
4622 struct componentname *cnp
4623);
39037602
A
4624/**
4625 @brief Access control check for creating clone
4626 @param cred Subject credential
4627 @param dvp Vnode of directory to create the clone in
4628 @param dlabel Policy label associated with dvp
4629 @param vp Vnode of the file to clone from
4630 @param label Policy label associated with vp
4631 @param cnp Component name for the clone being created
4632
4633 Determine whether the subject identified by the credential should be
4634 allowed to create a clone of the vnode vp with the name specified by cnp.
4635
4636 @return Return 0 if access is granted, otherwise an appropriate value for
4637 errno should be returned.
4638*/
4639typedef int mpo_vnode_check_clone_t(
4640 kauth_cred_t cred,
4641 struct vnode *dvp,
4642 struct label *dlabel,
4643 struct vnode *vp,
4644 struct label *label,
4645 struct componentname *cnp
4646);
2d21ac55
A
4647/**
4648 @brief Access control check for creating vnode
4649 @param cred Subject credential
4650 @param dvp Directory vnode
4651 @param dlabel Policy label for dvp
4652 @param cnp Component name for dvp
4653 @param vap vnode attributes for vap
4654
4655 Determine whether the subject identified by the credential can create
4656 a vnode with the passed parent directory, passed name information,
4657 and passed attribute information. This call may be made in a number of
4658 situations, including as a result of calls to open(2) with O_CREAT,
4659 mknod(2), mkfifo(2), and others.
4660
4661 @return Return 0 if access is granted, otherwise an appropriate value for
4662 errno should be returned. Suggested failure: EACCES for label mismatch or
4663 EPERM for lack of privilege.
4664*/
4665typedef int mpo_vnode_check_create_t(
4666 kauth_cred_t cred,
4667 struct vnode *dvp,
4668 struct label *dlabel,
4669 struct componentname *cnp,
4670 struct vnode_attr *vap
4671);
4672/**
4673 @brief Access control check for deleting extended attribute
4674 @param cred Subject credential
4675 @param vp Object vnode
4676 @param vlabel Label associated with vp
4677 @param name Extended attribute name
4678
4679 Determine whether the subject identified by the credential can delete
4680 the extended attribute from the passed vnode.
4681
4682 @return Return 0 if access is granted, otherwise an appropriate value for
4683 errno should be returned. Suggested failure: EACCES for label mismatch or
4684 EPERM for lack of privilege.
4685*/
4686typedef int mpo_vnode_check_deleteextattr_t(
4687 kauth_cred_t cred,
4688 struct vnode *vp,
4689 struct label *vlabel,
4690 const char *name
4691);
4692/**
4693 @brief Access control check for exchanging file data
4694 @param cred Subject credential
4695 @param v1 vnode 1 to swap
4696 @param vl1 Policy label for v1
4697 @param v2 vnode 2 to swap
4698 @param vl2 Policy label for v2
4699
4700 Determine whether the subject identified by the credential can swap the data
4701 in the two supplied vnodes.
4702
4703 @return Return 0 if access is granted, otherwise an appropriate value for
4704 errno should be returned. Suggested failure: EACCES for label mismatch or
4705 EPERM for lack of privilege.
4706*/
4707typedef int mpo_vnode_check_exchangedata_t(
4708 kauth_cred_t cred,
4709 struct vnode *v1,
4710 struct label *vl1,
4711 struct vnode *v2,
4712 struct label *vl2
4713);
4714/**
4715 @brief Access control check for executing the vnode
4716 @param cred Subject credential
4717 @param vp Object vnode to execute
fe8ab488
A
4718 @param scriptvp Script being executed by interpreter, if any.
4719 @param vnodelabel Label corresponding to vp
39037602 4720 @param scriptlabel Script vnode label
2d21ac55
A
4721 @param execlabel Userspace provided execution label
4722 @param cnp Component name for file being executed
39236c6e
A
4723 @param macpolicyattr MAC policy-specific spawn attribute data.
4724 @param macpolicyattrlen Length of policy-specific spawn attribute data.
2d21ac55
A
4725
4726 Determine whether the subject identified by the credential can execute
4727 the passed vnode. Determination of execute privilege is made separately
4728 from decisions about any process label transitioning event.
4729
4730 The final label, execlabel, corresponds to a label supplied by a
4731 user space application through the use of the mac_execve system call.
4732 This label will be NULL if the user application uses the the vendor
4733 execve(2) call instead of the MAC Framework mac_execve() call.
4734
4735 @return Return 0 if access is granted, otherwise an appropriate value for
4736 errno should be returned. Suggested failure: EACCES for label mismatch or
4737 EPERM for lack of privilege.
4738*/
4739typedef int mpo_vnode_check_exec_t(
4740 kauth_cred_t cred,
4741 struct vnode *vp,
fe8ab488
A
4742 struct vnode *scriptvp,
4743 struct label *vnodelabel,
4744 struct label *scriptlabel,
2d21ac55
A
4745 struct label *execlabel, /* NULLOK */
4746 struct componentname *cnp,
39236c6e
A
4747 u_int *csflags,
4748 void *macpolicyattr,
4749 size_t macpolicyattrlen
2d21ac55 4750);
6d2010ae
A
4751/**
4752 @brief Access control check for fsgetpath
4753 @param cred Subject credential
4754 @param vp Vnode for which a path will be returned
4755 @param label Label associated with the vnode
4756
4757 Determine whether the subject identified by the credential can get the path
4758 of the given vnode with fsgetpath.
4759
4760 @return Return 0 if access is granted, otherwise an appropriate value for
4761 errno should be returned.
4762*/
4763typedef int mpo_vnode_check_fsgetpath_t(
4764 kauth_cred_t cred,
4765 struct vnode *vp,
4766 struct label *label
4767);
593a1d5f 4768/**
743345f9
A
4769 @brief Access control check for retrieving file attributes
4770 @param active_cred Subject credential
4771 @param file_cred Credential associated with the struct fileproc
4772 @param vp Object vnode
4773 @param vlabel Policy label for vp
4774 @param va Vnode attributes to retrieve
4775
4776 Determine whether the subject identified by the credential can
4777 get information about the passed vnode. The active_cred hold
4778 the credentials of the subject performing the operation, and
4779 file_cred holds the credentials of the subject that originally
4780 opened the file. This check happens during stat(), lstat(),
4781 fstat(), and getattrlist() syscalls. See <sys/vnode.h> for
4782 definitions of the attributes.
593a1d5f 4783
39037602
A
4784 @return Return 0 if access is granted, otherwise an appropriate value for
4785 errno should be returned.
743345f9
A
4786
4787 @note Policies may change the contents of va to alter the list of
4788 file attributes returned.
4789*/
4790typedef int mpo_vnode_check_getattr_t(
4791 kauth_cred_t active_cred,
4792 kauth_cred_t file_cred, /* NULLOK */
39037602 4793 struct vnode *vp,
743345f9
A
4794 struct label *vlabel,
4795 struct vnode_attr *va
4796);
2d21ac55
A
4797/**
4798 @brief Access control check for retrieving file attributes
4799 @param cred Subject credential
4800 @param vp Object vnode
4801 @param vlabel Policy label for vp
4802 @param alist List of attributes to retrieve
4803
4804 Determine whether the subject identified by the credential can read
4805 various attributes of the specified vnode, or the filesystem or volume on
4806 which that vnode resides. See <sys/attr.h> for definitions of the
4807 attributes.
4808
4809 @return Return 0 if access is granted, otherwise an appropriate value for
4810 errno should be returned. Suggested failure: EACCES for label mismatch or
4811 EPERM for lack of privilege. Access control covers all attributes requested
4812 with this call; the security policy is not permitted to change the set of
4813 attributes requested.
4814*/
4815typedef int mpo_vnode_check_getattrlist_t(
4816 kauth_cred_t cred,
4817 struct vnode *vp,
4818 struct label *vlabel,
4819 struct attrlist *alist
4820);
4821/**
4822 @brief Access control check for retrieving an extended attribute
4823 @param cred Subject credential
4824 @param vp Object vnode
4825 @param label Policy label for vp
4826 @param name Extended attribute name
4827 @param uio I/O structure pointer
4828
4829 Determine whether the subject identified by the credential can retrieve
4830 the extended attribute from the passed vnode. The uio parameter
4831 will be NULL when the getxattr(2) call has been made with a NULL data
4832 value; this is done to request the size of the data only.
4833
4834 @return Return 0 if access is granted, otherwise an appropriate value for
4835 errno should be returned. Suggested failure: EACCES for label mismatch or
4836 EPERM for lack of privilege.
4837*/
4838typedef int mpo_vnode_check_getextattr_t(
4839 kauth_cred_t cred,
4840 struct vnode *vp,
4841 struct label *label, /* NULLOK */
4842 const char *name,
4843 struct uio *uio /* NULLOK */
4844);
4845/**
4846 @brief Access control check for ioctl
4847 @param cred Subject credential
4848 @param vp Object vnode
4849 @param label Policy label for vp
39037602 4850 @param cmd Device-dependent request code; see ioctl(2)
2d21ac55
A
4851
4852 Determine whether the subject identified by the credential can perform
4853 the ioctl operation indicated by com.
4854
4855 @warning Since ioctl data is opaque from the standpoint of the MAC
4856 framework, and since ioctls can affect many aspects of system
4857 operation, policies must exercise extreme care when implementing
4858 access control checks.
4859
4860 @return Return 0 if access is granted, otherwise an appropriate value for
4861 errno should be returned.
4862*/
4863typedef int mpo_vnode_check_ioctl_t(
4864 kauth_cred_t cred,
4865 struct vnode *vp,
4866 struct label *label,
4867 unsigned int cmd
4868);
4869/**
4870 @brief Access control check for vnode kqfilter
39037602 4871 @param active_cred Subject credential
2d21ac55
A
4872 @param kn Object knote
4873 @param vp Object vnode
4874 @param label Policy label for vp
4875
4876 Determine whether the subject identified by the credential can
4877 receive the knote on the passed vnode.
4878
4879 @return Return 0 if access if granted, otherwise an appropriate
4880 value for errno should be returned.
4881*/
4882typedef int mpo_vnode_check_kqfilter_t(
4883 kauth_cred_t active_cred,
4884 kauth_cred_t file_cred, /* NULLOK */
4885 struct knote *kn,
4886 struct vnode *vp,
4887 struct label *label
4888);
4889/**
4890 @brief Access control check for relabel
4891 @param cred Subject credential
4892 @param vp Object vnode
4893 @param vnodelabel Existing policy label for vp
4894 @param newlabel Policy label update to later be applied to vp
4895 @see mpo_relable_vnode_t
4896
4897 Determine whether the subject identified by the credential can relabel
4898 the passed vnode to the passed label update. If all policies permit
4899 the label change, the actual relabel entry point (mpo_vnode_label_update)
4900 will follow.
4901
4902 @return Return 0 if access is granted, otherwise an appropriate value for
4903 errno should be returned.
4904*/
4905typedef int mpo_vnode_check_label_update_t(
4906 struct ucred *cred,
4907 struct vnode *vp,
4908 struct label *vnodelabel,
4909 struct label *newlabel
4910);
4911/**
4912 @brief Access control check for creating link
4913 @param cred Subject credential
4914 @param dvp Directory vnode
4915 @param dlabel Policy label associated with dvp
4916 @param vp Link destination vnode
4917 @param label Policy label associated with vp
4918 @param cnp Component name for the link being created
4919
4920 Determine whether the subject identified by the credential should be
4921 allowed to create a link to the vnode vp with the name specified by cnp.
4922
4923 @return Return 0 if access is granted, otherwise an appropriate value for
4924 errno should be returned.
4925*/
4926typedef int mpo_vnode_check_link_t(
4927 kauth_cred_t cred,
4928 struct vnode *dvp,
4929 struct label *dlabel,
4930 struct vnode *vp,
4931 struct label *label,
4932 struct componentname *cnp
4933);
4934/**
4935 @brief Access control check for listing extended attributes
4936 @param cred Subject credential
4937 @param vp Object vnode
4938 @param vlabel Policy label associated with vp
4939
4940 Determine whether the subject identified by the credential can retrieve
4941 a list of named extended attributes from a vnode.
4942
4943 @return Return 0 if access is granted, otherwise an appropriate value for
4944 errno should be returned.
4945*/
4946typedef int mpo_vnode_check_listextattr_t(
4947 kauth_cred_t cred,
4948 struct vnode *vp,
4949 struct label *vlabel
4950);
5ba3f43e
A
4951/**
4952 @brief Access control check for lookup
4953 @param cred Subject credential
4954 @param dvp Directory vnode
4955 @param dlabel Policy label for dvp
4956 @param path Path being looked up
4957 @param pathlen Length of path in bytes
4958
4959 Determine whether the subject identified by the credential can perform
4960 a lookup of the passed path relative to the passed directory vnode.
4961
4962 @return Return 0 if access is granted, otherwise an appropriate value for
4963 errno should be returned. Suggested failure: EACCES for label mismatch or
4964 EPERM for lack of privilege.
4965
4966 @note The path may contain untrusted input. If approved, lookup proceeds
4967 on the path; if a component is found to be a symlink then this hook is
4968 called again with the updated path.
4969*/
4970typedef int mpo_vnode_check_lookup_preflight_t(
4971 kauth_cred_t cred,
4972 struct vnode *dvp,
4973 struct label *dlabel,
4974 const char *path,
4975 size_t pathlen
4976);
2d21ac55
A
4977/**
4978 @brief Access control check for lookup
4979 @param cred Subject credential
4980 @param dvp Object vnode
4981 @param dlabel Policy label for dvp
4982 @param cnp Component name being looked up
4983
4984 Determine whether the subject identified by the credential can perform
4985 a lookup in the passed directory vnode for the passed name (cnp).
4986
4987 @return Return 0 if access is granted, otherwise an appropriate value for
4988 errno should be returned. Suggested failure: EACCES for label mismatch or
4989 EPERM for lack of privilege.
4990*/
4991typedef int mpo_vnode_check_lookup_t(
4992 kauth_cred_t cred,
4993 struct vnode *dvp,
4994 struct label *dlabel,
4995 struct componentname *cnp
4996);
4997/**
4998 @brief Access control check for open
4999 @param cred Subject credential
5000 @param vp Object vnode
5001 @param label Policy label associated with vp
5002 @param acc_mode open(2) access mode
5003
5004 Determine whether the subject identified by the credential can perform
5005 an open operation on the passed vnode with the passed access mode.
5006
5007 @return Return 0 if access is granted, otherwise an appropriate value for
5008 errno should be returned. Suggested failure: EACCES for label mismatch or
5009 EPERM for lack of privilege.
5010*/
5011typedef int mpo_vnode_check_open_t(
5012 kauth_cred_t cred,
5013 struct vnode *vp,
5014 struct label *label,
5015 int acc_mode
5016);
5017/**
5018 @brief Access control check for read
5019 @param active_cred Subject credential
5020 @param file_cred Credential associated with the struct fileproc
5021 @param vp Object vnode
5022 @param label Policy label for vp
5023
5024 Determine whether the subject identified by the credential can perform
5025 a read operation on the passed vnode. The active_cred hold the credentials
5026 of the subject performing the operation, and file_cred holds the
5027 credentials of the subject that originally opened the file.
5028
5029 @return Return 0 if access is granted, otherwise an appropriate value for
5030 errno should be returned. Suggested failure: EACCES for label mismatch or
5031 EPERM for lack of privilege.
5032*/
5033typedef int mpo_vnode_check_read_t(
5034 kauth_cred_t active_cred, /* SUBJECT */
5035 kauth_cred_t file_cred, /* NULLOK */
5036 struct vnode *vp, /* OBJECT */
5037 struct label *label /* LABEL */
5038);
5039/**
5040 @brief Access control check for read directory
5041 @param cred Subject credential
5042 @param dvp Object directory vnode
5043 @param dlabel Policy label for dvp
5044
5045 Determine whether the subject identified by the credential can
5046 perform a readdir operation on the passed directory vnode.
5047
5048 @return Return 0 if access is granted, otherwise an appropriate value for
5049 errno should be returned. Suggested failure: EACCES for label mismatch or
5050 EPERM for lack of privilege.
5051*/
5052typedef int mpo_vnode_check_readdir_t(
5053 kauth_cred_t cred, /* SUBJECT */
5054 struct vnode *dvp, /* OBJECT */
5055 struct label *dlabel /* LABEL */
5056);
5057/**
5058 @brief Access control check for read link
5059 @param cred Subject credential
5060 @param vp Object vnode
5061 @param label Policy label for vp
5062
5063 Determine whether the subject identified by the credential can perform
5064 a readlink operation on the passed symlink vnode. This call can be made
5065 in a number of situations, including an explicit readlink call by the
5066 user process, or as a result of an implicit readlink during a name
5067 lookup by the process.
5068
5069 @return Return 0 if access is granted, otherwise an appropriate value for
5070 errno should be returned. Suggested failure: EACCES for label mismatch or
5071 EPERM for lack of privilege.
5072*/
5073typedef int mpo_vnode_check_readlink_t(
5074 kauth_cred_t cred,
5075 struct vnode *vp,
5076 struct label *label
5077);
fe8ab488
A
5078/**
5079 @brief Access control check for rename
5080 @param cred Subject credential
5081 @param dvp Directory vnode
5082 @param dlabel Policy label associated with dvp
5083 @param vp vnode to be renamed
5084 @param label Policy label associated with vp
5085 @param cnp Component name for vp
5086 @param tdvp Destination directory vnode
5087 @param tdlabel Policy label associated with tdvp
5088 @param tvp Overwritten vnode
5089 @param tlabel Policy label associated with tvp
5090 @param tcnp Destination component name
5091
5092 Determine whether the subject identified by the credential should be allowed
5093 to rename the vnode vp to something else.
5094
5095 @return Return 0 if access is granted, otherwise an appropriate value for
5096 errno should be returned.
5097*/
5098typedef int mpo_vnode_check_rename_t(
5099 kauth_cred_t cred,
5100 struct vnode *dvp,
5101 struct label *dlabel,
5102 struct vnode *vp,
5103 struct label *label,
5104 struct componentname *cnp,
5105 struct vnode *tdvp,
5106 struct label *tdlabel,
5107 struct vnode *tvp,
5108 struct label *tlabel,
5109 struct componentname *tcnp
5110);
2d21ac55
A
5111/**
5112 @brief Access control check for rename from
5113 @param cred Subject credential
5114 @param dvp Directory vnode
5115 @param dlabel Policy label associated with dvp
5116 @param vp vnode to be renamed
5117 @param label Policy label associated with vp
5118 @param cnp Component name for vp
fe8ab488 5119 @see mpo_vnode_check_rename_t
2d21ac55
A
5120 @see mpo_vnode_check_rename_to_t
5121
5122 Determine whether the subject identified by the credential should be
5123 allowed to rename the vnode vp to something else.
5124
5125 Due to VFS locking constraints (to make sure proper vnode locks are
5126 held during this entry point), the vnode relabel checks had to be
5127 split into two parts: relabel_from and relabel to.
5128
fe8ab488
A
5129 This hook is deprecated, mpo_vnode_check_rename_t should be used instead.
5130
2d21ac55
A
5131 @return Return 0 if access is granted, otherwise an appropriate value for
5132 errno should be returned.
5133*/
5134typedef int mpo_vnode_check_rename_from_t(
5135 kauth_cred_t cred,
5136 struct vnode *dvp,
5137 struct label *dlabel,
5138 struct vnode *vp,
5139 struct label *label,
5140 struct componentname *cnp
5141);
5142/**
5143 @brief Access control check for rename to
5144 @param cred Subject credential
5145 @param dvp Directory vnode
5146 @param dlabel Policy label associated with dvp
5147 @param vp Overwritten vnode
5148 @param label Policy label associated with vp
5149 @param samedir Boolean; 1 if the source and destination directories are the same
5150 @param cnp Destination component name
fe8ab488 5151 @see mpo_vnode_check_rename_t
2d21ac55
A
5152 @see mpo_vnode_check_rename_from_t
5153
5154 Determine whether the subject identified by the credential should be
5155 allowed to rename to the vnode vp, into the directory dvp, or to the
5156 name represented by cnp. If there is no existing file to overwrite,
5157 vp and label will be NULL.
5158
5159 Due to VFS locking constraints (to make sure proper vnode locks are
5160 held during this entry point), the vnode relabel checks had to be
5161 split into two parts: relabel_from and relabel to.
5162
fe8ab488
A
5163 This hook is deprecated, mpo_vnode_check_rename_t should be used instead.
5164
2d21ac55
A
5165 @return Return 0 if access is granted, otherwise an appropriate value for
5166 errno should be returned.
5167*/
5168typedef int mpo_vnode_check_rename_to_t(
5169 kauth_cred_t cred,
5170 struct vnode *dvp,
5171 struct label *dlabel,
5172 struct vnode *vp, /* NULLOK */
5173 struct label *label, /* NULLOK */
5174 int samedir,
5175 struct componentname *cnp
5176);
5177/**
5178 @brief Access control check for revoke
5179 @param cred Subject credential
5180 @param vp Object vnode
5181 @param label Policy label for vp
5182
5183 Determine whether the subject identified by the credential can revoke
5184 access to the passed vnode.
5185
5186 @return Return 0 if access is granted, otherwise an appropriate value for
5187 errno should be returned. Suggested failure: EACCES for label mismatch or
5188 EPERM for lack of privilege.
5189*/
5190typedef int mpo_vnode_check_revoke_t(
5191 kauth_cred_t cred,
5192 struct vnode *vp,
5193 struct label *label
5194);
6d2010ae
A
5195/**
5196 @brief Access control check for searchfs
5197 @param cred Subject credential
5198 @param vp Object vnode
5199 @param vlabel Policy label for vp
5200 @param alist List of attributes used as search criteria
5201
5202 Determine whether the subject identified by the credential can search the
5203 vnode using the searchfs system call.
5204
5205 @return Return 0 if access is granted, otherwise an appropriate value for
5206 errno should be returned.
5207*/
5208typedef int mpo_vnode_check_searchfs_t(
5209 kauth_cred_t cred,
5210 struct vnode *vp,
5211 struct label *vlabel,
5212 struct attrlist *alist
5213);
2d21ac55
A
5214/**
5215 @brief Access control check for select
5216 @param cred Subject credential
5217 @param vp Object vnode
5218 @param label Policy label for vp
5219 @param which The operation selected on: FREAD or FWRITE
5220
5221 Determine whether the subject identified by the credential can select
5222 the vnode.
5223
5224 @return Return 0 if access is granted, otherwise an appropriate value for
5225 errno should be returned.
5226*/
5227typedef int mpo_vnode_check_select_t(
5228 kauth_cred_t cred,
5229 struct vnode *vp,
5230 struct label *label,
5231 int which
5232);
39037602
A
5233/**
5234 @brief Access control check for setting ACL
5235 @param cred Subject credential
5236 @param vp Object node
5237 @param label Policy label for vp
5238 @param acl ACL structure pointer
5239
5240 Determine whether the subject identified by the credential can set an ACL
5241 on the specified vnode. The ACL pointer will be NULL when removing an ACL.
5242
5243 @return Return 0 if access is granted, otherwise an appropriate value for
5244 errno should be returned. Suggested failure: EACCES for label mismatch or
5245 EPERM for lack of privilege.
5246*/
5247typedef int mpo_vnode_check_setacl_t(
5248 kauth_cred_t cred,
5249 struct vnode *vp,
5250 struct label *label,
5251 struct kauth_acl *acl
5252);
2d21ac55
A
5253/**
5254 @brief Access control check for setting file attributes
5255 @param cred Subject credential
5256 @param vp Object vnode
5257 @param vlabel Policy label for vp
5258 @param alist List of attributes to set
5259
5260 Determine whether the subject identified by the credential can set
5261 various attributes of the specified vnode, or the filesystem or volume on
5262 which that vnode resides. See <sys/attr.h> for definitions of the
5263 attributes.
5264
5265 @return Return 0 if access is granted, otherwise an appropriate value for
5266 errno should be returned. Suggested failure: EACCES for label mismatch or
5267 EPERM for lack of privilege. Access control covers all attributes requested
5268 with this call.
5269*/
5270typedef int mpo_vnode_check_setattrlist_t(
5271 kauth_cred_t cred,
5272 struct vnode *vp,
5273 struct label *vlabel,
5274 struct attrlist *alist
5275);
5276/**
5277 @brief Access control check for setting extended attribute
5278 @param cred Subject credential
5279 @param vp Object vnode
5280 @param label Policy label for vp
5281 @param name Extended attribute name
5282 @param uio I/O structure pointer
5283
5284 Determine whether the subject identified by the credential can set the
5285 extended attribute of passed name and passed namespace on the passed
5286 vnode. Policies implementing security labels backed into extended
5287 attributes may want to provide additional protections for those
5288 attributes. Additionally, policies should avoid making decisions based
5289 on the data referenced from uio, as there is a potential race condition
5290 between this check and the actual operation. The uio may also be NULL
5291 if a delete operation is being performed.
5292
5293 @return Return 0 if access is granted, otherwise an appropriate value for
5294 errno should be returned. Suggested failure: EACCES for label mismatch or
5295 EPERM for lack of privilege.
5296*/
5297typedef int mpo_vnode_check_setextattr_t(
5298 kauth_cred_t cred,
5299 struct vnode *vp,
5300 struct label *label,
5301 const char *name,
5302 struct uio *uio
5303);
5304/**
5305 @brief Access control check for setting flags
5306 @param cred Subject credential
5307 @param vp Object vnode
5308 @param label Policy label for vp
5309 @param flags File flags; see chflags(2)
5310
5311 Determine whether the subject identified by the credential can set
5312 the passed flags on the passed vnode.
5313
5314 @return Return 0 if access is granted, otherwise an appropriate value for
5315 errno should be returned. Suggested failure: EACCES for label mismatch or
5316 EPERM for lack of privilege.
5317*/
5318typedef int mpo_vnode_check_setflags_t(
5319 kauth_cred_t cred,
5320 struct vnode *vp,
5321 struct label *label,
5322 u_long flags
5323);
5324/**
5325 @brief Access control check for setting mode
5326 @param cred Subject credential
5327 @param vp Object vnode
5328 @param label Policy label for vp
5329 @param mode File mode; see chmod(2)
5330
5331 Determine whether the subject identified by the credential can set
5332 the passed mode on the passed vnode.
5333
5334 @return Return 0 if access is granted, otherwise an appropriate value for
5335 errno should be returned. Suggested failure: EACCES for label mismatch or
5336 EPERM for lack of privilege.
5337*/
5338typedef int mpo_vnode_check_setmode_t(
5339 kauth_cred_t cred,
5340 struct vnode *vp,
5341 struct label *label,
5342 mode_t mode
5343);
5344/**
5345 @brief Access control check for setting uid and gid
5346 @param cred Subject credential
5347 @param vp Object vnode
5348 @param label Policy label for vp
5349 @param uid User ID
5350 @param gid Group ID
5351
5352 Determine whether the subject identified by the credential can set
5353 the passed uid and passed gid as file uid and file gid on the passed
5354 vnode. The IDs may be set to (-1) to request no update.
5355
5356 @return Return 0 if access is granted, otherwise an appropriate value for
5357 errno should be returned. Suggested failure: EACCES for label mismatch or
5358 EPERM for lack of privilege.
5359*/
5360typedef int mpo_vnode_check_setowner_t(
5361 kauth_cred_t cred,
5362 struct vnode *vp,
5363 struct label *label,
5364 uid_t uid,
5365 gid_t gid
5366);
5367/**
5368 @brief Access control check for setting timestamps
5369 @param cred Subject credential
5370 @param vp Object vnode
5371 @param label Policy label for vp
5372 @param atime Access time; see utimes(2)
5373 @param mtime Modification time; see utimes(2)
5374
5375 Determine whether the subject identified by the credential can set
5376 the passed access timestamps on the passed vnode.
5377
5378 @return Return 0 if access is granted, otherwise an appropriate value for
5379 errno should be returned. Suggested failure: EACCES for label mismatch or
5380 EPERM for lack of privilege.
5381*/
5382typedef int mpo_vnode_check_setutimes_t(
5383 kauth_cred_t cred,
5384 struct vnode *vp,
5385 struct label *label,
5386 struct timespec atime,
5387 struct timespec mtime
5388);
743345f9
A
5389/**
5390 @brief Access control check after determining the code directory hash
5391 @param vp vnode vnode to combine into proc
5392 @param label label associated with the vnode
5393 @param cs_blob the code signature to check
5394 @param cs_flags update code signing flags if needed
5ba3f43e 5395 @param signer_type output parameter for the code signature's signer type
743345f9
A
5396 @param flags operational flag to mpo_vnode_check_signature
5397 @param fatal_failure_desc description of fatal failure
5398 @param fatal_failure_desc_len failure description len, failure is fatal if non-0
5399
5400 @return Return 0 if access is granted, otherwise an appropriate value for
5401 errno should be returned.
5402 */
5403typedef int mpo_vnode_check_signature_t(
5404 struct vnode *vp,
5405 struct label *label,
5406 struct cs_blob *cs_blob,
5407 unsigned int *cs_flags,
5ba3f43e 5408 unsigned int *signer_type,
743345f9
A
5409 int flags,
5410 char **fatal_failure_desc, size_t *fatal_failure_desc_len
5411);
2d21ac55
A
5412/**
5413 @brief Access control check for stat
5414 @param active_cred Subject credential
5415 @param file_cred Credential associated with the struct fileproc
5416 @param vp Object vnode
5417 @param label Policy label for vp
5418
5419 Determine whether the subject identified by the credential can stat
5420 the passed vnode. See stat(2) for more information. The active_cred
5421 hold the credentials of the subject performing the operation, and
5422 file_cred holds the credentials of the subject that originally
5423 opened the file.
5424
5425 @return Return 0 if access is granted, otherwise an appropriate value for
5426 errno should be returned. Suggested failure: EACCES for label mismatch or
5427 EPERM for lack of privilege.
5428*/
5429typedef int mpo_vnode_check_stat_t(
5430 struct ucred *active_cred,
5431 struct ucred *file_cred, /* NULLOK */
5432 struct vnode *vp,
5433 struct label *label
5434);
527f9951
A
5435/**
5436 @brief Access control check for vnode trigger resolution
5437 @param cred Subject credential
5438 @param dvp Object vnode
5439 @param dlabel Policy label for dvp
5440 @param cnp Component name that triggered resolution
5441
5442 Determine whether the subject identified by the credential can trigger
5443 resolution of the passed name (cnp) in the passed directory vnode
5444 via an external trigger resolver.
5445
5446 @return Return 0 if access is granted, otherwise an appropriate value for
5447 errno should be returned. Suggested failure: EACCES for label mismatch or
5448 EPERM for lack of privilege.
5449*/
5450typedef int mpo_vnode_check_trigger_resolve_t(
5451 kauth_cred_t cred,
5452 struct vnode *dvp,
5453 struct label *dlabel,
5454 struct componentname *cnp
5455);
2d21ac55
A
5456/**
5457 @brief Access control check for truncate/ftruncate
5458 @param active_cred Subject credential
5459 @param file_cred Credential associated with the struct fileproc
5460 @param vp Object vnode
5461 @param label Policy label for vp
5462
5463 Determine whether the subject identified by the credential can
5464 perform a truncate operation on the passed vnode. The active_cred hold
5465 the credentials of the subject performing the operation, and
5466 file_cred holds the credentials of the subject that originally
5467 opened the file.
5468
5469 @return Return 0 if access is granted, otherwise an appropriate value for
5470 errno should be returned. Suggested failure: EACCES for label mismatch or
5471 EPERM for lack of privilege.
5472*/
5473typedef int mpo_vnode_check_truncate_t(
5474 kauth_cred_t active_cred,
5475 kauth_cred_t file_cred, /* NULLOK */
5476 struct vnode *vp,
5477 struct label *label
5478);
b0d623f7
A
5479/**
5480 @brief Access control check for binding UNIX domain socket
5481 @param cred Subject credential
5482 @param dvp Directory vnode
5483 @param dlabel Policy label for dvp
5484 @param cnp Component name for dvp
5485 @param vap vnode attributes for vap
5486
5487 Determine whether the subject identified by the credential can perform a
5488 bind operation on a UNIX domain socket with the passed parent directory,
5489 passed name information, and passed attribute information.
5490
5491 @return Return 0 if access is granted, otherwise an appropriate value for
5492 errno should be returned. Suggested failure: EACCES for label mismatch or
5493 EPERM for lack of privilege.
5494*/
5495typedef int mpo_vnode_check_uipc_bind_t(
5496 kauth_cred_t cred,
5497 struct vnode *dvp,
5498 struct label *dlabel,
5499 struct componentname *cnp,
5500 struct vnode_attr *vap
5501);
5502/**
5503 @brief Access control check for connecting UNIX domain socket
5504 @param cred Subject credential
5505 @param vp Object vnode
5506 @param label Policy label associated with vp
39037602 5507 @param so Socket
b0d623f7
A
5508
5509 Determine whether the subject identified by the credential can perform a
5510 connect operation on the passed UNIX domain socket vnode.
5511
5512 @return Return 0 if access is granted, otherwise an appropriate value for
5513 errno should be returned. Suggested failure: EACCES for label mismatch or
5514 EPERM for lack of privilege.
5515*/
5516typedef int mpo_vnode_check_uipc_connect_t(
5517 kauth_cred_t cred,
5518 struct vnode *vp,
39037602
A
5519 struct label *label,
5520 socket_t so
b0d623f7 5521);
2d21ac55
A
5522/**
5523 @brief Access control check for deleting vnode
5524 @param cred Subject credential
5525 @param dvp Parent directory vnode
5526 @param dlabel Policy label for dvp
5527 @param vp Object vnode to delete
5528 @param label Policy label for vp
5529 @param cnp Component name for vp
5530 @see mpo_check_rename_to_t
5531
5532 Determine whether the subject identified by the credential can delete
5533 a vnode from the passed parent directory and passed name information.
5534 This call may be made in a number of situations, including as a
5535 results of calls to unlink(2) and rmdir(2). Policies implementing
5536 this entry point should also implement mpo_check_rename_to to
5537 authorize deletion of objects as a result of being the target of a rename.
5538
5539 @return Return 0 if access is granted, otherwise an appropriate value for
5540 errno should be returned. Suggested failure: EACCES for label mismatch or
5541 EPERM for lack of privilege.
5542*/
5543typedef int mpo_vnode_check_unlink_t(
5544 kauth_cred_t cred,
5545 struct vnode *dvp,
5546 struct label *dlabel,
5547 struct vnode *vp,
5548 struct label *label,
5549 struct componentname *cnp
5550);
5551/**
5552 @brief Access control check for write
5553 @param active_cred Subject credential
5554 @param file_cred Credential associated with the struct fileproc
5555 @param vp Object vnode
5556 @param label Policy label for vp
5557
5558 Determine whether the subject identified by the credential can
5559 perform a write operation on the passed vnode. The active_cred hold
5560 the credentials of the subject performing the operation, and
5561 file_cred holds the credentials of the subject that originally
5562 opened the file.
5563
5564 @return Return 0 if access is granted, otherwise an appropriate value for
5565 errno should be returned. Suggested failure: EACCES for label mismatch or
5566 EPERM for lack of privilege.
5567*/
5568typedef int mpo_vnode_check_write_t(
5569 kauth_cred_t active_cred,
5570 kauth_cred_t file_cred, /* NULLOK */
5571 struct vnode *vp,
5572 struct label *label
5573);
5574/**
5575 @brief Associate a vnode with a devfs entry
5576 @param mp Devfs mount point
5577 @param mntlabel Devfs mount point label
5578 @param de Devfs directory entry
5579 @param delabel Label associated with de
5580 @param vp vnode associated with de
5581 @param vlabel Label associated with vp
5582
5583 Fill in the label (vlabel) for a newly created devfs vnode. The
5584 label is typically derived from the label on the devfs directory
5585 entry or the label on the filesystem, supplied as parameters.
5586*/
5587typedef void mpo_vnode_label_associate_devfs_t(
5588 struct mount *mp,
5589 struct label *mntlabel,
5590 struct devnode *de,
5591 struct label *delabel,
5592 struct vnode *vp,
5593 struct label *vlabel
5594);
5595/**
5596 @brief Associate a label with a vnode
5597 @param mp File system mount point
5598 @param mntlabel File system mount point label
5599 @param vp Vnode to label
5600 @param vlabel Label associated with vp
5601
5602 Attempt to retrieve label information for the vnode, vp, from the
5603 file system extended attribute store. The label should be stored in
5604 the supplied vlabel parameter. If a policy cannot retrieve an
5605 extended attribute, sometimes it is acceptible to fallback to using
5606 the mntlabel.
5607
5608 If the policy requires vnodes to have a valid label elsewhere it
5609 MUST NOT return other than temporary errors, and must always provide
5610 a valid label of some sort. Returning an error will cause vnode
5611 labeling to be retried at a later access. Failure to handle policy
5612 centric errors internally (corrupt labels etc.) will result in
5613 inaccessible files.
5614
5615 @return In the event of an error, an appropriate value for errno
5616 should be returned, otherwise return 0 upon success.
5617*/
5618typedef int mpo_vnode_label_associate_extattr_t(
5619 struct mount *mp,
5620 struct label *mntlabel,
5621 struct vnode *vp,
5622 struct label *vlabel
5623);
5624/**
5625 @brief Associate a file label with a vnode
5626 @param cred User credential
5627 @param mp Fdesc mount point
5628 @param mntlabel Fdesc mount point label
5629 @param fg Fileglob structure
5630 @param label Policy label for fg
5631 @param vp Vnode to label
5632 @param vlabel Label associated with vp
5633
5634 Associate label information for the vnode, vp, with the label of
5635 the open file descriptor described by fg.
5636 The label should be stored in the supplied vlabel parameter.
5637*/
5638typedef void mpo_vnode_label_associate_file_t(
5639 struct ucred *cred,
5640 struct mount *mp,
5641 struct label *mntlabel,
5642 struct fileglob *fg,
5643 struct label *label,
5644 struct vnode *vp,
5645 struct label *vlabel
5646);
5647/**
5648 @brief Associate a pipe label with a vnode
5649 @param cred User credential for the process that opened the pipe
5650 @param cpipe Pipe structure
5651 @param pipelabel Label associated with pipe
5652 @param vp Vnode to label
5653 @param vlabel Label associated with vp
5654
5655 Associate label information for the vnode, vp, with the label of
5656 the pipe described by the pipe structure cpipe.
5657 The label should be stored in the supplied vlabel parameter.
5658*/
5659typedef void mpo_vnode_label_associate_pipe_t(
5660 struct ucred *cred,
5661 struct pipe *cpipe,
5662 struct label *pipelabel,
5663 struct vnode *vp,
5664 struct label *vlabel
5665);
5666/**
5667 @brief Associate a POSIX semaphore label with a vnode
5668 @param cred User credential for the process that create psem
5669 @param psem POSIX semaphore structure
5670 @param psemlabel Label associated with psem
5671 @param vp Vnode to label
5672 @param vlabel Label associated with vp
5673
5674 Associate label information for the vnode, vp, with the label of
5675 the POSIX semaphore described by psem.
5676 The label should be stored in the supplied vlabel parameter.
5677*/
5678typedef void mpo_vnode_label_associate_posixsem_t(
5679 struct ucred *cred,
5680 struct pseminfo *psem,
5681 struct label *psemlabel,
5682 struct vnode *vp,
5683 struct label *vlabel
5684);
5685/**
5686 @brief Associate a POSIX shared memory label with a vnode
5687 @param cred User credential for the process that created pshm
5688 @param pshm POSIX shared memory structure
5689 @param pshmlabel Label associated with pshm
5690 @param vp Vnode to label
5691 @param vlabel Label associated with vp
5692
5693 Associate label information for the vnode, vp, with the label of
5694 the POSIX shared memory region described by pshm.
5695 The label should be stored in the supplied vlabel parameter.
5696*/
5697typedef void mpo_vnode_label_associate_posixshm_t(
5698 struct ucred *cred,
5699 struct pshminfo *pshm,
5700 struct label *pshmlabel,
5701 struct vnode *vp,
5702 struct label *vlabel
5703);
5704/**
5705 @brief Associate a label with a vnode
5706 @param mp File system mount point
5707 @param mntlabel File system mount point label
5708 @param vp Vnode to label
5709 @param vlabel Label associated with vp
5710
5711 On non-multilabel file systems, set the label for a vnode. The
5712 label will most likely be based on the file system label.
5713*/
5714typedef void mpo_vnode_label_associate_singlelabel_t(
5715 struct mount *mp,
5716 struct label *mntlabel,
5717 struct vnode *vp,
5718 struct label *vlabel
5719);
5720/**
5721 @brief Associate a socket label with a vnode
5722 @param cred User credential for the process that opened the socket
5723 @param so Socket structure
5724 @param solabel Label associated with so
5725 @param vp Vnode to label
5726 @param vlabel Label associated with vp
5727
5728 Associate label information for the vnode, vp, with the label of
5729 the open socket described by the socket structure so.
5730 The label should be stored in the supplied vlabel parameter.
5731*/
5732typedef void mpo_vnode_label_associate_socket_t(
5733 kauth_cred_t cred,
5734 socket_t so,
5735 struct label *solabel,
5736 struct vnode *vp,
5737 struct label *vlabel
5738);
5739/**
5740 @brief Copy a vnode label
5741 @param src Source vnode label
5742 @param dest Destination vnode label
5743
5744 Copy the vnode label information from src to dest. On Darwin, this
5745 is currently only necessary when executing interpreted scripts, but
5746 will later be used if vnode label externalization cannot be an
5747 atomic operation.
5748*/
5749typedef void mpo_vnode_label_copy_t(
5750 struct label *src,
5751 struct label *dest
5752);
5753/**
5754 @brief Destroy vnode label
5755 @param label The label to be destroyed
5756
5757 Destroy a vnode label. Since the object is going out of scope,
5758 policy modules should free any internal storage associated with the
5759 label so that it may be destroyed.
5760*/
5761typedef void mpo_vnode_label_destroy_t(
5762 struct label *label
5763);
5764/**
5765 @brief Externalize a vnode label for auditing
5766 @param label Label to be externalized
5767 @param element_name Name of the label namespace for which labels should be
5768 externalized
5769 @param sb String buffer to be filled with a text representation of the label
5770
5771 Produce an external representation of the label on a vnode suitable for
5772 inclusion in an audit record. An externalized label consists of a text
5773 representation of the label contents that will be added to the audit record
5774 as part of a text token. Policy-agnostic user space tools will display
5775 this externalized version.
5776
5777 @return 0 on success, return non-zero if an error occurs while
5778 externalizing the label data.
5779
5780*/
5781typedef int mpo_vnode_label_externalize_audit_t(
5782 struct label *label,
5783 char *element_name,
5784 struct sbuf *sb
5785);
5786/**
5787 @brief Externalize a vnode label
5788 @param label Label to be externalized
5789 @param element_name Name of the label namespace for which labels should be
5790 externalized
5791 @param sb String buffer to be filled with a text representation of the label
5792
5793 Produce an external representation of the label on a vnode. An
5794 externalized label consists of a text representation of the label
5795 contents that can be used with user applications. Policy-agnostic
5796 user space tools will display this externalized version.
5797
5798 @return 0 on success, return non-zero if an error occurs while
5799 externalizing the label data.
5800
5801*/
5802typedef int mpo_vnode_label_externalize_t(
5803 struct label *label,
5804 char *element_name,
5805 struct sbuf *sb
5806);
5807/**
5808 @brief Initialize vnode label
5809 @param label New label to initialize
5810
5811 Initialize label storage for use with a newly instantiated vnode, or
5812 for temporary storage associated with the copying in or out of a
5813 vnode label. While it is necessary to allocate space for a
5814 kernel-resident vnode label, it is not yet necessary to link this vnode
5815 with persistent label storage facilities, such as extended attributes.
5816 Sleeping is permitted.
5817*/
5818typedef void mpo_vnode_label_init_t(
5819 struct label *label
5820);
5821/**
5822 @brief Internalize a vnode label
5823 @param label Label to be internalized
5824 @param element_name Name of the label namespace for which the label should
5825 be internalized
5826 @param element_data Text data to be internalized
5827
5828 Produce a vnode label from an external representation. An
5829 externalized label consists of a text representation of the label
5830 contents that can be used with user applications. Policy-agnostic
5831 user space tools will forward text version to the kernel for
5832 processing by individual policy modules.
5833
5834 The policy's internalize entry points will be called only if the
5835 policy has registered interest in the label namespace.
5836
5837 @return 0 on success, Otherwise, return non-zero if an error occurs
5838 while internalizing the label data.
5839*/
5840typedef int mpo_vnode_label_internalize_t(
5841 struct label *label,
5842 char *element_name,
5843 char *element_data
5844);
5845/**
5846 @brief Clean up a vnode label
5847 @param label The label to be cleaned for re-use
5848
5849 Clean up a vnode label. Darwin (Tiger, 8.x) allocates vnodes on demand, but
5850 typically never frees them. Before vnodes are placed back on free lists for
5851 re-use, policies can cleanup or overwrite any information present in the label.
5852*/
5853typedef void mpo_vnode_label_recycle_t(
5854 struct label *label
5855);
5856/**
5857 @brief Write a label to a extended attribute
5858 @param cred Subject credential
5859 @param vp The vnode for which the label is being stored
5860 @param vlabel Label associated with vp
5861 @param intlabel The new label to store
5862
5863 Store a new label in the extended attribute corresponding to the
5864 supplied vnode. The policy has already authorized the operation;
5865 this call must be implemented in order to perform the actual
5866 operation.
5867
5868 @return In the event of an error, an appropriate value for errno
5869 should be returned, otherwise return 0 upon success.
5870
5871 @warning XXX After examining the extended attribute implementation on
5872 Apple's future release, this entry point may be changed.
5873*/
5874typedef int mpo_vnode_label_store_t(
5875 kauth_cred_t cred,
5876 struct vnode *vp,
5877 struct label *vlabel,
5878 struct label *intlabel
5879);
5880/**
5881 @brief Update vnode label from extended attributes
5882 @param mp File system mount point
5883 @param mntlabel Mount point label
5884 @param vp Vnode to label
5885 @param vlabel Label associated with vp
5886 @param name Name of the xattr
5887 @see mpo_vnode_check_setextattr_t
5888
5889 When an extended attribute is updated via the Vendor attribute management
5890 functions, the MAC vnode label might also require an update.
5891 Policies should first determine if 'name' matches their xattr label
5892 name. If it does, the kernel is has either replaced or removed the
5893 named extended attribute that was previously associated with the
5894 vnode. Normally labels should only be modified via MAC Framework label
5895 management calls, but sometimes the user space components will directly
5896 modify extended attributes. For example, 'cp', 'tar', etc. manage
5897 extended attributes in userspace, not the kernel.
5898
5899 This entry point is called after the label update has occurred, so
5900 it cannot return a failure. However, the operation is preceded by
5901 the mpo_vnode_check_setextattr() access control check.
5902
5903 If the vnode label needs to be updated the policy should return
5904 a non-zero value. The vnode label will be marked for re-association
5905 by the framework.
5906*/
5907typedef int mpo_vnode_label_update_extattr_t(
5908 struct mount *mp,
5909 struct label *mntlabel,
5910 struct vnode *vp,
5911 struct label *vlabel,
5912 const char *name
5913);
5914/**
5915 @brief Update a vnode label
5916 @param cred Subject credential
5917 @param vp The vnode to relabel
5918 @param vnodelabel Existing vnode label
5919 @param label New label to replace existing label
5920 @see mpo_vnode_check_label_update_t
5921
5922 The subject identified by the credential has previously requested
5923 and was authorized to relabel the vnode; this entry point allows
5924 policies to perform the actual relabel operation. Policies should
5925 update vnodelabel using the label stored in the label parameter.
5926*/
5927typedef void mpo_vnode_label_update_t(
5928 kauth_cred_t cred,
5929 struct vnode *vp,
5930 struct label *vnodelabel,
5931 struct label *label
5932);
39236c6e
A
5933/**
5934 @brief Find deatched signatures for a shared library
5935 @param p file trying to find the signature
5936 @param vp The vnode to relabel
5937 @param offset offset in the macho that the signature is requested for (for fat binaries)
5938 @param label Existing vnode label
5939
5940*/
5941typedef int mpo_vnode_find_sigs_t(
5942 struct proc *p,
5943 struct vnode *vp,
5944 off_t offset,
5945 struct label *label
5946);
2d21ac55
A
5947/**
5948 @brief Create a new vnode, backed by extended attributes
5949 @param cred User credential for the creating process
5950 @param mp File system mount point
5951 @param mntlabel File system mount point label
5952 @param dvp Parent directory vnode
5953 @param dlabel Parent directory vnode label
5954 @param vp Newly created vnode
5955 @param vlabel Label to associate with the new vnode
5956 @param cnp Component name for vp
5957
5958 Write out the label for the newly created vnode, most likely storing
5959 the results in a file system extended attribute. Most policies will
5960 derive the new vnode label using information from a combination
5961 of the subject (user) credential, the file system label, the parent
5962 directory label, and potentially the path name component.
5963
5964 @return If the operation succeeds, store the new label in vlabel and
5965 return 0. Otherwise, return an appropriate errno value.
5966*/
5967typedef int mpo_vnode_notify_create_t(
5968 kauth_cred_t cred,
5969 struct mount *mp,
5970 struct label *mntlabel,
5971 struct vnode *dvp,
5972 struct label *dlabel,
5973 struct vnode *vp,
5974 struct label *vlabel,
5975 struct componentname *cnp
5976);
5977
4b17d6b6
A
5978/**
5979 @brief Inform MAC policies that a vnode has been opened
5980 @param cred User credential for the creating process
5981 @param vp vnode opened
5982 @param label Policy label for the vp
5983 @param acc_mode open(2) access mode used
5984
5985 Inform Mac policies that a vnode have been successfully opened
5986 (passing all MAC polices and DAC).
5987*/
5988typedef void mpo_vnode_notify_open_t(
5989 kauth_cred_t cred,
5990 struct vnode *vp,
5991 struct label *label,
5992 int acc_mode
5993);
5994
6d2010ae
A
5995/**
5996 @brief Inform MAC policies that a vnode has been renamed
5997 @param cred User credential for the renaming process
5998 @param vp Vnode that's being renamed
5999 @param label Policy label for vp
6000 @param dvp Parent directory for the destination
6001 @param dlabel Policy label for dvp
6002 @param cnp Component name for the destination
6003
6004 Inform MAC policies that a vnode has been renamed.
6005 */
6006typedef void mpo_vnode_notify_rename_t(
6007 kauth_cred_t cred,
6008 struct vnode *vp,
6009 struct label *label,
6010 struct vnode *dvp,
6011 struct label *dlabel,
6012 struct componentname *cnp
6013);
6014
39236c6e
A
6015/**
6016 @brief Inform MAC policies that a vnode has been linked
6017 @param cred User credential for the renaming process
6018 @param dvp Parent directory for the destination
6019 @param dlabel Policy label for dvp
6020 @param vp Vnode that's being linked
6021 @param vlabel Policy label for vp
6022 @param cnp Component name for the destination
6023
6024 Inform MAC policies that a vnode has been linked.
6025 */
6026typedef void mpo_vnode_notify_link_t(
6027 kauth_cred_t cred,
6028 struct vnode *dvp,
6029 struct label *dlabel,
6030 struct vnode *vp,
6031 struct label *vlabel,
6032 struct componentname *cnp
6033);
6034
39037602
A
6035/**
6036 @brief Inform MAC policies that an extended attribute has been removed from a vnode
6037 @param cred Subject credential
6038 @param vp Object node
6039 @param label Policy label for vp
6040 @param name Extended attribute name
6041
6042 Inform MAC policies that an extended attribute has been removed from a vnode.
6043*/
6044typedef void mpo_vnode_notify_deleteextattr_t(
6045 kauth_cred_t cred,
6046 struct vnode *vp,
6047 struct label *label,
6048 const char *name
6049);
6050
6051
6052/**
6053 @brief Inform MAC policies that an ACL has been set on a vnode
6054 @param cred Subject credential
6055 @param vp Object node
6056 @param label Policy label for vp
6057 @param acl ACL structure pointer
6058
6059 Inform MAC policies that an ACL has been set on a vnode.
6060*/
6061typedef void mpo_vnode_notify_setacl_t(
6062 kauth_cred_t cred,
6063 struct vnode *vp,
6064 struct label *label,
6065 struct kauth_acl *acl
6066);
6067
6068/**
6069 @brief Inform MAC policies that an attributes have been set on a vnode
6070 @param cred Subject credential
6071 @param vp Object vnode
6072 @param label Policy label for vp
6073 @param alist List of attributes to set
6074
6075 Inform MAC policies that an attributes have been set on a vnode.
6076*/
6077typedef void mpo_vnode_notify_setattrlist_t(
6078 kauth_cred_t cred,
6079 struct vnode *vp,
6080 struct label *label,
6081 struct attrlist *alist
6082);
6083
6084/**
6085 @brief Inform MAC policies that an extended attribute has been set on a vnode
6086 @param cred Subject credential
6087 @param vp Object vnode
6088 @param label Policy label for vp
6089 @param name Extended attribute name
6090 @param uio I/O structure pointer
6091
6092 Inform MAC policies that an extended attribute has been set on a vnode.
6093*/
6094typedef void mpo_vnode_notify_setextattr_t(
6095 kauth_cred_t cred,
6096 struct vnode *vp,
6097 struct label *label,
6098 const char *name,
6099 struct uio *uio
6100);
6101
6102/**
6103 @brief Inform MAC policies that flags have been set on a vnode
6104 @param cred Subject credential
6105 @param vp Object vnode
6106 @param label Policy label for vp
6107 @param flags File flags; see chflags(2)
6108
6109 Inform MAC policies that flags have been set on a vnode.
6110*/
6111typedef void mpo_vnode_notify_setflags_t(
6112 kauth_cred_t cred,
6113 struct vnode *vp,
6114 struct label *label,
6115 u_long flags
6116);
6117
6118/**
6119 @brief Inform MAC policies that a new mode has been set on a vnode
6120 @param cred Subject credential
6121 @param vp Object vnode
6122 @param label Policy label for vp
6123 @param mode File mode; see chmod(2)
6124
6125 Inform MAC policies that a new mode has been set on a vnode.
6126*/
6127typedef void mpo_vnode_notify_setmode_t(
6128 kauth_cred_t cred,
6129 struct vnode *vp,
6130 struct label *label,
6131 mode_t mode
6132);
6133
6134/**
6135 @brief Inform MAC policies that new uid/gid have been set on a vnode
6136 @param cred Subject credential
6137 @param vp Object vnode
6138 @param label Policy label for vp
6139 @param uid User ID
6140 @param gid Group ID
6141
6142 Inform MAC policies that new uid/gid have been set on a vnode.
6143*/
6144typedef void mpo_vnode_notify_setowner_t(
6145 kauth_cred_t cred,
6146 struct vnode *vp,
6147 struct label *label,
6148 uid_t uid,
6149 gid_t gid
6150);
6151
6152/**
6153 @brief Inform MAC policies that new timestamps have been set on a vnode
6154 @param cred Subject credential
6155 @param vp Object vnode
6156 @param label Policy label for vp
6157 @param atime Access time; see utimes(2)
6158 @param mtime Modification time; see utimes(2)
6159
6160 Inform MAC policies that new timestamps have been set on a vnode.
6161*/
6162typedef void mpo_vnode_notify_setutimes_t(
6163 kauth_cred_t cred,
6164 struct vnode *vp,
6165 struct label *label,
6166 struct timespec atime,
6167 struct timespec mtime
6168);
6169
6170/**
6171 @brief Inform MAC policies that a vnode has been truncated
6172 @param cred Subject credential
6173 @param file_cred Credential associated with the struct fileproc
6174 @param vp Object vnode
6175 @param label Policy label for vp
6176
6177 Inform MAC policies that a vnode has been truncated.
6178*/
6179typedef void mpo_vnode_notify_truncate_t(
6180 kauth_cred_t cred,
6181 kauth_cred_t file_cred,
6182 struct vnode *vp,
6183 struct label *label
6184);
6185
6186
39236c6e
A
6187/**
6188 @brief Inform MAC policies that a pty slave has been granted
6189 @param p Responsible process
6190 @param tp tty data structure
6191 @param dev Major and minor numbers of device
6192 @param label Policy label for tp
6193
6194 Inform MAC policies that a pty slave has been granted.
6195*/
6196typedef void mpo_pty_notify_grant_t(
6197 proc_t p,
6198 struct tty *tp,
6199 dev_t dev,
6200 struct label *label
6201);
6202
6203/**
6204 @brief Inform MAC policies that a pty master has been closed
6205 @param p Responsible process
6206 @param tp tty data structure
6207 @param dev Major and minor numbers of device
6208 @param label Policy label for tp
6209
6210 Inform MAC policies that a pty master has been closed.
6211*/
6212typedef void mpo_pty_notify_close_t(
6213 proc_t p,
6214 struct tty *tp,
6215 dev_t dev,
6216 struct label *label
6217);
6218
6219/**
6220 @brief Access control check for kext loading
6221 @param cred Subject credential
6222 @param identifier Kext identifier
6223
6224 Determine whether the subject identified by the credential can load the
6225 specified kext.
6226
6227 @return Return 0 if access is granted, otherwise an appropriate value for
6228 errno should be returned. Suggested failure: EPERM for lack of privilege.
6229*/
6230typedef int mpo_kext_check_load_t(
6231 kauth_cred_t cred,
6232 const char *identifier
6233);
6234
6235/**
6236 @brief Access control check for kext unloading
6237 @param cred Subject credential
6238 @param identifier Kext identifier
6239
6240 Determine whether the subject identified by the credential can unload the
6241 specified kext.
6242
6243 @return Return 0 if access is granted, otherwise an appropriate value for
6244 errno should be returned. Suggested failure: EPERM for lack of privilege.
6245*/
6246typedef int mpo_kext_check_unload_t(
6247 kauth_cred_t cred,
6248 const char *identifier
6249);
6250
3e170ce0
A
6251/**
6252 @brief Access control check for querying information about loaded kexts
6253 @param cred Subject credential
6254
6255 Determine whether the subject identified by the credential can query
6256 information about loaded kexts.
6257
6258 @return Return 0 if access is granted, otherwise an appropriate value for
6259 errno should be returned. Suggested failure: EPERM for lack of privilege.
6260*/
6261typedef int mpo_kext_check_query_t(
6262 kauth_cred_t cred
6263);
6264
6265/**
6266 @brief Access control check for getting NVRAM variables.
6267 @param cred Subject credential
6268 @param name NVRAM variable to get
6269
6270 Determine whether the subject identifier by the credential can get the
6271 value of the named NVRAM variable.
6272
6273 @return Return 0 if access is granted, otherwise an appropriate value for
6274 errno should be returned. Suggested failure: EPERM for lack of privilege.
6275*/
6276typedef int mpo_iokit_check_nvram_get_t(
6277 kauth_cred_t cred,
6278 const char *name
6279);
6280
6281/**
6282 @brief Access control check for setting NVRAM variables.
6283 @param cred Subject credential
6284 @param name NVRAM variable to set
6285 @param value The new value for the NVRAM variable
6286
6287 Determine whether the subject identifier by the credential can set the
6288 value of the named NVRAM variable.
6289
6290 @return Return 0 if access is granted, otherwise an appropriate value for
6291 errno should be returned. Suggested failure: EPERM for lack of privilege.
6292*/
6293typedef int mpo_iokit_check_nvram_set_t(
6294 kauth_cred_t cred,
6295 const char *name,
6296 io_object_t value
6297);
6298
6299/**
6300 @brief Access control check for deleting NVRAM variables.
6301 @param cred Subject credential
6302 @param name NVRAM variable to delete
6303
6304 Determine whether the subject identifier by the credential can delete the
6305 named NVRAM variable.
6306
6307 @return Return 0 if access is granted, otherwise an appropriate value for
6308 errno should be returned. Suggested failure: EPERM for lack of privilege.
6309*/
6310typedef int mpo_iokit_check_nvram_delete_t(
6311 kauth_cred_t cred,
6312 const char *name
6313);
6314
2d21ac55
A
6315/*
6316 * Placeholder for future events that may need mac hooks.
6317 */
6318typedef void mpo_reserved_hook_t(void);
6319
39236c6e
A
6320/*
6321 * Policy module operations.
6322 *
6323 * Please note that this should be kept in sync with the check assumptions
6324 * policy in bsd/kern/policy_check.c (policy_ops struct).
6325 */
527f9951 6326#define MAC_POLICY_OPS_VERSION 53 /* inc when new reserved slots are taken */
2d21ac55
A
6327struct mac_policy_ops {
6328 mpo_audit_check_postselect_t *mpo_audit_check_postselect;
6329 mpo_audit_check_preselect_t *mpo_audit_check_preselect;
39236c6e 6330
2d21ac55
A
6331 mpo_bpfdesc_label_associate_t *mpo_bpfdesc_label_associate;
6332 mpo_bpfdesc_label_destroy_t *mpo_bpfdesc_label_destroy;
6333 mpo_bpfdesc_label_init_t *mpo_bpfdesc_label_init;
6334 mpo_bpfdesc_check_receive_t *mpo_bpfdesc_check_receive;
39236c6e 6335
2d21ac55
A
6336 mpo_cred_check_label_update_execve_t *mpo_cred_check_label_update_execve;
6337 mpo_cred_check_label_update_t *mpo_cred_check_label_update;
6338 mpo_cred_check_visible_t *mpo_cred_check_visible;
6339 mpo_cred_label_associate_fork_t *mpo_cred_label_associate_fork;
6340 mpo_cred_label_associate_kernel_t *mpo_cred_label_associate_kernel;
6341 mpo_cred_label_associate_t *mpo_cred_label_associate;
6342 mpo_cred_label_associate_user_t *mpo_cred_label_associate_user;
6343 mpo_cred_label_destroy_t *mpo_cred_label_destroy;
6344 mpo_cred_label_externalize_audit_t *mpo_cred_label_externalize_audit;
6345 mpo_cred_label_externalize_t *mpo_cred_label_externalize;
6346 mpo_cred_label_init_t *mpo_cred_label_init;
6347 mpo_cred_label_internalize_t *mpo_cred_label_internalize;
6348 mpo_cred_label_update_execve_t *mpo_cred_label_update_execve;
6349 mpo_cred_label_update_t *mpo_cred_label_update;
39236c6e 6350
2d21ac55
A
6351 mpo_devfs_label_associate_device_t *mpo_devfs_label_associate_device;
6352 mpo_devfs_label_associate_directory_t *mpo_devfs_label_associate_directory;
6353 mpo_devfs_label_copy_t *mpo_devfs_label_copy;
6354 mpo_devfs_label_destroy_t *mpo_devfs_label_destroy;
6355 mpo_devfs_label_init_t *mpo_devfs_label_init;
6356 mpo_devfs_label_update_t *mpo_devfs_label_update;
39236c6e 6357
2d21ac55
A
6358 mpo_file_check_change_offset_t *mpo_file_check_change_offset;
6359 mpo_file_check_create_t *mpo_file_check_create;
6360 mpo_file_check_dup_t *mpo_file_check_dup;
6361 mpo_file_check_fcntl_t *mpo_file_check_fcntl;
6362 mpo_file_check_get_offset_t *mpo_file_check_get_offset;
6363 mpo_file_check_get_t *mpo_file_check_get;
6364 mpo_file_check_inherit_t *mpo_file_check_inherit;
6365 mpo_file_check_ioctl_t *mpo_file_check_ioctl;
6366 mpo_file_check_lock_t *mpo_file_check_lock;
6367 mpo_file_check_mmap_downgrade_t *mpo_file_check_mmap_downgrade;
6368 mpo_file_check_mmap_t *mpo_file_check_mmap;
6369 mpo_file_check_receive_t *mpo_file_check_receive;
6370 mpo_file_check_set_t *mpo_file_check_set;
6371 mpo_file_label_init_t *mpo_file_label_init;
6372 mpo_file_label_destroy_t *mpo_file_label_destroy;
6373 mpo_file_label_associate_t *mpo_file_label_associate;
39236c6e 6374
2d21ac55
A
6375 mpo_ifnet_check_label_update_t *mpo_ifnet_check_label_update;
6376 mpo_ifnet_check_transmit_t *mpo_ifnet_check_transmit;
6377 mpo_ifnet_label_associate_t *mpo_ifnet_label_associate;
6378 mpo_ifnet_label_copy_t *mpo_ifnet_label_copy;
6379 mpo_ifnet_label_destroy_t *mpo_ifnet_label_destroy;
6380 mpo_ifnet_label_externalize_t *mpo_ifnet_label_externalize;
6381 mpo_ifnet_label_init_t *mpo_ifnet_label_init;
6382 mpo_ifnet_label_internalize_t *mpo_ifnet_label_internalize;
6383 mpo_ifnet_label_update_t *mpo_ifnet_label_update;
6384 mpo_ifnet_label_recycle_t *mpo_ifnet_label_recycle;
39236c6e 6385
2d21ac55
A
6386 mpo_inpcb_check_deliver_t *mpo_inpcb_check_deliver;
6387 mpo_inpcb_label_associate_t *mpo_inpcb_label_associate;
6388 mpo_inpcb_label_destroy_t *mpo_inpcb_label_destroy;
6389 mpo_inpcb_label_init_t *mpo_inpcb_label_init;
6390 mpo_inpcb_label_recycle_t *mpo_inpcb_label_recycle;
6391 mpo_inpcb_label_update_t *mpo_inpcb_label_update;
39236c6e 6392
2d21ac55 6393 mpo_iokit_check_device_t *mpo_iokit_check_device;
39236c6e 6394
2d21ac55
A
6395 mpo_ipq_label_associate_t *mpo_ipq_label_associate;
6396 mpo_ipq_label_compare_t *mpo_ipq_label_compare;
6397 mpo_ipq_label_destroy_t *mpo_ipq_label_destroy;
6398 mpo_ipq_label_init_t *mpo_ipq_label_init;
6399 mpo_ipq_label_update_t *mpo_ipq_label_update;
39236c6e 6400
39037602
A
6401 mpo_file_check_library_validation_t *mpo_file_check_library_validation;
6402 mpo_vnode_notify_setacl_t *mpo_vnode_notify_setacl;
6403 mpo_vnode_notify_setattrlist_t *mpo_vnode_notify_setattrlist;
6404 mpo_vnode_notify_setextattr_t *mpo_vnode_notify_setextattr;
6405 mpo_vnode_notify_setflags_t *mpo_vnode_notify_setflags;
6406 mpo_vnode_notify_setmode_t *mpo_vnode_notify_setmode;
6407 mpo_vnode_notify_setowner_t *mpo_vnode_notify_setowner;
6408 mpo_vnode_notify_setutimes_t *mpo_vnode_notify_setutimes;
6409 mpo_vnode_notify_truncate_t *mpo_vnode_notify_truncate;
39236c6e 6410
2d21ac55
A
6411 mpo_mbuf_label_associate_bpfdesc_t *mpo_mbuf_label_associate_bpfdesc;
6412 mpo_mbuf_label_associate_ifnet_t *mpo_mbuf_label_associate_ifnet;
6413 mpo_mbuf_label_associate_inpcb_t *mpo_mbuf_label_associate_inpcb;
6414 mpo_mbuf_label_associate_ipq_t *mpo_mbuf_label_associate_ipq;
6415 mpo_mbuf_label_associate_linklayer_t *mpo_mbuf_label_associate_linklayer;
6416 mpo_mbuf_label_associate_multicast_encap_t *mpo_mbuf_label_associate_multicast_encap;
6417 mpo_mbuf_label_associate_netlayer_t *mpo_mbuf_label_associate_netlayer;
6418 mpo_mbuf_label_associate_socket_t *mpo_mbuf_label_associate_socket;
6419 mpo_mbuf_label_copy_t *mpo_mbuf_label_copy;
6420 mpo_mbuf_label_destroy_t *mpo_mbuf_label_destroy;
6421 mpo_mbuf_label_init_t *mpo_mbuf_label_init;
39236c6e 6422
2d21ac55
A
6423 mpo_mount_check_fsctl_t *mpo_mount_check_fsctl;
6424 mpo_mount_check_getattr_t *mpo_mount_check_getattr;
6425 mpo_mount_check_label_update_t *mpo_mount_check_label_update;
6426 mpo_mount_check_mount_t *mpo_mount_check_mount;
6427 mpo_mount_check_remount_t *mpo_mount_check_remount;
6428 mpo_mount_check_setattr_t *mpo_mount_check_setattr;
6429 mpo_mount_check_stat_t *mpo_mount_check_stat;
6430 mpo_mount_check_umount_t *mpo_mount_check_umount;
6431 mpo_mount_label_associate_t *mpo_mount_label_associate;
6432 mpo_mount_label_destroy_t *mpo_mount_label_destroy;
6433 mpo_mount_label_externalize_t *mpo_mount_label_externalize;
6434 mpo_mount_label_init_t *mpo_mount_label_init;
6435 mpo_mount_label_internalize_t *mpo_mount_label_internalize;
39236c6e 6436
2d21ac55
A
6437 mpo_netinet_fragment_t *mpo_netinet_fragment;
6438 mpo_netinet_icmp_reply_t *mpo_netinet_icmp_reply;
6439 mpo_netinet_tcp_reply_t *mpo_netinet_tcp_reply;
39236c6e 6440
2d21ac55
A
6441 mpo_pipe_check_ioctl_t *mpo_pipe_check_ioctl;
6442 mpo_pipe_check_kqfilter_t *mpo_pipe_check_kqfilter;
6443 mpo_pipe_check_label_update_t *mpo_pipe_check_label_update;
6444 mpo_pipe_check_read_t *mpo_pipe_check_read;
6445 mpo_pipe_check_select_t *mpo_pipe_check_select;
6446 mpo_pipe_check_stat_t *mpo_pipe_check_stat;
6447 mpo_pipe_check_write_t *mpo_pipe_check_write;
6448 mpo_pipe_label_associate_t *mpo_pipe_label_associate;
6449 mpo_pipe_label_copy_t *mpo_pipe_label_copy;
6450 mpo_pipe_label_destroy_t *mpo_pipe_label_destroy;
6451 mpo_pipe_label_externalize_t *mpo_pipe_label_externalize;
6452 mpo_pipe_label_init_t *mpo_pipe_label_init;
6453 mpo_pipe_label_internalize_t *mpo_pipe_label_internalize;
6454 mpo_pipe_label_update_t *mpo_pipe_label_update;
39236c6e 6455
2d21ac55
A
6456 mpo_policy_destroy_t *mpo_policy_destroy;
6457 mpo_policy_init_t *mpo_policy_init;
6458 mpo_policy_initbsd_t *mpo_policy_initbsd;
6459 mpo_policy_syscall_t *mpo_policy_syscall;
39236c6e 6460
fe8ab488
A
6461 mpo_system_check_sysctlbyname_t *mpo_system_check_sysctlbyname;
6462 mpo_proc_check_inherit_ipc_ports_t *mpo_proc_check_inherit_ipc_ports;
6463 mpo_vnode_check_rename_t *mpo_vnode_check_rename;
3e170ce0
A
6464 mpo_kext_check_query_t *mpo_kext_check_query;
6465 mpo_iokit_check_nvram_get_t *mpo_iokit_check_nvram_get;
6466 mpo_iokit_check_nvram_set_t *mpo_iokit_check_nvram_set;
6467 mpo_iokit_check_nvram_delete_t *mpo_iokit_check_nvram_delete;
6468 mpo_proc_check_expose_task_t *mpo_proc_check_expose_task;
6469 mpo_proc_check_set_host_special_port_t *mpo_proc_check_set_host_special_port;
6470 mpo_proc_check_set_host_exception_port_t *mpo_proc_check_set_host_exception_port;
39037602
A
6471 mpo_exc_action_check_exception_send_t *mpo_exc_action_check_exception_send;
6472 mpo_exc_action_label_associate_t *mpo_exc_action_label_associate;
5ba3f43e 6473 mpo_exc_action_label_populate_t *mpo_exc_action_label_populate;
743345f9
A
6474 mpo_exc_action_label_destroy_t *mpo_exc_action_label_destroy;
6475 mpo_exc_action_label_init_t *mpo_exc_action_label_init;
6476 mpo_exc_action_label_update_t *mpo_exc_action_label_update;
6477
527f9951 6478 mpo_vnode_check_trigger_resolve_t *mpo_vnode_check_trigger_resolve;
743345f9
A
6479 mpo_reserved_hook_t *mpo_reserved1;
6480 mpo_reserved_hook_t *mpo_reserved2;
6481 mpo_reserved_hook_t *mpo_reserved3;
5ba3f43e
A
6482 mpo_skywalk_flow_check_connect_t *mpo_skywalk_flow_check_connect;
6483 mpo_skywalk_flow_check_listen_t *mpo_skywalk_flow_check_listen;
39236c6e 6484
2d21ac55
A
6485 mpo_posixsem_check_create_t *mpo_posixsem_check_create;
6486 mpo_posixsem_check_open_t *mpo_posixsem_check_open;
6487 mpo_posixsem_check_post_t *mpo_posixsem_check_post;
6488 mpo_posixsem_check_unlink_t *mpo_posixsem_check_unlink;
6489 mpo_posixsem_check_wait_t *mpo_posixsem_check_wait;
6490 mpo_posixsem_label_associate_t *mpo_posixsem_label_associate;
6491 mpo_posixsem_label_destroy_t *mpo_posixsem_label_destroy;
6492 mpo_posixsem_label_init_t *mpo_posixsem_label_init;
6493 mpo_posixshm_check_create_t *mpo_posixshm_check_create;
6494 mpo_posixshm_check_mmap_t *mpo_posixshm_check_mmap;
6495 mpo_posixshm_check_open_t *mpo_posixshm_check_open;
6496 mpo_posixshm_check_stat_t *mpo_posixshm_check_stat;
6497 mpo_posixshm_check_truncate_t *mpo_posixshm_check_truncate;
6498 mpo_posixshm_check_unlink_t *mpo_posixshm_check_unlink;
6499 mpo_posixshm_label_associate_t *mpo_posixshm_label_associate;
6500 mpo_posixshm_label_destroy_t *mpo_posixshm_label_destroy;
6501 mpo_posixshm_label_init_t *mpo_posixshm_label_init;
39236c6e 6502
2d21ac55
A
6503 mpo_proc_check_debug_t *mpo_proc_check_debug;
6504 mpo_proc_check_fork_t *mpo_proc_check_fork;
6505 mpo_proc_check_get_task_name_t *mpo_proc_check_get_task_name;
6506 mpo_proc_check_get_task_t *mpo_proc_check_get_task;
6507 mpo_proc_check_getaudit_t *mpo_proc_check_getaudit;
6508 mpo_proc_check_getauid_t *mpo_proc_check_getauid;
6509 mpo_proc_check_getlcid_t *mpo_proc_check_getlcid;
6510 mpo_proc_check_mprotect_t *mpo_proc_check_mprotect;
6511 mpo_proc_check_sched_t *mpo_proc_check_sched;
6512 mpo_proc_check_setaudit_t *mpo_proc_check_setaudit;
6513 mpo_proc_check_setauid_t *mpo_proc_check_setauid;
6514 mpo_proc_check_setlcid_t *mpo_proc_check_setlcid;
6515 mpo_proc_check_signal_t *mpo_proc_check_signal;
6516 mpo_proc_check_wait_t *mpo_proc_check_wait;
6517 mpo_proc_label_destroy_t *mpo_proc_label_destroy;
6518 mpo_proc_label_init_t *mpo_proc_label_init;
39236c6e 6519
2d21ac55
A
6520 mpo_socket_check_accept_t *mpo_socket_check_accept;
6521 mpo_socket_check_accepted_t *mpo_socket_check_accepted;
6522 mpo_socket_check_bind_t *mpo_socket_check_bind;
6523 mpo_socket_check_connect_t *mpo_socket_check_connect;
6524 mpo_socket_check_create_t *mpo_socket_check_create;
6525 mpo_socket_check_deliver_t *mpo_socket_check_deliver;
6526 mpo_socket_check_kqfilter_t *mpo_socket_check_kqfilter;
6527 mpo_socket_check_label_update_t *mpo_socket_check_label_update;
6528 mpo_socket_check_listen_t *mpo_socket_check_listen;
6529 mpo_socket_check_receive_t *mpo_socket_check_receive;
6530 mpo_socket_check_received_t *mpo_socket_check_received;
6531 mpo_socket_check_select_t *mpo_socket_check_select;
6532 mpo_socket_check_send_t *mpo_socket_check_send;
6533 mpo_socket_check_stat_t *mpo_socket_check_stat;
6534 mpo_socket_check_setsockopt_t *mpo_socket_check_setsockopt;
6535 mpo_socket_check_getsockopt_t *mpo_socket_check_getsockopt;
6536 mpo_socket_label_associate_accept_t *mpo_socket_label_associate_accept;
6537 mpo_socket_label_associate_t *mpo_socket_label_associate;
6538 mpo_socket_label_copy_t *mpo_socket_label_copy;
6539 mpo_socket_label_destroy_t *mpo_socket_label_destroy;
6540 mpo_socket_label_externalize_t *mpo_socket_label_externalize;
6541 mpo_socket_label_init_t *mpo_socket_label_init;
6542 mpo_socket_label_internalize_t *mpo_socket_label_internalize;
6543 mpo_socket_label_update_t *mpo_socket_label_update;
39236c6e 6544
2d21ac55
A
6545 mpo_socketpeer_label_associate_mbuf_t *mpo_socketpeer_label_associate_mbuf;
6546 mpo_socketpeer_label_associate_socket_t *mpo_socketpeer_label_associate_socket;
6547 mpo_socketpeer_label_destroy_t *mpo_socketpeer_label_destroy;
6548 mpo_socketpeer_label_externalize_t *mpo_socketpeer_label_externalize;
6549 mpo_socketpeer_label_init_t *mpo_socketpeer_label_init;
39236c6e 6550
2d21ac55
A
6551 mpo_system_check_acct_t *mpo_system_check_acct;
6552 mpo_system_check_audit_t *mpo_system_check_audit;
6553 mpo_system_check_auditctl_t *mpo_system_check_auditctl;
6554 mpo_system_check_auditon_t *mpo_system_check_auditon;
6555 mpo_system_check_host_priv_t *mpo_system_check_host_priv;
6556 mpo_system_check_nfsd_t *mpo_system_check_nfsd;
6557 mpo_system_check_reboot_t *mpo_system_check_reboot;
6558 mpo_system_check_settime_t *mpo_system_check_settime;
6559 mpo_system_check_swapoff_t *mpo_system_check_swapoff;
6560 mpo_system_check_swapon_t *mpo_system_check_swapon;
5ba3f43e 6561 mpo_socket_check_ioctl_t *mpo_socket_check_ioctl;
39236c6e 6562
2d21ac55
A
6563 mpo_sysvmsg_label_associate_t *mpo_sysvmsg_label_associate;
6564 mpo_sysvmsg_label_destroy_t *mpo_sysvmsg_label_destroy;
6565 mpo_sysvmsg_label_init_t *mpo_sysvmsg_label_init;
6566 mpo_sysvmsg_label_recycle_t *mpo_sysvmsg_label_recycle;
6567 mpo_sysvmsq_check_enqueue_t *mpo_sysvmsq_check_enqueue;
6568 mpo_sysvmsq_check_msgrcv_t *mpo_sysvmsq_check_msgrcv;
6569 mpo_sysvmsq_check_msgrmid_t *mpo_sysvmsq_check_msgrmid;
6570 mpo_sysvmsq_check_msqctl_t *mpo_sysvmsq_check_msqctl;
6571 mpo_sysvmsq_check_msqget_t *mpo_sysvmsq_check_msqget;
6572 mpo_sysvmsq_check_msqrcv_t *mpo_sysvmsq_check_msqrcv;
6573 mpo_sysvmsq_check_msqsnd_t *mpo_sysvmsq_check_msqsnd;
6574 mpo_sysvmsq_label_associate_t *mpo_sysvmsq_label_associate;
6575 mpo_sysvmsq_label_destroy_t *mpo_sysvmsq_label_destroy;
6576 mpo_sysvmsq_label_init_t *mpo_sysvmsq_label_init;
6577 mpo_sysvmsq_label_recycle_t *mpo_sysvmsq_label_recycle;
6578 mpo_sysvsem_check_semctl_t *mpo_sysvsem_check_semctl;
6579 mpo_sysvsem_check_semget_t *mpo_sysvsem_check_semget;
6580 mpo_sysvsem_check_semop_t *mpo_sysvsem_check_semop;
6581 mpo_sysvsem_label_associate_t *mpo_sysvsem_label_associate;
6582 mpo_sysvsem_label_destroy_t *mpo_sysvsem_label_destroy;
6583 mpo_sysvsem_label_init_t *mpo_sysvsem_label_init;
6584 mpo_sysvsem_label_recycle_t *mpo_sysvsem_label_recycle;
6585 mpo_sysvshm_check_shmat_t *mpo_sysvshm_check_shmat;
6586 mpo_sysvshm_check_shmctl_t *mpo_sysvshm_check_shmctl;
6587 mpo_sysvshm_check_shmdt_t *mpo_sysvshm_check_shmdt;
6588 mpo_sysvshm_check_shmget_t *mpo_sysvshm_check_shmget;
6589 mpo_sysvshm_label_associate_t *mpo_sysvshm_label_associate;
6590 mpo_sysvshm_label_destroy_t *mpo_sysvshm_label_destroy;
6591 mpo_sysvshm_label_init_t *mpo_sysvshm_label_init;
6592 mpo_sysvshm_label_recycle_t *mpo_sysvshm_label_recycle;
39236c6e 6593
5ba3f43e 6594 mpo_proc_notify_exit_t *mpo_proc_notify_exit;
813fb2f6 6595 mpo_mount_check_snapshot_revert_t *mpo_mount_check_snapshot_revert;
743345f9 6596 mpo_vnode_check_getattr_t *mpo_vnode_check_getattr;
39037602
A
6597 mpo_mount_check_snapshot_create_t *mpo_mount_check_snapshot_create;
6598 mpo_mount_check_snapshot_delete_t *mpo_mount_check_snapshot_delete;
6599 mpo_vnode_check_clone_t *mpo_vnode_check_clone;
7e41aa88
A
6600 mpo_proc_check_get_cs_info_t *mpo_proc_check_get_cs_info;
6601 mpo_proc_check_set_cs_info_t *mpo_proc_check_set_cs_info;
39236c6e
A
6602
6603 mpo_iokit_check_hid_control_t *mpo_iokit_check_hid_control;
6604
2d21ac55
A
6605 mpo_vnode_check_access_t *mpo_vnode_check_access;
6606 mpo_vnode_check_chdir_t *mpo_vnode_check_chdir;
6607 mpo_vnode_check_chroot_t *mpo_vnode_check_chroot;
6608 mpo_vnode_check_create_t *mpo_vnode_check_create;
6609 mpo_vnode_check_deleteextattr_t *mpo_vnode_check_deleteextattr;
6610 mpo_vnode_check_exchangedata_t *mpo_vnode_check_exchangedata;
6611 mpo_vnode_check_exec_t *mpo_vnode_check_exec;
6612 mpo_vnode_check_getattrlist_t *mpo_vnode_check_getattrlist;
6613 mpo_vnode_check_getextattr_t *mpo_vnode_check_getextattr;
6614 mpo_vnode_check_ioctl_t *mpo_vnode_check_ioctl;
6615 mpo_vnode_check_kqfilter_t *mpo_vnode_check_kqfilter;
6616 mpo_vnode_check_label_update_t *mpo_vnode_check_label_update;
6617 mpo_vnode_check_link_t *mpo_vnode_check_link;
6618 mpo_vnode_check_listextattr_t *mpo_vnode_check_listextattr;
6619 mpo_vnode_check_lookup_t *mpo_vnode_check_lookup;
6620 mpo_vnode_check_open_t *mpo_vnode_check_open;
6621 mpo_vnode_check_read_t *mpo_vnode_check_read;
6622 mpo_vnode_check_readdir_t *mpo_vnode_check_readdir;
6623 mpo_vnode_check_readlink_t *mpo_vnode_check_readlink;
6624 mpo_vnode_check_rename_from_t *mpo_vnode_check_rename_from;
6625 mpo_vnode_check_rename_to_t *mpo_vnode_check_rename_to;
6626 mpo_vnode_check_revoke_t *mpo_vnode_check_revoke;
6627 mpo_vnode_check_select_t *mpo_vnode_check_select;
6628 mpo_vnode_check_setattrlist_t *mpo_vnode_check_setattrlist;
6629 mpo_vnode_check_setextattr_t *mpo_vnode_check_setextattr;
6630 mpo_vnode_check_setflags_t *mpo_vnode_check_setflags;
6631 mpo_vnode_check_setmode_t *mpo_vnode_check_setmode;
6632 mpo_vnode_check_setowner_t *mpo_vnode_check_setowner;
6633 mpo_vnode_check_setutimes_t *mpo_vnode_check_setutimes;
6634 mpo_vnode_check_stat_t *mpo_vnode_check_stat;
6635 mpo_vnode_check_truncate_t *mpo_vnode_check_truncate;
6636 mpo_vnode_check_unlink_t *mpo_vnode_check_unlink;
6637 mpo_vnode_check_write_t *mpo_vnode_check_write;
6638 mpo_vnode_label_associate_devfs_t *mpo_vnode_label_associate_devfs;
6639 mpo_vnode_label_associate_extattr_t *mpo_vnode_label_associate_extattr;
6640 mpo_vnode_label_associate_file_t *mpo_vnode_label_associate_file;
6641 mpo_vnode_label_associate_pipe_t *mpo_vnode_label_associate_pipe;
6642 mpo_vnode_label_associate_posixsem_t *mpo_vnode_label_associate_posixsem;
6643 mpo_vnode_label_associate_posixshm_t *mpo_vnode_label_associate_posixshm;
6644 mpo_vnode_label_associate_singlelabel_t *mpo_vnode_label_associate_singlelabel;
6645 mpo_vnode_label_associate_socket_t *mpo_vnode_label_associate_socket;
6646 mpo_vnode_label_copy_t *mpo_vnode_label_copy;
6647 mpo_vnode_label_destroy_t *mpo_vnode_label_destroy;
6648 mpo_vnode_label_externalize_audit_t *mpo_vnode_label_externalize_audit;
6649 mpo_vnode_label_externalize_t *mpo_vnode_label_externalize;
6650 mpo_vnode_label_init_t *mpo_vnode_label_init;
6651 mpo_vnode_label_internalize_t *mpo_vnode_label_internalize;
6652 mpo_vnode_label_recycle_t *mpo_vnode_label_recycle;
6653 mpo_vnode_label_store_t *mpo_vnode_label_store;
6654 mpo_vnode_label_update_extattr_t *mpo_vnode_label_update_extattr;
6655 mpo_vnode_label_update_t *mpo_vnode_label_update;
6656 mpo_vnode_notify_create_t *mpo_vnode_notify_create;
593a1d5f 6657 mpo_vnode_check_signature_t *mpo_vnode_check_signature;
b0d623f7
A
6658 mpo_vnode_check_uipc_bind_t *mpo_vnode_check_uipc_bind;
6659 mpo_vnode_check_uipc_connect_t *mpo_vnode_check_uipc_connect;
39236c6e 6660
3e170ce0 6661 mpo_proc_check_run_cs_invalid_t *mpo_proc_check_run_cs_invalid;
d1ecb069 6662 mpo_proc_check_suspend_resume_t *mpo_proc_check_suspend_resume;
39236c6e 6663
316670eb 6664 mpo_thread_userret_t *mpo_thread_userret;
39236c6e 6665
6d2010ae 6666 mpo_iokit_check_set_properties_t *mpo_iokit_check_set_properties;
39236c6e 6667
6d2010ae 6668 mpo_system_check_chud_t *mpo_system_check_chud;
39236c6e 6669
6d2010ae 6670 mpo_vnode_check_searchfs_t *mpo_vnode_check_searchfs;
39236c6e 6671
6d2010ae
A
6672 mpo_priv_check_t *mpo_priv_check;
6673 mpo_priv_grant_t *mpo_priv_grant;
39236c6e 6674
6d2010ae 6675 mpo_proc_check_map_anon_t *mpo_proc_check_map_anon;
39236c6e 6676
6d2010ae 6677 mpo_vnode_check_fsgetpath_t *mpo_vnode_check_fsgetpath;
39236c6e 6678
6d2010ae 6679 mpo_iokit_check_open_t *mpo_iokit_check_open;
39236c6e 6680
316670eb 6681 mpo_proc_check_ledger_t *mpo_proc_check_ledger;
39236c6e 6682
6d2010ae 6683 mpo_vnode_notify_rename_t *mpo_vnode_notify_rename;
39236c6e 6684
39037602
A
6685 mpo_vnode_check_setacl_t *mpo_vnode_check_setacl;
6686
6687 mpo_vnode_notify_deleteextattr_t *mpo_vnode_notify_deleteextattr;
39236c6e
A
6688
6689 mpo_system_check_kas_info_t *mpo_system_check_kas_info;
6690
5ba3f43e 6691 mpo_vnode_check_lookup_preflight_t *mpo_vnode_check_lookup_preflight;
39236c6e
A
6692
6693 mpo_vnode_notify_open_t *mpo_vnode_notify_open;
6694
6695 mpo_system_check_info_t *mpo_system_check_info;
6696
6697 mpo_pty_notify_grant_t *mpo_pty_notify_grant;
6698 mpo_pty_notify_close_t *mpo_pty_notify_close;
6699
6700 mpo_vnode_find_sigs_t *mpo_vnode_find_sigs;
6701
6702 mpo_kext_check_load_t *mpo_kext_check_load;
6703 mpo_kext_check_unload_t *mpo_kext_check_unload;
6704
6705 mpo_proc_check_proc_info_t *mpo_proc_check_proc_info;
6706 mpo_vnode_notify_link_t *mpo_vnode_notify_link;
fe8ab488
A
6707 mpo_iokit_check_filter_properties_t *mpo_iokit_check_filter_properties;
6708 mpo_iokit_check_get_property_t *mpo_iokit_check_get_property;
2d21ac55
A
6709};
6710
6711/**
6712 @brief MAC policy handle type
6713
6714 The MAC handle is used to uniquely identify a loaded policy within
6715 the MAC Framework.
6716
6717 A variable of this type is set by mac_policy_register().
6718 */
6719typedef unsigned int mac_policy_handle_t;
6720
6721#define mpc_t struct mac_policy_conf *
6722
6723/**
6724 @brief Mac policy configuration
6725
6726 This structure specifies the configuration information for a
6727 MAC policy module. A policy module developer must supply
6728 a short unique policy name, a more descriptive full name, a list of label
6729 namespaces and count, a pointer to the registered enty point operations,
6730 any load time flags, and optionally, a pointer to a label slot identifier.
6731
6732 The Framework will update the runtime flags (mpc_runtime_flags) to
6733 indicate that the module has been registered.
6734
6735 If the label slot identifier (mpc_field_off) is NULL, the Framework
6736 will not provide label storage for the policy. Otherwise, the
6737 Framework will store the label location (slot) in this field.
6738
6739 The mpc_list field is used by the Framework and should not be
6740 modified by policies.
6741*/
6742/* XXX - reorder these for better aligment on 64bit platforms */
6743struct mac_policy_conf {
6744 const char *mpc_name; /** policy name */
6745 const char *mpc_fullname; /** full name */
d190cdc3 6746 char const * const *mpc_labelnames; /** managed label namespaces */
2d21ac55 6747 unsigned int mpc_labelname_count; /** number of managed label namespaces */
5ba3f43e 6748 const struct mac_policy_ops *mpc_ops; /** operation vector */
2d21ac55
A
6749 int mpc_loadtime_flags; /** load time flags */
6750 int *mpc_field_off; /** label slot */
6751 int mpc_runtime_flags; /** run time flags */
6752 mpc_t mpc_list; /** List reference */
6753 void *mpc_data; /** module data */
6754};
6755
6756/**
6757 @brief MAC policy module registration routine
6758
6759 This function is called to register a policy with the
6760 MAC framework. A policy module will typically call this from the
6761 Darwin KEXT registration routine.
6762 */
6763int mac_policy_register(struct mac_policy_conf *mpc,
6764 mac_policy_handle_t *handlep, void *xd);
6765
6766/**
6767 @brief MAC policy module de-registration routine
6768
6769 This function is called to de-register a policy with theD
6770 MAC framework. A policy module will typically call this from the
6771 Darwin KEXT de-registration routine.
6772 */
6773int mac_policy_unregister(mac_policy_handle_t handle);
6774
6775/*
6776 * Framework entry points for the policies to add audit data.
6777 */
6778int mac_audit_text(char *text, mac_policy_handle_t handle);
6779
6780/*
6781 * Calls to assist with use of Apple XATTRs within policy modules.
6782 */
6783int mac_vnop_setxattr(struct vnode *, const char *, char *, size_t);
6784int mac_vnop_getxattr(struct vnode *, const char *, char *, size_t,
6785 size_t *);
6786int mac_vnop_removexattr(struct vnode *, const char *);
6787
39037602
A
6788/**
6789 @brief Set an extended attribute on a vnode-based fileglob.
6790 @param fg fileglob representing file to attach the extended attribute
6791 @param name extended attribute name
6792 @param buf buffer of data to use as the extended attribute value
6793 @param len size of buffer
6794
6795 Sets the value of an extended attribute on a file.
6796
6797 Caller must hold an iocount on the vnode represented by the fileglob.
6798*/
6799int mac_file_setxattr(struct fileglob *fg, const char *name, char *buf, size_t len);
6800
6801/**
6802 @brief Get an extended attribute from a vnode-based fileglob.
6803 @param fg fileglob representing file to read the extended attribute
6804 @param name extended attribute name
6805 @param buf buffer of data to hold the extended attribute value
6806 @param len size of buffer
6807 @param attrlen size of full extended attribute value
6808
6809 Gets the value of an extended attribute on a file.
6810
6811 Caller must hold an iocount on the vnode represented by the fileglob.
6812*/
6813int mac_file_getxattr(struct fileglob *fg, const char *name, char *buf, size_t len,
6814 size_t *attrlen);
6815
6816/**
6817 @brief Remove an extended attribute from a vnode-based fileglob.
6818 @param fg fileglob representing file to remove the extended attribute
6819 @param name extended attribute name
6820
6821 Removes the named extended attribute from the file.
6822
6823 Caller must hold an iocount on the vnode represented by the fileglob.
6824*/
6825int mac_file_removexattr(struct fileglob *fg, const char *name);
6826
6827
2d21ac55
A
6828/*
6829 * Arbitrary limit on how much data will be logged by the audit
6830 * entry points above.
6831 */
6832#define MAC_AUDIT_DATA_LIMIT 1024
6833
6834/*
6835 * Values returned by mac_audit_{pre,post}select. To combine the responses
6836 * of the security policies into a single decision,
6837 * mac_audit_{pre,post}select() choose the greatest value returned.
6838 */
6839#define MAC_AUDIT_DEFAULT 0 /* use system behavior */
6840#define MAC_AUDIT_NO 1 /* force not auditing this event */
6841#define MAC_AUDIT_YES 2 /* force auditing this event */
6842
6843// \defgroup mpc_loadtime_flags Flags for the mpc_loadtime_flags field
6844
6845/**
6846 @name Flags for the mpc_loadtime_flags field
6847 @see mac_policy_conf
6848
6849 This is the complete list of flags that are supported by the
6850 mpc_loadtime_flags field of the mac_policy_conf structure. These
6851 flags specify the load time behavior of MAC Framework policy
6852 modules.
6853*/
6854
6855/*@{*/
6856
6857/**
6858 @brief Flag to indicate registration preference
6859
6860 This flag indicates that the policy module must be loaded and
6861 initialized early in the boot process. If the flag is specified,
6862 attempts to register the module following boot will be rejected. The
6863 flag may be used by policies that require pervasive labeling of all
6864 system objects, and cannot handle objects that have not been
6865 properly initialized by the policy.
6866 */
6867#define MPC_LOADTIME_FLAG_NOTLATE 0x00000001
6868
6869/**
6870 @brief Flag to indicate unload preference
6871
6872 This flag indicates that the policy module may be unloaded. If this
6873 flag is not set, then the policy framework will reject requests to
6874 unload the module. This flag might be used by modules that allocate
6875 label state and are unable to free that state at runtime, or for
6876 modules that simply do not want to permit unload operations.
6877*/
6878#define MPC_LOADTIME_FLAG_UNLOADOK 0x00000002
6879
6880/**
6881 @brief Unsupported
6882
6883 XXX This flag is not yet supported.
6884*/
6885#define MPC_LOADTIME_FLAG_LABELMBUFS 0x00000004
6886
6887/**
6888 @brief Flag to indicate a base policy
6889
6890 This flag indicates that the policy module is a base policy. Only
6891 one module can declare itself as base, otherwise the boot process
6892 will be halted.
6893 */
6894#define MPC_LOADTIME_BASE_POLICY 0x00000008
6895
6896/*@}*/
6897
6898/**
6899 @brief Policy registration flag
6900 @see mac_policy_conf
6901
6902 This flag indicates that the policy module has been successfully
6903 registered with the TrustedBSD MAC Framework. The Framework will
6904 set this flag in the mpc_runtime_flags field of the policy's
6905 mac_policy_conf structure after registering the policy.
6906 */
6907#define MPC_RUNTIME_FLAG_REGISTERED 0x00000001
6908
6909/*
6910 * Depends on POLICY_VER
6911 */
6912
6913#ifndef POLICY_VER
6914#define POLICY_VER 1.0
6915#endif
6916
6917#define MAC_POLICY_SET(handle, mpops, mpname, mpfullname, lnames, lcount, slot, lflags, rflags) \
6918 static struct mac_policy_conf mpname##_mac_policy_conf = { \
6919 .mpc_name = #mpname, \
6920 .mpc_fullname = mpfullname, \
6921 .mpc_labelnames = lnames, \
6922 .mpc_labelname_count = lcount, \
6923 .mpc_ops = mpops, \
6924 .mpc_loadtime_flags = lflags, \
6925 .mpc_field_off = slot, \
6926 .mpc_runtime_flags = rflags \
6927 }; \
6928 \
6929 static kern_return_t \
6930 kmod_start(kmod_info_t *ki, void *xd) \
6931 { \
6932 return mac_policy_register(&mpname##_mac_policy_conf, \
6933 &handle, xd); \
6934 } \
6935 \
6936 static kern_return_t \
6937 kmod_stop(kmod_info_t *ki, void *xd) \
6938 { \
6939 return mac_policy_unregister(handle); \
6940 } \
6941 \
6942 extern kern_return_t _start(kmod_info_t *ki, void *data); \
6943 extern kern_return_t _stop(kmod_info_t *ki, void *data); \
6944 \
6945 KMOD_EXPLICIT_DECL(security.mpname, POLICY_VER, _start, _stop) \
6946 kmod_start_func_t *_realmain = kmod_start; \
6947 kmod_stop_func_t *_antimain = kmod_stop; \
6948 int _kext_apple_cc = __APPLE_CC__
6949
6950
6951#define LABEL_TO_SLOT(l, s) (l)->l_perpolicy[s]
6952
b0d623f7
A
6953/*
6954 * Policy interface to map a struct label pointer to per-policy data.
6955 * Typically, policies wrap this in their own accessor macro that casts an
6956 * intptr_t to a policy-specific data type.
6957 */
6958intptr_t mac_label_get(struct label *l, int slot);
6959void mac_label_set(struct label *l, int slot, intptr_t v);
6960
2d21ac55
A
6961#define mac_get_mpc(h) (mac_policy_list.entries[h].mpc)
6962
6963/**
6964 @name Flags for MAC allocator interfaces
6965
6966 These flags are passed to the Darwin kernel allocator routines to
6967 indicate whether the allocation is permitted to block or not.
6968 Caution should be taken; some operations are not permitted to sleep,
6969 and some types of locks cannot be held when sleeping.
6970 */
6971
6972/*@{*/
6973
6974/**
6975 @brief Allocation operations may block
6976
6977 If memory is not immediately available, the allocation routine
6978 will block (typically sleeping) until memory is available.
6979
6980 @warning Inappropriate use of this flag may cause kernel panics.
6981 */
6982#define MAC_WAITOK 0
6983
6984/**
6985 @brief Allocation operations may not block
6986
6987 Rather than blocking, the allocator may return an error if memory
6988 is not immediately available. This type of allocation will not
6989 sleep, preserving locking semantics.
6990 */
6991#define MAC_NOWAIT 1
6992
6993/*@}*/
6994
6995#endif /* !_SECURITY_MAC_POLICY_H_ */