xref: /xnu-8019.80.24/security/mac_vfs.c (revision a325d9c4a84054e40bbe985afedcb50ab80993ea)
1*a325d9c4SApple OSS Distributions /*
2*a325d9c4SApple OSS Distributions  * Copyright (c) 2007-2016 Apple Inc. All rights reserved.
3*a325d9c4SApple OSS Distributions  *
4*a325d9c4SApple OSS Distributions  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5*a325d9c4SApple OSS Distributions  *
6*a325d9c4SApple OSS Distributions  * This file contains Original Code and/or Modifications of Original Code
7*a325d9c4SApple OSS Distributions  * as defined in and that are subject to the Apple Public Source License
8*a325d9c4SApple OSS Distributions  * Version 2.0 (the 'License'). You may not use this file except in
9*a325d9c4SApple OSS Distributions  * compliance with the License. The rights granted to you under the License
10*a325d9c4SApple OSS Distributions  * may not be used to create, or enable the creation or redistribution of,
11*a325d9c4SApple OSS Distributions  * unlawful or unlicensed copies of an Apple operating system, or to
12*a325d9c4SApple OSS Distributions  * circumvent, violate, or enable the circumvention or violation of, any
13*a325d9c4SApple OSS Distributions  * terms of an Apple operating system software license agreement.
14*a325d9c4SApple OSS Distributions  *
15*a325d9c4SApple OSS Distributions  * Please obtain a copy of the License at
16*a325d9c4SApple OSS Distributions  * http://www.opensource.apple.com/apsl/ and read it before using this file.
17*a325d9c4SApple OSS Distributions  *
18*a325d9c4SApple OSS Distributions  * The Original Code and all software distributed under the License are
19*a325d9c4SApple OSS Distributions  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20*a325d9c4SApple OSS Distributions  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21*a325d9c4SApple OSS Distributions  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22*a325d9c4SApple OSS Distributions  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23*a325d9c4SApple OSS Distributions  * Please see the License for the specific language governing rights and
24*a325d9c4SApple OSS Distributions  * limitations under the License.
25*a325d9c4SApple OSS Distributions  *
26*a325d9c4SApple OSS Distributions  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27*a325d9c4SApple OSS Distributions  */
28*a325d9c4SApple OSS Distributions /*-
29*a325d9c4SApple OSS Distributions  * Copyright (c) 1999, 2000, 2001, 2002 Robert N. M. Watson
30*a325d9c4SApple OSS Distributions  * Copyright (c) 2001 Ilmar S. Habibulin
31*a325d9c4SApple OSS Distributions  * Copyright (c) 2001, 2002, 2003, 2004 Networks Associates Technology, Inc.
32*a325d9c4SApple OSS Distributions  * Copyright (c) 2005 SPARTA, Inc.
33*a325d9c4SApple OSS Distributions  *
34*a325d9c4SApple OSS Distributions  * This software was developed by Robert Watson and Ilmar Habibulin for the
35*a325d9c4SApple OSS Distributions  * TrustedBSD Project.
36*a325d9c4SApple OSS Distributions  *
37*a325d9c4SApple OSS Distributions  * This software was developed for the FreeBSD Project in part by Network
38*a325d9c4SApple OSS Distributions  * Associates Laboratories, the Security Research Division of Network
39*a325d9c4SApple OSS Distributions  * Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035 ("CBOSS"),
40*a325d9c4SApple OSS Distributions  * as part of the DARPA CHATS research program.
41*a325d9c4SApple OSS Distributions  *
42*a325d9c4SApple OSS Distributions  * Redistribution and use in source and binary forms, with or without
43*a325d9c4SApple OSS Distributions  * modification, are permitted provided that the following conditions
44*a325d9c4SApple OSS Distributions  * are met:
45*a325d9c4SApple OSS Distributions  * 1. Redistributions of source code must retain the above copyright
46*a325d9c4SApple OSS Distributions  *    notice, this list of conditions and the following disclaimer.
47*a325d9c4SApple OSS Distributions  * 2. Redistributions in binary form must reproduce the above copyright
48*a325d9c4SApple OSS Distributions  *    notice, this list of conditions and the following disclaimer in the
49*a325d9c4SApple OSS Distributions  *    documentation and/or other materials provided with the distribution.
50*a325d9c4SApple OSS Distributions  *
51*a325d9c4SApple OSS Distributions  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
52*a325d9c4SApple OSS Distributions  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
53*a325d9c4SApple OSS Distributions  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
54*a325d9c4SApple OSS Distributions  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
55*a325d9c4SApple OSS Distributions  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
56*a325d9c4SApple OSS Distributions  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
57*a325d9c4SApple OSS Distributions  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
58*a325d9c4SApple OSS Distributions  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
59*a325d9c4SApple OSS Distributions  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
60*a325d9c4SApple OSS Distributions  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
61*a325d9c4SApple OSS Distributions  * SUCH DAMAGE.
62*a325d9c4SApple OSS Distributions  *
63*a325d9c4SApple OSS Distributions  */
64*a325d9c4SApple OSS Distributions 
65*a325d9c4SApple OSS Distributions #include <kern/kalloc.h>
66*a325d9c4SApple OSS Distributions #include <libkern/OSAtomic.h>
67*a325d9c4SApple OSS Distributions 
68*a325d9c4SApple OSS Distributions #include <sys/param.h>
69*a325d9c4SApple OSS Distributions #include <sys/systm.h>
70*a325d9c4SApple OSS Distributions #include <sys/kernel.h>
71*a325d9c4SApple OSS Distributions #include <sys/proc.h>
72*a325d9c4SApple OSS Distributions #include <sys/kauth.h>
73*a325d9c4SApple OSS Distributions 
74*a325d9c4SApple OSS Distributions #include <sys/file_internal.h>
75*a325d9c4SApple OSS Distributions #include <sys/imgact.h>
76*a325d9c4SApple OSS Distributions #include <sys/namei.h>
77*a325d9c4SApple OSS Distributions #include <sys/mount_internal.h>
78*a325d9c4SApple OSS Distributions #include <sys/pipe.h>
79*a325d9c4SApple OSS Distributions #include <sys/posix_sem.h>
80*a325d9c4SApple OSS Distributions #include <sys/posix_shm.h>
81*a325d9c4SApple OSS Distributions #include <sys/reason.h>
82*a325d9c4SApple OSS Distributions #include <sys/uio_internal.h>
83*a325d9c4SApple OSS Distributions #include <sys/vnode_internal.h>
84*a325d9c4SApple OSS Distributions #include <sys/kdebug.h>
85*a325d9c4SApple OSS Distributions 
86*a325d9c4SApple OSS Distributions 
87*a325d9c4SApple OSS Distributions #include <miscfs/devfs/devfsdefs.h>
88*a325d9c4SApple OSS Distributions #include <miscfs/devfs/fdesc.h>
89*a325d9c4SApple OSS Distributions 
90*a325d9c4SApple OSS Distributions #include <security/mac_internal.h>
91*a325d9c4SApple OSS Distributions 
92*a325d9c4SApple OSS Distributions /* convert {R,W,X}_OK values to V{READ,WRITE,EXEC} */
93*a325d9c4SApple OSS Distributions #define ACCESS_MODE_TO_VNODE_MASK(m)    (m << 6)
94*a325d9c4SApple OSS Distributions 
95*a325d9c4SApple OSS Distributions 
96*a325d9c4SApple OSS Distributions /*
97*a325d9c4SApple OSS Distributions  * Optional tracing of policy operations. Define VFS_TRACE_POLICY_OPS to trace the operations.
98*a325d9c4SApple OSS Distributions  *
99*a325d9c4SApple OSS Distributions  * Along with DBG_FSYSTEM and DBG_VFS, dcode in the macros below is used to construct
100*a325d9c4SApple OSS Distributions  * KDBG_EVENTID(DBG_FSYSTEM, DBG_VFS, dcode) global event id, see bsd/sys/kdebug.h.
101*a325d9c4SApple OSS Distributions  * Note that dcode is multiplied by 4 and ORed as part of the construction. See bsd/kern/trace_codes
102*a325d9c4SApple OSS Distributions  * for list of system-wide {global event id, name} pairs. Currently DBG_VFS event ids are in range
103*a325d9c4SApple OSS Distributions  * [0x3130000, 0x3130184].
104*a325d9c4SApple OSS Distributions  */
105*a325d9c4SApple OSS Distributions 
106*a325d9c4SApple OSS Distributions //#define VFS_TRACE_POLICY_OPS
107*a325d9c4SApple OSS Distributions 
108*a325d9c4SApple OSS Distributions #ifdef VFS_TRACE_POLICY_OPS
109*a325d9c4SApple OSS Distributions #define DBG_VFS_CODE(dcode)                     FSDBG_CODE(DBG_VFS, dcode)
110*a325d9c4SApple OSS Distributions #define VFS_KERNEL_DEBUG_START0(dcode)          KERNEL_DEBUG_CONSTANT(DBG_VFS_CODE(dcode) | DBG_FUNC_START, 0, 0, 0, 0, 0)
111*a325d9c4SApple OSS Distributions #define VFS_KERNEL_DEBUG_END0(dcode)            KERNEL_DEBUG_CONSTANT(DBG_VFS_CODE(dcode) | DBG_FUNC_END, 0, 0, 0, 0, 0)
112*a325d9c4SApple OSS Distributions #define VFS_KERNEL_DEBUG_START1(dcode, darg)    KERNEL_DEBUG_CONSTANT(DBG_VFS_CODE(dcode) | DBG_FUNC_START, darg, 0, 0, 0, 0)
113*a325d9c4SApple OSS Distributions #define VFS_KERNEL_DEBUG_END1(dcode, darg)      KERNEL_DEBUG_CONSTANT(DBG_VFS_CODE(dcode) | DBG_FUNC_END, darg, 0, 0, 0, 0)
114*a325d9c4SApple OSS Distributions #else
115*a325d9c4SApple OSS Distributions #define VFS_KERNEL_DEBUG_START0(dcode)          do {} while (0)
116*a325d9c4SApple OSS Distributions #define VFS_KERNEL_DEBUG_END0(dcode)            do {} while (0)
117*a325d9c4SApple OSS Distributions #define VFS_KERNEL_DEBUG_START1(dcode, darg)    do {} while (0)
118*a325d9c4SApple OSS Distributions #define VFS_KERNEL_DEBUG_END1(dcode, darg)      do {} while (0)
119*a325d9c4SApple OSS Distributions #endif
120*a325d9c4SApple OSS Distributions 
121*a325d9c4SApple OSS Distributions void
mac_devfs_label_init(struct devnode * de)122*a325d9c4SApple OSS Distributions mac_devfs_label_init(struct devnode *de)
123*a325d9c4SApple OSS Distributions {
124*a325d9c4SApple OSS Distributions 	mac_labelzone_alloc_owned(&de->dn_label, MAC_WAITOK, ^(struct label *label) {
125*a325d9c4SApple OSS Distributions 		VFS_KERNEL_DEBUG_START0(0);
126*a325d9c4SApple OSS Distributions 		MAC_PERFORM(devfs_label_init, label);
127*a325d9c4SApple OSS Distributions 		VFS_KERNEL_DEBUG_END0(0);
128*a325d9c4SApple OSS Distributions 	});
129*a325d9c4SApple OSS Distributions }
130*a325d9c4SApple OSS Distributions 
131*a325d9c4SApple OSS Distributions struct label *
mac_devfs_label(struct devnode * de)132*a325d9c4SApple OSS Distributions mac_devfs_label(struct devnode *de)
133*a325d9c4SApple OSS Distributions {
134*a325d9c4SApple OSS Distributions 	return mac_label_verify(&de->dn_label);
135*a325d9c4SApple OSS Distributions }
136*a325d9c4SApple OSS Distributions 
137*a325d9c4SApple OSS Distributions void
mac_devfs_label_destroy(struct devnode * de)138*a325d9c4SApple OSS Distributions mac_devfs_label_destroy(struct devnode *de)
139*a325d9c4SApple OSS Distributions {
140*a325d9c4SApple OSS Distributions 	mac_labelzone_free_owned(&de->dn_label, ^(struct label *label) {
141*a325d9c4SApple OSS Distributions 		VFS_KERNEL_DEBUG_START1(3, label);
142*a325d9c4SApple OSS Distributions 		MAC_PERFORM(devfs_label_destroy, label);
143*a325d9c4SApple OSS Distributions 		VFS_KERNEL_DEBUG_END1(3, label);
144*a325d9c4SApple OSS Distributions 	});
145*a325d9c4SApple OSS Distributions }
146*a325d9c4SApple OSS Distributions 
147*a325d9c4SApple OSS Distributions void
mac_mount_label_init(struct mount * mp)148*a325d9c4SApple OSS Distributions mac_mount_label_init(struct mount *mp)
149*a325d9c4SApple OSS Distributions {
150*a325d9c4SApple OSS Distributions 	mac_labelzone_alloc_owned(&mp->mnt_mntlabel, MAC_WAITOK, ^(struct label *label) {
151*a325d9c4SApple OSS Distributions 		VFS_KERNEL_DEBUG_START0(1);
152*a325d9c4SApple OSS Distributions 		MAC_PERFORM(mount_label_init, label);
153*a325d9c4SApple OSS Distributions 		VFS_KERNEL_DEBUG_END0(1);
154*a325d9c4SApple OSS Distributions 	});
155*a325d9c4SApple OSS Distributions }
156*a325d9c4SApple OSS Distributions 
157*a325d9c4SApple OSS Distributions struct label *
mac_mount_label(struct mount * mp)158*a325d9c4SApple OSS Distributions mac_mount_label(struct mount *mp)
159*a325d9c4SApple OSS Distributions {
160*a325d9c4SApple OSS Distributions 	return mac_label_verify(&mp->mnt_mntlabel);
161*a325d9c4SApple OSS Distributions }
162*a325d9c4SApple OSS Distributions 
163*a325d9c4SApple OSS Distributions void
mac_mount_label_destroy(struct mount * mp)164*a325d9c4SApple OSS Distributions mac_mount_label_destroy(struct mount *mp)
165*a325d9c4SApple OSS Distributions {
166*a325d9c4SApple OSS Distributions 	mac_labelzone_free_owned(&mp->mnt_mntlabel, ^(struct label *label) {
167*a325d9c4SApple OSS Distributions 		VFS_KERNEL_DEBUG_START1(4, label);
168*a325d9c4SApple OSS Distributions 		MAC_PERFORM(mount_label_destroy, label);
169*a325d9c4SApple OSS Distributions 		VFS_KERNEL_DEBUG_END1(4, label);
170*a325d9c4SApple OSS Distributions 	});
171*a325d9c4SApple OSS Distributions }
172*a325d9c4SApple OSS Distributions 
173*a325d9c4SApple OSS Distributions struct label *
mac_vnode_label_alloc(vnode_t vp)174*a325d9c4SApple OSS Distributions mac_vnode_label_alloc(vnode_t vp)
175*a325d9c4SApple OSS Distributions {
176*a325d9c4SApple OSS Distributions 	return mac_labelzone_alloc_for_owner(vp ? &vp->v_label : NULL, MAC_WAITOK, ^(struct label *label) {
177*a325d9c4SApple OSS Distributions 		VFS_KERNEL_DEBUG_START0(2);
178*a325d9c4SApple OSS Distributions 		MAC_PERFORM(vnode_label_init, label);
179*a325d9c4SApple OSS Distributions 		VFS_KERNEL_DEBUG_END0(2);
180*a325d9c4SApple OSS Distributions 		OSIncrementAtomic(&mac_vnode_label_count);
181*a325d9c4SApple OSS Distributions 	});
182*a325d9c4SApple OSS Distributions }
183*a325d9c4SApple OSS Distributions 
184*a325d9c4SApple OSS Distributions void
mac_vnode_label_init(vnode_t vp)185*a325d9c4SApple OSS Distributions mac_vnode_label_init(vnode_t vp)
186*a325d9c4SApple OSS Distributions {
187*a325d9c4SApple OSS Distributions 	struct label *label;
188*a325d9c4SApple OSS Distributions 
189*a325d9c4SApple OSS Distributions 	label = mac_vnode_label_alloc(vp);
190*a325d9c4SApple OSS Distributions 	vp->v_label = label;
191*a325d9c4SApple OSS Distributions }
192*a325d9c4SApple OSS Distributions 
193*a325d9c4SApple OSS Distributions struct label *
mac_vnode_label(vnode_t vp)194*a325d9c4SApple OSS Distributions mac_vnode_label(vnode_t vp)
195*a325d9c4SApple OSS Distributions {
196*a325d9c4SApple OSS Distributions 	return mac_label_verify(&vp->v_label);
197*a325d9c4SApple OSS Distributions }
198*a325d9c4SApple OSS Distributions 
199*a325d9c4SApple OSS Distributions static void
mac_vnode_label_cleanup(struct label * label)200*a325d9c4SApple OSS Distributions mac_vnode_label_cleanup(struct label *label)
201*a325d9c4SApple OSS Distributions {
202*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(5, label);
203*a325d9c4SApple OSS Distributions 	MAC_PERFORM(vnode_label_destroy, label);
204*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(5, label);
205*a325d9c4SApple OSS Distributions 	OSDecrementAtomic(&mac_vnode_label_count);
206*a325d9c4SApple OSS Distributions }
207*a325d9c4SApple OSS Distributions 
208*a325d9c4SApple OSS Distributions void
mac_vnode_label_free(struct label * label)209*a325d9c4SApple OSS Distributions mac_vnode_label_free(struct label *label)
210*a325d9c4SApple OSS Distributions {
211*a325d9c4SApple OSS Distributions 	if (label != NULL) {
212*a325d9c4SApple OSS Distributions 		mac_vnode_label_cleanup(label);
213*a325d9c4SApple OSS Distributions 		mac_labelzone_free(label);
214*a325d9c4SApple OSS Distributions 	}
215*a325d9c4SApple OSS Distributions }
216*a325d9c4SApple OSS Distributions 
217*a325d9c4SApple OSS Distributions void
mac_vnode_label_destroy(struct vnode * vp)218*a325d9c4SApple OSS Distributions mac_vnode_label_destroy(struct vnode *vp)
219*a325d9c4SApple OSS Distributions {
220*a325d9c4SApple OSS Distributions 	mac_labelzone_free_owned(&vp->v_label, ^(struct label *label) {
221*a325d9c4SApple OSS Distributions 		mac_vnode_label_cleanup(label);
222*a325d9c4SApple OSS Distributions 	});
223*a325d9c4SApple OSS Distributions }
224*a325d9c4SApple OSS Distributions 
225*a325d9c4SApple OSS Distributions int
mac_vnode_label_init_needed(vnode_t vp)226*a325d9c4SApple OSS Distributions mac_vnode_label_init_needed(vnode_t vp)
227*a325d9c4SApple OSS Distributions {
228*a325d9c4SApple OSS Distributions #if CONFIG_MACF_LAZY_VNODE_LABELS
229*a325d9c4SApple OSS Distributions 	(void)vp;
230*a325d9c4SApple OSS Distributions 	return false;
231*a325d9c4SApple OSS Distributions #else
232*a325d9c4SApple OSS Distributions 	return mac_label_vnodes != 0 && mac_vnode_label(vp) == NULL;
233*a325d9c4SApple OSS Distributions #endif
234*a325d9c4SApple OSS Distributions }
235*a325d9c4SApple OSS Distributions 
236*a325d9c4SApple OSS Distributions struct label *
mac_vnode_label_allocate(vnode_t vp)237*a325d9c4SApple OSS Distributions mac_vnode_label_allocate(vnode_t vp)
238*a325d9c4SApple OSS Distributions {
239*a325d9c4SApple OSS Distributions 	if (mac_vnode_label_init_needed(vp)) {
240*a325d9c4SApple OSS Distributions 		mac_vnode_label_init(vp);
241*a325d9c4SApple OSS Distributions 	}
242*a325d9c4SApple OSS Distributions 	return mac_vnode_label(vp);
243*a325d9c4SApple OSS Distributions }
244*a325d9c4SApple OSS Distributions 
245*a325d9c4SApple OSS Distributions /*
246*a325d9c4SApple OSS Distributions  * vnode labels are allocated at the same time as vnodes, but vnodes are never
247*a325d9c4SApple OSS Distributions  * freed.  Instead, we want to remove any sensitive information before putting
248*a325d9c4SApple OSS Distributions  * them on the free list for reuse.
249*a325d9c4SApple OSS Distributions  */
250*a325d9c4SApple OSS Distributions void
mac_vnode_label_recycle(vnode_t vp)251*a325d9c4SApple OSS Distributions mac_vnode_label_recycle(vnode_t vp)
252*a325d9c4SApple OSS Distributions {
253*a325d9c4SApple OSS Distributions 	struct label *v_label = mac_vnode_label(vp);
254*a325d9c4SApple OSS Distributions 
255*a325d9c4SApple OSS Distributions 	MAC_PERFORM(vnode_label_recycle, v_label);
256*a325d9c4SApple OSS Distributions #if CONFIG_MACF_LAZY_VNODE_LABELS
257*a325d9c4SApple OSS Distributions 	if (v_label) {
258*a325d9c4SApple OSS Distributions 		mac_vnode_label_destroy(vp);
259*a325d9c4SApple OSS Distributions 		vp->v_lflag &= ~VL_LABELED;
260*a325d9c4SApple OSS Distributions 	}
261*a325d9c4SApple OSS Distributions #endif
262*a325d9c4SApple OSS Distributions }
263*a325d9c4SApple OSS Distributions 
264*a325d9c4SApple OSS Distributions void
mac_vnode_label_copy(struct label * src,struct label * dest)265*a325d9c4SApple OSS Distributions mac_vnode_label_copy(struct label *src, struct label *dest)
266*a325d9c4SApple OSS Distributions {
267*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(6, src);
268*a325d9c4SApple OSS Distributions 	if (src == NULL) {
269*a325d9c4SApple OSS Distributions 		MAC_PERFORM(vnode_label_init, dest);
270*a325d9c4SApple OSS Distributions 	} else {
271*a325d9c4SApple OSS Distributions 		MAC_PERFORM(vnode_label_copy, src, dest);
272*a325d9c4SApple OSS Distributions 	}
273*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(6, src);
274*a325d9c4SApple OSS Distributions }
275*a325d9c4SApple OSS Distributions 
276*a325d9c4SApple OSS Distributions int
mac_vnode_label_externalize_audit(struct vnode * vp,struct mac * mac)277*a325d9c4SApple OSS Distributions mac_vnode_label_externalize_audit(struct vnode *vp, struct mac *mac)
278*a325d9c4SApple OSS Distributions {
279*a325d9c4SApple OSS Distributions 	int error;
280*a325d9c4SApple OSS Distributions 
281*a325d9c4SApple OSS Distributions 	/* It is assumed that any necessary vnode locking is done on entry */
282*a325d9c4SApple OSS Distributions 	error = MAC_EXTERNALIZE_AUDIT(vnode, mac_vnode_label(vp),
283*a325d9c4SApple OSS Distributions 	    mac->m_string, mac->m_buflen);
284*a325d9c4SApple OSS Distributions 
285*a325d9c4SApple OSS Distributions 	return error;
286*a325d9c4SApple OSS Distributions }
287*a325d9c4SApple OSS Distributions 
288*a325d9c4SApple OSS Distributions int
mac_vnode_label_externalize(struct label * label,char * elements,char * outbuf,size_t outbuflen,int flags __unused)289*a325d9c4SApple OSS Distributions mac_vnode_label_externalize(struct label *label, char *elements,
290*a325d9c4SApple OSS Distributions     char *outbuf, size_t outbuflen, int flags __unused)
291*a325d9c4SApple OSS Distributions {
292*a325d9c4SApple OSS Distributions 	int error;
293*a325d9c4SApple OSS Distributions 
294*a325d9c4SApple OSS Distributions 	error = MAC_EXTERNALIZE(vnode, label, elements, outbuf, outbuflen);
295*a325d9c4SApple OSS Distributions 
296*a325d9c4SApple OSS Distributions 	return error;
297*a325d9c4SApple OSS Distributions }
298*a325d9c4SApple OSS Distributions 
299*a325d9c4SApple OSS Distributions int
mac_vnode_label_internalize(struct label * label,char * string)300*a325d9c4SApple OSS Distributions mac_vnode_label_internalize(struct label *label, char *string)
301*a325d9c4SApple OSS Distributions {
302*a325d9c4SApple OSS Distributions 	int error;
303*a325d9c4SApple OSS Distributions 
304*a325d9c4SApple OSS Distributions 	error = MAC_INTERNALIZE(vnode, label, string);
305*a325d9c4SApple OSS Distributions 
306*a325d9c4SApple OSS Distributions 	return error;
307*a325d9c4SApple OSS Distributions }
308*a325d9c4SApple OSS Distributions 
309*a325d9c4SApple OSS Distributions int
mac_mount_label_internalize(struct label * label,char * string)310*a325d9c4SApple OSS Distributions mac_mount_label_internalize(struct label *label, char *string)
311*a325d9c4SApple OSS Distributions {
312*a325d9c4SApple OSS Distributions 	int error;
313*a325d9c4SApple OSS Distributions 
314*a325d9c4SApple OSS Distributions 	error = MAC_INTERNALIZE(mount, label, string);
315*a325d9c4SApple OSS Distributions 
316*a325d9c4SApple OSS Distributions 	return error;
317*a325d9c4SApple OSS Distributions }
318*a325d9c4SApple OSS Distributions 
319*a325d9c4SApple OSS Distributions int
mac_mount_label_externalize(struct label * label,char * elements,char * outbuf,size_t outbuflen)320*a325d9c4SApple OSS Distributions mac_mount_label_externalize(struct label *label, char *elements,
321*a325d9c4SApple OSS Distributions     char *outbuf, size_t outbuflen)
322*a325d9c4SApple OSS Distributions {
323*a325d9c4SApple OSS Distributions 	int error;
324*a325d9c4SApple OSS Distributions 
325*a325d9c4SApple OSS Distributions 	error = MAC_EXTERNALIZE(mount, label, elements, outbuf, outbuflen);
326*a325d9c4SApple OSS Distributions 
327*a325d9c4SApple OSS Distributions 	return error;
328*a325d9c4SApple OSS Distributions }
329*a325d9c4SApple OSS Distributions 
330*a325d9c4SApple OSS Distributions void
mac_devfs_label_copy(struct label * src,struct label * dest)331*a325d9c4SApple OSS Distributions mac_devfs_label_copy(struct label *src, struct label *dest)
332*a325d9c4SApple OSS Distributions {
333*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
334*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
335*a325d9c4SApple OSS Distributions 	if (!mac_device_enforce) {
336*a325d9c4SApple OSS Distributions 		return;
337*a325d9c4SApple OSS Distributions 	}
338*a325d9c4SApple OSS Distributions #endif
339*a325d9c4SApple OSS Distributions 
340*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(7, src);
341*a325d9c4SApple OSS Distributions 	MAC_PERFORM(devfs_label_copy, src, dest);
342*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(7, src);
343*a325d9c4SApple OSS Distributions }
344*a325d9c4SApple OSS Distributions 
345*a325d9c4SApple OSS Distributions void
mac_devfs_label_update(struct mount * mp,struct devnode * de,struct vnode * vp)346*a325d9c4SApple OSS Distributions mac_devfs_label_update(struct mount *mp, struct devnode *de,
347*a325d9c4SApple OSS Distributions     struct vnode *vp)
348*a325d9c4SApple OSS Distributions {
349*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
350*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
351*a325d9c4SApple OSS Distributions 	if (!mac_device_enforce) {
352*a325d9c4SApple OSS Distributions 		return;
353*a325d9c4SApple OSS Distributions 	}
354*a325d9c4SApple OSS Distributions #endif
355*a325d9c4SApple OSS Distributions 
356*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(8, vp);
357*a325d9c4SApple OSS Distributions 	MAC_PERFORM(devfs_label_update, mp, de, mac_devfs_label(de), vp,
358*a325d9c4SApple OSS Distributions 	    mac_vnode_label(vp));
359*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(8, vp);
360*a325d9c4SApple OSS Distributions }
361*a325d9c4SApple OSS Distributions 
362*a325d9c4SApple OSS Distributions int
mac_vnode_label_associate(struct mount * mp,struct vnode * vp,vfs_context_t ctx)363*a325d9c4SApple OSS Distributions mac_vnode_label_associate(struct mount *mp, struct vnode *vp, vfs_context_t ctx)
364*a325d9c4SApple OSS Distributions {
365*a325d9c4SApple OSS Distributions 	struct devnode *dnp;
366*a325d9c4SApple OSS Distributions 	struct fdescnode *fnp;
367*a325d9c4SApple OSS Distributions 	int error = 0;
368*a325d9c4SApple OSS Distributions 
369*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
370*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
371*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
372*a325d9c4SApple OSS Distributions 		return error;
373*a325d9c4SApple OSS Distributions 	}
374*a325d9c4SApple OSS Distributions #endif
375*a325d9c4SApple OSS Distributions 
376*a325d9c4SApple OSS Distributions 	/* XXX: should not inspect v_tag in kernel! */
377*a325d9c4SApple OSS Distributions 	switch (vp->v_tag) {
378*a325d9c4SApple OSS Distributions 	case VT_DEVFS:
379*a325d9c4SApple OSS Distributions 		dnp = VTODN(vp);
380*a325d9c4SApple OSS Distributions 		mac_vnode_label_associate_devfs(mp, dnp, vp);
381*a325d9c4SApple OSS Distributions 		break;
382*a325d9c4SApple OSS Distributions 	case VT_FDESC:
383*a325d9c4SApple OSS Distributions 		fnp = VTOFDESC(vp);
384*a325d9c4SApple OSS Distributions 		error = mac_vnode_label_associate_fdesc(mp, fnp, vp, ctx);
385*a325d9c4SApple OSS Distributions 		break;
386*a325d9c4SApple OSS Distributions 	default:
387*a325d9c4SApple OSS Distributions 		error = mac_vnode_label_associate_extattr(mp, vp);
388*a325d9c4SApple OSS Distributions 		break;
389*a325d9c4SApple OSS Distributions 	}
390*a325d9c4SApple OSS Distributions 
391*a325d9c4SApple OSS Distributions 	return error;
392*a325d9c4SApple OSS Distributions }
393*a325d9c4SApple OSS Distributions 
394*a325d9c4SApple OSS Distributions void
mac_vnode_label_associate_devfs(struct mount * mp,struct devnode * de,struct vnode * vp)395*a325d9c4SApple OSS Distributions mac_vnode_label_associate_devfs(struct mount *mp, struct devnode *de,
396*a325d9c4SApple OSS Distributions     struct vnode *vp)
397*a325d9c4SApple OSS Distributions {
398*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
399*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
400*a325d9c4SApple OSS Distributions 	if (!mac_device_enforce) {
401*a325d9c4SApple OSS Distributions 		return;
402*a325d9c4SApple OSS Distributions 	}
403*a325d9c4SApple OSS Distributions #endif
404*a325d9c4SApple OSS Distributions 
405*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(9, vp);
406*a325d9c4SApple OSS Distributions 	MAC_PERFORM(vnode_label_associate_devfs,
407*a325d9c4SApple OSS Distributions 	    mp, mp ? mac_mount_label(mp) : NULL,
408*a325d9c4SApple OSS Distributions 	    de, mac_devfs_label(de),
409*a325d9c4SApple OSS Distributions 	    vp, mac_vnode_label(vp));
410*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(9, vp);
411*a325d9c4SApple OSS Distributions }
412*a325d9c4SApple OSS Distributions 
413*a325d9c4SApple OSS Distributions int
mac_vnode_label_associate_extattr(struct mount * mp,struct vnode * vp)414*a325d9c4SApple OSS Distributions mac_vnode_label_associate_extattr(struct mount *mp, struct vnode *vp)
415*a325d9c4SApple OSS Distributions {
416*a325d9c4SApple OSS Distributions 	int error;
417*a325d9c4SApple OSS Distributions 
418*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(10, vp);
419*a325d9c4SApple OSS Distributions 	MAC_CHECK(vnode_label_associate_extattr, mp, mac_mount_label(mp), vp,
420*a325d9c4SApple OSS Distributions 	    mac_vnode_label(vp));
421*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(10, vp);
422*a325d9c4SApple OSS Distributions 
423*a325d9c4SApple OSS Distributions 	return error;
424*a325d9c4SApple OSS Distributions }
425*a325d9c4SApple OSS Distributions 
426*a325d9c4SApple OSS Distributions void
mac_vnode_label_associate_singlelabel(struct mount * mp,struct vnode * vp)427*a325d9c4SApple OSS Distributions mac_vnode_label_associate_singlelabel(struct mount *mp, struct vnode *vp)
428*a325d9c4SApple OSS Distributions {
429*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
430*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
431*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
432*a325d9c4SApple OSS Distributions 		return;
433*a325d9c4SApple OSS Distributions 	}
434*a325d9c4SApple OSS Distributions #endif
435*a325d9c4SApple OSS Distributions 	if (!mac_label_vnodes) {
436*a325d9c4SApple OSS Distributions 		return;
437*a325d9c4SApple OSS Distributions 	}
438*a325d9c4SApple OSS Distributions 
439*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(11, vp);
440*a325d9c4SApple OSS Distributions 	MAC_PERFORM(vnode_label_associate_singlelabel, mp,
441*a325d9c4SApple OSS Distributions 	    mp ? mac_mount_label(mp) : NULL, vp, mac_vnode_label(vp));
442*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(11, vp);
443*a325d9c4SApple OSS Distributions }
444*a325d9c4SApple OSS Distributions 
445*a325d9c4SApple OSS Distributions int
mac_vnode_notify_create(vfs_context_t ctx,struct mount * mp,struct vnode * dvp,struct vnode * vp,struct componentname * cnp)446*a325d9c4SApple OSS Distributions mac_vnode_notify_create(vfs_context_t ctx, struct mount *mp,
447*a325d9c4SApple OSS Distributions     struct vnode *dvp, struct vnode *vp, struct componentname *cnp)
448*a325d9c4SApple OSS Distributions {
449*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
450*a325d9c4SApple OSS Distributions 	int error;
451*a325d9c4SApple OSS Distributions 
452*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
453*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
454*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
455*a325d9c4SApple OSS Distributions 		return 0;
456*a325d9c4SApple OSS Distributions 	}
457*a325d9c4SApple OSS Distributions #endif
458*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
459*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
460*a325d9c4SApple OSS Distributions 		return 0;
461*a325d9c4SApple OSS Distributions 	}
462*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(12, vp);
463*a325d9c4SApple OSS Distributions 	MAC_CHECK(vnode_notify_create, cred, mp, mac_mount_label(mp),
464*a325d9c4SApple OSS Distributions 	    dvp, mac_vnode_label(dvp), vp, mac_vnode_label(vp), cnp);
465*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(12, vp);
466*a325d9c4SApple OSS Distributions 
467*a325d9c4SApple OSS Distributions 	return error;
468*a325d9c4SApple OSS Distributions }
469*a325d9c4SApple OSS Distributions 
470*a325d9c4SApple OSS Distributions void
mac_vnode_notify_rename(vfs_context_t ctx,struct vnode * fvp,struct vnode * fdvp,struct componentname * fcnp,struct vnode * tvp,struct vnode * tdvp,struct componentname * tcnp,bool swap)471*a325d9c4SApple OSS Distributions mac_vnode_notify_rename(vfs_context_t ctx, struct vnode *fvp,
472*a325d9c4SApple OSS Distributions     struct vnode *fdvp, struct componentname *fcnp, struct vnode *tvp,
473*a325d9c4SApple OSS Distributions     struct vnode *tdvp, struct componentname *tcnp, bool swap)
474*a325d9c4SApple OSS Distributions {
475*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
476*a325d9c4SApple OSS Distributions 
477*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
478*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
479*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
480*a325d9c4SApple OSS Distributions 		return;
481*a325d9c4SApple OSS Distributions 	}
482*a325d9c4SApple OSS Distributions #endif
483*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
484*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
485*a325d9c4SApple OSS Distributions 		return;
486*a325d9c4SApple OSS Distributions 	}
487*a325d9c4SApple OSS Distributions 
488*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(13, fvp);
489*a325d9c4SApple OSS Distributions 	MAC_POLICY_ITERATE({
490*a325d9c4SApple OSS Distributions 		/* BEGIN IGNORE CODESTYLE */
491*a325d9c4SApple OSS Distributions 		if (swap) {
492*a325d9c4SApple OSS Distributions 			if (mpc->mpc_ops->mpo_vnode_notify_swap != NULL) {
493*a325d9c4SApple OSS Distributions 				mpc->mpc_ops->mpo_vnode_notify_swap(cred, fvp, mac_vnode_label(fvp),
494*a325d9c4SApple OSS Distributions 					tvp, mac_vnode_label(tvp));
495*a325d9c4SApple OSS Distributions 			} else if (mpc->mpc_ops->mpo_vnode_notify_rename != NULL) {
496*a325d9c4SApple OSS Distributions 				/* Call notify_rename twice, one for each member of the swap. */
497*a325d9c4SApple OSS Distributions 				mpc->mpc_ops->mpo_vnode_notify_rename(cred, fvp, mac_vnode_label(fvp),
498*a325d9c4SApple OSS Distributions 					tdvp, mac_vnode_label(tdvp), tcnp);
499*a325d9c4SApple OSS Distributions 				mpc->mpc_ops->mpo_vnode_notify_rename(cred, tvp, mac_vnode_label(tvp),
500*a325d9c4SApple OSS Distributions 					fdvp, mac_vnode_label(fdvp), fcnp);
501*a325d9c4SApple OSS Distributions 			}
502*a325d9c4SApple OSS Distributions 		} else if (mpc->mpc_ops->mpo_vnode_notify_rename != NULL) {
503*a325d9c4SApple OSS Distributions 			mpc->mpc_ops->mpo_vnode_notify_rename(cred, fvp, mac_vnode_label(fvp),
504*a325d9c4SApple OSS Distributions 		        tdvp, mac_vnode_label(tdvp), tcnp);
505*a325d9c4SApple OSS Distributions 		}
506*a325d9c4SApple OSS Distributions 		/* END IGNORE CODESTYLE */
507*a325d9c4SApple OSS Distributions 	});
508*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(13, fvp);
509*a325d9c4SApple OSS Distributions }
510*a325d9c4SApple OSS Distributions 
511*a325d9c4SApple OSS Distributions void
mac_vnode_notify_open(vfs_context_t ctx,struct vnode * vp,int acc_flags)512*a325d9c4SApple OSS Distributions mac_vnode_notify_open(vfs_context_t ctx, struct vnode *vp, int acc_flags)
513*a325d9c4SApple OSS Distributions {
514*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
515*a325d9c4SApple OSS Distributions 
516*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
517*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
518*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
519*a325d9c4SApple OSS Distributions 		return;
520*a325d9c4SApple OSS Distributions 	}
521*a325d9c4SApple OSS Distributions #endif
522*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
523*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
524*a325d9c4SApple OSS Distributions 		return;
525*a325d9c4SApple OSS Distributions 	}
526*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(14, vp);
527*a325d9c4SApple OSS Distributions 	MAC_PERFORM(vnode_notify_open, cred, vp, mac_vnode_label(vp), acc_flags);
528*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(14, vp);
529*a325d9c4SApple OSS Distributions }
530*a325d9c4SApple OSS Distributions 
531*a325d9c4SApple OSS Distributions void
mac_vnode_notify_link(vfs_context_t ctx,struct vnode * vp,struct vnode * dvp,struct componentname * cnp)532*a325d9c4SApple OSS Distributions mac_vnode_notify_link(vfs_context_t ctx, struct vnode *vp,
533*a325d9c4SApple OSS Distributions     struct vnode *dvp, struct componentname *cnp)
534*a325d9c4SApple OSS Distributions {
535*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
536*a325d9c4SApple OSS Distributions 
537*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
538*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
539*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
540*a325d9c4SApple OSS Distributions 		return;
541*a325d9c4SApple OSS Distributions 	}
542*a325d9c4SApple OSS Distributions #endif
543*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
544*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
545*a325d9c4SApple OSS Distributions 		return;
546*a325d9c4SApple OSS Distributions 	}
547*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(15, vp);
548*a325d9c4SApple OSS Distributions 	MAC_PERFORM(vnode_notify_link, cred, dvp, mac_vnode_label(dvp), vp, mac_vnode_label(vp), cnp);
549*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(15, vp);
550*a325d9c4SApple OSS Distributions }
551*a325d9c4SApple OSS Distributions 
552*a325d9c4SApple OSS Distributions void
mac_vnode_notify_deleteextattr(vfs_context_t ctx,struct vnode * vp,const char * name)553*a325d9c4SApple OSS Distributions mac_vnode_notify_deleteextattr(vfs_context_t ctx, struct vnode *vp, const char *name)
554*a325d9c4SApple OSS Distributions {
555*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
556*a325d9c4SApple OSS Distributions 
557*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
558*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
559*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
560*a325d9c4SApple OSS Distributions 		return;
561*a325d9c4SApple OSS Distributions 	}
562*a325d9c4SApple OSS Distributions #endif
563*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
564*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
565*a325d9c4SApple OSS Distributions 		return;
566*a325d9c4SApple OSS Distributions 	}
567*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(16, vp);
568*a325d9c4SApple OSS Distributions 	MAC_PERFORM(vnode_notify_deleteextattr, cred, vp, mac_vnode_label(vp), name);
569*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(16, vp);
570*a325d9c4SApple OSS Distributions }
571*a325d9c4SApple OSS Distributions 
572*a325d9c4SApple OSS Distributions void
mac_vnode_notify_setacl(vfs_context_t ctx,struct vnode * vp,struct kauth_acl * acl)573*a325d9c4SApple OSS Distributions mac_vnode_notify_setacl(vfs_context_t ctx, struct vnode *vp, struct kauth_acl *acl)
574*a325d9c4SApple OSS Distributions {
575*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
576*a325d9c4SApple OSS Distributions 
577*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
578*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
579*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
580*a325d9c4SApple OSS Distributions 		return;
581*a325d9c4SApple OSS Distributions 	}
582*a325d9c4SApple OSS Distributions #endif
583*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
584*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
585*a325d9c4SApple OSS Distributions 		return;
586*a325d9c4SApple OSS Distributions 	}
587*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(17, vp);
588*a325d9c4SApple OSS Distributions 	MAC_PERFORM(vnode_notify_setacl, cred, vp, mac_vnode_label(vp), acl);
589*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(17, vp);
590*a325d9c4SApple OSS Distributions }
591*a325d9c4SApple OSS Distributions 
592*a325d9c4SApple OSS Distributions void
mac_vnode_notify_setattrlist(vfs_context_t ctx,struct vnode * vp,struct attrlist * alist)593*a325d9c4SApple OSS Distributions mac_vnode_notify_setattrlist(vfs_context_t ctx, struct vnode *vp, struct attrlist *alist)
594*a325d9c4SApple OSS Distributions {
595*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
596*a325d9c4SApple OSS Distributions 
597*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
598*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
599*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
600*a325d9c4SApple OSS Distributions 		return;
601*a325d9c4SApple OSS Distributions 	}
602*a325d9c4SApple OSS Distributions #endif
603*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
604*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
605*a325d9c4SApple OSS Distributions 		return;
606*a325d9c4SApple OSS Distributions 	}
607*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(18, vp);
608*a325d9c4SApple OSS Distributions 	MAC_PERFORM(vnode_notify_setattrlist, cred, vp, mac_vnode_label(vp), alist);
609*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(18, vp);
610*a325d9c4SApple OSS Distributions }
611*a325d9c4SApple OSS Distributions 
612*a325d9c4SApple OSS Distributions void
mac_vnode_notify_setextattr(vfs_context_t ctx,struct vnode * vp,const char * name,struct uio * uio)613*a325d9c4SApple OSS Distributions mac_vnode_notify_setextattr(vfs_context_t ctx, struct vnode *vp, const char *name, struct uio *uio)
614*a325d9c4SApple OSS Distributions {
615*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
616*a325d9c4SApple OSS Distributions 
617*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
618*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
619*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
620*a325d9c4SApple OSS Distributions 		return;
621*a325d9c4SApple OSS Distributions 	}
622*a325d9c4SApple OSS Distributions #endif
623*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
624*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
625*a325d9c4SApple OSS Distributions 		return;
626*a325d9c4SApple OSS Distributions 	}
627*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(19, vp);
628*a325d9c4SApple OSS Distributions 	MAC_PERFORM(vnode_notify_setextattr, cred, vp, mac_vnode_label(vp), name, uio);
629*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(19, vp);
630*a325d9c4SApple OSS Distributions }
631*a325d9c4SApple OSS Distributions 
632*a325d9c4SApple OSS Distributions void
mac_vnode_notify_setflags(vfs_context_t ctx,struct vnode * vp,u_long flags)633*a325d9c4SApple OSS Distributions mac_vnode_notify_setflags(vfs_context_t ctx, struct vnode *vp, u_long flags)
634*a325d9c4SApple OSS Distributions {
635*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
636*a325d9c4SApple OSS Distributions 
637*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
638*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
639*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
640*a325d9c4SApple OSS Distributions 		return;
641*a325d9c4SApple OSS Distributions 	}
642*a325d9c4SApple OSS Distributions #endif
643*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
644*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
645*a325d9c4SApple OSS Distributions 		return;
646*a325d9c4SApple OSS Distributions 	}
647*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(20, vp);
648*a325d9c4SApple OSS Distributions 	MAC_PERFORM(vnode_notify_setflags, cred, vp, mac_vnode_label(vp), flags);
649*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(20, vp);
650*a325d9c4SApple OSS Distributions }
651*a325d9c4SApple OSS Distributions 
652*a325d9c4SApple OSS Distributions void
mac_vnode_notify_setmode(vfs_context_t ctx,struct vnode * vp,mode_t mode)653*a325d9c4SApple OSS Distributions mac_vnode_notify_setmode(vfs_context_t ctx, struct vnode *vp, mode_t mode)
654*a325d9c4SApple OSS Distributions {
655*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
656*a325d9c4SApple OSS Distributions 
657*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
658*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
659*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
660*a325d9c4SApple OSS Distributions 		return;
661*a325d9c4SApple OSS Distributions 	}
662*a325d9c4SApple OSS Distributions #endif
663*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
664*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
665*a325d9c4SApple OSS Distributions 		return;
666*a325d9c4SApple OSS Distributions 	}
667*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(21, vp);
668*a325d9c4SApple OSS Distributions 	MAC_PERFORM(vnode_notify_setmode, cred, vp, mac_vnode_label(vp), mode);
669*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(21, vp);
670*a325d9c4SApple OSS Distributions }
671*a325d9c4SApple OSS Distributions 
672*a325d9c4SApple OSS Distributions void
mac_vnode_notify_setowner(vfs_context_t ctx,struct vnode * vp,uid_t uid,gid_t gid)673*a325d9c4SApple OSS Distributions mac_vnode_notify_setowner(vfs_context_t ctx, struct vnode *vp, uid_t uid, gid_t gid)
674*a325d9c4SApple OSS Distributions {
675*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
676*a325d9c4SApple OSS Distributions 
677*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
678*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
679*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
680*a325d9c4SApple OSS Distributions 		return;
681*a325d9c4SApple OSS Distributions 	}
682*a325d9c4SApple OSS Distributions #endif
683*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
684*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
685*a325d9c4SApple OSS Distributions 		return;
686*a325d9c4SApple OSS Distributions 	}
687*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(22, vp);
688*a325d9c4SApple OSS Distributions 	MAC_PERFORM(vnode_notify_setowner, cred, vp, mac_vnode_label(vp), uid, gid);
689*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(22, vp);
690*a325d9c4SApple OSS Distributions }
691*a325d9c4SApple OSS Distributions 
692*a325d9c4SApple OSS Distributions void
mac_vnode_notify_setutimes(vfs_context_t ctx,struct vnode * vp,struct timespec atime,struct timespec mtime)693*a325d9c4SApple OSS Distributions mac_vnode_notify_setutimes(vfs_context_t ctx, struct vnode *vp, struct timespec atime, struct timespec mtime)
694*a325d9c4SApple OSS Distributions {
695*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
696*a325d9c4SApple OSS Distributions 
697*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
698*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
699*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
700*a325d9c4SApple OSS Distributions 		return;
701*a325d9c4SApple OSS Distributions 	}
702*a325d9c4SApple OSS Distributions #endif
703*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
704*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
705*a325d9c4SApple OSS Distributions 		return;
706*a325d9c4SApple OSS Distributions 	}
707*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(23, vp);
708*a325d9c4SApple OSS Distributions 	MAC_PERFORM(vnode_notify_setutimes, cred, vp, mac_vnode_label(vp), atime, mtime);
709*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(23, vp);
710*a325d9c4SApple OSS Distributions }
711*a325d9c4SApple OSS Distributions 
712*a325d9c4SApple OSS Distributions void
mac_vnode_notify_truncate(vfs_context_t ctx,kauth_cred_t file_cred,struct vnode * vp)713*a325d9c4SApple OSS Distributions mac_vnode_notify_truncate(vfs_context_t ctx, kauth_cred_t file_cred, struct vnode *vp)
714*a325d9c4SApple OSS Distributions {
715*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
716*a325d9c4SApple OSS Distributions 
717*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
718*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
719*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
720*a325d9c4SApple OSS Distributions 		return;
721*a325d9c4SApple OSS Distributions 	}
722*a325d9c4SApple OSS Distributions #endif
723*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
724*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
725*a325d9c4SApple OSS Distributions 		return;
726*a325d9c4SApple OSS Distributions 	}
727*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(24, vp);
728*a325d9c4SApple OSS Distributions 	MAC_PERFORM(vnode_notify_truncate, cred, file_cred, vp, mac_vnode_label(vp));
729*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(24, vp);
730*a325d9c4SApple OSS Distributions }
731*a325d9c4SApple OSS Distributions 
732*a325d9c4SApple OSS Distributions /*
733*a325d9c4SApple OSS Distributions  * Extended attribute 'name' was updated via
734*a325d9c4SApple OSS Distributions  * vn_setxattr() or vn_removexattr().  Allow the
735*a325d9c4SApple OSS Distributions  * policy to update the vnode label.
736*a325d9c4SApple OSS Distributions  */
737*a325d9c4SApple OSS Distributions void
mac_vnode_label_update_extattr(struct mount * mp,struct vnode * vp,const char * name)738*a325d9c4SApple OSS Distributions mac_vnode_label_update_extattr(struct mount *mp, struct vnode *vp,
739*a325d9c4SApple OSS Distributions     const char *name)
740*a325d9c4SApple OSS Distributions {
741*a325d9c4SApple OSS Distributions 	int error = 0;
742*a325d9c4SApple OSS Distributions 
743*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
744*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
745*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
746*a325d9c4SApple OSS Distributions 		return;
747*a325d9c4SApple OSS Distributions 	}
748*a325d9c4SApple OSS Distributions #endif
749*a325d9c4SApple OSS Distributions 	if (!mac_label_vnodes) {
750*a325d9c4SApple OSS Distributions 		return;
751*a325d9c4SApple OSS Distributions 	}
752*a325d9c4SApple OSS Distributions 
753*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(25, vp);
754*a325d9c4SApple OSS Distributions 	MAC_PERFORM(vnode_label_update_extattr, mp, mac_mount_label(mp), vp,
755*a325d9c4SApple OSS Distributions 	    mac_vnode_label(vp), name);
756*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(25, vp);
757*a325d9c4SApple OSS Distributions 	if (error == 0) {
758*a325d9c4SApple OSS Distributions 		return;
759*a325d9c4SApple OSS Distributions 	}
760*a325d9c4SApple OSS Distributions 
761*a325d9c4SApple OSS Distributions 	vnode_lock(vp);
762*a325d9c4SApple OSS Distributions 	vnode_relabel(vp);
763*a325d9c4SApple OSS Distributions 	vnode_unlock(vp);
764*a325d9c4SApple OSS Distributions 	return;
765*a325d9c4SApple OSS Distributions }
766*a325d9c4SApple OSS Distributions 
767*a325d9c4SApple OSS Distributions static int
mac_vnode_label_store(vfs_context_t ctx,struct vnode * vp,struct label * intlabel)768*a325d9c4SApple OSS Distributions mac_vnode_label_store(vfs_context_t ctx, struct vnode *vp,
769*a325d9c4SApple OSS Distributions     struct label *intlabel)
770*a325d9c4SApple OSS Distributions {
771*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
772*a325d9c4SApple OSS Distributions 	int error;
773*a325d9c4SApple OSS Distributions 
774*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
775*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
776*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
777*a325d9c4SApple OSS Distributions 		return 0;
778*a325d9c4SApple OSS Distributions 	}
779*a325d9c4SApple OSS Distributions #endif
780*a325d9c4SApple OSS Distributions 	if (!mac_label_vnodes) {
781*a325d9c4SApple OSS Distributions 		return 0;
782*a325d9c4SApple OSS Distributions 	}
783*a325d9c4SApple OSS Distributions 
784*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
785*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
786*a325d9c4SApple OSS Distributions 		return 0;
787*a325d9c4SApple OSS Distributions 	}
788*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(26, vp);
789*a325d9c4SApple OSS Distributions 	MAC_CHECK(vnode_label_store, cred, vp, mac_vnode_label(vp), intlabel);
790*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(26, vp);
791*a325d9c4SApple OSS Distributions 
792*a325d9c4SApple OSS Distributions 	return error;
793*a325d9c4SApple OSS Distributions }
794*a325d9c4SApple OSS Distributions 
795*a325d9c4SApple OSS Distributions void
mac_cred_label_update_execve(vfs_context_t ctx,kauth_cred_t new,struct vnode * vp,off_t offset,struct vnode * scriptvp,struct label * scriptvnodelabel,struct label * execl,u_int * csflags,void * macextensions,int * disjoint,int * labelupdateerror)796*a325d9c4SApple OSS Distributions mac_cred_label_update_execve(vfs_context_t ctx, kauth_cred_t new, struct vnode *vp, off_t offset,
797*a325d9c4SApple OSS Distributions     struct vnode *scriptvp, struct label *scriptvnodelabel, struct label *execl, u_int *csflags,
798*a325d9c4SApple OSS Distributions     void *macextensions, int *disjoint, int *labelupdateerror)
799*a325d9c4SApple OSS Distributions {
800*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
801*a325d9c4SApple OSS Distributions 	*disjoint = 0;
802*a325d9c4SApple OSS Distributions 	int error;
803*a325d9c4SApple OSS Distributions 	posix_cred_t pcred = posix_cred_get(new);
804*a325d9c4SApple OSS Distributions 
805*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
806*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
807*a325d9c4SApple OSS Distributions 	if (!mac_proc_enforce || !mac_vnode_enforce) {
808*a325d9c4SApple OSS Distributions 		return;
809*a325d9c4SApple OSS Distributions 	}
810*a325d9c4SApple OSS Distributions #endif
811*a325d9c4SApple OSS Distributions 
812*a325d9c4SApple OSS Distributions 	/* mark the new cred to indicate "matching" includes the label */
813*a325d9c4SApple OSS Distributions 	pcred->cr_flags |= CRF_MAC_ENFORCE;
814*a325d9c4SApple OSS Distributions 
815*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
816*a325d9c4SApple OSS Distributions 
817*a325d9c4SApple OSS Distributions 	/*
818*a325d9c4SApple OSS Distributions 	 * NB: Cannot use MAC_CHECK macro because we need a sequence point after
819*a325d9c4SApple OSS Distributions 	 *     calling exec_spawnattr_getmacpolicyinfo() and before passing the
820*a325d9c4SApple OSS Distributions 	 *     spawnattrlen as an argument to the hook.
821*a325d9c4SApple OSS Distributions 	 */
822*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(27, vp);
823*a325d9c4SApple OSS Distributions 	{
824*a325d9c4SApple OSS Distributions 		struct mac_policy_conf *mpc;
825*a325d9c4SApple OSS Distributions 		u_int i;
826*a325d9c4SApple OSS Distributions 
827*a325d9c4SApple OSS Distributions 		error = 0;
828*a325d9c4SApple OSS Distributions 		for (i = 0; i < mac_policy_list.staticmax; i++) {
829*a325d9c4SApple OSS Distributions 			mpc = mac_policy_list.entries[i].mpc;
830*a325d9c4SApple OSS Distributions 			if (mpc == NULL) {
831*a325d9c4SApple OSS Distributions 				continue;
832*a325d9c4SApple OSS Distributions 			}
833*a325d9c4SApple OSS Distributions 
834*a325d9c4SApple OSS Distributions 			mpo_cred_label_update_execve_t *hook = mpc->mpc_ops->mpo_cred_label_update_execve;
835*a325d9c4SApple OSS Distributions 			if (hook == NULL) {
836*a325d9c4SApple OSS Distributions 				continue;
837*a325d9c4SApple OSS Distributions 			}
838*a325d9c4SApple OSS Distributions 
839*a325d9c4SApple OSS Distributions 			size_t spawnattrlen = 0;
840*a325d9c4SApple OSS Distributions 			void *spawnattr = exec_spawnattr_getmacpolicyinfo(macextensions, mpc->mpc_name, &spawnattrlen);
841*a325d9c4SApple OSS Distributions 
842*a325d9c4SApple OSS Distributions 			error = mac_error_select(hook(cred, new, vfs_context_proc(ctx), vp, offset, scriptvp,
843*a325d9c4SApple OSS Distributions 			    mac_vnode_label(vp), scriptvnodelabel, execl, csflags, spawnattr, spawnattrlen, disjoint),
844*a325d9c4SApple OSS Distributions 			    error);
845*a325d9c4SApple OSS Distributions 		}
846*a325d9c4SApple OSS Distributions 		if (mac_policy_list_conditional_busy() != 0) {
847*a325d9c4SApple OSS Distributions 			for (; i <= mac_policy_list.maxindex; i++) {
848*a325d9c4SApple OSS Distributions 				mpc = mac_policy_list.entries[i].mpc;
849*a325d9c4SApple OSS Distributions 				if (mpc == NULL) {
850*a325d9c4SApple OSS Distributions 					continue;
851*a325d9c4SApple OSS Distributions 				}
852*a325d9c4SApple OSS Distributions 
853*a325d9c4SApple OSS Distributions 				mpo_cred_label_update_execve_t *hook = mpc->mpc_ops->mpo_cred_label_update_execve;
854*a325d9c4SApple OSS Distributions 				if (hook == NULL) {
855*a325d9c4SApple OSS Distributions 					continue;
856*a325d9c4SApple OSS Distributions 				}
857*a325d9c4SApple OSS Distributions 
858*a325d9c4SApple OSS Distributions 				size_t spawnattrlen = 0;
859*a325d9c4SApple OSS Distributions 				void *spawnattr = exec_spawnattr_getmacpolicyinfo(macextensions, mpc->mpc_name, &spawnattrlen);
860*a325d9c4SApple OSS Distributions 
861*a325d9c4SApple OSS Distributions 				error = mac_error_select(hook(cred, new, vfs_context_proc(ctx), vp, offset, scriptvp,
862*a325d9c4SApple OSS Distributions 				    mac_vnode_label(vp), scriptvnodelabel, execl, csflags, spawnattr, spawnattrlen, disjoint),
863*a325d9c4SApple OSS Distributions 				    error);
864*a325d9c4SApple OSS Distributions 			}
865*a325d9c4SApple OSS Distributions 			mac_policy_list_unbusy();
866*a325d9c4SApple OSS Distributions 		}
867*a325d9c4SApple OSS Distributions 	}
868*a325d9c4SApple OSS Distributions 	*labelupdateerror = error;
869*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(27, vp);
870*a325d9c4SApple OSS Distributions }
871*a325d9c4SApple OSS Distributions 
872*a325d9c4SApple OSS Distributions int
mac_cred_check_label_update_execve(vfs_context_t ctx,struct vnode * vp,off_t offset,struct vnode * scriptvp,struct label * scriptvnodelabel,struct label * execlabel,struct proc * p,void * macextensions)873*a325d9c4SApple OSS Distributions mac_cred_check_label_update_execve(vfs_context_t ctx, struct vnode *vp, off_t offset,
874*a325d9c4SApple OSS Distributions     struct vnode *scriptvp, struct label *scriptvnodelabel, struct label *execlabel,
875*a325d9c4SApple OSS Distributions     struct proc *p, void *macextensions)
876*a325d9c4SApple OSS Distributions {
877*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
878*a325d9c4SApple OSS Distributions 	int result = 0;
879*a325d9c4SApple OSS Distributions 
880*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
881*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
882*a325d9c4SApple OSS Distributions 	if (!mac_proc_enforce || !mac_vnode_enforce) {
883*a325d9c4SApple OSS Distributions 		return result;
884*a325d9c4SApple OSS Distributions 	}
885*a325d9c4SApple OSS Distributions #endif
886*a325d9c4SApple OSS Distributions 
887*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
888*a325d9c4SApple OSS Distributions 
889*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(28, vp);
890*a325d9c4SApple OSS Distributions 	/*
891*a325d9c4SApple OSS Distributions 	 * NB: Cannot use MAC_BOOLEAN macro because we need a sequence point after
892*a325d9c4SApple OSS Distributions 	 *     calling exec_spawnattr_getmacpolicyinfo() and before passing the
893*a325d9c4SApple OSS Distributions 	 *     spawnattrlen as an argument to the hook.
894*a325d9c4SApple OSS Distributions 	 */
895*a325d9c4SApple OSS Distributions 	{
896*a325d9c4SApple OSS Distributions 		struct mac_policy_conf *mpc;
897*a325d9c4SApple OSS Distributions 		u_int i;
898*a325d9c4SApple OSS Distributions 
899*a325d9c4SApple OSS Distributions 		for (i = 0; i < mac_policy_list.staticmax; i++) {
900*a325d9c4SApple OSS Distributions 			mpc = mac_policy_list.entries[i].mpc;
901*a325d9c4SApple OSS Distributions 			if (mpc == NULL) {
902*a325d9c4SApple OSS Distributions 				continue;
903*a325d9c4SApple OSS Distributions 			}
904*a325d9c4SApple OSS Distributions 
905*a325d9c4SApple OSS Distributions 			mpo_cred_check_label_update_execve_t *hook = mpc->mpc_ops->mpo_cred_check_label_update_execve;
906*a325d9c4SApple OSS Distributions 			if (hook == NULL) {
907*a325d9c4SApple OSS Distributions 				continue;
908*a325d9c4SApple OSS Distributions 			}
909*a325d9c4SApple OSS Distributions 
910*a325d9c4SApple OSS Distributions 			size_t spawnattrlen = 0;
911*a325d9c4SApple OSS Distributions 			void *spawnattr = exec_spawnattr_getmacpolicyinfo(macextensions, mpc->mpc_name, &spawnattrlen);
912*a325d9c4SApple OSS Distributions 
913*a325d9c4SApple OSS Distributions 			result = result || hook(cred, vp, offset, scriptvp, mac_vnode_label(vp), scriptvnodelabel, execlabel, p, spawnattr, spawnattrlen);
914*a325d9c4SApple OSS Distributions 		}
915*a325d9c4SApple OSS Distributions 		if (mac_policy_list_conditional_busy() != 0) {
916*a325d9c4SApple OSS Distributions 			for (; i <= mac_policy_list.maxindex; i++) {
917*a325d9c4SApple OSS Distributions 				mpc = mac_policy_list.entries[i].mpc;
918*a325d9c4SApple OSS Distributions 				if (mpc == NULL) {
919*a325d9c4SApple OSS Distributions 					continue;
920*a325d9c4SApple OSS Distributions 				}
921*a325d9c4SApple OSS Distributions 
922*a325d9c4SApple OSS Distributions 				mpo_cred_check_label_update_execve_t *hook = mpc->mpc_ops->mpo_cred_check_label_update_execve;
923*a325d9c4SApple OSS Distributions 				if (hook == NULL) {
924*a325d9c4SApple OSS Distributions 					continue;
925*a325d9c4SApple OSS Distributions 				}
926*a325d9c4SApple OSS Distributions 
927*a325d9c4SApple OSS Distributions 				size_t spawnattrlen = 0;
928*a325d9c4SApple OSS Distributions 				void *spawnattr = exec_spawnattr_getmacpolicyinfo(macextensions, mpc->mpc_name, &spawnattrlen);
929*a325d9c4SApple OSS Distributions 
930*a325d9c4SApple OSS Distributions 				result = result || hook(cred, vp, offset, scriptvp, mac_vnode_label(vp), scriptvnodelabel, execlabel, p, spawnattr, spawnattrlen);
931*a325d9c4SApple OSS Distributions 			}
932*a325d9c4SApple OSS Distributions 			mac_policy_list_unbusy();
933*a325d9c4SApple OSS Distributions 		}
934*a325d9c4SApple OSS Distributions 	}
935*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(28, vp);
936*a325d9c4SApple OSS Distributions 
937*a325d9c4SApple OSS Distributions 	return result;
938*a325d9c4SApple OSS Distributions }
939*a325d9c4SApple OSS Distributions 
940*a325d9c4SApple OSS Distributions int
mac_vnode_check_access(vfs_context_t ctx,struct vnode * vp,int acc_mode)941*a325d9c4SApple OSS Distributions mac_vnode_check_access(vfs_context_t ctx, struct vnode *vp,
942*a325d9c4SApple OSS Distributions     int acc_mode)
943*a325d9c4SApple OSS Distributions {
944*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
945*a325d9c4SApple OSS Distributions 	int error;
946*a325d9c4SApple OSS Distributions 	int mask;
947*a325d9c4SApple OSS Distributions 
948*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
949*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
950*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
951*a325d9c4SApple OSS Distributions 		return 0;
952*a325d9c4SApple OSS Distributions 	}
953*a325d9c4SApple OSS Distributions #endif
954*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
955*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
956*a325d9c4SApple OSS Distributions 		return 0;
957*a325d9c4SApple OSS Distributions 	}
958*a325d9c4SApple OSS Distributions 	/* Convert {R,W,X}_OK values to V{READ,WRITE,EXEC} for entry points */
959*a325d9c4SApple OSS Distributions 	mask = ACCESS_MODE_TO_VNODE_MASK(acc_mode);
960*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(29, vp);
961*a325d9c4SApple OSS Distributions 	MAC_CHECK(vnode_check_access, cred, vp, mac_vnode_label(vp), mask);
962*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(29, vp);
963*a325d9c4SApple OSS Distributions 	return error;
964*a325d9c4SApple OSS Distributions }
965*a325d9c4SApple OSS Distributions 
966*a325d9c4SApple OSS Distributions int
mac_vnode_check_chdir(vfs_context_t ctx,struct vnode * dvp)967*a325d9c4SApple OSS Distributions mac_vnode_check_chdir(vfs_context_t ctx, struct vnode *dvp)
968*a325d9c4SApple OSS Distributions {
969*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
970*a325d9c4SApple OSS Distributions 	int error;
971*a325d9c4SApple OSS Distributions 
972*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
973*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
974*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
975*a325d9c4SApple OSS Distributions 		return 0;
976*a325d9c4SApple OSS Distributions 	}
977*a325d9c4SApple OSS Distributions #endif
978*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
979*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
980*a325d9c4SApple OSS Distributions 		return 0;
981*a325d9c4SApple OSS Distributions 	}
982*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(30, dvp);
983*a325d9c4SApple OSS Distributions 	MAC_CHECK(vnode_check_chdir, cred, dvp, mac_vnode_label(dvp));
984*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(30, dvp);
985*a325d9c4SApple OSS Distributions 	return error;
986*a325d9c4SApple OSS Distributions }
987*a325d9c4SApple OSS Distributions 
988*a325d9c4SApple OSS Distributions int
mac_vnode_check_chroot(vfs_context_t ctx,struct vnode * dvp,struct componentname * cnp)989*a325d9c4SApple OSS Distributions mac_vnode_check_chroot(vfs_context_t ctx, struct vnode *dvp,
990*a325d9c4SApple OSS Distributions     struct componentname *cnp)
991*a325d9c4SApple OSS Distributions {
992*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
993*a325d9c4SApple OSS Distributions 	int error;
994*a325d9c4SApple OSS Distributions 
995*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
996*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
997*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
998*a325d9c4SApple OSS Distributions 		return 0;
999*a325d9c4SApple OSS Distributions 	}
1000*a325d9c4SApple OSS Distributions #endif
1001*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1002*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1003*a325d9c4SApple OSS Distributions 		return 0;
1004*a325d9c4SApple OSS Distributions 	}
1005*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(31, dvp);
1006*a325d9c4SApple OSS Distributions 	MAC_CHECK(vnode_check_chroot, cred, dvp, mac_vnode_label(dvp), cnp);
1007*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(31, dvp);
1008*a325d9c4SApple OSS Distributions 	return error;
1009*a325d9c4SApple OSS Distributions }
1010*a325d9c4SApple OSS Distributions 
1011*a325d9c4SApple OSS Distributions int
mac_vnode_check_clone(vfs_context_t ctx,struct vnode * dvp,struct vnode * vp,struct componentname * cnp)1012*a325d9c4SApple OSS Distributions mac_vnode_check_clone(vfs_context_t ctx, struct vnode *dvp,
1013*a325d9c4SApple OSS Distributions     struct vnode *vp, struct componentname *cnp)
1014*a325d9c4SApple OSS Distributions {
1015*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
1016*a325d9c4SApple OSS Distributions 	int error;
1017*a325d9c4SApple OSS Distributions 
1018*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1019*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
1020*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
1021*a325d9c4SApple OSS Distributions 		return 0;
1022*a325d9c4SApple OSS Distributions 	}
1023*a325d9c4SApple OSS Distributions #endif
1024*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1025*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1026*a325d9c4SApple OSS Distributions 		return 0;
1027*a325d9c4SApple OSS Distributions 	}
1028*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(32, dvp);
1029*a325d9c4SApple OSS Distributions 	MAC_CHECK(vnode_check_clone, cred, dvp, mac_vnode_label(dvp), vp,
1030*a325d9c4SApple OSS Distributions 	    mac_vnode_label(vp), cnp);
1031*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(32, dvp);
1032*a325d9c4SApple OSS Distributions 	return error;
1033*a325d9c4SApple OSS Distributions }
1034*a325d9c4SApple OSS Distributions int
mac_vnode_check_create(vfs_context_t ctx,struct vnode * dvp,struct componentname * cnp,struct vnode_attr * vap)1035*a325d9c4SApple OSS Distributions mac_vnode_check_create(vfs_context_t ctx, struct vnode *dvp,
1036*a325d9c4SApple OSS Distributions     struct componentname *cnp, struct vnode_attr *vap)
1037*a325d9c4SApple OSS Distributions {
1038*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
1039*a325d9c4SApple OSS Distributions 	int error;
1040*a325d9c4SApple OSS Distributions 
1041*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1042*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
1043*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
1044*a325d9c4SApple OSS Distributions 		return 0;
1045*a325d9c4SApple OSS Distributions 	}
1046*a325d9c4SApple OSS Distributions #endif
1047*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1048*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1049*a325d9c4SApple OSS Distributions 		return 0;
1050*a325d9c4SApple OSS Distributions 	}
1051*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(33, dvp);
1052*a325d9c4SApple OSS Distributions 	MAC_CHECK(vnode_check_create, cred, dvp, mac_vnode_label(dvp), cnp, vap);
1053*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(33, dvp);
1054*a325d9c4SApple OSS Distributions 	return error;
1055*a325d9c4SApple OSS Distributions }
1056*a325d9c4SApple OSS Distributions 
1057*a325d9c4SApple OSS Distributions int
mac_vnode_check_unlink(vfs_context_t ctx,struct vnode * dvp,struct vnode * vp,struct componentname * cnp)1058*a325d9c4SApple OSS Distributions mac_vnode_check_unlink(vfs_context_t ctx, struct vnode *dvp, struct vnode *vp,
1059*a325d9c4SApple OSS Distributions     struct componentname *cnp)
1060*a325d9c4SApple OSS Distributions {
1061*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
1062*a325d9c4SApple OSS Distributions 	int error;
1063*a325d9c4SApple OSS Distributions 
1064*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1065*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
1066*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
1067*a325d9c4SApple OSS Distributions 		return 0;
1068*a325d9c4SApple OSS Distributions 	}
1069*a325d9c4SApple OSS Distributions #endif
1070*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1071*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1072*a325d9c4SApple OSS Distributions 		return 0;
1073*a325d9c4SApple OSS Distributions 	}
1074*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(34, dvp);
1075*a325d9c4SApple OSS Distributions 	MAC_CHECK(vnode_check_unlink, cred, dvp, mac_vnode_label(dvp), vp,
1076*a325d9c4SApple OSS Distributions 	    mac_vnode_label(vp), cnp);
1077*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(34, dvp);
1078*a325d9c4SApple OSS Distributions 	return error;
1079*a325d9c4SApple OSS Distributions }
1080*a325d9c4SApple OSS Distributions #if 0
1081*a325d9c4SApple OSS Distributions int
1082*a325d9c4SApple OSS Distributions mac_vnode_check_deleteacl(vfs_context_t ctx, struct vnode *vp,
1083*a325d9c4SApple OSS Distributions     acl_type_t type)
1084*a325d9c4SApple OSS Distributions {
1085*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
1086*a325d9c4SApple OSS Distributions 	int error;
1087*a325d9c4SApple OSS Distributions 
1088*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1089*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
1090*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
1091*a325d9c4SApple OSS Distributions 		return 0;
1092*a325d9c4SApple OSS Distributions 	}
1093*a325d9c4SApple OSS Distributions #endif
1094*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1095*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1096*a325d9c4SApple OSS Distributions 		return 0;
1097*a325d9c4SApple OSS Distributions 	}
1098*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(35, dvp);
1099*a325d9c4SApple OSS Distributions 	MAC_CHECK(vnode_check_deleteacl, cred, vp, mac_vnode_label(vp), type);
1100*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(35, dvp);
1101*a325d9c4SApple OSS Distributions 	return error;
1102*a325d9c4SApple OSS Distributions }
1103*a325d9c4SApple OSS Distributions #endif
1104*a325d9c4SApple OSS Distributions 
1105*a325d9c4SApple OSS Distributions int
mac_vnode_check_deleteextattr(vfs_context_t ctx,struct vnode * vp,const char * name)1106*a325d9c4SApple OSS Distributions mac_vnode_check_deleteextattr(vfs_context_t ctx, struct vnode *vp,
1107*a325d9c4SApple OSS Distributions     const char *name)
1108*a325d9c4SApple OSS Distributions {
1109*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
1110*a325d9c4SApple OSS Distributions 	int error;
1111*a325d9c4SApple OSS Distributions 
1112*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1113*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
1114*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
1115*a325d9c4SApple OSS Distributions 		return 0;
1116*a325d9c4SApple OSS Distributions 	}
1117*a325d9c4SApple OSS Distributions #endif
1118*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1119*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1120*a325d9c4SApple OSS Distributions 		return 0;
1121*a325d9c4SApple OSS Distributions 	}
1122*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(36, vp);
1123*a325d9c4SApple OSS Distributions 	MAC_CHECK(vnode_check_deleteextattr, cred, vp, mac_vnode_label(vp), name);
1124*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(36, vp);
1125*a325d9c4SApple OSS Distributions 	return error;
1126*a325d9c4SApple OSS Distributions }
1127*a325d9c4SApple OSS Distributions int
mac_vnode_check_exchangedata(vfs_context_t ctx,struct vnode * v1,struct vnode * v2)1128*a325d9c4SApple OSS Distributions mac_vnode_check_exchangedata(vfs_context_t ctx,
1129*a325d9c4SApple OSS Distributions     struct vnode *v1, struct vnode *v2)
1130*a325d9c4SApple OSS Distributions {
1131*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
1132*a325d9c4SApple OSS Distributions 	int error;
1133*a325d9c4SApple OSS Distributions 
1134*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1135*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
1136*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
1137*a325d9c4SApple OSS Distributions 		return 0;
1138*a325d9c4SApple OSS Distributions 	}
1139*a325d9c4SApple OSS Distributions #endif
1140*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1141*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1142*a325d9c4SApple OSS Distributions 		return 0;
1143*a325d9c4SApple OSS Distributions 	}
1144*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(37, v1);
1145*a325d9c4SApple OSS Distributions 	MAC_CHECK(vnode_check_exchangedata, cred, v1, mac_vnode_label(v1),
1146*a325d9c4SApple OSS Distributions 	    v2, mac_vnode_label(v2));
1147*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(37, v1);
1148*a325d9c4SApple OSS Distributions 
1149*a325d9c4SApple OSS Distributions 	return error;
1150*a325d9c4SApple OSS Distributions }
1151*a325d9c4SApple OSS Distributions 
1152*a325d9c4SApple OSS Distributions #if 0
1153*a325d9c4SApple OSS Distributions int
1154*a325d9c4SApple OSS Distributions mac_vnode_check_getacl(vfs_context_t ctx, struct vnode *vp, acl_type_t type)
1155*a325d9c4SApple OSS Distributions {
1156*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
1157*a325d9c4SApple OSS Distributions 	int error;
1158*a325d9c4SApple OSS Distributions 
1159*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1160*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
1161*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
1162*a325d9c4SApple OSS Distributions 		return 0;
1163*a325d9c4SApple OSS Distributions 	}
1164*a325d9c4SApple OSS Distributions #endif
1165*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1166*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1167*a325d9c4SApple OSS Distributions 		return 0;
1168*a325d9c4SApple OSS Distributions 	}
1169*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(38, vp);
1170*a325d9c4SApple OSS Distributions 	MAC_CHECK(vnode_check_getacl, cred, vp, mac_vnode_label(vp), type);
1171*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(38, vp);
1172*a325d9c4SApple OSS Distributions 	return error;
1173*a325d9c4SApple OSS Distributions }
1174*a325d9c4SApple OSS Distributions #endif
1175*a325d9c4SApple OSS Distributions 
1176*a325d9c4SApple OSS Distributions int
mac_vnode_check_getattr(vfs_context_t ctx,struct ucred * file_cred,struct vnode * vp,struct vnode_attr * va)1177*a325d9c4SApple OSS Distributions mac_vnode_check_getattr(vfs_context_t ctx, struct ucred *file_cred,
1178*a325d9c4SApple OSS Distributions     struct vnode *vp, struct vnode_attr *va)
1179*a325d9c4SApple OSS Distributions {
1180*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
1181*a325d9c4SApple OSS Distributions 	int error;
1182*a325d9c4SApple OSS Distributions 
1183*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1184*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
1185*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
1186*a325d9c4SApple OSS Distributions 		return 0;
1187*a325d9c4SApple OSS Distributions 	}
1188*a325d9c4SApple OSS Distributions #endif
1189*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1190*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1191*a325d9c4SApple OSS Distributions 		return 0;
1192*a325d9c4SApple OSS Distributions 	}
1193*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(39, vp);
1194*a325d9c4SApple OSS Distributions 	MAC_CHECK(vnode_check_getattr, cred, file_cred, vp, mac_vnode_label(vp), va);
1195*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(39, vp);
1196*a325d9c4SApple OSS Distributions 	return error;
1197*a325d9c4SApple OSS Distributions }
1198*a325d9c4SApple OSS Distributions 
1199*a325d9c4SApple OSS Distributions int
mac_vnode_check_getattrlist(vfs_context_t ctx,struct vnode * vp,struct attrlist * alist,uint64_t options)1200*a325d9c4SApple OSS Distributions mac_vnode_check_getattrlist(vfs_context_t ctx, struct vnode *vp,
1201*a325d9c4SApple OSS Distributions     struct attrlist *alist, uint64_t options)
1202*a325d9c4SApple OSS Distributions {
1203*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
1204*a325d9c4SApple OSS Distributions 	int error;
1205*a325d9c4SApple OSS Distributions 
1206*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1207*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
1208*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
1209*a325d9c4SApple OSS Distributions 		return 0;
1210*a325d9c4SApple OSS Distributions 	}
1211*a325d9c4SApple OSS Distributions #endif
1212*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1213*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1214*a325d9c4SApple OSS Distributions 		return 0;
1215*a325d9c4SApple OSS Distributions 	}
1216*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(40, vp);
1217*a325d9c4SApple OSS Distributions 	MAC_CHECK(vnode_check_getattrlist, cred, vp, mac_vnode_label(vp), alist, options);
1218*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(40, vp);
1219*a325d9c4SApple OSS Distributions 
1220*a325d9c4SApple OSS Distributions 	/* Falsify results instead of returning error? */
1221*a325d9c4SApple OSS Distributions 	return error;
1222*a325d9c4SApple OSS Distributions }
1223*a325d9c4SApple OSS Distributions 
1224*a325d9c4SApple OSS Distributions int
mac_vnode_check_exec(vfs_context_t ctx,struct vnode * vp,struct image_params * imgp)1225*a325d9c4SApple OSS Distributions mac_vnode_check_exec(vfs_context_t ctx, struct vnode *vp,
1226*a325d9c4SApple OSS Distributions     struct image_params *imgp)
1227*a325d9c4SApple OSS Distributions {
1228*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
1229*a325d9c4SApple OSS Distributions 	int error = 0;
1230*a325d9c4SApple OSS Distributions 
1231*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1232*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
1233*a325d9c4SApple OSS Distributions 	if (!mac_proc_enforce || !mac_vnode_enforce) {
1234*a325d9c4SApple OSS Distributions 		return 0;
1235*a325d9c4SApple OSS Distributions 	}
1236*a325d9c4SApple OSS Distributions #endif
1237*a325d9c4SApple OSS Distributions 
1238*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1239*a325d9c4SApple OSS Distributions 
1240*a325d9c4SApple OSS Distributions 	/*
1241*a325d9c4SApple OSS Distributions 	 * NB: Cannot use MAC_CHECK macro because we need a sequence point after
1242*a325d9c4SApple OSS Distributions 	 *     calling exec_spawnattr_getmacpolicyinfo() and before passing the
1243*a325d9c4SApple OSS Distributions 	 *     spawnattrlen as an argument to the hook.
1244*a325d9c4SApple OSS Distributions 	 */
1245*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(41, vp);
1246*a325d9c4SApple OSS Distributions 	{
1247*a325d9c4SApple OSS Distributions 		struct mac_policy_conf *mpc;
1248*a325d9c4SApple OSS Distributions 		u_int i;
1249*a325d9c4SApple OSS Distributions 
1250*a325d9c4SApple OSS Distributions 		for (i = 0; i < mac_policy_list.staticmax; i++) {
1251*a325d9c4SApple OSS Distributions 			mpc = mac_policy_list.entries[i].mpc;
1252*a325d9c4SApple OSS Distributions 			if (mpc == NULL) {
1253*a325d9c4SApple OSS Distributions 				continue;
1254*a325d9c4SApple OSS Distributions 			}
1255*a325d9c4SApple OSS Distributions 
1256*a325d9c4SApple OSS Distributions 			mpo_vnode_check_exec_t *hook = mpc->mpc_ops->mpo_vnode_check_exec;
1257*a325d9c4SApple OSS Distributions 			if (hook == NULL) {
1258*a325d9c4SApple OSS Distributions 				continue;
1259*a325d9c4SApple OSS Distributions 			}
1260*a325d9c4SApple OSS Distributions 
1261*a325d9c4SApple OSS Distributions 			size_t spawnattrlen = 0;
1262*a325d9c4SApple OSS Distributions 			void *spawnattr = exec_spawnattr_getmacpolicyinfo(&imgp->ip_px_smpx, mpc->mpc_name, &spawnattrlen);
1263*a325d9c4SApple OSS Distributions 
1264*a325d9c4SApple OSS Distributions 			error = mac_error_select(
1265*a325d9c4SApple OSS Distributions 				hook(cred,
1266*a325d9c4SApple OSS Distributions 				vp, imgp->ip_scriptvp, mac_vnode_label(vp), imgp->ip_scriptlabelp,
1267*a325d9c4SApple OSS Distributions 				imgp->ip_execlabelp, &imgp->ip_ndp->ni_cnd, &imgp->ip_csflags,
1268*a325d9c4SApple OSS Distributions 				spawnattr, spawnattrlen), error);
1269*a325d9c4SApple OSS Distributions 		}
1270*a325d9c4SApple OSS Distributions 		if (mac_policy_list_conditional_busy() != 0) {
1271*a325d9c4SApple OSS Distributions 			for (; i <= mac_policy_list.maxindex; i++) {
1272*a325d9c4SApple OSS Distributions 				mpc = mac_policy_list.entries[i].mpc;
1273*a325d9c4SApple OSS Distributions 				if (mpc == NULL) {
1274*a325d9c4SApple OSS Distributions 					continue;
1275*a325d9c4SApple OSS Distributions 				}
1276*a325d9c4SApple OSS Distributions 
1277*a325d9c4SApple OSS Distributions 				mpo_vnode_check_exec_t *hook = mpc->mpc_ops->mpo_vnode_check_exec;
1278*a325d9c4SApple OSS Distributions 				if (hook == NULL) {
1279*a325d9c4SApple OSS Distributions 					continue;
1280*a325d9c4SApple OSS Distributions 				}
1281*a325d9c4SApple OSS Distributions 
1282*a325d9c4SApple OSS Distributions 				size_t spawnattrlen = 0;
1283*a325d9c4SApple OSS Distributions 				void *spawnattr = exec_spawnattr_getmacpolicyinfo(&imgp->ip_px_smpx, mpc->mpc_name, &spawnattrlen);
1284*a325d9c4SApple OSS Distributions 
1285*a325d9c4SApple OSS Distributions 				error = mac_error_select(
1286*a325d9c4SApple OSS Distributions 					hook(cred,
1287*a325d9c4SApple OSS Distributions 					vp, imgp->ip_scriptvp, mac_vnode_label(vp), imgp->ip_scriptlabelp,
1288*a325d9c4SApple OSS Distributions 					imgp->ip_execlabelp, &imgp->ip_ndp->ni_cnd, &imgp->ip_csflags,
1289*a325d9c4SApple OSS Distributions 					spawnattr, spawnattrlen), error);
1290*a325d9c4SApple OSS Distributions 			}
1291*a325d9c4SApple OSS Distributions 			mac_policy_list_unbusy();
1292*a325d9c4SApple OSS Distributions 		}
1293*a325d9c4SApple OSS Distributions 	}
1294*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(41, vp);
1295*a325d9c4SApple OSS Distributions 
1296*a325d9c4SApple OSS Distributions 	return error;
1297*a325d9c4SApple OSS Distributions }
1298*a325d9c4SApple OSS Distributions 
1299*a325d9c4SApple OSS Distributions int
mac_vnode_check_fsgetpath(vfs_context_t ctx,struct vnode * vp)1300*a325d9c4SApple OSS Distributions mac_vnode_check_fsgetpath(vfs_context_t ctx, struct vnode *vp)
1301*a325d9c4SApple OSS Distributions {
1302*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
1303*a325d9c4SApple OSS Distributions 	int error;
1304*a325d9c4SApple OSS Distributions 
1305*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1306*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
1307*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
1308*a325d9c4SApple OSS Distributions 		return 0;
1309*a325d9c4SApple OSS Distributions 	}
1310*a325d9c4SApple OSS Distributions #endif
1311*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1312*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1313*a325d9c4SApple OSS Distributions 		return 0;
1314*a325d9c4SApple OSS Distributions 	}
1315*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(42, vp);
1316*a325d9c4SApple OSS Distributions 	MAC_CHECK(vnode_check_fsgetpath, cred, vp, mac_vnode_label(vp));
1317*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(42, vp);
1318*a325d9c4SApple OSS Distributions 	return error;
1319*a325d9c4SApple OSS Distributions }
1320*a325d9c4SApple OSS Distributions 
1321*a325d9c4SApple OSS Distributions int
mac_vnode_check_signature(struct vnode * vp,struct cs_blob * cs_blob,struct image_params * imgp,unsigned int * cs_flags,unsigned int * signer_type,int flags,unsigned int platform)1322*a325d9c4SApple OSS Distributions mac_vnode_check_signature(struct vnode *vp, struct cs_blob *cs_blob,
1323*a325d9c4SApple OSS Distributions     struct image_params *imgp,
1324*a325d9c4SApple OSS Distributions     unsigned int *cs_flags, unsigned int *signer_type,
1325*a325d9c4SApple OSS Distributions     int flags, unsigned int platform)
1326*a325d9c4SApple OSS Distributions {
1327*a325d9c4SApple OSS Distributions 	int error;
1328*a325d9c4SApple OSS Distributions 	char *fatal_failure_desc = NULL;
1329*a325d9c4SApple OSS Distributions 	size_t fatal_failure_desc_len = 0;
1330*a325d9c4SApple OSS Distributions 
1331*a325d9c4SApple OSS Distributions 	char *vn_path = NULL;
1332*a325d9c4SApple OSS Distributions 	vm_size_t vn_pathlen = MAXPATHLEN;
1333*a325d9c4SApple OSS Distributions 	cpu_type_t cpu_type = (imgp == NULL) ? CPU_TYPE_ANY : imgp->ip_origcputype;
1334*a325d9c4SApple OSS Distributions 
1335*a325d9c4SApple OSS Distributions 
1336*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1337*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
1338*a325d9c4SApple OSS Distributions 	if (!mac_proc_enforce || !mac_vnode_enforce) {
1339*a325d9c4SApple OSS Distributions 		return 0;
1340*a325d9c4SApple OSS Distributions 	}
1341*a325d9c4SApple OSS Distributions #endif
1342*a325d9c4SApple OSS Distributions 
1343*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(43, vp);
1344*a325d9c4SApple OSS Distributions 	MAC_CHECK(vnode_check_signature, vp, mac_vnode_label(vp), cpu_type, cs_blob,
1345*a325d9c4SApple OSS Distributions 	    cs_flags, signer_type, flags, platform, &fatal_failure_desc, &fatal_failure_desc_len);
1346*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(43, vp);
1347*a325d9c4SApple OSS Distributions 
1348*a325d9c4SApple OSS Distributions 	if (fatal_failure_desc_len) {
1349*a325d9c4SApple OSS Distributions 		// A fatal code signature validation failure occured, formulate a crash
1350*a325d9c4SApple OSS Distributions 		// reason.
1351*a325d9c4SApple OSS Distributions 
1352*a325d9c4SApple OSS Distributions 		char const *path = NULL;
1353*a325d9c4SApple OSS Distributions 
1354*a325d9c4SApple OSS Distributions 		vn_path = zalloc(ZV_NAMEI);
1355*a325d9c4SApple OSS Distributions 		if (vn_getpath(vp, vn_path, (int*)&vn_pathlen) == 0) {
1356*a325d9c4SApple OSS Distributions 			path = vn_path;
1357*a325d9c4SApple OSS Distributions 		} else {
1358*a325d9c4SApple OSS Distributions 			path = "(get vnode path failed)";
1359*a325d9c4SApple OSS Distributions 		}
1360*a325d9c4SApple OSS Distributions 
1361*a325d9c4SApple OSS Distributions 		if (error == 0) {
1362*a325d9c4SApple OSS Distributions 			panic("mac_vnode_check_signature: MAC hook returned no error, "
1363*a325d9c4SApple OSS Distributions 			    "but status is claimed to be fatal? "
1364*a325d9c4SApple OSS Distributions 			    "path: '%s', fatal_failure_desc_len: %ld, fatal_failure_desc:\n%s\n",
1365*a325d9c4SApple OSS Distributions 			    path, fatal_failure_desc_len, fatal_failure_desc);
1366*a325d9c4SApple OSS Distributions 		}
1367*a325d9c4SApple OSS Distributions 
1368*a325d9c4SApple OSS Distributions 		printf("mac_vnode_check_signature: %s: code signature validation failed fatally: %s",
1369*a325d9c4SApple OSS Distributions 		    path, fatal_failure_desc);
1370*a325d9c4SApple OSS Distributions 
1371*a325d9c4SApple OSS Distributions 		if (imgp == NULL) {
1372*a325d9c4SApple OSS Distributions 			goto out;
1373*a325d9c4SApple OSS Distributions 		}
1374*a325d9c4SApple OSS Distributions 
1375*a325d9c4SApple OSS Distributions 		os_reason_t reason = os_reason_create(OS_REASON_CODESIGNING,
1376*a325d9c4SApple OSS Distributions 		    CODESIGNING_EXIT_REASON_TASKGATED_INVALID_SIG);
1377*a325d9c4SApple OSS Distributions 
1378*a325d9c4SApple OSS Distributions 		if (reason == OS_REASON_NULL) {
1379*a325d9c4SApple OSS Distributions 			printf("mac_vnode_check_signature: %s: failure to allocate exit reason for validation failure: %s\n",
1380*a325d9c4SApple OSS Distributions 			    path, fatal_failure_desc);
1381*a325d9c4SApple OSS Distributions 			goto out;
1382*a325d9c4SApple OSS Distributions 		}
1383*a325d9c4SApple OSS Distributions 
1384*a325d9c4SApple OSS Distributions 		imgp->ip_cs_error = reason;
1385*a325d9c4SApple OSS Distributions 		reason->osr_flags = (OS_REASON_FLAG_GENERATE_CRASH_REPORT |
1386*a325d9c4SApple OSS Distributions 		    OS_REASON_FLAG_CONSISTENT_FAILURE);
1387*a325d9c4SApple OSS Distributions 
1388*a325d9c4SApple OSS Distributions 		if (fatal_failure_desc == NULL) {
1389*a325d9c4SApple OSS Distributions 			// This may happen if allocation for the buffer failed.
1390*a325d9c4SApple OSS Distributions 			printf("mac_vnode_check_signature: %s: fatal failure is missing its description.\n", path);
1391*a325d9c4SApple OSS Distributions 		} else {
1392*a325d9c4SApple OSS Distributions 			mach_vm_address_t data_addr = 0;
1393*a325d9c4SApple OSS Distributions 
1394*a325d9c4SApple OSS Distributions 			int reason_error = 0;
1395*a325d9c4SApple OSS Distributions 			int kcdata_error = 0;
1396*a325d9c4SApple OSS Distributions 
1397*a325d9c4SApple OSS Distributions 			if ((reason_error = os_reason_alloc_buffer_noblock(reason, kcdata_estimate_required_buffer_size
1398*a325d9c4SApple OSS Distributions 			    (1, (uint32_t)fatal_failure_desc_len))) == 0 &&
1399*a325d9c4SApple OSS Distributions 			    (kcdata_error = kcdata_get_memory_addr(&reason->osr_kcd_descriptor,
1400*a325d9c4SApple OSS Distributions 			    EXIT_REASON_USER_DESC, (uint32_t)fatal_failure_desc_len,
1401*a325d9c4SApple OSS Distributions 			    &data_addr)) == KERN_SUCCESS) {
1402*a325d9c4SApple OSS Distributions 				kern_return_t mc_error = kcdata_memcpy(&reason->osr_kcd_descriptor, (mach_vm_address_t)data_addr,
1403*a325d9c4SApple OSS Distributions 				    fatal_failure_desc, (uint32_t)fatal_failure_desc_len);
1404*a325d9c4SApple OSS Distributions 
1405*a325d9c4SApple OSS Distributions 				if (mc_error != KERN_SUCCESS) {
1406*a325d9c4SApple OSS Distributions 					printf("mac_vnode_check_signature: %s: failed to copy reason string "
1407*a325d9c4SApple OSS Distributions 					    "(kcdata_memcpy error: %d, length: %ld)\n",
1408*a325d9c4SApple OSS Distributions 					    path, mc_error, fatal_failure_desc_len);
1409*a325d9c4SApple OSS Distributions 				}
1410*a325d9c4SApple OSS Distributions 			} else {
1411*a325d9c4SApple OSS Distributions 				printf("mac_vnode_check_signature: %s: failed to allocate space for reason string "
1412*a325d9c4SApple OSS Distributions 				    "(os_reason_alloc_buffer error: %d, kcdata error: %d, length: %ld)\n",
1413*a325d9c4SApple OSS Distributions 				    path, reason_error, kcdata_error, fatal_failure_desc_len);
1414*a325d9c4SApple OSS Distributions 			}
1415*a325d9c4SApple OSS Distributions 		}
1416*a325d9c4SApple OSS Distributions 	}
1417*a325d9c4SApple OSS Distributions 
1418*a325d9c4SApple OSS Distributions out:
1419*a325d9c4SApple OSS Distributions 	if (vn_path) {
1420*a325d9c4SApple OSS Distributions 		zfree(ZV_NAMEI, vn_path);
1421*a325d9c4SApple OSS Distributions 	}
1422*a325d9c4SApple OSS Distributions 
1423*a325d9c4SApple OSS Distributions 	if (fatal_failure_desc_len > 0 && fatal_failure_desc != NULL) {
1424*a325d9c4SApple OSS Distributions 		/* AMFI uses kalloc() which for kexts is redirected to KHEAP_KEXT */
1425*a325d9c4SApple OSS Distributions 		kheap_free(KHEAP_KEXT, fatal_failure_desc, fatal_failure_desc_len);
1426*a325d9c4SApple OSS Distributions 	}
1427*a325d9c4SApple OSS Distributions 
1428*a325d9c4SApple OSS Distributions 	return error;
1429*a325d9c4SApple OSS Distributions }
1430*a325d9c4SApple OSS Distributions 
1431*a325d9c4SApple OSS Distributions int
mac_vnode_check_supplemental_signature(struct vnode * vp,struct cs_blob * cs_blob,struct vnode * linked_vp,struct cs_blob * linked_cs_blob,unsigned int * signer_type)1432*a325d9c4SApple OSS Distributions mac_vnode_check_supplemental_signature(struct vnode *vp,
1433*a325d9c4SApple OSS Distributions     struct cs_blob *cs_blob, struct vnode *linked_vp,
1434*a325d9c4SApple OSS Distributions     struct cs_blob *linked_cs_blob, unsigned int *signer_type)
1435*a325d9c4SApple OSS Distributions {
1436*a325d9c4SApple OSS Distributions 	int error;
1437*a325d9c4SApple OSS Distributions 
1438*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1439*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
1440*a325d9c4SApple OSS Distributions 	if (!mac_proc_enforce || !mac_vnode_enforce) {
1441*a325d9c4SApple OSS Distributions 		return 0;
1442*a325d9c4SApple OSS Distributions 	}
1443*a325d9c4SApple OSS Distributions #endif
1444*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(93, vp);
1445*a325d9c4SApple OSS Distributions 	MAC_CHECK(vnode_check_supplemental_signature, vp, mac_vnode_label(vp), cs_blob, linked_vp, linked_cs_blob,
1446*a325d9c4SApple OSS Distributions 	    signer_type);
1447*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(93, vp);
1448*a325d9c4SApple OSS Distributions 
1449*a325d9c4SApple OSS Distributions 	return error;
1450*a325d9c4SApple OSS Distributions }
1451*a325d9c4SApple OSS Distributions 
1452*a325d9c4SApple OSS Distributions #if 0
1453*a325d9c4SApple OSS Distributions int
1454*a325d9c4SApple OSS Distributions mac_vnode_check_getacl(vfs_context_t ctx, struct vnode *vp, acl_type_t type)
1455*a325d9c4SApple OSS Distributions {
1456*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
1457*a325d9c4SApple OSS Distributions 	int error;
1458*a325d9c4SApple OSS Distributions 
1459*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1460*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
1461*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
1462*a325d9c4SApple OSS Distributions 		return 0;
1463*a325d9c4SApple OSS Distributions 	}
1464*a325d9c4SApple OSS Distributions #endif
1465*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1466*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1467*a325d9c4SApple OSS Distributions 		return 0;
1468*a325d9c4SApple OSS Distributions 	}
1469*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(44, vp);
1470*a325d9c4SApple OSS Distributions 	MAC_CHECK(vnode_check_getacl, cred, vp, mac_vnode_label(vp), type);
1471*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(44, vp);
1472*a325d9c4SApple OSS Distributions 	return error;
1473*a325d9c4SApple OSS Distributions }
1474*a325d9c4SApple OSS Distributions #endif
1475*a325d9c4SApple OSS Distributions 
1476*a325d9c4SApple OSS Distributions int
mac_vnode_check_getextattr(vfs_context_t ctx,struct vnode * vp,const char * name,struct uio * uio)1477*a325d9c4SApple OSS Distributions mac_vnode_check_getextattr(vfs_context_t ctx, struct vnode *vp,
1478*a325d9c4SApple OSS Distributions     const char *name, struct uio *uio)
1479*a325d9c4SApple OSS Distributions {
1480*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
1481*a325d9c4SApple OSS Distributions 	int error;
1482*a325d9c4SApple OSS Distributions 
1483*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1484*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
1485*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
1486*a325d9c4SApple OSS Distributions 		return 0;
1487*a325d9c4SApple OSS Distributions 	}
1488*a325d9c4SApple OSS Distributions #endif
1489*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1490*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1491*a325d9c4SApple OSS Distributions 		return 0;
1492*a325d9c4SApple OSS Distributions 	}
1493*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(45, vp);
1494*a325d9c4SApple OSS Distributions 	MAC_CHECK(vnode_check_getextattr, cred, vp, mac_vnode_label(vp),
1495*a325d9c4SApple OSS Distributions 	    name, uio);
1496*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(45, vp);
1497*a325d9c4SApple OSS Distributions 	return error;
1498*a325d9c4SApple OSS Distributions }
1499*a325d9c4SApple OSS Distributions 
1500*a325d9c4SApple OSS Distributions int
mac_vnode_check_ioctl(vfs_context_t ctx,struct vnode * vp,u_long cmd)1501*a325d9c4SApple OSS Distributions mac_vnode_check_ioctl(vfs_context_t ctx, struct vnode *vp, u_long cmd)
1502*a325d9c4SApple OSS Distributions {
1503*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
1504*a325d9c4SApple OSS Distributions 	int error;
1505*a325d9c4SApple OSS Distributions 
1506*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1507*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
1508*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
1509*a325d9c4SApple OSS Distributions 		return 0;
1510*a325d9c4SApple OSS Distributions 	}
1511*a325d9c4SApple OSS Distributions #endif
1512*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1513*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1514*a325d9c4SApple OSS Distributions 		return 0;
1515*a325d9c4SApple OSS Distributions 	}
1516*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(46, vp);
1517*a325d9c4SApple OSS Distributions 	MAC_CHECK(vnode_check_ioctl, cred, vp, mac_vnode_label(vp), cmd);
1518*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(46, vp);
1519*a325d9c4SApple OSS Distributions 	return error;
1520*a325d9c4SApple OSS Distributions }
1521*a325d9c4SApple OSS Distributions 
1522*a325d9c4SApple OSS Distributions int
mac_vnode_check_kqfilter(vfs_context_t ctx,kauth_cred_t file_cred,struct knote * kn,struct vnode * vp)1523*a325d9c4SApple OSS Distributions mac_vnode_check_kqfilter(vfs_context_t ctx, kauth_cred_t file_cred,
1524*a325d9c4SApple OSS Distributions     struct knote *kn, struct vnode *vp)
1525*a325d9c4SApple OSS Distributions {
1526*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
1527*a325d9c4SApple OSS Distributions 	int error;
1528*a325d9c4SApple OSS Distributions 
1529*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1530*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
1531*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
1532*a325d9c4SApple OSS Distributions 		return 0;
1533*a325d9c4SApple OSS Distributions 	}
1534*a325d9c4SApple OSS Distributions #endif
1535*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1536*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1537*a325d9c4SApple OSS Distributions 		return 0;
1538*a325d9c4SApple OSS Distributions 	}
1539*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(47, vp);
1540*a325d9c4SApple OSS Distributions 	MAC_CHECK(vnode_check_kqfilter, cred, file_cred, kn, vp,
1541*a325d9c4SApple OSS Distributions 	    mac_vnode_label(vp));
1542*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(47, vp);
1543*a325d9c4SApple OSS Distributions 
1544*a325d9c4SApple OSS Distributions 	return error;
1545*a325d9c4SApple OSS Distributions }
1546*a325d9c4SApple OSS Distributions 
1547*a325d9c4SApple OSS Distributions int
mac_vnode_check_link(vfs_context_t ctx,struct vnode * dvp,struct vnode * vp,struct componentname * cnp)1548*a325d9c4SApple OSS Distributions mac_vnode_check_link(vfs_context_t ctx, struct vnode *dvp,
1549*a325d9c4SApple OSS Distributions     struct vnode *vp, struct componentname *cnp)
1550*a325d9c4SApple OSS Distributions {
1551*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
1552*a325d9c4SApple OSS Distributions 	int error;
1553*a325d9c4SApple OSS Distributions 
1554*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1555*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
1556*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
1557*a325d9c4SApple OSS Distributions 		return 0;
1558*a325d9c4SApple OSS Distributions 	}
1559*a325d9c4SApple OSS Distributions #endif
1560*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1561*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1562*a325d9c4SApple OSS Distributions 		return 0;
1563*a325d9c4SApple OSS Distributions 	}
1564*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(48, vp);
1565*a325d9c4SApple OSS Distributions 	MAC_CHECK(vnode_check_link, cred, dvp, mac_vnode_label(dvp), vp,
1566*a325d9c4SApple OSS Distributions 	    mac_vnode_label(vp), cnp);
1567*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(48, vp);
1568*a325d9c4SApple OSS Distributions 	return error;
1569*a325d9c4SApple OSS Distributions }
1570*a325d9c4SApple OSS Distributions 
1571*a325d9c4SApple OSS Distributions int
mac_vnode_check_listextattr(vfs_context_t ctx,struct vnode * vp)1572*a325d9c4SApple OSS Distributions mac_vnode_check_listextattr(vfs_context_t ctx, struct vnode *vp)
1573*a325d9c4SApple OSS Distributions {
1574*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
1575*a325d9c4SApple OSS Distributions 	int error;
1576*a325d9c4SApple OSS Distributions 
1577*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1578*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
1579*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
1580*a325d9c4SApple OSS Distributions 		return 0;
1581*a325d9c4SApple OSS Distributions 	}
1582*a325d9c4SApple OSS Distributions #endif
1583*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1584*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1585*a325d9c4SApple OSS Distributions 		return 0;
1586*a325d9c4SApple OSS Distributions 	}
1587*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(49, vp);
1588*a325d9c4SApple OSS Distributions 	MAC_CHECK(vnode_check_listextattr, cred, vp, mac_vnode_label(vp));
1589*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(49, vp);
1590*a325d9c4SApple OSS Distributions 	return error;
1591*a325d9c4SApple OSS Distributions }
1592*a325d9c4SApple OSS Distributions 
1593*a325d9c4SApple OSS Distributions int
mac_vnode_check_lookup_preflight(vfs_context_t ctx,struct vnode * dvp,const char * path,size_t pathlen)1594*a325d9c4SApple OSS Distributions mac_vnode_check_lookup_preflight(vfs_context_t ctx, struct vnode *dvp,
1595*a325d9c4SApple OSS Distributions     const char *path, size_t pathlen)
1596*a325d9c4SApple OSS Distributions {
1597*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
1598*a325d9c4SApple OSS Distributions 	int error;
1599*a325d9c4SApple OSS Distributions 
1600*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1601*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
1602*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
1603*a325d9c4SApple OSS Distributions 		return 0;
1604*a325d9c4SApple OSS Distributions 	}
1605*a325d9c4SApple OSS Distributions #endif
1606*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1607*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1608*a325d9c4SApple OSS Distributions 		return 0;
1609*a325d9c4SApple OSS Distributions 	}
1610*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(50, dvp);
1611*a325d9c4SApple OSS Distributions 	MAC_CHECK(vnode_check_lookup_preflight, cred, dvp, mac_vnode_label(dvp), path, pathlen);
1612*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(50, dvp);
1613*a325d9c4SApple OSS Distributions 	return error;
1614*a325d9c4SApple OSS Distributions }
1615*a325d9c4SApple OSS Distributions 
1616*a325d9c4SApple OSS Distributions int
mac_vnode_check_lookup(vfs_context_t ctx,struct vnode * dvp,struct componentname * cnp)1617*a325d9c4SApple OSS Distributions mac_vnode_check_lookup(vfs_context_t ctx, struct vnode *dvp,
1618*a325d9c4SApple OSS Distributions     struct componentname *cnp)
1619*a325d9c4SApple OSS Distributions {
1620*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
1621*a325d9c4SApple OSS Distributions 	int error;
1622*a325d9c4SApple OSS Distributions 
1623*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1624*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
1625*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
1626*a325d9c4SApple OSS Distributions 		return 0;
1627*a325d9c4SApple OSS Distributions 	}
1628*a325d9c4SApple OSS Distributions #endif
1629*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1630*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1631*a325d9c4SApple OSS Distributions 		return 0;
1632*a325d9c4SApple OSS Distributions 	}
1633*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(51, dvp);
1634*a325d9c4SApple OSS Distributions 	MAC_CHECK(vnode_check_lookup, cred, dvp, mac_vnode_label(dvp), cnp);
1635*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(51, dvp);
1636*a325d9c4SApple OSS Distributions 	return error;
1637*a325d9c4SApple OSS Distributions }
1638*a325d9c4SApple OSS Distributions 
1639*a325d9c4SApple OSS Distributions int
mac_vnode_check_open(vfs_context_t ctx,struct vnode * vp,int acc_mode)1640*a325d9c4SApple OSS Distributions mac_vnode_check_open(vfs_context_t ctx, struct vnode *vp, int acc_mode)
1641*a325d9c4SApple OSS Distributions {
1642*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
1643*a325d9c4SApple OSS Distributions 	int error;
1644*a325d9c4SApple OSS Distributions 
1645*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1646*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
1647*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
1648*a325d9c4SApple OSS Distributions 		return 0;
1649*a325d9c4SApple OSS Distributions 	}
1650*a325d9c4SApple OSS Distributions #endif
1651*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1652*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1653*a325d9c4SApple OSS Distributions 		return 0;
1654*a325d9c4SApple OSS Distributions 	}
1655*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(52, vp);
1656*a325d9c4SApple OSS Distributions 	MAC_CHECK(vnode_check_open, cred, vp, mac_vnode_label(vp), acc_mode);
1657*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(52, vp);
1658*a325d9c4SApple OSS Distributions 	return error;
1659*a325d9c4SApple OSS Distributions }
1660*a325d9c4SApple OSS Distributions 
1661*a325d9c4SApple OSS Distributions int
mac_vnode_check_read(vfs_context_t ctx,struct ucred * file_cred,struct vnode * vp)1662*a325d9c4SApple OSS Distributions mac_vnode_check_read(vfs_context_t ctx, struct ucred *file_cred,
1663*a325d9c4SApple OSS Distributions     struct vnode *vp)
1664*a325d9c4SApple OSS Distributions {
1665*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
1666*a325d9c4SApple OSS Distributions 	int error;
1667*a325d9c4SApple OSS Distributions 
1668*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1669*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
1670*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
1671*a325d9c4SApple OSS Distributions 		return 0;
1672*a325d9c4SApple OSS Distributions 	}
1673*a325d9c4SApple OSS Distributions #endif
1674*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1675*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1676*a325d9c4SApple OSS Distributions 		return 0;
1677*a325d9c4SApple OSS Distributions 	}
1678*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(53, vp);
1679*a325d9c4SApple OSS Distributions 	MAC_CHECK(vnode_check_read, cred, file_cred, vp,
1680*a325d9c4SApple OSS Distributions 	    mac_vnode_label(vp));
1681*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(53, vp);
1682*a325d9c4SApple OSS Distributions 
1683*a325d9c4SApple OSS Distributions 	return error;
1684*a325d9c4SApple OSS Distributions }
1685*a325d9c4SApple OSS Distributions 
1686*a325d9c4SApple OSS Distributions int
mac_vnode_check_readdir(vfs_context_t ctx,struct vnode * dvp)1687*a325d9c4SApple OSS Distributions mac_vnode_check_readdir(vfs_context_t ctx, struct vnode *dvp)
1688*a325d9c4SApple OSS Distributions {
1689*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
1690*a325d9c4SApple OSS Distributions 	int error;
1691*a325d9c4SApple OSS Distributions 
1692*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1693*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
1694*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
1695*a325d9c4SApple OSS Distributions 		return 0;
1696*a325d9c4SApple OSS Distributions 	}
1697*a325d9c4SApple OSS Distributions #endif
1698*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1699*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1700*a325d9c4SApple OSS Distributions 		return 0;
1701*a325d9c4SApple OSS Distributions 	}
1702*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(54, dvp);
1703*a325d9c4SApple OSS Distributions 	MAC_CHECK(vnode_check_readdir, cred, dvp, mac_vnode_label(dvp));
1704*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(54, dvp);
1705*a325d9c4SApple OSS Distributions 	return error;
1706*a325d9c4SApple OSS Distributions }
1707*a325d9c4SApple OSS Distributions 
1708*a325d9c4SApple OSS Distributions int
mac_vnode_check_readlink(vfs_context_t ctx,struct vnode * vp)1709*a325d9c4SApple OSS Distributions mac_vnode_check_readlink(vfs_context_t ctx, struct vnode *vp)
1710*a325d9c4SApple OSS Distributions {
1711*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
1712*a325d9c4SApple OSS Distributions 	int error;
1713*a325d9c4SApple OSS Distributions 
1714*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1715*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
1716*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
1717*a325d9c4SApple OSS Distributions 		return 0;
1718*a325d9c4SApple OSS Distributions 	}
1719*a325d9c4SApple OSS Distributions #endif
1720*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1721*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1722*a325d9c4SApple OSS Distributions 		return 0;
1723*a325d9c4SApple OSS Distributions 	}
1724*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(55, vp);
1725*a325d9c4SApple OSS Distributions 	MAC_CHECK(vnode_check_readlink, cred, vp, mac_vnode_label(vp));
1726*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(55, vp);
1727*a325d9c4SApple OSS Distributions 	return error;
1728*a325d9c4SApple OSS Distributions }
1729*a325d9c4SApple OSS Distributions 
1730*a325d9c4SApple OSS Distributions int
mac_vnode_check_label_update(vfs_context_t ctx,struct vnode * vp,struct label * newlabel)1731*a325d9c4SApple OSS Distributions mac_vnode_check_label_update(vfs_context_t ctx, struct vnode *vp,
1732*a325d9c4SApple OSS Distributions     struct label *newlabel)
1733*a325d9c4SApple OSS Distributions {
1734*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
1735*a325d9c4SApple OSS Distributions 	int error;
1736*a325d9c4SApple OSS Distributions 
1737*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1738*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
1739*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
1740*a325d9c4SApple OSS Distributions 		return 0;
1741*a325d9c4SApple OSS Distributions 	}
1742*a325d9c4SApple OSS Distributions #endif
1743*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1744*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1745*a325d9c4SApple OSS Distributions 		return 0;
1746*a325d9c4SApple OSS Distributions 	}
1747*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(56, vp);
1748*a325d9c4SApple OSS Distributions 	MAC_CHECK(vnode_check_label_update, cred, vp, mac_vnode_label(vp), newlabel);
1749*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(56, vp);
1750*a325d9c4SApple OSS Distributions 
1751*a325d9c4SApple OSS Distributions 	return error;
1752*a325d9c4SApple OSS Distributions }
1753*a325d9c4SApple OSS Distributions 
1754*a325d9c4SApple OSS Distributions int
mac_vnode_check_rename(vfs_context_t ctx,struct vnode * dvp,struct vnode * vp,struct componentname * cnp,struct vnode * tdvp,struct vnode * tvp,struct componentname * tcnp)1755*a325d9c4SApple OSS Distributions mac_vnode_check_rename(vfs_context_t ctx, struct vnode *dvp,
1756*a325d9c4SApple OSS Distributions     struct vnode *vp, struct componentname *cnp, struct vnode *tdvp,
1757*a325d9c4SApple OSS Distributions     struct vnode *tvp, struct componentname *tcnp)
1758*a325d9c4SApple OSS Distributions {
1759*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
1760*a325d9c4SApple OSS Distributions 	int error;
1761*a325d9c4SApple OSS Distributions 
1762*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1763*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
1764*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
1765*a325d9c4SApple OSS Distributions 		return 0;
1766*a325d9c4SApple OSS Distributions 	}
1767*a325d9c4SApple OSS Distributions #endif
1768*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1769*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1770*a325d9c4SApple OSS Distributions 		return 0;
1771*a325d9c4SApple OSS Distributions 	}
1772*a325d9c4SApple OSS Distributions 
1773*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(57, vp);
1774*a325d9c4SApple OSS Distributions 	MAC_CHECK(vnode_check_rename_from, cred, dvp, mac_vnode_label(dvp), vp,
1775*a325d9c4SApple OSS Distributions 	    mac_vnode_label(vp), cnp);
1776*a325d9c4SApple OSS Distributions 	if (error) {
1777*a325d9c4SApple OSS Distributions 		VFS_KERNEL_DEBUG_END1(57, vp);
1778*a325d9c4SApple OSS Distributions 		return error;
1779*a325d9c4SApple OSS Distributions 	}
1780*a325d9c4SApple OSS Distributions 
1781*a325d9c4SApple OSS Distributions 	MAC_CHECK(vnode_check_rename_to, cred, tdvp, mac_vnode_label(tdvp), tvp,
1782*a325d9c4SApple OSS Distributions 	    tvp != NULL ? mac_vnode_label(tvp) : NULL, dvp == tdvp, tcnp);
1783*a325d9c4SApple OSS Distributions 	if (error) {
1784*a325d9c4SApple OSS Distributions 		VFS_KERNEL_DEBUG_END1(57, vp);
1785*a325d9c4SApple OSS Distributions 		return error;
1786*a325d9c4SApple OSS Distributions 	}
1787*a325d9c4SApple OSS Distributions 
1788*a325d9c4SApple OSS Distributions 	MAC_CHECK(vnode_check_rename, cred, dvp, mac_vnode_label(dvp), vp,
1789*a325d9c4SApple OSS Distributions 	    mac_vnode_label(vp), cnp, tdvp, mac_vnode_label(tdvp), tvp,
1790*a325d9c4SApple OSS Distributions 	    tvp != NULL ? mac_vnode_label(tvp) : NULL, tcnp);
1791*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(57, vp);
1792*a325d9c4SApple OSS Distributions 	return error;
1793*a325d9c4SApple OSS Distributions }
1794*a325d9c4SApple OSS Distributions 
1795*a325d9c4SApple OSS Distributions int
mac_vnode_check_revoke(vfs_context_t ctx,struct vnode * vp)1796*a325d9c4SApple OSS Distributions mac_vnode_check_revoke(vfs_context_t ctx, struct vnode *vp)
1797*a325d9c4SApple OSS Distributions {
1798*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
1799*a325d9c4SApple OSS Distributions 	int error;
1800*a325d9c4SApple OSS Distributions 
1801*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1802*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
1803*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
1804*a325d9c4SApple OSS Distributions 		return 0;
1805*a325d9c4SApple OSS Distributions 	}
1806*a325d9c4SApple OSS Distributions #endif
1807*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1808*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1809*a325d9c4SApple OSS Distributions 		return 0;
1810*a325d9c4SApple OSS Distributions 	}
1811*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(58, vp);
1812*a325d9c4SApple OSS Distributions 	MAC_CHECK(vnode_check_revoke, cred, vp, mac_vnode_label(vp));
1813*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(58, vp);
1814*a325d9c4SApple OSS Distributions 	return error;
1815*a325d9c4SApple OSS Distributions }
1816*a325d9c4SApple OSS Distributions 
1817*a325d9c4SApple OSS Distributions int
mac_vnode_check_searchfs(vfs_context_t ctx,struct vnode * vp,struct attrlist * returnattrs,struct attrlist * searchattrs)1818*a325d9c4SApple OSS Distributions mac_vnode_check_searchfs(vfs_context_t ctx, struct vnode *vp, struct attrlist *returnattrs,
1819*a325d9c4SApple OSS Distributions     struct attrlist *searchattrs)
1820*a325d9c4SApple OSS Distributions {
1821*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
1822*a325d9c4SApple OSS Distributions 	int error;
1823*a325d9c4SApple OSS Distributions 
1824*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1825*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
1826*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
1827*a325d9c4SApple OSS Distributions 		return 0;
1828*a325d9c4SApple OSS Distributions 	}
1829*a325d9c4SApple OSS Distributions #endif
1830*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1831*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1832*a325d9c4SApple OSS Distributions 		return 0;
1833*a325d9c4SApple OSS Distributions 	}
1834*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(59, vp);
1835*a325d9c4SApple OSS Distributions 	MAC_CHECK(vnode_check_searchfs, cred, vp, mac_vnode_label(vp), returnattrs, searchattrs);
1836*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(59, vp);
1837*a325d9c4SApple OSS Distributions 	return error;
1838*a325d9c4SApple OSS Distributions }
1839*a325d9c4SApple OSS Distributions 
1840*a325d9c4SApple OSS Distributions int
mac_vnode_check_select(vfs_context_t ctx,struct vnode * vp,int which)1841*a325d9c4SApple OSS Distributions mac_vnode_check_select(vfs_context_t ctx, struct vnode *vp, int which)
1842*a325d9c4SApple OSS Distributions {
1843*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
1844*a325d9c4SApple OSS Distributions 	int error;
1845*a325d9c4SApple OSS Distributions 
1846*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1847*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
1848*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
1849*a325d9c4SApple OSS Distributions 		return 0;
1850*a325d9c4SApple OSS Distributions 	}
1851*a325d9c4SApple OSS Distributions #endif
1852*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1853*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1854*a325d9c4SApple OSS Distributions 		return 0;
1855*a325d9c4SApple OSS Distributions 	}
1856*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(60, vp);
1857*a325d9c4SApple OSS Distributions 	MAC_CHECK(vnode_check_select, cred, vp, mac_vnode_label(vp), which);
1858*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(60, vp);
1859*a325d9c4SApple OSS Distributions 	return error;
1860*a325d9c4SApple OSS Distributions }
1861*a325d9c4SApple OSS Distributions 
1862*a325d9c4SApple OSS Distributions int
mac_vnode_check_setacl(vfs_context_t ctx,struct vnode * vp,struct kauth_acl * acl)1863*a325d9c4SApple OSS Distributions mac_vnode_check_setacl(vfs_context_t ctx, struct vnode *vp,
1864*a325d9c4SApple OSS Distributions     struct kauth_acl *acl)
1865*a325d9c4SApple OSS Distributions {
1866*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
1867*a325d9c4SApple OSS Distributions 	int error;
1868*a325d9c4SApple OSS Distributions 
1869*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1870*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
1871*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
1872*a325d9c4SApple OSS Distributions 		return 0;
1873*a325d9c4SApple OSS Distributions 	}
1874*a325d9c4SApple OSS Distributions #endif
1875*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1876*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1877*a325d9c4SApple OSS Distributions 		return 0;
1878*a325d9c4SApple OSS Distributions 	}
1879*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(61, vp);
1880*a325d9c4SApple OSS Distributions 	MAC_CHECK(vnode_check_setacl, cred, vp, mac_vnode_label(vp), acl);
1881*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(61, vp);
1882*a325d9c4SApple OSS Distributions 	return error;
1883*a325d9c4SApple OSS Distributions }
1884*a325d9c4SApple OSS Distributions 
1885*a325d9c4SApple OSS Distributions int
mac_vnode_check_setattrlist(vfs_context_t ctx,struct vnode * vp,struct attrlist * alist)1886*a325d9c4SApple OSS Distributions mac_vnode_check_setattrlist(vfs_context_t ctx, struct vnode *vp,
1887*a325d9c4SApple OSS Distributions     struct attrlist *alist)
1888*a325d9c4SApple OSS Distributions {
1889*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
1890*a325d9c4SApple OSS Distributions 	int error;
1891*a325d9c4SApple OSS Distributions 
1892*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1893*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
1894*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
1895*a325d9c4SApple OSS Distributions 		return 0;
1896*a325d9c4SApple OSS Distributions 	}
1897*a325d9c4SApple OSS Distributions #endif
1898*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1899*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1900*a325d9c4SApple OSS Distributions 		return 0;
1901*a325d9c4SApple OSS Distributions 	}
1902*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(62, vp);
1903*a325d9c4SApple OSS Distributions 	MAC_CHECK(vnode_check_setattrlist, cred, vp, mac_vnode_label(vp), alist);
1904*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(62, vp);
1905*a325d9c4SApple OSS Distributions 	return error;
1906*a325d9c4SApple OSS Distributions }
1907*a325d9c4SApple OSS Distributions 
1908*a325d9c4SApple OSS Distributions int
mac_vnode_check_setextattr(vfs_context_t ctx,struct vnode * vp,const char * name,struct uio * uio)1909*a325d9c4SApple OSS Distributions mac_vnode_check_setextattr(vfs_context_t ctx, struct vnode *vp,
1910*a325d9c4SApple OSS Distributions     const char *name, struct uio *uio)
1911*a325d9c4SApple OSS Distributions {
1912*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
1913*a325d9c4SApple OSS Distributions 	int error;
1914*a325d9c4SApple OSS Distributions 
1915*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1916*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
1917*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
1918*a325d9c4SApple OSS Distributions 		return 0;
1919*a325d9c4SApple OSS Distributions 	}
1920*a325d9c4SApple OSS Distributions #endif
1921*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1922*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1923*a325d9c4SApple OSS Distributions 		return 0;
1924*a325d9c4SApple OSS Distributions 	}
1925*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(63, vp);
1926*a325d9c4SApple OSS Distributions 	MAC_CHECK(vnode_check_setextattr, cred, vp, mac_vnode_label(vp),
1927*a325d9c4SApple OSS Distributions 	    name, uio);
1928*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(63, vp);
1929*a325d9c4SApple OSS Distributions 	return error;
1930*a325d9c4SApple OSS Distributions }
1931*a325d9c4SApple OSS Distributions 
1932*a325d9c4SApple OSS Distributions int
mac_vnode_check_setflags(vfs_context_t ctx,struct vnode * vp,u_long flags)1933*a325d9c4SApple OSS Distributions mac_vnode_check_setflags(vfs_context_t ctx, struct vnode *vp, u_long flags)
1934*a325d9c4SApple OSS Distributions {
1935*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
1936*a325d9c4SApple OSS Distributions 	int error;
1937*a325d9c4SApple OSS Distributions 
1938*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1939*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
1940*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
1941*a325d9c4SApple OSS Distributions 		return 0;
1942*a325d9c4SApple OSS Distributions 	}
1943*a325d9c4SApple OSS Distributions #endif
1944*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1945*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1946*a325d9c4SApple OSS Distributions 		return 0;
1947*a325d9c4SApple OSS Distributions 	}
1948*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(64, vp);
1949*a325d9c4SApple OSS Distributions 	MAC_CHECK(vnode_check_setflags, cred, vp, mac_vnode_label(vp), flags);
1950*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(64, vp);
1951*a325d9c4SApple OSS Distributions 	return error;
1952*a325d9c4SApple OSS Distributions }
1953*a325d9c4SApple OSS Distributions 
1954*a325d9c4SApple OSS Distributions int
mac_vnode_check_setmode(vfs_context_t ctx,struct vnode * vp,mode_t mode)1955*a325d9c4SApple OSS Distributions mac_vnode_check_setmode(vfs_context_t ctx, struct vnode *vp, mode_t mode)
1956*a325d9c4SApple OSS Distributions {
1957*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
1958*a325d9c4SApple OSS Distributions 	int error;
1959*a325d9c4SApple OSS Distributions 
1960*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1961*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
1962*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
1963*a325d9c4SApple OSS Distributions 		return 0;
1964*a325d9c4SApple OSS Distributions 	}
1965*a325d9c4SApple OSS Distributions #endif
1966*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1967*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1968*a325d9c4SApple OSS Distributions 		return 0;
1969*a325d9c4SApple OSS Distributions 	}
1970*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(65, vp);
1971*a325d9c4SApple OSS Distributions 	MAC_CHECK(vnode_check_setmode, cred, vp, mac_vnode_label(vp), mode);
1972*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(65, vp);
1973*a325d9c4SApple OSS Distributions 	return error;
1974*a325d9c4SApple OSS Distributions }
1975*a325d9c4SApple OSS Distributions 
1976*a325d9c4SApple OSS Distributions int
mac_vnode_check_setowner(vfs_context_t ctx,struct vnode * vp,uid_t uid,gid_t gid)1977*a325d9c4SApple OSS Distributions mac_vnode_check_setowner(vfs_context_t ctx, struct vnode *vp, uid_t uid,
1978*a325d9c4SApple OSS Distributions     gid_t gid)
1979*a325d9c4SApple OSS Distributions {
1980*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
1981*a325d9c4SApple OSS Distributions 	int error;
1982*a325d9c4SApple OSS Distributions 
1983*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
1984*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
1985*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
1986*a325d9c4SApple OSS Distributions 		return 0;
1987*a325d9c4SApple OSS Distributions 	}
1988*a325d9c4SApple OSS Distributions #endif
1989*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
1990*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
1991*a325d9c4SApple OSS Distributions 		return 0;
1992*a325d9c4SApple OSS Distributions 	}
1993*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(66, vp);
1994*a325d9c4SApple OSS Distributions 	MAC_CHECK(vnode_check_setowner, cred, vp, mac_vnode_label(vp), uid, gid);
1995*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(66, vp);
1996*a325d9c4SApple OSS Distributions 	return error;
1997*a325d9c4SApple OSS Distributions }
1998*a325d9c4SApple OSS Distributions 
1999*a325d9c4SApple OSS Distributions int
mac_vnode_check_setutimes(vfs_context_t ctx,struct vnode * vp,struct timespec atime,struct timespec mtime)2000*a325d9c4SApple OSS Distributions mac_vnode_check_setutimes(vfs_context_t ctx, struct vnode *vp,
2001*a325d9c4SApple OSS Distributions     struct timespec atime, struct timespec mtime)
2002*a325d9c4SApple OSS Distributions {
2003*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
2004*a325d9c4SApple OSS Distributions 	int error;
2005*a325d9c4SApple OSS Distributions 
2006*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
2007*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
2008*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
2009*a325d9c4SApple OSS Distributions 		return 0;
2010*a325d9c4SApple OSS Distributions 	}
2011*a325d9c4SApple OSS Distributions #endif
2012*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
2013*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
2014*a325d9c4SApple OSS Distributions 		return 0;
2015*a325d9c4SApple OSS Distributions 	}
2016*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(67, vp);
2017*a325d9c4SApple OSS Distributions 	MAC_CHECK(vnode_check_setutimes, cred, vp, mac_vnode_label(vp), atime,
2018*a325d9c4SApple OSS Distributions 	    mtime);
2019*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(67, vp);
2020*a325d9c4SApple OSS Distributions 	return error;
2021*a325d9c4SApple OSS Distributions }
2022*a325d9c4SApple OSS Distributions 
2023*a325d9c4SApple OSS Distributions int
mac_vnode_check_stat(vfs_context_t ctx,struct ucred * file_cred,struct vnode * vp)2024*a325d9c4SApple OSS Distributions mac_vnode_check_stat(vfs_context_t ctx, struct ucred *file_cred,
2025*a325d9c4SApple OSS Distributions     struct vnode *vp)
2026*a325d9c4SApple OSS Distributions {
2027*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
2028*a325d9c4SApple OSS Distributions 	int error;
2029*a325d9c4SApple OSS Distributions 
2030*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
2031*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
2032*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
2033*a325d9c4SApple OSS Distributions 		return 0;
2034*a325d9c4SApple OSS Distributions 	}
2035*a325d9c4SApple OSS Distributions #endif
2036*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
2037*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
2038*a325d9c4SApple OSS Distributions 		return 0;
2039*a325d9c4SApple OSS Distributions 	}
2040*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(68, vp);
2041*a325d9c4SApple OSS Distributions 	MAC_CHECK(vnode_check_stat, cred, file_cred, vp,
2042*a325d9c4SApple OSS Distributions 	    mac_vnode_label(vp));
2043*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(68, vp);
2044*a325d9c4SApple OSS Distributions 	return error;
2045*a325d9c4SApple OSS Distributions }
2046*a325d9c4SApple OSS Distributions 
2047*a325d9c4SApple OSS Distributions int
mac_vnode_check_trigger_resolve(vfs_context_t ctx,struct vnode * dvp,struct componentname * cnp)2048*a325d9c4SApple OSS Distributions mac_vnode_check_trigger_resolve(vfs_context_t ctx, struct vnode *dvp,
2049*a325d9c4SApple OSS Distributions     struct componentname *cnp)
2050*a325d9c4SApple OSS Distributions {
2051*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
2052*a325d9c4SApple OSS Distributions 	int error;
2053*a325d9c4SApple OSS Distributions 
2054*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
2055*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
2056*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
2057*a325d9c4SApple OSS Distributions 		return 0;
2058*a325d9c4SApple OSS Distributions 	}
2059*a325d9c4SApple OSS Distributions #endif
2060*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
2061*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
2062*a325d9c4SApple OSS Distributions 		return 0;
2063*a325d9c4SApple OSS Distributions 	}
2064*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(69, dvp);
2065*a325d9c4SApple OSS Distributions 	MAC_CHECK(vnode_check_trigger_resolve, cred, dvp, mac_vnode_label(dvp), cnp);
2066*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(69, dvp);
2067*a325d9c4SApple OSS Distributions 	return error;
2068*a325d9c4SApple OSS Distributions }
2069*a325d9c4SApple OSS Distributions 
2070*a325d9c4SApple OSS Distributions int
mac_vnode_check_truncate(vfs_context_t ctx,struct ucred * file_cred,struct vnode * vp)2071*a325d9c4SApple OSS Distributions mac_vnode_check_truncate(vfs_context_t ctx, struct ucred *file_cred,
2072*a325d9c4SApple OSS Distributions     struct vnode *vp)
2073*a325d9c4SApple OSS Distributions {
2074*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
2075*a325d9c4SApple OSS Distributions 	int error;
2076*a325d9c4SApple OSS Distributions 
2077*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
2078*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
2079*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
2080*a325d9c4SApple OSS Distributions 		return 0;
2081*a325d9c4SApple OSS Distributions 	}
2082*a325d9c4SApple OSS Distributions #endif
2083*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
2084*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
2085*a325d9c4SApple OSS Distributions 		return 0;
2086*a325d9c4SApple OSS Distributions 	}
2087*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(70, vp);
2088*a325d9c4SApple OSS Distributions 	MAC_CHECK(vnode_check_truncate, cred, file_cred, vp,
2089*a325d9c4SApple OSS Distributions 	    mac_vnode_label(vp));
2090*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(70, vp);
2091*a325d9c4SApple OSS Distributions 
2092*a325d9c4SApple OSS Distributions 	return error;
2093*a325d9c4SApple OSS Distributions }
2094*a325d9c4SApple OSS Distributions 
2095*a325d9c4SApple OSS Distributions int
mac_vnode_check_write(vfs_context_t ctx,struct ucred * file_cred,struct vnode * vp)2096*a325d9c4SApple OSS Distributions mac_vnode_check_write(vfs_context_t ctx, struct ucred *file_cred,
2097*a325d9c4SApple OSS Distributions     struct vnode *vp)
2098*a325d9c4SApple OSS Distributions {
2099*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
2100*a325d9c4SApple OSS Distributions 	int error;
2101*a325d9c4SApple OSS Distributions 
2102*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
2103*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
2104*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
2105*a325d9c4SApple OSS Distributions 		return 0;
2106*a325d9c4SApple OSS Distributions 	}
2107*a325d9c4SApple OSS Distributions #endif
2108*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
2109*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
2110*a325d9c4SApple OSS Distributions 		return 0;
2111*a325d9c4SApple OSS Distributions 	}
2112*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(71, vp);
2113*a325d9c4SApple OSS Distributions 	MAC_CHECK(vnode_check_write, cred, file_cred, vp, mac_vnode_label(vp));
2114*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(71, vp);
2115*a325d9c4SApple OSS Distributions 
2116*a325d9c4SApple OSS Distributions 	return error;
2117*a325d9c4SApple OSS Distributions }
2118*a325d9c4SApple OSS Distributions 
2119*a325d9c4SApple OSS Distributions int
mac_vnode_check_uipc_bind(vfs_context_t ctx,struct vnode * dvp,struct componentname * cnp,struct vnode_attr * vap)2120*a325d9c4SApple OSS Distributions mac_vnode_check_uipc_bind(vfs_context_t ctx, struct vnode *dvp,
2121*a325d9c4SApple OSS Distributions     struct componentname *cnp, struct vnode_attr *vap)
2122*a325d9c4SApple OSS Distributions {
2123*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
2124*a325d9c4SApple OSS Distributions 	int error;
2125*a325d9c4SApple OSS Distributions 
2126*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
2127*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
2128*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
2129*a325d9c4SApple OSS Distributions 		return 0;
2130*a325d9c4SApple OSS Distributions 	}
2131*a325d9c4SApple OSS Distributions #endif
2132*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
2133*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
2134*a325d9c4SApple OSS Distributions 		return 0;
2135*a325d9c4SApple OSS Distributions 	}
2136*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(72, dvp);
2137*a325d9c4SApple OSS Distributions 	MAC_CHECK(vnode_check_uipc_bind, cred, dvp, mac_vnode_label(dvp), cnp, vap);
2138*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(72, dvp);
2139*a325d9c4SApple OSS Distributions 	return error;
2140*a325d9c4SApple OSS Distributions }
2141*a325d9c4SApple OSS Distributions 
2142*a325d9c4SApple OSS Distributions int
mac_vnode_check_uipc_connect(vfs_context_t ctx,struct vnode * vp,struct socket * so)2143*a325d9c4SApple OSS Distributions mac_vnode_check_uipc_connect(vfs_context_t ctx, struct vnode *vp, struct socket *so)
2144*a325d9c4SApple OSS Distributions {
2145*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
2146*a325d9c4SApple OSS Distributions 	int error;
2147*a325d9c4SApple OSS Distributions 
2148*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
2149*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
2150*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
2151*a325d9c4SApple OSS Distributions 		return 0;
2152*a325d9c4SApple OSS Distributions 	}
2153*a325d9c4SApple OSS Distributions #endif
2154*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
2155*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
2156*a325d9c4SApple OSS Distributions 		return 0;
2157*a325d9c4SApple OSS Distributions 	}
2158*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(73, vp);
2159*a325d9c4SApple OSS Distributions 	MAC_CHECK(vnode_check_uipc_connect, cred, vp, mac_vnode_label(vp), (socket_t) so);
2160*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(73, vp);
2161*a325d9c4SApple OSS Distributions 	return error;
2162*a325d9c4SApple OSS Distributions }
2163*a325d9c4SApple OSS Distributions 
2164*a325d9c4SApple OSS Distributions void
mac_vnode_label_update(vfs_context_t ctx,struct vnode * vp,struct label * newlabel)2165*a325d9c4SApple OSS Distributions mac_vnode_label_update(vfs_context_t ctx, struct vnode *vp, struct label *newlabel)
2166*a325d9c4SApple OSS Distributions {
2167*a325d9c4SApple OSS Distributions 	kauth_cred_t cred = vfs_context_ucred(ctx);
2168*a325d9c4SApple OSS Distributions 	struct label *tmpl = NULL;
2169*a325d9c4SApple OSS Distributions 
2170*a325d9c4SApple OSS Distributions 	if (mac_vnode_label(vp) == NULL) {
2171*a325d9c4SApple OSS Distributions 		tmpl = mac_vnode_label_alloc(vp);
2172*a325d9c4SApple OSS Distributions 	}
2173*a325d9c4SApple OSS Distributions 
2174*a325d9c4SApple OSS Distributions 	vnode_lock(vp);
2175*a325d9c4SApple OSS Distributions 
2176*a325d9c4SApple OSS Distributions 	/*
2177*a325d9c4SApple OSS Distributions 	 * Recheck under lock.  We allocate labels for vnodes lazily, so
2178*a325d9c4SApple OSS Distributions 	 * somebody else might have already got here first.
2179*a325d9c4SApple OSS Distributions 	 */
2180*a325d9c4SApple OSS Distributions 	if (mac_vnode_label(vp) == NULL) {
2181*a325d9c4SApple OSS Distributions 		vp->v_label = tmpl;
2182*a325d9c4SApple OSS Distributions 		tmpl = NULL;
2183*a325d9c4SApple OSS Distributions 	}
2184*a325d9c4SApple OSS Distributions 
2185*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(74, vp);
2186*a325d9c4SApple OSS Distributions 	MAC_PERFORM(vnode_label_update, cred, vp, mac_vnode_label(vp), newlabel);
2187*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(74, vp);
2188*a325d9c4SApple OSS Distributions 	vnode_unlock(vp);
2189*a325d9c4SApple OSS Distributions 
2190*a325d9c4SApple OSS Distributions 	if (tmpl != NULL) {
2191*a325d9c4SApple OSS Distributions 		mac_vnode_label_free(tmpl);
2192*a325d9c4SApple OSS Distributions 	}
2193*a325d9c4SApple OSS Distributions }
2194*a325d9c4SApple OSS Distributions 
2195*a325d9c4SApple OSS Distributions int
mac_vnode_find_sigs(struct proc * p,struct vnode * vp,off_t offset)2196*a325d9c4SApple OSS Distributions mac_vnode_find_sigs(struct proc *p, struct vnode *vp, off_t offset)
2197*a325d9c4SApple OSS Distributions {
2198*a325d9c4SApple OSS Distributions 	int error;
2199*a325d9c4SApple OSS Distributions 
2200*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
2201*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
2202*a325d9c4SApple OSS Distributions 	if (!mac_proc_enforce || !mac_vnode_enforce) {
2203*a325d9c4SApple OSS Distributions 		return 0;
2204*a325d9c4SApple OSS Distributions 	}
2205*a325d9c4SApple OSS Distributions #endif
2206*a325d9c4SApple OSS Distributions 
2207*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(75, vp);
2208*a325d9c4SApple OSS Distributions 	MAC_CHECK(vnode_find_sigs, p, vp, offset, mac_vnode_label(vp));
2209*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(75, vp);
2210*a325d9c4SApple OSS Distributions 
2211*a325d9c4SApple OSS Distributions 	return error;
2212*a325d9c4SApple OSS Distributions }
2213*a325d9c4SApple OSS Distributions 
2214*a325d9c4SApple OSS Distributions void
mac_mount_label_associate(vfs_context_t ctx,struct mount * mp)2215*a325d9c4SApple OSS Distributions mac_mount_label_associate(vfs_context_t ctx, struct mount *mp)
2216*a325d9c4SApple OSS Distributions {
2217*a325d9c4SApple OSS Distributions 	kauth_cred_t cred = vfs_context_ucred(ctx);
2218*a325d9c4SApple OSS Distributions 
2219*a325d9c4SApple OSS Distributions 	/* XXX: eventually this logic may be handled by the policy? */
2220*a325d9c4SApple OSS Distributions 
2221*a325d9c4SApple OSS Distributions 	/* We desire MULTILABEL for the root filesystem. */
2222*a325d9c4SApple OSS Distributions 	if ((mp->mnt_flag & MNT_ROOTFS) &&
2223*a325d9c4SApple OSS Distributions 	    (strcmp(mp->mnt_vfsstat.f_fstypename, "hfs") == 0)) {
2224*a325d9c4SApple OSS Distributions 		mp->mnt_flag |= MNT_MULTILABEL;
2225*a325d9c4SApple OSS Distributions 	}
2226*a325d9c4SApple OSS Distributions 
2227*a325d9c4SApple OSS Distributions 	/* MULTILABEL on DEVFS. */
2228*a325d9c4SApple OSS Distributions 	if (strcmp(mp->mnt_vfsstat.f_fstypename, "devfs") == 0) {
2229*a325d9c4SApple OSS Distributions 		mp->mnt_flag |= MNT_MULTILABEL;
2230*a325d9c4SApple OSS Distributions 	}
2231*a325d9c4SApple OSS Distributions 
2232*a325d9c4SApple OSS Distributions 	/* MULTILABEL on FDESC pseudo-filesystem. */
2233*a325d9c4SApple OSS Distributions 	if (strcmp(mp->mnt_vfsstat.f_fstypename, "fdesc") == 0) {
2234*a325d9c4SApple OSS Distributions 		mp->mnt_flag |= MNT_MULTILABEL;
2235*a325d9c4SApple OSS Distributions 	}
2236*a325d9c4SApple OSS Distributions 
2237*a325d9c4SApple OSS Distributions 	/* MULTILABEL on all NFS filesystems. */
2238*a325d9c4SApple OSS Distributions 	if (strcmp(mp->mnt_vfsstat.f_fstypename, "nfs") == 0) {
2239*a325d9c4SApple OSS Distributions 		mp->mnt_flag |= MNT_MULTILABEL;
2240*a325d9c4SApple OSS Distributions 	}
2241*a325d9c4SApple OSS Distributions 
2242*a325d9c4SApple OSS Distributions 	/* MULTILABEL on all AFP filesystems. */
2243*a325d9c4SApple OSS Distributions 	if (strcmp(mp->mnt_vfsstat.f_fstypename, "afpfs") == 0) {
2244*a325d9c4SApple OSS Distributions 		mp->mnt_flag |= MNT_MULTILABEL;
2245*a325d9c4SApple OSS Distributions 	}
2246*a325d9c4SApple OSS Distributions 
2247*a325d9c4SApple OSS Distributions 	if (mp->mnt_vtable != NULL) {
2248*a325d9c4SApple OSS Distributions 		/* Any filesystem that supports native XATTRs. */
2249*a325d9c4SApple OSS Distributions 		if ((mp->mnt_vtable->vfc_vfsflags & VFC_VFSNATIVEXATTR)) {
2250*a325d9c4SApple OSS Distributions 			mp->mnt_flag |= MNT_MULTILABEL;
2251*a325d9c4SApple OSS Distributions 		}
2252*a325d9c4SApple OSS Distributions 
2253*a325d9c4SApple OSS Distributions 		/* Filesystem does not support multilabel. */
2254*a325d9c4SApple OSS Distributions 		if ((mp->mnt_vtable->vfc_vfsflags & VFC_VFSNOMACLABEL) &&
2255*a325d9c4SApple OSS Distributions 		    (mp->mnt_flag & MNT_MULTILABEL)) {
2256*a325d9c4SApple OSS Distributions 			mp->mnt_flag &= ~MNT_MULTILABEL;
2257*a325d9c4SApple OSS Distributions 		}
2258*a325d9c4SApple OSS Distributions 	}
2259*a325d9c4SApple OSS Distributions 
2260*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(76, mp);
2261*a325d9c4SApple OSS Distributions 	MAC_PERFORM(mount_label_associate, cred, mp, mac_mount_label(mp));
2262*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(76, mp);
2263*a325d9c4SApple OSS Distributions #if DEBUG
2264*a325d9c4SApple OSS Distributions 	printf("MAC Framework enabling %s support: %s -> %s (%s)\n",
2265*a325d9c4SApple OSS Distributions 	    mp->mnt_flag & MNT_MULTILABEL ? "multilabel" : "singlelabel",
2266*a325d9c4SApple OSS Distributions 	    mp->mnt_vfsstat.f_mntfromname,
2267*a325d9c4SApple OSS Distributions 	    mp->mnt_vfsstat.f_mntonname,
2268*a325d9c4SApple OSS Distributions 	    mp->mnt_vfsstat.f_fstypename);
2269*a325d9c4SApple OSS Distributions #endif
2270*a325d9c4SApple OSS Distributions }
2271*a325d9c4SApple OSS Distributions 
2272*a325d9c4SApple OSS Distributions int
mac_mount_check_mount(vfs_context_t ctx,struct vnode * vp,struct componentname * cnp,const char * vfc_name)2273*a325d9c4SApple OSS Distributions mac_mount_check_mount(vfs_context_t ctx, struct vnode *vp,
2274*a325d9c4SApple OSS Distributions     struct componentname *cnp, const char *vfc_name)
2275*a325d9c4SApple OSS Distributions {
2276*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
2277*a325d9c4SApple OSS Distributions 	int error;
2278*a325d9c4SApple OSS Distributions 
2279*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
2280*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
2281*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
2282*a325d9c4SApple OSS Distributions 		return 0;
2283*a325d9c4SApple OSS Distributions 	}
2284*a325d9c4SApple OSS Distributions #endif
2285*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
2286*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
2287*a325d9c4SApple OSS Distributions 		return 0;
2288*a325d9c4SApple OSS Distributions 	}
2289*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(77, vp);
2290*a325d9c4SApple OSS Distributions 	MAC_CHECK(mount_check_mount, cred, vp, mac_vnode_label(vp), cnp, vfc_name);
2291*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(77, vp);
2292*a325d9c4SApple OSS Distributions 
2293*a325d9c4SApple OSS Distributions 	return error;
2294*a325d9c4SApple OSS Distributions }
2295*a325d9c4SApple OSS Distributions 
2296*a325d9c4SApple OSS Distributions int
mac_mount_check_mount_late(vfs_context_t ctx,struct mount * mp)2297*a325d9c4SApple OSS Distributions mac_mount_check_mount_late(vfs_context_t ctx, struct mount *mp)
2298*a325d9c4SApple OSS Distributions {
2299*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
2300*a325d9c4SApple OSS Distributions 	int error;
2301*a325d9c4SApple OSS Distributions 
2302*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
2303*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
2304*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
2305*a325d9c4SApple OSS Distributions 		return 0;
2306*a325d9c4SApple OSS Distributions 	}
2307*a325d9c4SApple OSS Distributions #endif
2308*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
2309*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
2310*a325d9c4SApple OSS Distributions 		return 0;
2311*a325d9c4SApple OSS Distributions 	}
2312*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(78, mp);
2313*a325d9c4SApple OSS Distributions 	MAC_CHECK(mount_check_mount_late, cred, mp);
2314*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(78, mp);
2315*a325d9c4SApple OSS Distributions 
2316*a325d9c4SApple OSS Distributions 	return error;
2317*a325d9c4SApple OSS Distributions }
2318*a325d9c4SApple OSS Distributions 
2319*a325d9c4SApple OSS Distributions int
mac_mount_check_snapshot_create(vfs_context_t ctx,struct mount * mp,const char * name)2320*a325d9c4SApple OSS Distributions mac_mount_check_snapshot_create(vfs_context_t ctx, struct mount *mp,
2321*a325d9c4SApple OSS Distributions     const char *name)
2322*a325d9c4SApple OSS Distributions {
2323*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
2324*a325d9c4SApple OSS Distributions 	int error;
2325*a325d9c4SApple OSS Distributions 
2326*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
2327*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
2328*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
2329*a325d9c4SApple OSS Distributions 		return 0;
2330*a325d9c4SApple OSS Distributions 	}
2331*a325d9c4SApple OSS Distributions #endif
2332*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
2333*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
2334*a325d9c4SApple OSS Distributions 		return 0;
2335*a325d9c4SApple OSS Distributions 	}
2336*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(79, mp);
2337*a325d9c4SApple OSS Distributions 	MAC_CHECK(mount_check_snapshot_create, cred, mp, name);
2338*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(79, mp);
2339*a325d9c4SApple OSS Distributions 	return error;
2340*a325d9c4SApple OSS Distributions }
2341*a325d9c4SApple OSS Distributions 
2342*a325d9c4SApple OSS Distributions int
mac_mount_check_snapshot_delete(vfs_context_t ctx,struct mount * mp,const char * name)2343*a325d9c4SApple OSS Distributions mac_mount_check_snapshot_delete(vfs_context_t ctx, struct mount *mp,
2344*a325d9c4SApple OSS Distributions     const char *name)
2345*a325d9c4SApple OSS Distributions {
2346*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
2347*a325d9c4SApple OSS Distributions 	int error;
2348*a325d9c4SApple OSS Distributions 
2349*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
2350*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
2351*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
2352*a325d9c4SApple OSS Distributions 		return 0;
2353*a325d9c4SApple OSS Distributions 	}
2354*a325d9c4SApple OSS Distributions #endif
2355*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
2356*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
2357*a325d9c4SApple OSS Distributions 		return 0;
2358*a325d9c4SApple OSS Distributions 	}
2359*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(80, mp);
2360*a325d9c4SApple OSS Distributions 	MAC_CHECK(mount_check_snapshot_delete, cred, mp, name);
2361*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(80, mp);
2362*a325d9c4SApple OSS Distributions 	return error;
2363*a325d9c4SApple OSS Distributions }
2364*a325d9c4SApple OSS Distributions 
2365*a325d9c4SApple OSS Distributions int
mac_mount_check_snapshot_mount(vfs_context_t ctx,struct vnode * rvp,struct vnode * vp,struct componentname * cnp,const char * name,const char * vfc_name)2366*a325d9c4SApple OSS Distributions mac_mount_check_snapshot_mount(vfs_context_t ctx, struct vnode *rvp, struct vnode *vp, struct componentname *cnp,
2367*a325d9c4SApple OSS Distributions     const char *name, const char *vfc_name)
2368*a325d9c4SApple OSS Distributions {
2369*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
2370*a325d9c4SApple OSS Distributions 	int error;
2371*a325d9c4SApple OSS Distributions 
2372*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
2373*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
2374*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
2375*a325d9c4SApple OSS Distributions 		return 0;
2376*a325d9c4SApple OSS Distributions 	}
2377*a325d9c4SApple OSS Distributions #endif
2378*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
2379*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
2380*a325d9c4SApple OSS Distributions 		return 0;
2381*a325d9c4SApple OSS Distributions 	}
2382*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(92, vp);
2383*a325d9c4SApple OSS Distributions 	MAC_CHECK(mount_check_snapshot_mount, cred, rvp, vp, cnp, name, vfc_name);
2384*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(92, vp);
2385*a325d9c4SApple OSS Distributions 	return error;
2386*a325d9c4SApple OSS Distributions }
2387*a325d9c4SApple OSS Distributions 
2388*a325d9c4SApple OSS Distributions int
mac_mount_check_snapshot_revert(vfs_context_t ctx,struct mount * mp,const char * name)2389*a325d9c4SApple OSS Distributions mac_mount_check_snapshot_revert(vfs_context_t ctx, struct mount *mp,
2390*a325d9c4SApple OSS Distributions     const char *name)
2391*a325d9c4SApple OSS Distributions {
2392*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
2393*a325d9c4SApple OSS Distributions 	int error;
2394*a325d9c4SApple OSS Distributions 
2395*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
2396*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
2397*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
2398*a325d9c4SApple OSS Distributions 		return 0;
2399*a325d9c4SApple OSS Distributions 	}
2400*a325d9c4SApple OSS Distributions #endif
2401*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
2402*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
2403*a325d9c4SApple OSS Distributions 		return 0;
2404*a325d9c4SApple OSS Distributions 	}
2405*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(81, mp);
2406*a325d9c4SApple OSS Distributions 	MAC_CHECK(mount_check_snapshot_revert, cred, mp, name);
2407*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(81, mp);
2408*a325d9c4SApple OSS Distributions 	return error;
2409*a325d9c4SApple OSS Distributions }
2410*a325d9c4SApple OSS Distributions 
2411*a325d9c4SApple OSS Distributions int
mac_mount_check_remount(vfs_context_t ctx,struct mount * mp)2412*a325d9c4SApple OSS Distributions mac_mount_check_remount(vfs_context_t ctx, struct mount *mp)
2413*a325d9c4SApple OSS Distributions {
2414*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
2415*a325d9c4SApple OSS Distributions 	int error;
2416*a325d9c4SApple OSS Distributions 
2417*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
2418*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
2419*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
2420*a325d9c4SApple OSS Distributions 		return 0;
2421*a325d9c4SApple OSS Distributions 	}
2422*a325d9c4SApple OSS Distributions #endif
2423*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
2424*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
2425*a325d9c4SApple OSS Distributions 		return 0;
2426*a325d9c4SApple OSS Distributions 	}
2427*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(82, mp);
2428*a325d9c4SApple OSS Distributions 	MAC_CHECK(mount_check_remount, cred, mp, mac_mount_label(mp));
2429*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(82, mp);
2430*a325d9c4SApple OSS Distributions 
2431*a325d9c4SApple OSS Distributions 	return error;
2432*a325d9c4SApple OSS Distributions }
2433*a325d9c4SApple OSS Distributions 
2434*a325d9c4SApple OSS Distributions int
mac_mount_check_umount(vfs_context_t ctx,struct mount * mp)2435*a325d9c4SApple OSS Distributions mac_mount_check_umount(vfs_context_t ctx, struct mount *mp)
2436*a325d9c4SApple OSS Distributions {
2437*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
2438*a325d9c4SApple OSS Distributions 	int error;
2439*a325d9c4SApple OSS Distributions 
2440*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
2441*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
2442*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
2443*a325d9c4SApple OSS Distributions 		return 0;
2444*a325d9c4SApple OSS Distributions 	}
2445*a325d9c4SApple OSS Distributions #endif
2446*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
2447*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
2448*a325d9c4SApple OSS Distributions 		return 0;
2449*a325d9c4SApple OSS Distributions 	}
2450*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(83, mp);
2451*a325d9c4SApple OSS Distributions 	MAC_CHECK(mount_check_umount, cred, mp, mac_mount_label(mp));
2452*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(83, mp);
2453*a325d9c4SApple OSS Distributions 
2454*a325d9c4SApple OSS Distributions 	return error;
2455*a325d9c4SApple OSS Distributions }
2456*a325d9c4SApple OSS Distributions 
2457*a325d9c4SApple OSS Distributions int
mac_mount_check_getattr(vfs_context_t ctx,struct mount * mp,struct vfs_attr * vfa)2458*a325d9c4SApple OSS Distributions mac_mount_check_getattr(vfs_context_t ctx, struct mount *mp,
2459*a325d9c4SApple OSS Distributions     struct vfs_attr *vfa)
2460*a325d9c4SApple OSS Distributions {
2461*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
2462*a325d9c4SApple OSS Distributions 	int error;
2463*a325d9c4SApple OSS Distributions 
2464*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
2465*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
2466*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
2467*a325d9c4SApple OSS Distributions 		return 0;
2468*a325d9c4SApple OSS Distributions 	}
2469*a325d9c4SApple OSS Distributions #endif
2470*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
2471*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
2472*a325d9c4SApple OSS Distributions 		return 0;
2473*a325d9c4SApple OSS Distributions 	}
2474*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(84, mp);
2475*a325d9c4SApple OSS Distributions 	MAC_CHECK(mount_check_getattr, cred, mp, mac_mount_label(mp), vfa);
2476*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(84, mp);
2477*a325d9c4SApple OSS Distributions 	return error;
2478*a325d9c4SApple OSS Distributions }
2479*a325d9c4SApple OSS Distributions 
2480*a325d9c4SApple OSS Distributions int
mac_mount_check_setattr(vfs_context_t ctx,struct mount * mp,struct vfs_attr * vfa)2481*a325d9c4SApple OSS Distributions mac_mount_check_setattr(vfs_context_t ctx, struct mount *mp,
2482*a325d9c4SApple OSS Distributions     struct vfs_attr *vfa)
2483*a325d9c4SApple OSS Distributions {
2484*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
2485*a325d9c4SApple OSS Distributions 	int error;
2486*a325d9c4SApple OSS Distributions 
2487*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
2488*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
2489*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
2490*a325d9c4SApple OSS Distributions 		return 0;
2491*a325d9c4SApple OSS Distributions 	}
2492*a325d9c4SApple OSS Distributions #endif
2493*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
2494*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
2495*a325d9c4SApple OSS Distributions 		return 0;
2496*a325d9c4SApple OSS Distributions 	}
2497*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(85, mp);
2498*a325d9c4SApple OSS Distributions 	MAC_CHECK(mount_check_setattr, cred, mp, mac_mount_label(mp), vfa);
2499*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(85, mp);
2500*a325d9c4SApple OSS Distributions 	return error;
2501*a325d9c4SApple OSS Distributions }
2502*a325d9c4SApple OSS Distributions 
2503*a325d9c4SApple OSS Distributions int
mac_mount_check_stat(vfs_context_t ctx,struct mount * mount)2504*a325d9c4SApple OSS Distributions mac_mount_check_stat(vfs_context_t ctx, struct mount *mount)
2505*a325d9c4SApple OSS Distributions {
2506*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
2507*a325d9c4SApple OSS Distributions 	int error;
2508*a325d9c4SApple OSS Distributions 
2509*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
2510*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
2511*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
2512*a325d9c4SApple OSS Distributions 		return 0;
2513*a325d9c4SApple OSS Distributions 	}
2514*a325d9c4SApple OSS Distributions #endif
2515*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
2516*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
2517*a325d9c4SApple OSS Distributions 		return 0;
2518*a325d9c4SApple OSS Distributions 	}
2519*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(86, mount);
2520*a325d9c4SApple OSS Distributions 	MAC_CHECK(mount_check_stat, cred, mount, mac_mount_label(mount));
2521*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(86, mount);
2522*a325d9c4SApple OSS Distributions 
2523*a325d9c4SApple OSS Distributions 	return error;
2524*a325d9c4SApple OSS Distributions }
2525*a325d9c4SApple OSS Distributions 
2526*a325d9c4SApple OSS Distributions int
mac_mount_check_label_update(vfs_context_t ctx,struct mount * mount)2527*a325d9c4SApple OSS Distributions mac_mount_check_label_update(vfs_context_t ctx, struct mount *mount)
2528*a325d9c4SApple OSS Distributions {
2529*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
2530*a325d9c4SApple OSS Distributions 	int error;
2531*a325d9c4SApple OSS Distributions 
2532*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
2533*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
2534*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
2535*a325d9c4SApple OSS Distributions 		return 0;
2536*a325d9c4SApple OSS Distributions 	}
2537*a325d9c4SApple OSS Distributions #endif
2538*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
2539*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
2540*a325d9c4SApple OSS Distributions 		return 0;
2541*a325d9c4SApple OSS Distributions 	}
2542*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(87, mount);
2543*a325d9c4SApple OSS Distributions 	MAC_CHECK(mount_check_label_update, cred, mount, mac_mount_label(mount));
2544*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(87, mount);
2545*a325d9c4SApple OSS Distributions 
2546*a325d9c4SApple OSS Distributions 	return error;
2547*a325d9c4SApple OSS Distributions }
2548*a325d9c4SApple OSS Distributions 
2549*a325d9c4SApple OSS Distributions int
mac_mount_check_fsctl(vfs_context_t ctx,struct mount * mp,u_long cmd)2550*a325d9c4SApple OSS Distributions mac_mount_check_fsctl(vfs_context_t ctx, struct mount *mp, u_long cmd)
2551*a325d9c4SApple OSS Distributions {
2552*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
2553*a325d9c4SApple OSS Distributions 	int error;
2554*a325d9c4SApple OSS Distributions 
2555*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
2556*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
2557*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
2558*a325d9c4SApple OSS Distributions 		return 0;
2559*a325d9c4SApple OSS Distributions 	}
2560*a325d9c4SApple OSS Distributions #endif
2561*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
2562*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
2563*a325d9c4SApple OSS Distributions 		return 0;
2564*a325d9c4SApple OSS Distributions 	}
2565*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(88, mp);
2566*a325d9c4SApple OSS Distributions 	MAC_CHECK(mount_check_fsctl, cred, mp, mac_mount_label(mp), cmd);
2567*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(88, mp);
2568*a325d9c4SApple OSS Distributions 
2569*a325d9c4SApple OSS Distributions 	return error;
2570*a325d9c4SApple OSS Distributions }
2571*a325d9c4SApple OSS Distributions 
2572*a325d9c4SApple OSS Distributions void
mac_devfs_label_associate_device(dev_t dev,struct devnode * de,const char * fullpath)2573*a325d9c4SApple OSS Distributions mac_devfs_label_associate_device(dev_t dev, struct devnode *de,
2574*a325d9c4SApple OSS Distributions     const char *fullpath)
2575*a325d9c4SApple OSS Distributions {
2576*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
2577*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
2578*a325d9c4SApple OSS Distributions 	if (!mac_device_enforce) {
2579*a325d9c4SApple OSS Distributions 		return;
2580*a325d9c4SApple OSS Distributions 	}
2581*a325d9c4SApple OSS Distributions #endif
2582*a325d9c4SApple OSS Distributions 
2583*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(89, de);
2584*a325d9c4SApple OSS Distributions 	MAC_PERFORM(devfs_label_associate_device, dev, de, mac_devfs_label(de),
2585*a325d9c4SApple OSS Distributions 	    fullpath);
2586*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(89, de);
2587*a325d9c4SApple OSS Distributions }
2588*a325d9c4SApple OSS Distributions 
2589*a325d9c4SApple OSS Distributions void
mac_devfs_label_associate_directory(const char * dirname,int dirnamelen,struct devnode * de,const char * fullpath)2590*a325d9c4SApple OSS Distributions mac_devfs_label_associate_directory(const char *dirname, int dirnamelen,
2591*a325d9c4SApple OSS Distributions     struct devnode *de, const char *fullpath)
2592*a325d9c4SApple OSS Distributions {
2593*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
2594*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
2595*a325d9c4SApple OSS Distributions 	if (!mac_device_enforce) {
2596*a325d9c4SApple OSS Distributions 		return;
2597*a325d9c4SApple OSS Distributions 	}
2598*a325d9c4SApple OSS Distributions #endif
2599*a325d9c4SApple OSS Distributions 
2600*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(90, de);
2601*a325d9c4SApple OSS Distributions 	MAC_PERFORM(devfs_label_associate_directory, dirname, dirnamelen, de,
2602*a325d9c4SApple OSS Distributions 	    mac_devfs_label(de), fullpath);
2603*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(90, de);
2604*a325d9c4SApple OSS Distributions }
2605*a325d9c4SApple OSS Distributions 
2606*a325d9c4SApple OSS Distributions int
vn_setlabel(struct vnode * vp,struct label * intlabel,vfs_context_t context)2607*a325d9c4SApple OSS Distributions vn_setlabel(struct vnode *vp, struct label *intlabel, vfs_context_t context)
2608*a325d9c4SApple OSS Distributions {
2609*a325d9c4SApple OSS Distributions 	int error;
2610*a325d9c4SApple OSS Distributions 
2611*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
2612*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
2613*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
2614*a325d9c4SApple OSS Distributions 		return 0;
2615*a325d9c4SApple OSS Distributions 	}
2616*a325d9c4SApple OSS Distributions #endif
2617*a325d9c4SApple OSS Distributions 	if (!mac_label_vnodes) {
2618*a325d9c4SApple OSS Distributions 		return 0;
2619*a325d9c4SApple OSS Distributions 	}
2620*a325d9c4SApple OSS Distributions 
2621*a325d9c4SApple OSS Distributions 	if (vp->v_mount == NULL) {
2622*a325d9c4SApple OSS Distributions 		printf("vn_setlabel: null v_mount\n");
2623*a325d9c4SApple OSS Distributions 		if (vp->v_type != VNON) {
2624*a325d9c4SApple OSS Distributions 			printf("vn_setlabel: null v_mount with non-VNON\n");
2625*a325d9c4SApple OSS Distributions 		}
2626*a325d9c4SApple OSS Distributions 		return EBADF;
2627*a325d9c4SApple OSS Distributions 	}
2628*a325d9c4SApple OSS Distributions 
2629*a325d9c4SApple OSS Distributions 	if ((vp->v_mount->mnt_flag & MNT_MULTILABEL) == 0) {
2630*a325d9c4SApple OSS Distributions 		return ENOTSUP;
2631*a325d9c4SApple OSS Distributions 	}
2632*a325d9c4SApple OSS Distributions 
2633*a325d9c4SApple OSS Distributions 	/*
2634*a325d9c4SApple OSS Distributions 	 * Multi-phase commit.  First check the policies to confirm the
2635*a325d9c4SApple OSS Distributions 	 * change is OK.  Then commit via the filesystem.  Finally,
2636*a325d9c4SApple OSS Distributions 	 * update the actual vnode label.  Question: maybe the filesystem
2637*a325d9c4SApple OSS Distributions 	 * should update the vnode at the end as part of VNOP_SETLABEL()?
2638*a325d9c4SApple OSS Distributions 	 */
2639*a325d9c4SApple OSS Distributions 	error = mac_vnode_check_label_update(context, vp, intlabel);
2640*a325d9c4SApple OSS Distributions 	if (error) {
2641*a325d9c4SApple OSS Distributions 		return error;
2642*a325d9c4SApple OSS Distributions 	}
2643*a325d9c4SApple OSS Distributions 
2644*a325d9c4SApple OSS Distributions 	error = VNOP_SETLABEL(vp, intlabel, context);
2645*a325d9c4SApple OSS Distributions 	if (error == ENOTSUP) {
2646*a325d9c4SApple OSS Distributions 		error = mac_vnode_label_store(context, vp,
2647*a325d9c4SApple OSS Distributions 		    intlabel);
2648*a325d9c4SApple OSS Distributions 		if (error) {
2649*a325d9c4SApple OSS Distributions 			printf("%s: mac_vnode_label_store failed %d\n",
2650*a325d9c4SApple OSS Distributions 			    __func__, error);
2651*a325d9c4SApple OSS Distributions 			return error;
2652*a325d9c4SApple OSS Distributions 		}
2653*a325d9c4SApple OSS Distributions 		mac_vnode_label_update(context, vp, intlabel);
2654*a325d9c4SApple OSS Distributions 	} else if (error) {
2655*a325d9c4SApple OSS Distributions 		printf("vn_setlabel: vop setlabel failed %d\n", error);
2656*a325d9c4SApple OSS Distributions 		return error;
2657*a325d9c4SApple OSS Distributions 	}
2658*a325d9c4SApple OSS Distributions 
2659*a325d9c4SApple OSS Distributions 	return 0;
2660*a325d9c4SApple OSS Distributions }
2661*a325d9c4SApple OSS Distributions 
2662*a325d9c4SApple OSS Distributions int
mac_vnode_label_associate_fdesc(struct mount * mp,struct fdescnode * fnp,struct vnode * vp,vfs_context_t ctx)2663*a325d9c4SApple OSS Distributions mac_vnode_label_associate_fdesc(struct mount *mp, struct fdescnode *fnp,
2664*a325d9c4SApple OSS Distributions     struct vnode *vp, vfs_context_t ctx)
2665*a325d9c4SApple OSS Distributions {
2666*a325d9c4SApple OSS Distributions 	struct fileproc *fp;
2667*a325d9c4SApple OSS Distributions #if CONFIG_MACF_SOCKET_SUBSET
2668*a325d9c4SApple OSS Distributions 	struct socket *so;
2669*a325d9c4SApple OSS Distributions #endif
2670*a325d9c4SApple OSS Distributions 	struct pipe *cpipe;
2671*a325d9c4SApple OSS Distributions 	struct vnode *fvp;
2672*a325d9c4SApple OSS Distributions 	struct proc *p;
2673*a325d9c4SApple OSS Distributions 	int error;
2674*a325d9c4SApple OSS Distributions 
2675*a325d9c4SApple OSS Distributions 	error = 0;
2676*a325d9c4SApple OSS Distributions 
2677*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(91, vp);
2678*a325d9c4SApple OSS Distributions 	/*
2679*a325d9c4SApple OSS Distributions 	 * If no backing file, let the policy choose which label to use.
2680*a325d9c4SApple OSS Distributions 	 */
2681*a325d9c4SApple OSS Distributions 	if (fnp->fd_fd == -1) {
2682*a325d9c4SApple OSS Distributions 		MAC_PERFORM(vnode_label_associate_file, vfs_context_ucred(ctx),
2683*a325d9c4SApple OSS Distributions 		    mp, mac_mount_label(mp), NULL, NULL, vp, mac_vnode_label(vp));
2684*a325d9c4SApple OSS Distributions 		VFS_KERNEL_DEBUG_END1(91, vp);
2685*a325d9c4SApple OSS Distributions 		return 0;
2686*a325d9c4SApple OSS Distributions 	}
2687*a325d9c4SApple OSS Distributions 
2688*a325d9c4SApple OSS Distributions 	p = vfs_context_proc(ctx);
2689*a325d9c4SApple OSS Distributions 	error = fp_lookup(p, fnp->fd_fd, &fp, 0);
2690*a325d9c4SApple OSS Distributions 	if (error) {
2691*a325d9c4SApple OSS Distributions 		VFS_KERNEL_DEBUG_END1(91, vp);
2692*a325d9c4SApple OSS Distributions 		return error;
2693*a325d9c4SApple OSS Distributions 	}
2694*a325d9c4SApple OSS Distributions 
2695*a325d9c4SApple OSS Distributions 	if (fp->fp_glob == NULL) {
2696*a325d9c4SApple OSS Distributions 		error = EBADF;
2697*a325d9c4SApple OSS Distributions 		goto out;
2698*a325d9c4SApple OSS Distributions 	}
2699*a325d9c4SApple OSS Distributions 
2700*a325d9c4SApple OSS Distributions 	switch (FILEGLOB_DTYPE(fp->fp_glob)) {
2701*a325d9c4SApple OSS Distributions 	case DTYPE_VNODE:
2702*a325d9c4SApple OSS Distributions 		fvp = (struct vnode *)fp_get_data(fp);
2703*a325d9c4SApple OSS Distributions 		if ((error = vnode_getwithref(fvp))) {
2704*a325d9c4SApple OSS Distributions 			goto out;
2705*a325d9c4SApple OSS Distributions 		}
2706*a325d9c4SApple OSS Distributions 		if (mac_vnode_label(fvp) != NULL) {
2707*a325d9c4SApple OSS Distributions 			if (mac_label_vnodes != 0 && mac_vnode_label(vp) == NULL) {
2708*a325d9c4SApple OSS Distributions 				mac_vnode_label_init(vp); /* init dst label */
2709*a325d9c4SApple OSS Distributions 			}
2710*a325d9c4SApple OSS Distributions 			MAC_PERFORM(vnode_label_copy, mac_vnode_label(fvp), mac_vnode_label(vp));
2711*a325d9c4SApple OSS Distributions 		}
2712*a325d9c4SApple OSS Distributions 		(void)vnode_put(fvp);
2713*a325d9c4SApple OSS Distributions 		break;
2714*a325d9c4SApple OSS Distributions #if CONFIG_MACF_SOCKET_SUBSET
2715*a325d9c4SApple OSS Distributions 	case DTYPE_SOCKET:
2716*a325d9c4SApple OSS Distributions 		so = (struct socket *)fp_get_data(fp);
2717*a325d9c4SApple OSS Distributions 		socket_lock(so, 1);
2718*a325d9c4SApple OSS Distributions 		MAC_PERFORM(vnode_label_associate_socket,
2719*a325d9c4SApple OSS Distributions 		    vfs_context_ucred(ctx), (socket_t)so, NULL,
2720*a325d9c4SApple OSS Distributions 		    vp, mac_vnode_label(vp));
2721*a325d9c4SApple OSS Distributions 		socket_unlock(so, 1);
2722*a325d9c4SApple OSS Distributions 		break;
2723*a325d9c4SApple OSS Distributions #endif
2724*a325d9c4SApple OSS Distributions 	case DTYPE_PSXSHM:
2725*a325d9c4SApple OSS Distributions 		pshm_label_associate(fp, vp, ctx);
2726*a325d9c4SApple OSS Distributions 		break;
2727*a325d9c4SApple OSS Distributions 	case DTYPE_PSXSEM:
2728*a325d9c4SApple OSS Distributions 		psem_label_associate(fp, vp, ctx);
2729*a325d9c4SApple OSS Distributions 		break;
2730*a325d9c4SApple OSS Distributions 	case DTYPE_PIPE:
2731*a325d9c4SApple OSS Distributions 		cpipe = (struct pipe *)fp_get_data(fp);
2732*a325d9c4SApple OSS Distributions 		/* kern/sys_pipe.c:pipe_select() suggests this test. */
2733*a325d9c4SApple OSS Distributions 		if (cpipe == (struct pipe *)-1) {
2734*a325d9c4SApple OSS Distributions 			error = EINVAL;
2735*a325d9c4SApple OSS Distributions 			goto out;
2736*a325d9c4SApple OSS Distributions 		}
2737*a325d9c4SApple OSS Distributions 		PIPE_LOCK(cpipe);
2738*a325d9c4SApple OSS Distributions 		MAC_PERFORM(vnode_label_associate_pipe, vfs_context_ucred(ctx),
2739*a325d9c4SApple OSS Distributions 		    cpipe, mac_pipe_label(cpipe), vp, mac_vnode_label(vp));
2740*a325d9c4SApple OSS Distributions 		PIPE_UNLOCK(cpipe);
2741*a325d9c4SApple OSS Distributions 		break;
2742*a325d9c4SApple OSS Distributions 	case DTYPE_KQUEUE:
2743*a325d9c4SApple OSS Distributions 	case DTYPE_FSEVENTS:
2744*a325d9c4SApple OSS Distributions 	case DTYPE_ATALK:
2745*a325d9c4SApple OSS Distributions 	case DTYPE_NETPOLICY:
2746*a325d9c4SApple OSS Distributions 	default:
2747*a325d9c4SApple OSS Distributions 		MAC_PERFORM(vnode_label_associate_file, vfs_context_ucred(ctx),
2748*a325d9c4SApple OSS Distributions 		    mp, mac_mount_label(mp), fp->fp_glob, NULL,
2749*a325d9c4SApple OSS Distributions 		    vp, mac_vnode_label(vp));
2750*a325d9c4SApple OSS Distributions 		break;
2751*a325d9c4SApple OSS Distributions 	}
2752*a325d9c4SApple OSS Distributions out:
2753*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(91, vp);
2754*a325d9c4SApple OSS Distributions 	fp_drop(p, fnp->fd_fd, fp, 0);
2755*a325d9c4SApple OSS Distributions 	return error;
2756*a325d9c4SApple OSS Distributions }
2757*a325d9c4SApple OSS Distributions 
2758*a325d9c4SApple OSS Distributions intptr_t
mac_vnode_label_get(struct vnode * vp,int slot,intptr_t sentinel)2759*a325d9c4SApple OSS Distributions mac_vnode_label_get(struct vnode *vp, int slot, intptr_t sentinel)
2760*a325d9c4SApple OSS Distributions {
2761*a325d9c4SApple OSS Distributions 	struct label *l;
2762*a325d9c4SApple OSS Distributions 
2763*a325d9c4SApple OSS Distributions 	KASSERT(vp != NULL, ("mac_vnode_label_get: NULL vnode"));
2764*a325d9c4SApple OSS Distributions 	l = mac_vnode_label(vp);
2765*a325d9c4SApple OSS Distributions 	if (l != NULL) {
2766*a325d9c4SApple OSS Distributions 		return mac_label_get(l, slot);
2767*a325d9c4SApple OSS Distributions 	} else {
2768*a325d9c4SApple OSS Distributions 		return sentinel;
2769*a325d9c4SApple OSS Distributions 	}
2770*a325d9c4SApple OSS Distributions }
2771*a325d9c4SApple OSS Distributions 
2772*a325d9c4SApple OSS Distributions void
mac_vnode_label_set(struct vnode * vp,int slot,intptr_t v)2773*a325d9c4SApple OSS Distributions mac_vnode_label_set(struct vnode *vp, int slot, intptr_t v)
2774*a325d9c4SApple OSS Distributions {
2775*a325d9c4SApple OSS Distributions 	struct label *l;
2776*a325d9c4SApple OSS Distributions 	KASSERT(vp != NULL, ("mac_vnode_label_set: NULL vnode"));
2777*a325d9c4SApple OSS Distributions 	l = mac_vnode_label(vp);
2778*a325d9c4SApple OSS Distributions 	if (l == NULL) {
2779*a325d9c4SApple OSS Distributions 		mac_vnode_label_init(vp);
2780*a325d9c4SApple OSS Distributions 		l = mac_vnode_label(vp);
2781*a325d9c4SApple OSS Distributions 	}
2782*a325d9c4SApple OSS Distributions 	mac_label_set(l, slot, v);
2783*a325d9c4SApple OSS Distributions }
2784*a325d9c4SApple OSS Distributions 
2785*a325d9c4SApple OSS Distributions void
mac_vnode_notify_reclaim(struct vnode * vp)2786*a325d9c4SApple OSS Distributions mac_vnode_notify_reclaim(struct vnode *vp)
2787*a325d9c4SApple OSS Distributions {
2788*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(94, vp);
2789*a325d9c4SApple OSS Distributions 	MAC_PERFORM(vnode_notify_reclaim, vp);
2790*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(94, vp);
2791*a325d9c4SApple OSS Distributions }
2792*a325d9c4SApple OSS Distributions 
2793*a325d9c4SApple OSS Distributions int
mac_mount_check_quotactl(vfs_context_t ctx,struct mount * mp,int cmd,int id)2794*a325d9c4SApple OSS Distributions mac_mount_check_quotactl(vfs_context_t ctx, struct mount *mp, int cmd, int id)
2795*a325d9c4SApple OSS Distributions {
2796*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
2797*a325d9c4SApple OSS Distributions 	int error;
2798*a325d9c4SApple OSS Distributions 
2799*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
2800*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
2801*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
2802*a325d9c4SApple OSS Distributions 		return 0;
2803*a325d9c4SApple OSS Distributions 	}
2804*a325d9c4SApple OSS Distributions #endif
2805*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
2806*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
2807*a325d9c4SApple OSS Distributions 		return 0;
2808*a325d9c4SApple OSS Distributions 	}
2809*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(95, mp);
2810*a325d9c4SApple OSS Distributions 	MAC_CHECK(mount_check_quotactl, cred, mp, cmd, id);
2811*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(95, mp);
2812*a325d9c4SApple OSS Distributions 
2813*a325d9c4SApple OSS Distributions 	return error;
2814*a325d9c4SApple OSS Distributions }
2815*a325d9c4SApple OSS Distributions 
2816*a325d9c4SApple OSS Distributions int
mac_vnode_check_getattrlistbulk(vfs_context_t ctx,struct vnode * vp,struct attrlist * alist,uint64_t options)2817*a325d9c4SApple OSS Distributions mac_vnode_check_getattrlistbulk(vfs_context_t ctx, struct vnode *vp, struct attrlist *alist, uint64_t options)
2818*a325d9c4SApple OSS Distributions {
2819*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
2820*a325d9c4SApple OSS Distributions 	int error;
2821*a325d9c4SApple OSS Distributions 
2822*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
2823*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
2824*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
2825*a325d9c4SApple OSS Distributions 		return 0;
2826*a325d9c4SApple OSS Distributions 	}
2827*a325d9c4SApple OSS Distributions #endif
2828*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
2829*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
2830*a325d9c4SApple OSS Distributions 		return 0;
2831*a325d9c4SApple OSS Distributions 	}
2832*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(96, mp);
2833*a325d9c4SApple OSS Distributions 	MAC_CHECK(vnode_check_getattrlistbulk, cred, vp, alist, options);
2834*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(96, mp);
2835*a325d9c4SApple OSS Distributions 
2836*a325d9c4SApple OSS Distributions 	return error;
2837*a325d9c4SApple OSS Distributions }
2838*a325d9c4SApple OSS Distributions 
2839*a325d9c4SApple OSS Distributions int
mac_vnode_check_copyfile(vfs_context_t ctx,struct vnode * dvp,struct vnode * tvp,struct vnode * fvp,struct componentname * cnp,mode_t mode,int flags)2840*a325d9c4SApple OSS Distributions mac_vnode_check_copyfile(vfs_context_t ctx, struct vnode *dvp,
2841*a325d9c4SApple OSS Distributions     struct vnode *tvp, struct vnode *fvp, struct componentname *cnp,
2842*a325d9c4SApple OSS Distributions     mode_t mode, int flags)
2843*a325d9c4SApple OSS Distributions {
2844*a325d9c4SApple OSS Distributions 	kauth_cred_t cred;
2845*a325d9c4SApple OSS Distributions 	int error;
2846*a325d9c4SApple OSS Distributions 
2847*a325d9c4SApple OSS Distributions #if SECURITY_MAC_CHECK_ENFORCE
2848*a325d9c4SApple OSS Distributions 	/* 21167099 - only check if we allow write */
2849*a325d9c4SApple OSS Distributions 	if (!mac_vnode_enforce) {
2850*a325d9c4SApple OSS Distributions 		return 0;
2851*a325d9c4SApple OSS Distributions 	}
2852*a325d9c4SApple OSS Distributions #endif
2853*a325d9c4SApple OSS Distributions 	cred = vfs_context_ucred(ctx);
2854*a325d9c4SApple OSS Distributions 	if (!mac_cred_check_enforce(cred)) {
2855*a325d9c4SApple OSS Distributions 		return 0;
2856*a325d9c4SApple OSS Distributions 	}
2857*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_START1(97, dvp);
2858*a325d9c4SApple OSS Distributions 	MAC_CHECK(vnode_check_copyfile, cred, dvp, mac_vnode_label(dvp),
2859*a325d9c4SApple OSS Distributions 	    tvp, tvp ? mac_vnode_label(tvp) : NULL, fvp, mac_vnode_label(fvp), cnp, mode, flags);
2860*a325d9c4SApple OSS Distributions 	VFS_KERNEL_DEBUG_END1(97, dvp);
2861*a325d9c4SApple OSS Distributions 	return error;
2862*a325d9c4SApple OSS Distributions }
2863