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