xref: /xnu-10002.61.3/security/mac_process.c (revision 0f4c859e951fba394238ab619495c4e1d54d0f34)
1*0f4c859eSApple OSS Distributions /*
2*0f4c859eSApple OSS Distributions  * Copyright (c) 2007-2010 Apple Inc. All rights reserved.
3*0f4c859eSApple OSS Distributions  *
4*0f4c859eSApple OSS Distributions  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5*0f4c859eSApple OSS Distributions  *
6*0f4c859eSApple OSS Distributions  * This file contains Original Code and/or Modifications of Original Code
7*0f4c859eSApple OSS Distributions  * as defined in and that are subject to the Apple Public Source License
8*0f4c859eSApple OSS Distributions  * Version 2.0 (the 'License'). You may not use this file except in
9*0f4c859eSApple OSS Distributions  * compliance with the License. The rights granted to you under the License
10*0f4c859eSApple OSS Distributions  * may not be used to create, or enable the creation or redistribution of,
11*0f4c859eSApple OSS Distributions  * unlawful or unlicensed copies of an Apple operating system, or to
12*0f4c859eSApple OSS Distributions  * circumvent, violate, or enable the circumvention or violation of, any
13*0f4c859eSApple OSS Distributions  * terms of an Apple operating system software license agreement.
14*0f4c859eSApple OSS Distributions  *
15*0f4c859eSApple OSS Distributions  * Please obtain a copy of the License at
16*0f4c859eSApple OSS Distributions  * http://www.opensource.apple.com/apsl/ and read it before using this file.
17*0f4c859eSApple OSS Distributions  *
18*0f4c859eSApple OSS Distributions  * The Original Code and all software distributed under the License are
19*0f4c859eSApple OSS Distributions  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20*0f4c859eSApple OSS Distributions  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21*0f4c859eSApple OSS Distributions  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22*0f4c859eSApple OSS Distributions  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23*0f4c859eSApple OSS Distributions  * Please see the License for the specific language governing rights and
24*0f4c859eSApple OSS Distributions  * limitations under the License.
25*0f4c859eSApple OSS Distributions  *
26*0f4c859eSApple OSS Distributions  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27*0f4c859eSApple OSS Distributions  */
28*0f4c859eSApple OSS Distributions 
29*0f4c859eSApple OSS Distributions /*-
30*0f4c859eSApple OSS Distributions  * Copyright (c) 1999, 2000, 2001, 2002 Robert N. M. Watson
31*0f4c859eSApple OSS Distributions  * Copyright (c) 2001 Ilmar S. Habibulin
32*0f4c859eSApple OSS Distributions  * Copyright (c) 2001, 2002, 2003, 2004 Networks Associates Technology, Inc.
33*0f4c859eSApple OSS Distributions  *
34*0f4c859eSApple OSS Distributions  * This software was developed by Robert Watson and Ilmar Habibulin for the
35*0f4c859eSApple OSS Distributions  * TrustedBSD Project.
36*0f4c859eSApple OSS Distributions  *
37*0f4c859eSApple OSS Distributions  * This software was developed for the FreeBSD Project in part by Network
38*0f4c859eSApple OSS Distributions  * Associates Laboratories, the Security Research Division of Network
39*0f4c859eSApple OSS Distributions  * Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035 ("CBOSS"),
40*0f4c859eSApple OSS Distributions  * as part of the DARPA CHATS research program.
41*0f4c859eSApple OSS Distributions  *
42*0f4c859eSApple OSS Distributions  * Redistribution and use in source and binary forms, with or without
43*0f4c859eSApple OSS Distributions  * modification, are permitted provided that the following conditions
44*0f4c859eSApple OSS Distributions  * are met:
45*0f4c859eSApple OSS Distributions  * 1. Redistributions of source code must retain the above copyright
46*0f4c859eSApple OSS Distributions  *    notice, this list of conditions and the following disclaimer.
47*0f4c859eSApple OSS Distributions  * 2. Redistributions in binary form must reproduce the above copyright
48*0f4c859eSApple OSS Distributions  *    notice, this list of conditions and the following disclaimer in the
49*0f4c859eSApple OSS Distributions  *    documentation and/or other materials provided with the distribution.
50*0f4c859eSApple OSS Distributions  *
51*0f4c859eSApple OSS Distributions  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
52*0f4c859eSApple OSS Distributions  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
53*0f4c859eSApple OSS Distributions  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
54*0f4c859eSApple OSS Distributions  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
55*0f4c859eSApple OSS Distributions  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
56*0f4c859eSApple OSS Distributions  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
57*0f4c859eSApple OSS Distributions  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
58*0f4c859eSApple OSS Distributions  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
59*0f4c859eSApple OSS Distributions  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
60*0f4c859eSApple OSS Distributions  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
61*0f4c859eSApple OSS Distributions  * SUCH DAMAGE.
62*0f4c859eSApple OSS Distributions  *
63*0f4c859eSApple OSS Distributions  */
64*0f4c859eSApple OSS Distributions 
65*0f4c859eSApple OSS Distributions #include <string.h>
66*0f4c859eSApple OSS Distributions #include <sys/param.h>
67*0f4c859eSApple OSS Distributions #include <sys/ucred.h>
68*0f4c859eSApple OSS Distributions #include <sys/malloc.h>
69*0f4c859eSApple OSS Distributions #include <sys/sbuf.h>
70*0f4c859eSApple OSS Distributions #include <sys/vnode.h>
71*0f4c859eSApple OSS Distributions #include <sys/proc.h>
72*0f4c859eSApple OSS Distributions #include <sys/proc_internal.h>
73*0f4c859eSApple OSS Distributions #include <sys/kauth.h>
74*0f4c859eSApple OSS Distributions #include <sys/imgact.h>
75*0f4c859eSApple OSS Distributions #include <sys/reason.h>
76*0f4c859eSApple OSS Distributions #include <sys/vnode_internal.h>
77*0f4c859eSApple OSS Distributions #include <mach/mach_types.h>
78*0f4c859eSApple OSS Distributions #include <kern/task.h>
79*0f4c859eSApple OSS Distributions #include <kern/zalloc.h>
80*0f4c859eSApple OSS Distributions 
81*0f4c859eSApple OSS Distributions #include <os/hash.h>
82*0f4c859eSApple OSS Distributions 
83*0f4c859eSApple OSS Distributions #include <security/mac_internal.h>
84*0f4c859eSApple OSS Distributions #include <security/mac_mach_internal.h>
85*0f4c859eSApple OSS Distributions 
86*0f4c859eSApple OSS Distributions #include <bsd/security/audit/audit.h>
87*0f4c859eSApple OSS Distributions 
88*0f4c859eSApple OSS Distributions #include <os/log.h>
89*0f4c859eSApple OSS Distributions #include <kern/cs_blobs.h>
90*0f4c859eSApple OSS Distributions #include <sys/spawn.h>
91*0f4c859eSApple OSS Distributions #include <sys/spawn_internal.h>
92*0f4c859eSApple OSS Distributions 
93*0f4c859eSApple OSS Distributions struct label *
mac_cred_label_alloc(void)94*0f4c859eSApple OSS Distributions mac_cred_label_alloc(void)
95*0f4c859eSApple OSS Distributions {
96*0f4c859eSApple OSS Distributions 	struct label *label;
97*0f4c859eSApple OSS Distributions 
98*0f4c859eSApple OSS Distributions 	label = mac_labelzone_alloc(MAC_WAITOK);
99*0f4c859eSApple OSS Distributions 	if (label == NULL) {
100*0f4c859eSApple OSS Distributions 		return NULL;
101*0f4c859eSApple OSS Distributions 	}
102*0f4c859eSApple OSS Distributions 	MAC_PERFORM(cred_label_init, label);
103*0f4c859eSApple OSS Distributions 	return label;
104*0f4c859eSApple OSS Distributions }
105*0f4c859eSApple OSS Distributions 
106*0f4c859eSApple OSS Distributions void
mac_cred_label_init(struct ucred * cred)107*0f4c859eSApple OSS Distributions mac_cred_label_init(struct ucred *cred)
108*0f4c859eSApple OSS Distributions {
109*0f4c859eSApple OSS Distributions 	cred->cr_label = mac_cred_label_alloc();
110*0f4c859eSApple OSS Distributions }
111*0f4c859eSApple OSS Distributions 
112*0f4c859eSApple OSS Distributions void
mac_cred_label_seal(struct ucred * cred)113*0f4c859eSApple OSS Distributions mac_cred_label_seal(struct ucred *cred)
114*0f4c859eSApple OSS Distributions {
115*0f4c859eSApple OSS Distributions #if DEVELOPMENT || DEBUG
116*0f4c859eSApple OSS Distributions 	struct label **seal = (struct label **)-1;
117*0f4c859eSApple OSS Distributions 
118*0f4c859eSApple OSS Distributions 	zalloc_ro_update_field(ZONE_ID_MAC_LABEL, cred->cr_label, l_owner, &seal);
119*0f4c859eSApple OSS Distributions #else
120*0f4c859eSApple OSS Distributions 	(void)cred;
121*0f4c859eSApple OSS Distributions #endif
122*0f4c859eSApple OSS Distributions }
123*0f4c859eSApple OSS Distributions 
124*0f4c859eSApple OSS Distributions void
mac_cred_label_free(struct label * label)125*0f4c859eSApple OSS Distributions mac_cred_label_free(struct label *label)
126*0f4c859eSApple OSS Distributions {
127*0f4c859eSApple OSS Distributions #if DEVELOPMENT || DEBUG
128*0f4c859eSApple OSS Distributions 	struct label **seal = (struct label **)-1;
129*0f4c859eSApple OSS Distributions 
130*0f4c859eSApple OSS Distributions 	if (label->l_owner == seal) {
131*0f4c859eSApple OSS Distributions 		seal = NULL;
132*0f4c859eSApple OSS Distributions 		zalloc_ro_update_field(ZONE_ID_MAC_LABEL, label, l_owner, &seal);
133*0f4c859eSApple OSS Distributions 	}
134*0f4c859eSApple OSS Distributions #endif
135*0f4c859eSApple OSS Distributions 
136*0f4c859eSApple OSS Distributions 	MAC_PERFORM(cred_label_destroy, label);
137*0f4c859eSApple OSS Distributions 	mac_labelzone_free(label);
138*0f4c859eSApple OSS Distributions }
139*0f4c859eSApple OSS Distributions 
140*0f4c859eSApple OSS Distributions struct label *
mac_cred_label(struct ucred * cred)141*0f4c859eSApple OSS Distributions mac_cred_label(struct ucred *cred)
142*0f4c859eSApple OSS Distributions {
143*0f4c859eSApple OSS Distributions 	return cred->cr_label;
144*0f4c859eSApple OSS Distributions }
145*0f4c859eSApple OSS Distributions 
146*0f4c859eSApple OSS Distributions bool
mac_cred_label_is_equal(const struct label * a,const struct label * b)147*0f4c859eSApple OSS Distributions mac_cred_label_is_equal(const struct label *a, const struct label *b)
148*0f4c859eSApple OSS Distributions {
149*0f4c859eSApple OSS Distributions 	return memcmp(a->l_perpolicy, b->l_perpolicy, sizeof(a->l_perpolicy)) == 0;
150*0f4c859eSApple OSS Distributions }
151*0f4c859eSApple OSS Distributions 
152*0f4c859eSApple OSS Distributions uint32_t
mac_cred_label_hash_update(const struct label * a,uint32_t hash)153*0f4c859eSApple OSS Distributions mac_cred_label_hash_update(const struct label *a, uint32_t hash)
154*0f4c859eSApple OSS Distributions {
155*0f4c859eSApple OSS Distributions 	return os_hash_jenkins_update(a->l_perpolicy, sizeof(a->l_perpolicy), hash);
156*0f4c859eSApple OSS Distributions }
157*0f4c859eSApple OSS Distributions 
158*0f4c859eSApple OSS Distributions int
mac_cred_label_externalize_audit(struct proc * p,struct mac * mac)159*0f4c859eSApple OSS Distributions mac_cred_label_externalize_audit(struct proc *p, struct mac *mac)
160*0f4c859eSApple OSS Distributions {
161*0f4c859eSApple OSS Distributions 	kauth_cred_t cr;
162*0f4c859eSApple OSS Distributions 	int error;
163*0f4c859eSApple OSS Distributions 
164*0f4c859eSApple OSS Distributions 	cr = kauth_cred_proc_ref(p);
165*0f4c859eSApple OSS Distributions 
166*0f4c859eSApple OSS Distributions 	error = MAC_EXTERNALIZE_AUDIT(cred, mac_cred_label(cr),
167*0f4c859eSApple OSS Distributions 	    mac->m_string, mac->m_buflen);
168*0f4c859eSApple OSS Distributions 
169*0f4c859eSApple OSS Distributions 	kauth_cred_unref(&cr);
170*0f4c859eSApple OSS Distributions 	return error;
171*0f4c859eSApple OSS Distributions }
172*0f4c859eSApple OSS Distributions 
173*0f4c859eSApple OSS Distributions void
mac_cred_label_destroy(kauth_cred_t cred)174*0f4c859eSApple OSS Distributions mac_cred_label_destroy(kauth_cred_t cred)
175*0f4c859eSApple OSS Distributions {
176*0f4c859eSApple OSS Distributions 	struct label *label = mac_cred_label(cred);
177*0f4c859eSApple OSS Distributions 	cred->cr_label = NULL;
178*0f4c859eSApple OSS Distributions 	mac_cred_label_free(label);
179*0f4c859eSApple OSS Distributions }
180*0f4c859eSApple OSS Distributions 
181*0f4c859eSApple OSS Distributions int
mac_cred_label_externalize(struct label * label,char * elements,char * outbuf,size_t outbuflen,int flags __unused)182*0f4c859eSApple OSS Distributions mac_cred_label_externalize(struct label *label, char *elements,
183*0f4c859eSApple OSS Distributions     char *outbuf, size_t outbuflen, int flags __unused)
184*0f4c859eSApple OSS Distributions {
185*0f4c859eSApple OSS Distributions 	int error = 0;
186*0f4c859eSApple OSS Distributions 
187*0f4c859eSApple OSS Distributions 	error = MAC_EXTERNALIZE(cred, label, elements, outbuf, outbuflen);
188*0f4c859eSApple OSS Distributions 
189*0f4c859eSApple OSS Distributions 	return error;
190*0f4c859eSApple OSS Distributions }
191*0f4c859eSApple OSS Distributions 
192*0f4c859eSApple OSS Distributions int
mac_cred_label_internalize(struct label * label,char * string)193*0f4c859eSApple OSS Distributions mac_cred_label_internalize(struct label *label, char *string)
194*0f4c859eSApple OSS Distributions {
195*0f4c859eSApple OSS Distributions 	int error;
196*0f4c859eSApple OSS Distributions 
197*0f4c859eSApple OSS Distributions 	error = MAC_INTERNALIZE(cred, label, string);
198*0f4c859eSApple OSS Distributions 
199*0f4c859eSApple OSS Distributions 	return error;
200*0f4c859eSApple OSS Distributions }
201*0f4c859eSApple OSS Distributions 
202*0f4c859eSApple OSS Distributions /*
203*0f4c859eSApple OSS Distributions  * By default, fork just adds a reference to the parent
204*0f4c859eSApple OSS Distributions  * credential.  Policies may need to know about this reference
205*0f4c859eSApple OSS Distributions  * if they are tracking exit calls to know when to free the
206*0f4c859eSApple OSS Distributions  * label.
207*0f4c859eSApple OSS Distributions  */
208*0f4c859eSApple OSS Distributions void
mac_cred_label_associate_fork(kauth_cred_t cred,proc_t proc)209*0f4c859eSApple OSS Distributions mac_cred_label_associate_fork(kauth_cred_t cred, proc_t proc)
210*0f4c859eSApple OSS Distributions {
211*0f4c859eSApple OSS Distributions 	MAC_PERFORM(cred_label_associate_fork, cred, proc);
212*0f4c859eSApple OSS Distributions }
213*0f4c859eSApple OSS Distributions 
214*0f4c859eSApple OSS Distributions /*
215*0f4c859eSApple OSS Distributions  * Initialize MAC label for the first kernel process, from which other
216*0f4c859eSApple OSS Distributions  * kernel processes and threads are spawned.
217*0f4c859eSApple OSS Distributions  */
218*0f4c859eSApple OSS Distributions void
mac_cred_label_associate_kernel(kauth_cred_t cred)219*0f4c859eSApple OSS Distributions mac_cred_label_associate_kernel(kauth_cred_t cred)
220*0f4c859eSApple OSS Distributions {
221*0f4c859eSApple OSS Distributions 	MAC_PERFORM(cred_label_associate_kernel, cred);
222*0f4c859eSApple OSS Distributions }
223*0f4c859eSApple OSS Distributions 
224*0f4c859eSApple OSS Distributions /*
225*0f4c859eSApple OSS Distributions  * Initialize MAC label for the first userland process, from which other
226*0f4c859eSApple OSS Distributions  * userland processes and threads are spawned.
227*0f4c859eSApple OSS Distributions  */
228*0f4c859eSApple OSS Distributions void
mac_cred_label_associate_user(kauth_cred_t cred)229*0f4c859eSApple OSS Distributions mac_cred_label_associate_user(kauth_cred_t cred)
230*0f4c859eSApple OSS Distributions {
231*0f4c859eSApple OSS Distributions 	MAC_PERFORM(cred_label_associate_user, cred);
232*0f4c859eSApple OSS Distributions }
233*0f4c859eSApple OSS Distributions 
234*0f4c859eSApple OSS Distributions /*
235*0f4c859eSApple OSS Distributions  * When a new process is created, its label must be initialized.  Generally,
236*0f4c859eSApple OSS Distributions  * this involves inheritence from the parent process, modulo possible
237*0f4c859eSApple OSS Distributions  * deltas.  This function allows that processing to take place.
238*0f4c859eSApple OSS Distributions  */
239*0f4c859eSApple OSS Distributions void
mac_cred_label_associate(struct ucred * parent_cred,struct ucred * child_cred)240*0f4c859eSApple OSS Distributions mac_cred_label_associate(struct ucred *parent_cred, struct ucred *child_cred)
241*0f4c859eSApple OSS Distributions {
242*0f4c859eSApple OSS Distributions 	MAC_PERFORM(cred_label_associate, parent_cred, child_cred);
243*0f4c859eSApple OSS Distributions }
244*0f4c859eSApple OSS Distributions 
245*0f4c859eSApple OSS Distributions int
mac_execve_enter(user_addr_t mac_p,struct image_params * imgp)246*0f4c859eSApple OSS Distributions mac_execve_enter(user_addr_t mac_p, struct image_params *imgp)
247*0f4c859eSApple OSS Distributions {
248*0f4c859eSApple OSS Distributions 	if (mac_p == USER_ADDR_NULL) {
249*0f4c859eSApple OSS Distributions 		return 0;
250*0f4c859eSApple OSS Distributions 	}
251*0f4c859eSApple OSS Distributions 
252*0f4c859eSApple OSS Distributions 	return mac_do_set(current_proc(), mac_p,
253*0f4c859eSApple OSS Distributions 	           ^(char *input, __unused size_t len) {
254*0f4c859eSApple OSS Distributions 		struct label *execlabel;
255*0f4c859eSApple OSS Distributions 		int error;
256*0f4c859eSApple OSS Distributions 
257*0f4c859eSApple OSS Distributions 		execlabel = mac_cred_label_alloc();
258*0f4c859eSApple OSS Distributions 		if ((error = mac_cred_label_internalize(execlabel, input))) {
259*0f4c859eSApple OSS Distributions 		        mac_cred_label_free(execlabel);
260*0f4c859eSApple OSS Distributions 		        execlabel = NULL;
261*0f4c859eSApple OSS Distributions 		}
262*0f4c859eSApple OSS Distributions 
263*0f4c859eSApple OSS Distributions 		imgp->ip_execlabelp = execlabel;
264*0f4c859eSApple OSS Distributions 		return error;
265*0f4c859eSApple OSS Distributions 	});
266*0f4c859eSApple OSS Distributions }
267*0f4c859eSApple OSS Distributions 
268*0f4c859eSApple OSS Distributions /*
269*0f4c859eSApple OSS Distributions  * When the subject's label changes, it may require revocation of privilege
270*0f4c859eSApple OSS Distributions  * to mapped objects.  This can't be done on-the-fly later with a unified
271*0f4c859eSApple OSS Distributions  * buffer cache.
272*0f4c859eSApple OSS Distributions  *
273*0f4c859eSApple OSS Distributions  * XXX:		CRF_MAC_ENFORCE should be in a kauth_cred_t field, rather
274*0f4c859eSApple OSS Distributions  * XXX:		than a posix_cred_t field.
275*0f4c859eSApple OSS Distributions  */
276*0f4c859eSApple OSS Distributions void
mac_cred_label_update(kauth_cred_t cred,struct label * newlabel)277*0f4c859eSApple OSS Distributions mac_cred_label_update(kauth_cred_t cred, struct label *newlabel)
278*0f4c859eSApple OSS Distributions {
279*0f4c859eSApple OSS Distributions 	posix_cred_t pcred = posix_cred_get(cred);
280*0f4c859eSApple OSS Distributions 
281*0f4c859eSApple OSS Distributions 	/* force label to be part of "matching" for credential */
282*0f4c859eSApple OSS Distributions 	pcred->cr_flags |= CRF_MAC_ENFORCE;
283*0f4c859eSApple OSS Distributions 
284*0f4c859eSApple OSS Distributions 	/* inform the policies of the update */
285*0f4c859eSApple OSS Distributions 	MAC_PERFORM(cred_label_update, cred, newlabel);
286*0f4c859eSApple OSS Distributions }
287*0f4c859eSApple OSS Distributions 
288*0f4c859eSApple OSS Distributions int
mac_cred_check_label_update(kauth_cred_t cred,struct label * newlabel)289*0f4c859eSApple OSS Distributions mac_cred_check_label_update(kauth_cred_t cred, struct label *newlabel)
290*0f4c859eSApple OSS Distributions {
291*0f4c859eSApple OSS Distributions 	int error;
292*0f4c859eSApple OSS Distributions 
293*0f4c859eSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
294*0f4c859eSApple OSS Distributions 	/* 21167099 - only check if we allow write */
295*0f4c859eSApple OSS Distributions 	if (!mac_proc_enforce) {
296*0f4c859eSApple OSS Distributions 		return 0;
297*0f4c859eSApple OSS Distributions 	}
298*0f4c859eSApple OSS Distributions #endif
299*0f4c859eSApple OSS Distributions 
300*0f4c859eSApple OSS Distributions 	MAC_CHECK(cred_check_label_update, cred, newlabel);
301*0f4c859eSApple OSS Distributions 
302*0f4c859eSApple OSS Distributions 	return error;
303*0f4c859eSApple OSS Distributions }
304*0f4c859eSApple OSS Distributions 
305*0f4c859eSApple OSS Distributions int
mac_cred_check_visible(kauth_cred_t u1,kauth_cred_t u2)306*0f4c859eSApple OSS Distributions mac_cred_check_visible(kauth_cred_t u1, kauth_cred_t u2)
307*0f4c859eSApple OSS Distributions {
308*0f4c859eSApple OSS Distributions 	int error;
309*0f4c859eSApple OSS Distributions 
310*0f4c859eSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
311*0f4c859eSApple OSS Distributions 	/* 21167099 - only check if we allow write */
312*0f4c859eSApple OSS Distributions 	if (!mac_proc_enforce) {
313*0f4c859eSApple OSS Distributions 		return 0;
314*0f4c859eSApple OSS Distributions 	}
315*0f4c859eSApple OSS Distributions #endif
316*0f4c859eSApple OSS Distributions 
317*0f4c859eSApple OSS Distributions 	MAC_CHECK(cred_check_visible, u1, u2);
318*0f4c859eSApple OSS Distributions 
319*0f4c859eSApple OSS Distributions 	return error;
320*0f4c859eSApple OSS Distributions }
321*0f4c859eSApple OSS Distributions 
322*0f4c859eSApple OSS Distributions int
mac_proc_check_debug(proc_ident_t tracing_ident,kauth_cred_t tracing_cred,proc_ident_t traced_ident)323*0f4c859eSApple OSS Distributions mac_proc_check_debug(proc_ident_t tracing_ident, kauth_cred_t tracing_cred, proc_ident_t traced_ident)
324*0f4c859eSApple OSS Distributions {
325*0f4c859eSApple OSS Distributions 	int error;
326*0f4c859eSApple OSS Distributions 	bool enforce;
327*0f4c859eSApple OSS Distributions 	proc_t tracingp;
328*0f4c859eSApple OSS Distributions 
329*0f4c859eSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
330*0f4c859eSApple OSS Distributions 	/* 21167099 - only check if we allow write */
331*0f4c859eSApple OSS Distributions 	if (!mac_proc_enforce) {
332*0f4c859eSApple OSS Distributions 		return 0;
333*0f4c859eSApple OSS Distributions 	}
334*0f4c859eSApple OSS Distributions #endif
335*0f4c859eSApple OSS Distributions 	/*
336*0f4c859eSApple OSS Distributions 	 * Once all mac hooks adopt proc_ident_t, finding proc_t and releasing
337*0f4c859eSApple OSS Distributions 	 * it below should go to mac_proc_check_enforce().
338*0f4c859eSApple OSS Distributions 	 */
339*0f4c859eSApple OSS Distributions 	if ((tracingp = proc_find_ident(tracing_ident)) == PROC_NULL) {
340*0f4c859eSApple OSS Distributions 		return ESRCH;
341*0f4c859eSApple OSS Distributions 	}
342*0f4c859eSApple OSS Distributions 	enforce = mac_proc_check_enforce(tracingp);
343*0f4c859eSApple OSS Distributions 	proc_rele(tracingp);
344*0f4c859eSApple OSS Distributions 
345*0f4c859eSApple OSS Distributions 	if (!enforce) {
346*0f4c859eSApple OSS Distributions 		return 0;
347*0f4c859eSApple OSS Distributions 	}
348*0f4c859eSApple OSS Distributions 	MAC_CHECK(proc_check_debug, tracing_cred, traced_ident);
349*0f4c859eSApple OSS Distributions 
350*0f4c859eSApple OSS Distributions 	return error;
351*0f4c859eSApple OSS Distributions }
352*0f4c859eSApple OSS Distributions 
353*0f4c859eSApple OSS Distributions int
mac_proc_check_dump_core(struct proc * proc)354*0f4c859eSApple OSS Distributions mac_proc_check_dump_core(struct proc *proc)
355*0f4c859eSApple OSS Distributions {
356*0f4c859eSApple OSS Distributions 	int error;
357*0f4c859eSApple OSS Distributions 
358*0f4c859eSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
359*0f4c859eSApple OSS Distributions 	/* 21167099 - only check if we allow write */
360*0f4c859eSApple OSS Distributions 	if (!mac_proc_enforce) {
361*0f4c859eSApple OSS Distributions 		return 0;
362*0f4c859eSApple OSS Distributions 	}
363*0f4c859eSApple OSS Distributions #endif
364*0f4c859eSApple OSS Distributions 	if (!mac_proc_check_enforce(proc)) {
365*0f4c859eSApple OSS Distributions 		return 0;
366*0f4c859eSApple OSS Distributions 	}
367*0f4c859eSApple OSS Distributions 
368*0f4c859eSApple OSS Distributions 	MAC_CHECK(proc_check_dump_core, proc);
369*0f4c859eSApple OSS Distributions 
370*0f4c859eSApple OSS Distributions 	return error;
371*0f4c859eSApple OSS Distributions }
372*0f4c859eSApple OSS Distributions 
373*0f4c859eSApple OSS Distributions int
mac_proc_check_remote_thread_create(struct task * task,int flavor,thread_state_t new_state,mach_msg_type_number_t new_state_count)374*0f4c859eSApple OSS Distributions mac_proc_check_remote_thread_create(struct task *task, int flavor, thread_state_t new_state, mach_msg_type_number_t new_state_count)
375*0f4c859eSApple OSS Distributions {
376*0f4c859eSApple OSS Distributions 	proc_t curp = current_proc();
377*0f4c859eSApple OSS Distributions 	proc_t proc;
378*0f4c859eSApple OSS Distributions 	kauth_cred_t cred;
379*0f4c859eSApple OSS Distributions 	int error;
380*0f4c859eSApple OSS Distributions 
381*0f4c859eSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
382*0f4c859eSApple OSS Distributions 	/* 21167099 - only check if we allow write */
383*0f4c859eSApple OSS Distributions 	if (!mac_proc_enforce) {
384*0f4c859eSApple OSS Distributions 		return 0;
385*0f4c859eSApple OSS Distributions 	}
386*0f4c859eSApple OSS Distributions #endif
387*0f4c859eSApple OSS Distributions 	if (!mac_proc_check_enforce(curp)) {
388*0f4c859eSApple OSS Distributions 		return 0;
389*0f4c859eSApple OSS Distributions 	}
390*0f4c859eSApple OSS Distributions 
391*0f4c859eSApple OSS Distributions 	proc = proc_find(task_pid(task));
392*0f4c859eSApple OSS Distributions 	if (proc == PROC_NULL) {
393*0f4c859eSApple OSS Distributions 		return ESRCH;
394*0f4c859eSApple OSS Distributions 	}
395*0f4c859eSApple OSS Distributions 
396*0f4c859eSApple OSS Distributions 	cred = kauth_cred_proc_ref(curp);
397*0f4c859eSApple OSS Distributions 	MAC_CHECK(proc_check_remote_thread_create, cred, proc, flavor, new_state, new_state_count);
398*0f4c859eSApple OSS Distributions 	kauth_cred_unref(&cred);
399*0f4c859eSApple OSS Distributions 	proc_rele(proc);
400*0f4c859eSApple OSS Distributions 
401*0f4c859eSApple OSS Distributions 	return error;
402*0f4c859eSApple OSS Distributions }
403*0f4c859eSApple OSS Distributions 
404*0f4c859eSApple OSS Distributions void
mac_proc_notify_service_port_derive(struct mach_service_port_info * sp_info)405*0f4c859eSApple OSS Distributions mac_proc_notify_service_port_derive(struct mach_service_port_info *sp_info)
406*0f4c859eSApple OSS Distributions {
407*0f4c859eSApple OSS Distributions 	proc_t curp = current_proc();
408*0f4c859eSApple OSS Distributions 	kauth_cred_t cred = kauth_cred_proc_ref(curp);
409*0f4c859eSApple OSS Distributions 	MAC_PERFORM(proc_notify_service_port_derive, cred, sp_info);
410*0f4c859eSApple OSS Distributions 	kauth_cred_unref(&cred);
411*0f4c859eSApple OSS Distributions }
412*0f4c859eSApple OSS Distributions 
413*0f4c859eSApple OSS Distributions int
mac_proc_check_fork(proc_t curp)414*0f4c859eSApple OSS Distributions mac_proc_check_fork(proc_t curp)
415*0f4c859eSApple OSS Distributions {
416*0f4c859eSApple OSS Distributions 	kauth_cred_t cred;
417*0f4c859eSApple OSS Distributions 	int error;
418*0f4c859eSApple OSS Distributions 
419*0f4c859eSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
420*0f4c859eSApple OSS Distributions 	/* 21167099 - only check if we allow write */
421*0f4c859eSApple OSS Distributions 	if (!mac_proc_enforce) {
422*0f4c859eSApple OSS Distributions 		return 0;
423*0f4c859eSApple OSS Distributions 	}
424*0f4c859eSApple OSS Distributions #endif
425*0f4c859eSApple OSS Distributions 	if (!mac_proc_check_enforce(curp)) {
426*0f4c859eSApple OSS Distributions 		return 0;
427*0f4c859eSApple OSS Distributions 	}
428*0f4c859eSApple OSS Distributions 
429*0f4c859eSApple OSS Distributions 	cred = kauth_cred_proc_ref(curp);
430*0f4c859eSApple OSS Distributions 	MAC_CHECK(proc_check_fork, cred, curp);
431*0f4c859eSApple OSS Distributions 	kauth_cred_unref(&cred);
432*0f4c859eSApple OSS Distributions 
433*0f4c859eSApple OSS Distributions 	return error;
434*0f4c859eSApple OSS Distributions }
435*0f4c859eSApple OSS Distributions 
436*0f4c859eSApple OSS Distributions int
mac_proc_check_get_task(struct ucred * cred,proc_ident_t pident,mach_task_flavor_t flavor)437*0f4c859eSApple OSS Distributions mac_proc_check_get_task(struct ucred *cred, proc_ident_t pident, mach_task_flavor_t flavor)
438*0f4c859eSApple OSS Distributions {
439*0f4c859eSApple OSS Distributions 	int error;
440*0f4c859eSApple OSS Distributions 
441*0f4c859eSApple OSS Distributions 	assert(flavor <= TASK_FLAVOR_NAME);
442*0f4c859eSApple OSS Distributions 
443*0f4c859eSApple OSS Distributions 	MAC_CHECK(proc_check_get_task_with_flavor, cred, pident, flavor);
444*0f4c859eSApple OSS Distributions 
445*0f4c859eSApple OSS Distributions 	return error;
446*0f4c859eSApple OSS Distributions }
447*0f4c859eSApple OSS Distributions 
448*0f4c859eSApple OSS Distributions int
mac_proc_check_expose_task(struct ucred * cred,proc_ident_t pident,mach_task_flavor_t flavor)449*0f4c859eSApple OSS Distributions mac_proc_check_expose_task(struct ucred *cred, proc_ident_t pident, mach_task_flavor_t flavor)
450*0f4c859eSApple OSS Distributions {
451*0f4c859eSApple OSS Distributions 	int error;
452*0f4c859eSApple OSS Distributions 
453*0f4c859eSApple OSS Distributions 	assert(flavor <= TASK_FLAVOR_NAME);
454*0f4c859eSApple OSS Distributions 
455*0f4c859eSApple OSS Distributions 	MAC_CHECK(proc_check_expose_task_with_flavor, cred, pident, flavor);
456*0f4c859eSApple OSS Distributions 
457*0f4c859eSApple OSS Distributions 	return error;
458*0f4c859eSApple OSS Distributions }
459*0f4c859eSApple OSS Distributions 
460*0f4c859eSApple OSS Distributions int
mac_proc_check_inherit_ipc_ports(struct proc * p,struct vnode * cur_vp,off_t cur_offset,struct vnode * img_vp,off_t img_offset,struct vnode * scriptvp)461*0f4c859eSApple OSS Distributions mac_proc_check_inherit_ipc_ports(
462*0f4c859eSApple OSS Distributions 	struct proc *p,
463*0f4c859eSApple OSS Distributions 	struct vnode *cur_vp,
464*0f4c859eSApple OSS Distributions 	off_t cur_offset,
465*0f4c859eSApple OSS Distributions 	struct vnode *img_vp,
466*0f4c859eSApple OSS Distributions 	off_t img_offset,
467*0f4c859eSApple OSS Distributions 	struct vnode *scriptvp)
468*0f4c859eSApple OSS Distributions {
469*0f4c859eSApple OSS Distributions 	int error;
470*0f4c859eSApple OSS Distributions 
471*0f4c859eSApple OSS Distributions 	MAC_CHECK(proc_check_inherit_ipc_ports, p, cur_vp, cur_offset, img_vp, img_offset, scriptvp);
472*0f4c859eSApple OSS Distributions 
473*0f4c859eSApple OSS Distributions 	return error;
474*0f4c859eSApple OSS Distributions }
475*0f4c859eSApple OSS Distributions 
476*0f4c859eSApple OSS Distributions /*
477*0f4c859eSApple OSS Distributions  * The type of maxprot in proc_check_map_anon must be equivalent to vm_prot_t
478*0f4c859eSApple OSS Distributions  * (defined in <mach/vm_prot.h>). mac_policy.h does not include any header
479*0f4c859eSApple OSS Distributions  * files, so cannot use the typedef itself.
480*0f4c859eSApple OSS Distributions  */
481*0f4c859eSApple OSS Distributions int
mac_proc_check_map_anon(proc_t proc,user_addr_t u_addr,user_size_t u_size,int prot,int flags,int * maxprot)482*0f4c859eSApple OSS Distributions mac_proc_check_map_anon(proc_t proc, user_addr_t u_addr,
483*0f4c859eSApple OSS Distributions     user_size_t u_size, int prot, int flags, int *maxprot)
484*0f4c859eSApple OSS Distributions {
485*0f4c859eSApple OSS Distributions 	kauth_cred_t cred;
486*0f4c859eSApple OSS Distributions 	int error;
487*0f4c859eSApple OSS Distributions 
488*0f4c859eSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
489*0f4c859eSApple OSS Distributions 	/* 21167099 - only check if we allow write */
490*0f4c859eSApple OSS Distributions 	if (!mac_vm_enforce) {
491*0f4c859eSApple OSS Distributions 		return 0;
492*0f4c859eSApple OSS Distributions 	}
493*0f4c859eSApple OSS Distributions #endif
494*0f4c859eSApple OSS Distributions 	if (!mac_proc_check_enforce(proc)) {
495*0f4c859eSApple OSS Distributions 		return 0;
496*0f4c859eSApple OSS Distributions 	}
497*0f4c859eSApple OSS Distributions 
498*0f4c859eSApple OSS Distributions 	cred = kauth_cred_proc_ref(proc);
499*0f4c859eSApple OSS Distributions 	MAC_CHECK(proc_check_map_anon, proc, cred, u_addr, u_size, prot, flags, maxprot);
500*0f4c859eSApple OSS Distributions 	kauth_cred_unref(&cred);
501*0f4c859eSApple OSS Distributions 
502*0f4c859eSApple OSS Distributions 	return error;
503*0f4c859eSApple OSS Distributions }
504*0f4c859eSApple OSS Distributions 
505*0f4c859eSApple OSS Distributions 
506*0f4c859eSApple OSS Distributions int
mac_proc_check_memorystatus_control(proc_t proc,uint32_t command,pid_t pid)507*0f4c859eSApple OSS Distributions mac_proc_check_memorystatus_control(proc_t proc, uint32_t command, pid_t pid)
508*0f4c859eSApple OSS Distributions {
509*0f4c859eSApple OSS Distributions 	kauth_cred_t cred;
510*0f4c859eSApple OSS Distributions 	int error;
511*0f4c859eSApple OSS Distributions 
512*0f4c859eSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
513*0f4c859eSApple OSS Distributions 	/* 21167099 - only check if we allow write */
514*0f4c859eSApple OSS Distributions 	if (!mac_proc_enforce) {
515*0f4c859eSApple OSS Distributions 		return 0;
516*0f4c859eSApple OSS Distributions 	}
517*0f4c859eSApple OSS Distributions #endif
518*0f4c859eSApple OSS Distributions 	if (!mac_proc_check_enforce(proc)) {
519*0f4c859eSApple OSS Distributions 		return 0;
520*0f4c859eSApple OSS Distributions 	}
521*0f4c859eSApple OSS Distributions 
522*0f4c859eSApple OSS Distributions 	cred = kauth_cred_proc_ref(proc);
523*0f4c859eSApple OSS Distributions 	MAC_CHECK(proc_check_memorystatus_control, cred, command, pid);
524*0f4c859eSApple OSS Distributions 	kauth_cred_unref(&cred);
525*0f4c859eSApple OSS Distributions 
526*0f4c859eSApple OSS Distributions 	return error;
527*0f4c859eSApple OSS Distributions }
528*0f4c859eSApple OSS Distributions 
529*0f4c859eSApple OSS Distributions int
mac_proc_check_mprotect(proc_t proc,user_addr_t addr,user_size_t size,int prot)530*0f4c859eSApple OSS Distributions mac_proc_check_mprotect(proc_t proc,
531*0f4c859eSApple OSS Distributions     user_addr_t addr, user_size_t size, int prot)
532*0f4c859eSApple OSS Distributions {
533*0f4c859eSApple OSS Distributions 	kauth_cred_t cred;
534*0f4c859eSApple OSS Distributions 	int error;
535*0f4c859eSApple OSS Distributions 
536*0f4c859eSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
537*0f4c859eSApple OSS Distributions 	/* 21167099 - only check if we allow write */
538*0f4c859eSApple OSS Distributions 	if (!mac_vm_enforce) {
539*0f4c859eSApple OSS Distributions 		return 0;
540*0f4c859eSApple OSS Distributions 	}
541*0f4c859eSApple OSS Distributions #endif
542*0f4c859eSApple OSS Distributions 	if (!mac_proc_check_enforce(proc)) {
543*0f4c859eSApple OSS Distributions 		return 0;
544*0f4c859eSApple OSS Distributions 	}
545*0f4c859eSApple OSS Distributions 
546*0f4c859eSApple OSS Distributions 	cred = kauth_cred_proc_ref(proc);
547*0f4c859eSApple OSS Distributions 	MAC_CHECK(proc_check_mprotect, cred, proc, addr, size, prot);
548*0f4c859eSApple OSS Distributions 	kauth_cred_unref(&cred);
549*0f4c859eSApple OSS Distributions 
550*0f4c859eSApple OSS Distributions 	return error;
551*0f4c859eSApple OSS Distributions }
552*0f4c859eSApple OSS Distributions 
553*0f4c859eSApple OSS Distributions int
mac_proc_check_run_cs_invalid(proc_t proc)554*0f4c859eSApple OSS Distributions mac_proc_check_run_cs_invalid(proc_t proc)
555*0f4c859eSApple OSS Distributions {
556*0f4c859eSApple OSS Distributions 	int error;
557*0f4c859eSApple OSS Distributions 
558*0f4c859eSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
559*0f4c859eSApple OSS Distributions 	/* 21167099 - only check if we allow write */
560*0f4c859eSApple OSS Distributions 	if (!mac_vm_enforce) {
561*0f4c859eSApple OSS Distributions 		return 0;
562*0f4c859eSApple OSS Distributions 	}
563*0f4c859eSApple OSS Distributions #endif
564*0f4c859eSApple OSS Distributions 
565*0f4c859eSApple OSS Distributions 	MAC_CHECK(proc_check_run_cs_invalid, proc);
566*0f4c859eSApple OSS Distributions 
567*0f4c859eSApple OSS Distributions 	return error;
568*0f4c859eSApple OSS Distributions }
569*0f4c859eSApple OSS Distributions 
570*0f4c859eSApple OSS Distributions void
mac_proc_notify_cs_invalidated(proc_t proc)571*0f4c859eSApple OSS Distributions mac_proc_notify_cs_invalidated(proc_t proc)
572*0f4c859eSApple OSS Distributions {
573*0f4c859eSApple OSS Distributions 	MAC_PERFORM(proc_notify_cs_invalidated, proc);
574*0f4c859eSApple OSS Distributions }
575*0f4c859eSApple OSS Distributions 
576*0f4c859eSApple OSS Distributions int
mac_proc_check_sched(proc_t curp,struct proc * proc)577*0f4c859eSApple OSS Distributions mac_proc_check_sched(proc_t curp, struct proc *proc)
578*0f4c859eSApple OSS Distributions {
579*0f4c859eSApple OSS Distributions 	kauth_cred_t cred;
580*0f4c859eSApple OSS Distributions 	int error;
581*0f4c859eSApple OSS Distributions 
582*0f4c859eSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
583*0f4c859eSApple OSS Distributions 	/* 21167099 - only check if we allow write */
584*0f4c859eSApple OSS Distributions 	if (!mac_proc_enforce) {
585*0f4c859eSApple OSS Distributions 		return 0;
586*0f4c859eSApple OSS Distributions 	}
587*0f4c859eSApple OSS Distributions #endif
588*0f4c859eSApple OSS Distributions 	if (!mac_proc_check_enforce(curp)) {
589*0f4c859eSApple OSS Distributions 		return 0;
590*0f4c859eSApple OSS Distributions 	}
591*0f4c859eSApple OSS Distributions 
592*0f4c859eSApple OSS Distributions 	cred = kauth_cred_proc_ref(curp);
593*0f4c859eSApple OSS Distributions 	MAC_CHECK(proc_check_sched, cred, proc);
594*0f4c859eSApple OSS Distributions 	kauth_cred_unref(&cred);
595*0f4c859eSApple OSS Distributions 
596*0f4c859eSApple OSS Distributions 	return error;
597*0f4c859eSApple OSS Distributions }
598*0f4c859eSApple OSS Distributions 
599*0f4c859eSApple OSS Distributions int
mac_proc_check_signal(proc_t curp,struct proc * proc,int signum)600*0f4c859eSApple OSS Distributions mac_proc_check_signal(proc_t curp, struct proc *proc, int signum)
601*0f4c859eSApple OSS Distributions {
602*0f4c859eSApple OSS Distributions 	kauth_cred_t cred;
603*0f4c859eSApple OSS Distributions 	int error;
604*0f4c859eSApple OSS Distributions 
605*0f4c859eSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
606*0f4c859eSApple OSS Distributions 	/* 21167099 - only check if we allow write */
607*0f4c859eSApple OSS Distributions 	if (!mac_proc_enforce) {
608*0f4c859eSApple OSS Distributions 		return 0;
609*0f4c859eSApple OSS Distributions 	}
610*0f4c859eSApple OSS Distributions #endif
611*0f4c859eSApple OSS Distributions 	if (!mac_proc_check_enforce(curp)) {
612*0f4c859eSApple OSS Distributions 		return 0;
613*0f4c859eSApple OSS Distributions 	}
614*0f4c859eSApple OSS Distributions 
615*0f4c859eSApple OSS Distributions 	cred = kauth_cred_proc_ref(curp);
616*0f4c859eSApple OSS Distributions 	MAC_CHECK(proc_check_signal, cred, proc, signum);
617*0f4c859eSApple OSS Distributions 	kauth_cred_unref(&cred);
618*0f4c859eSApple OSS Distributions 
619*0f4c859eSApple OSS Distributions 	return error;
620*0f4c859eSApple OSS Distributions }
621*0f4c859eSApple OSS Distributions 
622*0f4c859eSApple OSS Distributions int
mac_proc_check_syscall_unix(proc_t curp,int scnum)623*0f4c859eSApple OSS Distributions mac_proc_check_syscall_unix(proc_t curp, int scnum)
624*0f4c859eSApple OSS Distributions {
625*0f4c859eSApple OSS Distributions 	int error;
626*0f4c859eSApple OSS Distributions 
627*0f4c859eSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
628*0f4c859eSApple OSS Distributions 	/* 21167099 - only check if we allow write */
629*0f4c859eSApple OSS Distributions 	if (!mac_proc_enforce) {
630*0f4c859eSApple OSS Distributions 		return 0;
631*0f4c859eSApple OSS Distributions 	}
632*0f4c859eSApple OSS Distributions #endif
633*0f4c859eSApple OSS Distributions 	if (!mac_proc_check_enforce(curp)) {
634*0f4c859eSApple OSS Distributions 		return 0;
635*0f4c859eSApple OSS Distributions 	}
636*0f4c859eSApple OSS Distributions 
637*0f4c859eSApple OSS Distributions 	MAC_CHECK(proc_check_syscall_unix, curp, scnum);
638*0f4c859eSApple OSS Distributions 
639*0f4c859eSApple OSS Distributions 	return error;
640*0f4c859eSApple OSS Distributions }
641*0f4c859eSApple OSS Distributions 
642*0f4c859eSApple OSS Distributions int
mac_proc_check_wait(proc_t curp,struct proc * proc)643*0f4c859eSApple OSS Distributions mac_proc_check_wait(proc_t curp, struct proc *proc)
644*0f4c859eSApple OSS Distributions {
645*0f4c859eSApple OSS Distributions 	kauth_cred_t cred;
646*0f4c859eSApple OSS Distributions 	int error;
647*0f4c859eSApple OSS Distributions 
648*0f4c859eSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
649*0f4c859eSApple OSS Distributions 	/* 21167099 - only check if we allow write */
650*0f4c859eSApple OSS Distributions 	if (!mac_proc_enforce) {
651*0f4c859eSApple OSS Distributions 		return 0;
652*0f4c859eSApple OSS Distributions 	}
653*0f4c859eSApple OSS Distributions #endif
654*0f4c859eSApple OSS Distributions 	if (!mac_proc_check_enforce(curp)) {
655*0f4c859eSApple OSS Distributions 		return 0;
656*0f4c859eSApple OSS Distributions 	}
657*0f4c859eSApple OSS Distributions 
658*0f4c859eSApple OSS Distributions 	cred = kauth_cred_proc_ref(curp);
659*0f4c859eSApple OSS Distributions 	MAC_CHECK(proc_check_wait, cred, proc);
660*0f4c859eSApple OSS Distributions 	kauth_cred_unref(&cred);
661*0f4c859eSApple OSS Distributions 
662*0f4c859eSApple OSS Distributions 	return error;
663*0f4c859eSApple OSS Distributions }
664*0f4c859eSApple OSS Distributions 
665*0f4c859eSApple OSS Distributions void
mac_proc_notify_exit(struct proc * proc)666*0f4c859eSApple OSS Distributions mac_proc_notify_exit(struct proc *proc)
667*0f4c859eSApple OSS Distributions {
668*0f4c859eSApple OSS Distributions 	MAC_PERFORM(proc_notify_exit, proc);
669*0f4c859eSApple OSS Distributions }
670*0f4c859eSApple OSS Distributions 
671*0f4c859eSApple OSS Distributions int
mac_proc_check_suspend_resume(proc_t proc,int sr)672*0f4c859eSApple OSS Distributions mac_proc_check_suspend_resume(proc_t proc, int sr)
673*0f4c859eSApple OSS Distributions {
674*0f4c859eSApple OSS Distributions 	kauth_cred_t cred;
675*0f4c859eSApple OSS Distributions 	int error;
676*0f4c859eSApple OSS Distributions 
677*0f4c859eSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
678*0f4c859eSApple OSS Distributions 	/* 21167099 - only check if we allow write */
679*0f4c859eSApple OSS Distributions 	if (!mac_proc_enforce) {
680*0f4c859eSApple OSS Distributions 		return 0;
681*0f4c859eSApple OSS Distributions 	}
682*0f4c859eSApple OSS Distributions #endif
683*0f4c859eSApple OSS Distributions 	if (!mac_proc_check_enforce(current_proc())) {
684*0f4c859eSApple OSS Distributions 		return 0;
685*0f4c859eSApple OSS Distributions 	}
686*0f4c859eSApple OSS Distributions 
687*0f4c859eSApple OSS Distributions 	cred = kauth_cred_proc_ref(current_proc());
688*0f4c859eSApple OSS Distributions 	MAC_CHECK(proc_check_suspend_resume, cred, proc, sr);
689*0f4c859eSApple OSS Distributions 	kauth_cred_unref(&cred);
690*0f4c859eSApple OSS Distributions 
691*0f4c859eSApple OSS Distributions 	return error;
692*0f4c859eSApple OSS Distributions }
693*0f4c859eSApple OSS Distributions 
694*0f4c859eSApple OSS Distributions int
mac_proc_check_ledger(proc_t curp,proc_t proc,int ledger_op)695*0f4c859eSApple OSS Distributions mac_proc_check_ledger(proc_t curp, proc_t proc, int ledger_op)
696*0f4c859eSApple OSS Distributions {
697*0f4c859eSApple OSS Distributions 	kauth_cred_t cred;
698*0f4c859eSApple OSS Distributions 	int error = 0;
699*0f4c859eSApple OSS Distributions 
700*0f4c859eSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
701*0f4c859eSApple OSS Distributions 	/* 21167099 - only check if we allow write */
702*0f4c859eSApple OSS Distributions 	if (!mac_proc_enforce) {
703*0f4c859eSApple OSS Distributions 		return 0;
704*0f4c859eSApple OSS Distributions 	}
705*0f4c859eSApple OSS Distributions #endif
706*0f4c859eSApple OSS Distributions 	if (!mac_proc_check_enforce(curp)) {
707*0f4c859eSApple OSS Distributions 		return 0;
708*0f4c859eSApple OSS Distributions 	}
709*0f4c859eSApple OSS Distributions 
710*0f4c859eSApple OSS Distributions 	cred = kauth_cred_proc_ref(curp);
711*0f4c859eSApple OSS Distributions 	MAC_CHECK(proc_check_ledger, cred, proc, ledger_op);
712*0f4c859eSApple OSS Distributions 	kauth_cred_unref(&cred);
713*0f4c859eSApple OSS Distributions 
714*0f4c859eSApple OSS Distributions 	return error;
715*0f4c859eSApple OSS Distributions }
716*0f4c859eSApple OSS Distributions 
717*0f4c859eSApple OSS Distributions int
mac_proc_check_proc_info(proc_t curp,proc_t target,int callnum,int flavor)718*0f4c859eSApple OSS Distributions mac_proc_check_proc_info(proc_t curp, proc_t target, int callnum, int flavor)
719*0f4c859eSApple OSS Distributions {
720*0f4c859eSApple OSS Distributions 	kauth_cred_t cred;
721*0f4c859eSApple OSS Distributions 	int error = 0;
722*0f4c859eSApple OSS Distributions 
723*0f4c859eSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
724*0f4c859eSApple OSS Distributions 	/* 21167099 - only check if we allow write */
725*0f4c859eSApple OSS Distributions 	if (!mac_proc_enforce) {
726*0f4c859eSApple OSS Distributions 		return 0;
727*0f4c859eSApple OSS Distributions 	}
728*0f4c859eSApple OSS Distributions #endif
729*0f4c859eSApple OSS Distributions 	if (!mac_proc_check_enforce(curp)) {
730*0f4c859eSApple OSS Distributions 		return 0;
731*0f4c859eSApple OSS Distributions 	}
732*0f4c859eSApple OSS Distributions 
733*0f4c859eSApple OSS Distributions 	cred = kauth_cred_proc_ref(curp);
734*0f4c859eSApple OSS Distributions 	MAC_CHECK(proc_check_proc_info, cred, target, callnum, flavor);
735*0f4c859eSApple OSS Distributions 	kauth_cred_unref(&cred);
736*0f4c859eSApple OSS Distributions 
737*0f4c859eSApple OSS Distributions 	return error;
738*0f4c859eSApple OSS Distributions }
739*0f4c859eSApple OSS Distributions 
740*0f4c859eSApple OSS Distributions int
mac_proc_check_get_cs_info(proc_t curp,proc_t target,unsigned int op)741*0f4c859eSApple OSS Distributions mac_proc_check_get_cs_info(proc_t curp, proc_t target, unsigned int op)
742*0f4c859eSApple OSS Distributions {
743*0f4c859eSApple OSS Distributions 	kauth_cred_t cred;
744*0f4c859eSApple OSS Distributions 	int error = 0;
745*0f4c859eSApple OSS Distributions 
746*0f4c859eSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
747*0f4c859eSApple OSS Distributions 	/* 21167099 - only check if we allow write */
748*0f4c859eSApple OSS Distributions 	if (!mac_proc_enforce) {
749*0f4c859eSApple OSS Distributions 		return 0;
750*0f4c859eSApple OSS Distributions 	}
751*0f4c859eSApple OSS Distributions #endif
752*0f4c859eSApple OSS Distributions 	if (!mac_proc_check_enforce(curp)) {
753*0f4c859eSApple OSS Distributions 		return 0;
754*0f4c859eSApple OSS Distributions 	}
755*0f4c859eSApple OSS Distributions 
756*0f4c859eSApple OSS Distributions 	cred = kauth_cred_proc_ref(curp);
757*0f4c859eSApple OSS Distributions 	MAC_CHECK(proc_check_get_cs_info, cred, target, op);
758*0f4c859eSApple OSS Distributions 	kauth_cred_unref(&cred);
759*0f4c859eSApple OSS Distributions 
760*0f4c859eSApple OSS Distributions 	return error;
761*0f4c859eSApple OSS Distributions }
762*0f4c859eSApple OSS Distributions 
763*0f4c859eSApple OSS Distributions int
mac_proc_check_set_cs_info(proc_t curp,proc_t target,unsigned int op)764*0f4c859eSApple OSS Distributions mac_proc_check_set_cs_info(proc_t curp, proc_t target, unsigned int op)
765*0f4c859eSApple OSS Distributions {
766*0f4c859eSApple OSS Distributions 	kauth_cred_t cred;
767*0f4c859eSApple OSS Distributions 	int error = 0;
768*0f4c859eSApple OSS Distributions 
769*0f4c859eSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
770*0f4c859eSApple OSS Distributions 	/* 21167099 - only check if we allow write */
771*0f4c859eSApple OSS Distributions 	if (!mac_proc_enforce) {
772*0f4c859eSApple OSS Distributions 		return 0;
773*0f4c859eSApple OSS Distributions 	}
774*0f4c859eSApple OSS Distributions #endif
775*0f4c859eSApple OSS Distributions 	if (!mac_proc_check_enforce(curp)) {
776*0f4c859eSApple OSS Distributions 		return 0;
777*0f4c859eSApple OSS Distributions 	}
778*0f4c859eSApple OSS Distributions 
779*0f4c859eSApple OSS Distributions 	cred = kauth_cred_proc_ref(curp);
780*0f4c859eSApple OSS Distributions 	MAC_CHECK(proc_check_set_cs_info, cred, target, op);
781*0f4c859eSApple OSS Distributions 	kauth_cred_unref(&cred);
782*0f4c859eSApple OSS Distributions 
783*0f4c859eSApple OSS Distributions 	return error;
784*0f4c859eSApple OSS Distributions }
785*0f4c859eSApple OSS Distributions 
786*0f4c859eSApple OSS Distributions int
mac_proc_check_setuid(proc_t curp,kauth_cred_t cred,uid_t uid)787*0f4c859eSApple OSS Distributions mac_proc_check_setuid(proc_t curp, kauth_cred_t cred, uid_t uid)
788*0f4c859eSApple OSS Distributions {
789*0f4c859eSApple OSS Distributions 	int error = 0;
790*0f4c859eSApple OSS Distributions 
791*0f4c859eSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
792*0f4c859eSApple OSS Distributions 	/* 21167099 - only check if we allow write */
793*0f4c859eSApple OSS Distributions 	if (!mac_proc_enforce) {
794*0f4c859eSApple OSS Distributions 		return 0;
795*0f4c859eSApple OSS Distributions 	}
796*0f4c859eSApple OSS Distributions #endif
797*0f4c859eSApple OSS Distributions 	if (!mac_proc_check_enforce(curp)) {
798*0f4c859eSApple OSS Distributions 		return 0;
799*0f4c859eSApple OSS Distributions 	}
800*0f4c859eSApple OSS Distributions 
801*0f4c859eSApple OSS Distributions 	MAC_CHECK(proc_check_setuid, cred, uid);
802*0f4c859eSApple OSS Distributions 
803*0f4c859eSApple OSS Distributions 	return error;
804*0f4c859eSApple OSS Distributions }
805*0f4c859eSApple OSS Distributions 
806*0f4c859eSApple OSS Distributions int
mac_proc_check_seteuid(proc_t curp,kauth_cred_t cred,uid_t euid)807*0f4c859eSApple OSS Distributions mac_proc_check_seteuid(proc_t curp, kauth_cred_t cred, uid_t euid)
808*0f4c859eSApple OSS Distributions {
809*0f4c859eSApple OSS Distributions 	int error = 0;
810*0f4c859eSApple OSS Distributions 
811*0f4c859eSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
812*0f4c859eSApple OSS Distributions 	/* 21167099 - only check if we allow write */
813*0f4c859eSApple OSS Distributions 	if (!mac_proc_enforce) {
814*0f4c859eSApple OSS Distributions 		return 0;
815*0f4c859eSApple OSS Distributions 	}
816*0f4c859eSApple OSS Distributions #endif
817*0f4c859eSApple OSS Distributions 	if (!mac_proc_check_enforce(curp)) {
818*0f4c859eSApple OSS Distributions 		return 0;
819*0f4c859eSApple OSS Distributions 	}
820*0f4c859eSApple OSS Distributions 
821*0f4c859eSApple OSS Distributions 	MAC_CHECK(proc_check_seteuid, cred, euid);
822*0f4c859eSApple OSS Distributions 
823*0f4c859eSApple OSS Distributions 	return error;
824*0f4c859eSApple OSS Distributions }
825*0f4c859eSApple OSS Distributions 
826*0f4c859eSApple OSS Distributions int
mac_proc_check_setreuid(proc_t curp,kauth_cred_t cred,uid_t ruid,uid_t euid)827*0f4c859eSApple OSS Distributions mac_proc_check_setreuid(proc_t curp, kauth_cred_t cred, uid_t ruid, uid_t euid)
828*0f4c859eSApple OSS Distributions {
829*0f4c859eSApple OSS Distributions 	int error = 0;
830*0f4c859eSApple OSS Distributions 
831*0f4c859eSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
832*0f4c859eSApple OSS Distributions 	/* 21167099 - only check if we allow write */
833*0f4c859eSApple OSS Distributions 	if (!mac_proc_enforce) {
834*0f4c859eSApple OSS Distributions 		return 0;
835*0f4c859eSApple OSS Distributions 	}
836*0f4c859eSApple OSS Distributions #endif
837*0f4c859eSApple OSS Distributions 	if (!mac_proc_check_enforce(curp)) {
838*0f4c859eSApple OSS Distributions 		return 0;
839*0f4c859eSApple OSS Distributions 	}
840*0f4c859eSApple OSS Distributions 
841*0f4c859eSApple OSS Distributions 	MAC_CHECK(proc_check_setreuid, cred, ruid, euid);
842*0f4c859eSApple OSS Distributions 
843*0f4c859eSApple OSS Distributions 	return error;
844*0f4c859eSApple OSS Distributions }
845*0f4c859eSApple OSS Distributions 
846*0f4c859eSApple OSS Distributions int
mac_proc_check_setgid(proc_t curp,kauth_cred_t cred,gid_t gid)847*0f4c859eSApple OSS Distributions mac_proc_check_setgid(proc_t curp, kauth_cred_t cred, gid_t gid)
848*0f4c859eSApple OSS Distributions {
849*0f4c859eSApple OSS Distributions 	int error = 0;
850*0f4c859eSApple OSS Distributions 
851*0f4c859eSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
852*0f4c859eSApple OSS Distributions 	/* 21167099 - only check if we allow write */
853*0f4c859eSApple OSS Distributions 	if (!mac_proc_enforce) {
854*0f4c859eSApple OSS Distributions 		return 0;
855*0f4c859eSApple OSS Distributions 	}
856*0f4c859eSApple OSS Distributions #endif
857*0f4c859eSApple OSS Distributions 	if (!mac_proc_check_enforce(curp)) {
858*0f4c859eSApple OSS Distributions 		return 0;
859*0f4c859eSApple OSS Distributions 	}
860*0f4c859eSApple OSS Distributions 
861*0f4c859eSApple OSS Distributions 	MAC_CHECK(proc_check_setgid, cred, gid);
862*0f4c859eSApple OSS Distributions 
863*0f4c859eSApple OSS Distributions 	return error;
864*0f4c859eSApple OSS Distributions }
865*0f4c859eSApple OSS Distributions 
866*0f4c859eSApple OSS Distributions int
mac_proc_check_setegid(proc_t curp,kauth_cred_t cred,gid_t egid)867*0f4c859eSApple OSS Distributions mac_proc_check_setegid(proc_t curp, kauth_cred_t cred, gid_t egid)
868*0f4c859eSApple OSS Distributions {
869*0f4c859eSApple OSS Distributions 	int error = 0;
870*0f4c859eSApple OSS Distributions 
871*0f4c859eSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
872*0f4c859eSApple OSS Distributions 	/* 21167099 - only check if we allow write */
873*0f4c859eSApple OSS Distributions 	if (!mac_proc_enforce) {
874*0f4c859eSApple OSS Distributions 		return 0;
875*0f4c859eSApple OSS Distributions 	}
876*0f4c859eSApple OSS Distributions #endif
877*0f4c859eSApple OSS Distributions 	if (!mac_proc_check_enforce(curp)) {
878*0f4c859eSApple OSS Distributions 		return 0;
879*0f4c859eSApple OSS Distributions 	}
880*0f4c859eSApple OSS Distributions 
881*0f4c859eSApple OSS Distributions 	MAC_CHECK(proc_check_setegid, cred, egid);
882*0f4c859eSApple OSS Distributions 
883*0f4c859eSApple OSS Distributions 	return error;
884*0f4c859eSApple OSS Distributions }
885*0f4c859eSApple OSS Distributions 
886*0f4c859eSApple OSS Distributions int
mac_proc_check_setregid(proc_t curp,kauth_cred_t cred,gid_t rgid,gid_t egid)887*0f4c859eSApple OSS Distributions mac_proc_check_setregid(proc_t curp, kauth_cred_t cred, gid_t rgid, gid_t egid)
888*0f4c859eSApple OSS Distributions {
889*0f4c859eSApple OSS Distributions 	int error = 0;
890*0f4c859eSApple OSS Distributions 
891*0f4c859eSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
892*0f4c859eSApple OSS Distributions 	/* 21167099 - only check if we allow write */
893*0f4c859eSApple OSS Distributions 	if (!mac_proc_enforce) {
894*0f4c859eSApple OSS Distributions 		return 0;
895*0f4c859eSApple OSS Distributions 	}
896*0f4c859eSApple OSS Distributions #endif
897*0f4c859eSApple OSS Distributions 	if (!mac_proc_check_enforce(curp)) {
898*0f4c859eSApple OSS Distributions 		return 0;
899*0f4c859eSApple OSS Distributions 	}
900*0f4c859eSApple OSS Distributions 
901*0f4c859eSApple OSS Distributions 	MAC_CHECK(proc_check_setregid, cred, rgid, egid);
902*0f4c859eSApple OSS Distributions 
903*0f4c859eSApple OSS Distributions 	return error;
904*0f4c859eSApple OSS Distributions }
905*0f4c859eSApple OSS Distributions 
906*0f4c859eSApple OSS Distributions int
mac_proc_check_settid(proc_t curp,uid_t uid,gid_t gid)907*0f4c859eSApple OSS Distributions mac_proc_check_settid(proc_t curp, uid_t uid, gid_t gid)
908*0f4c859eSApple OSS Distributions {
909*0f4c859eSApple OSS Distributions 	kauth_cred_t pcred, tcred;
910*0f4c859eSApple OSS Distributions 	int error = 0;
911*0f4c859eSApple OSS Distributions 
912*0f4c859eSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
913*0f4c859eSApple OSS Distributions 	/* 21167099 - only check if we allow write */
914*0f4c859eSApple OSS Distributions 	if (!mac_proc_enforce) {
915*0f4c859eSApple OSS Distributions 		return 0;
916*0f4c859eSApple OSS Distributions 	}
917*0f4c859eSApple OSS Distributions #endif
918*0f4c859eSApple OSS Distributions 	if (!mac_proc_check_enforce(curp)) {
919*0f4c859eSApple OSS Distributions 		return 0;
920*0f4c859eSApple OSS Distributions 	}
921*0f4c859eSApple OSS Distributions 
922*0f4c859eSApple OSS Distributions 	pcred = kauth_cred_proc_ref(curp);
923*0f4c859eSApple OSS Distributions 	tcred = kauth_cred_get_with_ref();
924*0f4c859eSApple OSS Distributions 	MAC_CHECK(proc_check_settid, pcred, tcred, uid, gid);
925*0f4c859eSApple OSS Distributions 	kauth_cred_unref(&tcred);
926*0f4c859eSApple OSS Distributions 	kauth_cred_unref(&pcred);
927*0f4c859eSApple OSS Distributions 
928*0f4c859eSApple OSS Distributions 	return error;
929*0f4c859eSApple OSS Distributions }
930*0f4c859eSApple OSS Distributions 
931*0f4c859eSApple OSS Distributions int
mac_proc_check_launch_constraints(proc_t curp,struct image_params * imgp,os_reason_t * reasonp)932*0f4c859eSApple OSS Distributions mac_proc_check_launch_constraints(proc_t curp, struct image_params *imgp, os_reason_t *reasonp)
933*0f4c859eSApple OSS Distributions {
934*0f4c859eSApple OSS Distributions 	char *fatal_failure_desc = NULL;
935*0f4c859eSApple OSS Distributions 	size_t fatal_failure_desc_len = 0;
936*0f4c859eSApple OSS Distributions 
937*0f4c859eSApple OSS Distributions 	pid_t original_parent_id = proc_original_ppid(curp);
938*0f4c859eSApple OSS Distributions 
939*0f4c859eSApple OSS Distributions 	pid_t responsible_pid = curp->p_responsible_pid;
940*0f4c859eSApple OSS Distributions 
941*0f4c859eSApple OSS Distributions 	int error = 0;
942*0f4c859eSApple OSS Distributions 
943*0f4c859eSApple OSS Distributions 	/* Vnode of the file */
944*0f4c859eSApple OSS Distributions 	struct vnode *vp = imgp->ip_vp;
945*0f4c859eSApple OSS Distributions 
946*0f4c859eSApple OSS Distributions 	char *vn_path = NULL;
947*0f4c859eSApple OSS Distributions 	vm_size_t vn_pathlen = MAXPATHLEN;
948*0f4c859eSApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
949*0f4c859eSApple OSS Distributions 	/* 21167099 - only check if we allow write */
950*0f4c859eSApple OSS Distributions 	if (!mac_proc_enforce || !mac_vnode_enforce) {
951*0f4c859eSApple OSS Distributions 		return 0;
952*0f4c859eSApple OSS Distributions 	}
953*0f4c859eSApple OSS Distributions #endif
954*0f4c859eSApple OSS Distributions 
955*0f4c859eSApple OSS Distributions 	MAC_POLICY_ITERATE({
956*0f4c859eSApple OSS Distributions 		mpo_proc_check_launch_constraints_t *hook = mpc->mpc_ops->mpo_proc_check_launch_constraints;
957*0f4c859eSApple OSS Distributions 		if (hook == NULL) {
958*0f4c859eSApple OSS Distributions 		        continue;
959*0f4c859eSApple OSS Distributions 		}
960*0f4c859eSApple OSS Distributions 
961*0f4c859eSApple OSS Distributions 		size_t spawnattrlen = 0;
962*0f4c859eSApple OSS Distributions 		void *spawnattr = exec_spawnattr_getmacpolicyinfo(&imgp->ip_px_smpx, mpc->mpc_name, &spawnattrlen);
963*0f4c859eSApple OSS Distributions 		struct _posix_spawnattr *psa = (struct _posix_spawnattr *) imgp->ip_px_sa;
964*0f4c859eSApple OSS Distributions 		struct launch_constraint_data lcd;
965*0f4c859eSApple OSS Distributions 		lcd.launch_type = CS_LAUNCH_TYPE_NONE;
966*0f4c859eSApple OSS Distributions 
967*0f4c859eSApple OSS Distributions 		/* Check to see if psa_launch_type was initalized */
968*0f4c859eSApple OSS Distributions 		if (psa != (struct _posix_spawnattr*)NULL) {
969*0f4c859eSApple OSS Distributions 		        lcd.launch_type = psa->psa_launch_type;
970*0f4c859eSApple OSS Distributions 		}
971*0f4c859eSApple OSS Distributions 
972*0f4c859eSApple OSS Distributions 		error = mac_error_select(
973*0f4c859eSApple OSS Distributions 			hook(curp, original_parent_id, responsible_pid,
974*0f4c859eSApple OSS Distributions 			spawnattr, spawnattrlen, &lcd, &fatal_failure_desc, &fatal_failure_desc_len), error);
975*0f4c859eSApple OSS Distributions 
976*0f4c859eSApple OSS Distributions 		/*
977*0f4c859eSApple OSS Distributions 		 * Early exit in case of failure in case we have multiple registered callers.
978*0f4c859eSApple OSS Distributions 		 * This is to avoid other MACF policies from stomping on each other's failure description
979*0f4c859eSApple OSS Distributions 		 */
980*0f4c859eSApple OSS Distributions 		if (fatal_failure_desc_len) {
981*0f4c859eSApple OSS Distributions 		        goto policy_fail;
982*0f4c859eSApple OSS Distributions 		}
983*0f4c859eSApple OSS Distributions 	});
984*0f4c859eSApple OSS Distributions 
985*0f4c859eSApple OSS Distributions policy_fail:
986*0f4c859eSApple OSS Distributions 	if (fatal_failure_desc_len) {
987*0f4c859eSApple OSS Distributions 		/*
988*0f4c859eSApple OSS Distributions 		 * A fatal code signature validation failure occured, formulate a crash
989*0f4c859eSApple OSS Distributions 		 * reason.
990*0f4c859eSApple OSS Distributions 		 */
991*0f4c859eSApple OSS Distributions 
992*0f4c859eSApple OSS Distributions 		char const *path = NULL;
993*0f4c859eSApple OSS Distributions 
994*0f4c859eSApple OSS Distributions 		vn_path = zalloc(ZV_NAMEI);
995*0f4c859eSApple OSS Distributions 		if (vn_getpath(vp, vn_path, (int*)&vn_pathlen) == 0) {
996*0f4c859eSApple OSS Distributions 			path = vn_path;
997*0f4c859eSApple OSS Distributions 		} else {
998*0f4c859eSApple OSS Distributions 			path = "(get vnode path failed)";
999*0f4c859eSApple OSS Distributions 		}
1000*0f4c859eSApple OSS Distributions 
1001*0f4c859eSApple OSS Distributions 		if (error == 0) {
1002*0f4c859eSApple OSS Distributions 			panic("%s: MAC hook returned no error, but status is claimed to be fatal? "
1003*0f4c859eSApple OSS Distributions 			    "path: '%s', fatal_failure_desc_len: %ld, fatal_failure_desc:\n%s\n",
1004*0f4c859eSApple OSS Distributions 			    __func__, path, fatal_failure_desc_len, fatal_failure_desc);
1005*0f4c859eSApple OSS Distributions 		}
1006*0f4c859eSApple OSS Distributions 
1007*0f4c859eSApple OSS Distributions 		os_reason_t reason = os_reason_create(OS_REASON_CODESIGNING,
1008*0f4c859eSApple OSS Distributions 		    CODESIGNING_EXIT_REASON_LAUNCH_CONSTRAINT_VIOLATION);
1009*0f4c859eSApple OSS Distributions 
1010*0f4c859eSApple OSS Distributions 		*reasonp = reason;
1011*0f4c859eSApple OSS Distributions 
1012*0f4c859eSApple OSS Distributions 		reason->osr_flags = (OS_REASON_FLAG_GENERATE_CRASH_REPORT |
1013*0f4c859eSApple OSS Distributions 		    OS_REASON_FLAG_CONSISTENT_FAILURE);
1014*0f4c859eSApple OSS Distributions 
1015*0f4c859eSApple OSS Distributions 		if (fatal_failure_desc != NULL) {
1016*0f4c859eSApple OSS Distributions 			mach_vm_address_t data_addr = 0;
1017*0f4c859eSApple OSS Distributions 
1018*0f4c859eSApple OSS Distributions 			int reason_error = 0;
1019*0f4c859eSApple OSS Distributions 			int kcdata_error = 0;
1020*0f4c859eSApple OSS Distributions 
1021*0f4c859eSApple OSS Distributions 			if ((reason_error = os_reason_alloc_buffer_noblock(reason,
1022*0f4c859eSApple OSS Distributions 			    kcdata_estimate_required_buffer_size(1,
1023*0f4c859eSApple OSS Distributions 			    (uint32_t)fatal_failure_desc_len))) == 0) {
1024*0f4c859eSApple OSS Distributions 				if ((kcdata_error = kcdata_get_memory_addr(&reason->osr_kcd_descriptor,
1025*0f4c859eSApple OSS Distributions 				    EXIT_REASON_USER_DESC, (uint32_t)fatal_failure_desc_len,
1026*0f4c859eSApple OSS Distributions 				    &data_addr)) == KERN_SUCCESS) {
1027*0f4c859eSApple OSS Distributions 					kcdata_memcpy(&reason->osr_kcd_descriptor, (mach_vm_address_t)data_addr,
1028*0f4c859eSApple OSS Distributions 					    fatal_failure_desc, (uint32_t)fatal_failure_desc_len);
1029*0f4c859eSApple OSS Distributions 				}
1030*0f4c859eSApple OSS Distributions 			}
1031*0f4c859eSApple OSS Distributions 		}
1032*0f4c859eSApple OSS Distributions 	}
1033*0f4c859eSApple OSS Distributions 
1034*0f4c859eSApple OSS Distributions 	if (vn_path) {
1035*0f4c859eSApple OSS Distributions 		zfree(ZV_NAMEI, vn_path);
1036*0f4c859eSApple OSS Distributions 	}
1037*0f4c859eSApple OSS Distributions 
1038*0f4c859eSApple OSS Distributions 	if (fatal_failure_desc_len > 0 && fatal_failure_desc != NULL) {
1039*0f4c859eSApple OSS Distributions 		kfree_data(fatal_failure_desc, fatal_failure_desc_len);
1040*0f4c859eSApple OSS Distributions 	}
1041*0f4c859eSApple OSS Distributions 
1042*0f4c859eSApple OSS Distributions 	return error;
1043*0f4c859eSApple OSS Distributions }
1044