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