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