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