xref: /xnu-11215/security/mac_pipe.c (revision e7776783)
1 /*
2  * Copyright (c) 2007 Apple Inc. All rights reserved.
3  *
4  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5  *
6  * This file contains Original Code and/or Modifications of Original Code
7  * as defined in and that are subject to the Apple Public Source License
8  * Version 2.0 (the 'License'). You may not use this file except in
9  * compliance with the License. The rights granted to you under the License
10  * may not be used to create, or enable the creation or redistribution of,
11  * unlawful or unlicensed copies of an Apple operating system, or to
12  * circumvent, violate, or enable the circumvention or violation of, any
13  * terms of an Apple operating system software license agreement.
14  *
15  * Please obtain a copy of the License at
16  * http://www.opensource.apple.com/apsl/ and read it before using this file.
17  *
18  * The Original Code and all software distributed under the License are
19  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23  * Please see the License for the specific language governing rights and
24  * limitations under the License.
25  *
26  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27  */
28 /*-
29  * Copyright (c) 2002, 2003 Networks Associates Technology, Inc.
30  * Copyright (c) 2005 SPARTA, Inc.
31  * All rights reserved.
32  *
33  * This software was developed for the FreeBSD Project in part by Network
34  * Associates Laboratories, the Security Research Division of Network
35  * Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035 ("CBOSS"),
36  * as part of the DARPA CHATS research program.
37  *
38  * Redistribution and use in source and binary forms, with or without
39  * modification, are permitted provided that the following conditions
40  * are met:
41  * 1. Redistributions of source code must retain the above copyright
42  *    notice, this list of conditions and the following disclaimer.
43  * 2. Redistributions in binary form must reproduce the above copyright
44  *    notice, this list of conditions and the following disclaimer in the
45  *    documentation and/or other materials provided with the distribution.
46  *
47  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
48  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
49  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
50  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
51  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
52  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
53  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
54  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
55  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
56  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
57  * SUCH DAMAGE.
58  */
59 
60 #include <sys/cdefs.h>
61 
62 #include <sys/param.h>
63 #include <sys/kernel.h>
64 #include <sys/lock.h>
65 #include <sys/malloc.h>
66 #include <sys/sbuf.h>
67 #include <sys/systm.h>
68 #include <sys/vnode.h>
69 #include <sys/pipe.h>
70 #include <sys/sysctl.h>
71 
72 #include <security/mac_internal.h>
73 
74 
75 static struct label *
mac_pipe_label_alloc(void)76 mac_pipe_label_alloc(void)
77 {
78 	struct label *label;
79 
80 	label = mac_labelzone_alloc(MAC_WAITOK);
81 	if (label == NULL) {
82 		return NULL;
83 	}
84 	MAC_PERFORM(pipe_label_init, label);
85 	return label;
86 }
87 
88 struct label *
mac_pipe_label(struct pipe * cpipe)89 mac_pipe_label(struct pipe *cpipe)
90 {
91 	return cpipe->pipe_label;
92 }
93 
94 void
mac_pipe_set_label(struct pipe * cpipe,struct label * label)95 mac_pipe_set_label(struct pipe *cpipe, struct label *label)
96 {
97 	cpipe->pipe_label = label;
98 }
99 
100 void
mac_pipe_label_init(struct pipe * cpipe)101 mac_pipe_label_init(struct pipe *cpipe)
102 {
103 	mac_pipe_set_label(cpipe, mac_pipe_label_alloc());
104 }
105 
106 void
mac_pipe_label_free(struct label * label)107 mac_pipe_label_free(struct label *label)
108 {
109 	MAC_PERFORM(pipe_label_destroy, label);
110 	mac_labelzone_free(label);
111 }
112 
113 void
mac_pipe_label_destroy(struct pipe * cpipe)114 mac_pipe_label_destroy(struct pipe *cpipe)
115 {
116 	struct label *label = mac_pipe_label(cpipe);
117 	mac_pipe_set_label(cpipe, NULL);
118 	mac_pipe_label_free(label);
119 }
120 
121 void
mac_pipe_label_associate(kauth_cred_t cred,struct pipe * cpipe)122 mac_pipe_label_associate(kauth_cred_t cred, struct pipe *cpipe)
123 {
124 	MAC_PERFORM(pipe_label_associate, cred, cpipe, mac_pipe_label(cpipe));
125 }
126 
127 int
mac_pipe_check_kqfilter(kauth_cred_t cred,struct knote * kn,struct pipe * cpipe)128 mac_pipe_check_kqfilter(kauth_cred_t cred, struct knote *kn,
129     struct pipe *cpipe)
130 {
131 	int error;
132 
133 #if SECURITY_MAC_CHECK_ENFORCE
134 	/* 21167099 - only check if we allow write */
135 	if (!mac_pipe_enforce) {
136 		return 0;
137 	}
138 #endif
139 	MAC_CHECK(pipe_check_kqfilter, cred, kn, cpipe, mac_pipe_label(cpipe));
140 	return error;
141 }
142 int
mac_pipe_check_ioctl(kauth_cred_t cred,struct pipe * cpipe,u_long cmd)143 mac_pipe_check_ioctl(kauth_cred_t cred, struct pipe *cpipe, u_long cmd)
144 {
145 	int error;
146 
147 #if SECURITY_MAC_CHECK_ENFORCE
148 	/* 21167099 - only check if we allow write */
149 	if (!mac_pipe_enforce) {
150 		return 0;
151 	}
152 #endif
153 
154 	MAC_CHECK(pipe_check_ioctl, cred, cpipe, mac_pipe_label(cpipe), cmd);
155 
156 	return error;
157 }
158 
159 int
mac_pipe_check_read(kauth_cred_t cred,struct pipe * cpipe)160 mac_pipe_check_read(kauth_cred_t cred, struct pipe *cpipe)
161 {
162 	int error;
163 
164 #if SECURITY_MAC_CHECK_ENFORCE
165 	/* 21167099 - only check if we allow write */
166 	if (!mac_pipe_enforce) {
167 		return 0;
168 	}
169 #endif
170 
171 	MAC_CHECK(pipe_check_read, cred, cpipe, mac_pipe_label(cpipe));
172 
173 	return error;
174 }
175 
176 int
mac_pipe_check_select(kauth_cred_t cred,struct pipe * cpipe,int which)177 mac_pipe_check_select(kauth_cred_t cred, struct pipe *cpipe, int which)
178 {
179 	int error;
180 
181 #if SECURITY_MAC_CHECK_ENFORCE
182 	/* 21167099 - only check if we allow write */
183 	if (!mac_pipe_enforce) {
184 		return 0;
185 	}
186 #endif
187 
188 	MAC_CHECK(pipe_check_select, cred, cpipe, mac_pipe_label(cpipe), which);
189 
190 	return error;
191 }
192 
193 int
mac_pipe_check_stat(kauth_cred_t cred,struct pipe * cpipe)194 mac_pipe_check_stat(kauth_cred_t cred, struct pipe *cpipe)
195 {
196 	int error;
197 
198 #if SECURITY_MAC_CHECK_ENFORCE
199 	/* 21167099 - only check if we allow write */
200 	if (!mac_pipe_enforce) {
201 		return 0;
202 	}
203 #endif
204 
205 	MAC_CHECK(pipe_check_stat, cred, cpipe, mac_pipe_label(cpipe));
206 
207 	return error;
208 }
209 
210 int
mac_pipe_check_write(kauth_cred_t cred,struct pipe * cpipe)211 mac_pipe_check_write(kauth_cred_t cred, struct pipe *cpipe)
212 {
213 	int error;
214 
215 #if SECURITY_MAC_CHECK_ENFORCE
216 	/* 21167099 - only check if we allow write */
217 	if (!mac_pipe_enforce) {
218 		return 0;
219 	}
220 #endif
221 
222 	MAC_CHECK(pipe_check_write, cred, cpipe, mac_pipe_label(cpipe));
223 
224 	return error;
225 }
226