1101099Srwatson/*-
2184467Srwatson * Copyright (c) 1999-2002, 2007-2008 Robert N. M. Watson
3145412Strhodes * Copyright (c) 2001-2005 Networks Associates Technology, Inc.
4171253Srwatson * Copyright (c) 2005 Tom Rhodes
5172930Srwatson * Copyright (c) 2006 SPARTA, Inc.
6101099Srwatson * All rights reserved.
7101099Srwatson *
8101099Srwatson * This software was developed by Robert Watson for the TrustedBSD Project.
9145412Strhodes * It was later enhanced by Tom Rhodes for the TrustedBSD Project.
10101099Srwatson *
11106393Srwatson * This software was developed for the FreeBSD Project in part by Network
12106393Srwatson * Associates Laboratories, the Security Research Division of Network
13106393Srwatson * Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035 ("CBOSS"),
14106393Srwatson * as part of the DARPA CHATS research program.
15101099Srwatson *
16172930Srwatson * This software was enhanced by SPARTA ISSO under SPAWAR contract
17172930Srwatson * N66001-04-C-6019 ("SEFOS").
18172930Srwatson *
19101099Srwatson * Redistribution and use in source and binary forms, with or without
20101099Srwatson * modification, are permitted provided that the following conditions
21101099Srwatson * are met:
22101099Srwatson * 1. Redistributions of source code must retain the above copyright
23101099Srwatson *    notice, this list of conditions and the following disclaimer.
24101099Srwatson * 2. Redistributions in binary form must reproduce the above copyright
25101099Srwatson *    notice, this list of conditions and the following disclaimer in the
26101099Srwatson *    documentation and/or other materials provided with the distribution.
27101099Srwatson *
28101099Srwatson * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
29101099Srwatson * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
30101099Srwatson * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
31101099Srwatson * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
32101099Srwatson * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
33101099Srwatson * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
34101099Srwatson * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
35101099Srwatson * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
36101099Srwatson * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
37101099Srwatson * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
38101099Srwatson * SUCH DAMAGE.
39101099Srwatson *
40101099Srwatson * $FreeBSD$
41101099Srwatson */
42136774Srwatson
43101099Srwatson#include <sys/param.h>
44101099Srwatson#include <sys/acl.h>
45101099Srwatson#include <sys/kernel.h>
46157986Sdwmalone#include <sys/jail.h>
47145412Strhodes#include <sys/lock.h>
48101099Srwatson#include <sys/malloc.h>
49166905Srwatson#include <sys/module.h>
50101099Srwatson#include <sys/mount.h>
51145412Strhodes#include <sys/mutex.h>
52170689Srwatson#include <sys/priv.h>
53101099Srwatson#include <sys/systm.h>
54101099Srwatson#include <sys/vnode.h>
55101099Srwatson#include <sys/sysctl.h>
56134132Strhodes#include <sys/syslog.h>
57182905Strasz#include <sys/stat.h>
58101099Srwatson
59165469Srwatson#include <security/mac/mac_policy.h>
60101099Srwatson#include <security/mac_bsdextended/mac_bsdextended.h>
61184331Srwatson#include <security/mac_bsdextended/ugidfw_internal.h>
62101099Srwatson
63184331Srwatsonint
64172955Srwatsonugidfw_vnode_check_access(struct ucred *cred, struct vnode *vp,
65184413Strasz    struct label *vplabel, accmode_t accmode)
66101099Srwatson{
67101099Srwatson
68184467Srwatson	return (ugidfw_check_vp(cred, vp, ugidfw_accmode2mbi(accmode)));
69101099Srwatson}
70101099Srwatson
71184331Srwatsonint
72172955Srwatsonugidfw_vnode_check_chdir(struct ucred *cred, struct vnode *dvp,
73168976Srwatson    struct label *dvplabel)
74101099Srwatson{
75101099Srwatson
76172955Srwatson	return (ugidfw_check_vp(cred, dvp, MBI_EXEC));
77101099Srwatson}
78101099Srwatson
79184331Srwatsonint
80172955Srwatsonugidfw_vnode_check_chroot(struct ucred *cred, struct vnode *dvp,
81168976Srwatson    struct label *dvplabel)
82101099Srwatson{
83101099Srwatson
84172955Srwatson	return (ugidfw_check_vp(cred, dvp, MBI_EXEC));
85101099Srwatson}
86101099Srwatson
87184331Srwatsonint
88172955Srwatsonugidfw_check_create_vnode(struct ucred *cred, struct vnode *dvp,
89168976Srwatson    struct label *dvplabel, struct componentname *cnp, struct vattr *vap)
90101099Srwatson{
91101099Srwatson
92172955Srwatson	return (ugidfw_check_vp(cred, dvp, MBI_WRITE));
93101099Srwatson}
94101099Srwatson
95184331Srwatsonint
96172955Srwatsonugidfw_vnode_check_deleteacl(struct ucred *cred, struct vnode *vp,
97168976Srwatson    struct label *vplabel, acl_type_t type)
98101099Srwatson{
99101099Srwatson
100172955Srwatson	return (ugidfw_check_vp(cred, vp, MBI_ADMIN));
101101099Srwatson}
102101099Srwatson
103184331Srwatsonint
104172955Srwatsonugidfw_vnode_check_deleteextattr(struct ucred *cred, struct vnode *vp,
105172955Srwatson    struct label *vplabel, int attrnamespace, const char *name)
106119202Srwatson{
107119202Srwatson
108172955Srwatson	return (ugidfw_check_vp(cred, vp, MBI_WRITE));
109119202Srwatson}
110119202Srwatson
111184331Srwatsonint
112172955Srwatsonugidfw_vnode_check_exec(struct ucred *cred, struct vnode *vp,
113168976Srwatson    struct label *vplabel, struct image_params *imgp,
114106648Srwatson    struct label *execlabel)
115101099Srwatson{
116101099Srwatson
117172955Srwatson	return (ugidfw_check_vp(cred, vp, MBI_READ|MBI_EXEC));
118101099Srwatson}
119101099Srwatson
120184331Srwatsonint
121172955Srwatsonugidfw_vnode_check_getacl(struct ucred *cred, struct vnode *vp,
122168976Srwatson    struct label *vplabel, acl_type_t type)
123101099Srwatson{
124101099Srwatson
125172955Srwatson	return (ugidfw_check_vp(cred, vp, MBI_STAT));
126101099Srwatson}
127101099Srwatson
128184331Srwatsonint
129172955Srwatsonugidfw_vnode_check_getextattr(struct ucred *cred, struct vnode *vp,
130189533Srwatson    struct label *vplabel, int attrnamespace, const char *name)
131101099Srwatson{
132101099Srwatson
133172955Srwatson	return (ugidfw_check_vp(cred, vp, MBI_READ));
134101099Srwatson}
135101099Srwatson
136184331Srwatsonint
137172955Srwatsonugidfw_vnode_check_link(struct ucred *cred, struct vnode *dvp,
138168976Srwatson    struct label *dvplabel, struct vnode *vp, struct label *label,
139104530Srwatson    struct componentname *cnp)
140104530Srwatson{
141104530Srwatson	int error;
142104530Srwatson
143172955Srwatson	error = ugidfw_check_vp(cred, dvp, MBI_WRITE);
144104530Srwatson	if (error)
145104530Srwatson		return (error);
146172955Srwatson	error = ugidfw_check_vp(cred, vp, MBI_WRITE);
147104530Srwatson	if (error)
148104530Srwatson		return (error);
149104530Srwatson	return (0);
150104530Srwatson}
151104530Srwatson
152184331Srwatsonint
153172955Srwatsonugidfw_vnode_check_listextattr(struct ucred *cred, struct vnode *vp,
154168976Srwatson    struct label *vplabel, int attrnamespace)
155119202Srwatson{
156119202Srwatson
157172955Srwatson	return (ugidfw_check_vp(cred, vp, MBI_READ));
158119202Srwatson}
159119202Srwatson
160184331Srwatsonint
161172955Srwatsonugidfw_vnode_check_lookup(struct ucred *cred, struct vnode *dvp,
162168976Srwatson    struct label *dvplabel, struct componentname *cnp)
163101099Srwatson{
164117247Srwatson
165172955Srwatson	return (ugidfw_check_vp(cred, dvp, MBI_EXEC));
166101099Srwatson}
167101099Srwatson
168184331Srwatsonint
169172955Srwatsonugidfw_vnode_check_open(struct ucred *cred, struct vnode *vp,
170184413Strasz    struct label *vplabel, accmode_t accmode)
171101099Srwatson{
172101099Srwatson
173184467Srwatson	return (ugidfw_check_vp(cred, vp, ugidfw_accmode2mbi(accmode)));
174101099Srwatson}
175101099Srwatson
176184331Srwatsonint
177172955Srwatsonugidfw_vnode_check_readdir(struct ucred *cred, struct vnode *dvp,
178168976Srwatson    struct label *dvplabel)
179101099Srwatson{
180101099Srwatson
181172955Srwatson	return (ugidfw_check_vp(cred, dvp, MBI_READ));
182101099Srwatson}
183101099Srwatson
184184331Srwatsonint
185172955Srwatsonugidfw_vnode_check_readdlink(struct ucred *cred, struct vnode *vp,
186168976Srwatson    struct label *vplabel)
187101099Srwatson{
188101099Srwatson
189172955Srwatson	return (ugidfw_check_vp(cred, vp, MBI_READ));
190101099Srwatson}
191101099Srwatson
192184331Srwatsonint
193172955Srwatsonugidfw_vnode_check_rename_from(struct ucred *cred, struct vnode *dvp,
194168976Srwatson    struct label *dvplabel, struct vnode *vp, struct label *vplabel,
195101099Srwatson    struct componentname *cnp)
196101099Srwatson{
197101099Srwatson	int error;
198101099Srwatson
199172955Srwatson	error = ugidfw_check_vp(cred, dvp, MBI_WRITE);
200101099Srwatson	if (error)
201101099Srwatson		return (error);
202172955Srwatson	return (ugidfw_check_vp(cred, vp, MBI_WRITE));
203101099Srwatson}
204101099Srwatson
205184331Srwatsonint
206172955Srwatsonugidfw_vnode_check_rename_to(struct ucred *cred, struct vnode *dvp,
207168976Srwatson    struct label *dvplabel, struct vnode *vp, struct label *vplabel,
208168976Srwatson    int samedir, struct componentname *cnp)
209101099Srwatson{
210101099Srwatson	int error;
211101099Srwatson
212172955Srwatson	error = ugidfw_check_vp(cred, dvp, MBI_WRITE);
213101099Srwatson	if (error)
214101099Srwatson		return (error);
215156300Sdwmalone	if (vp != NULL)
216172955Srwatson		error = ugidfw_check_vp(cred, vp, MBI_WRITE);
217101099Srwatson	return (error);
218101099Srwatson}
219101099Srwatson
220184331Srwatsonint
221172955Srwatsonugidfw_vnode_check_revoke(struct ucred *cred, struct vnode *vp,
222168976Srwatson    struct label *vplabel)
223101099Srwatson{
224101099Srwatson
225172955Srwatson	return (ugidfw_check_vp(cred, vp, MBI_ADMIN));
226101099Srwatson}
227101099Srwatson
228184331Srwatsonint
229172955Srwatsonugidfw_check_setacl_vnode(struct ucred *cred, struct vnode *vp,
230168976Srwatson    struct label *vplabel, acl_type_t type, struct acl *acl)
231101099Srwatson{
232101099Srwatson
233172955Srwatson	return (ugidfw_check_vp(cred, vp, MBI_ADMIN));
234101099Srwatson}
235101099Srwatson
236184331Srwatsonint
237172955Srwatsonugidfw_vnode_check_setextattr(struct ucred *cred, struct vnode *vp,
238189533Srwatson    struct label *vplabel, int attrnamespace, const char *name)
239101099Srwatson{
240101099Srwatson
241172955Srwatson	return (ugidfw_check_vp(cred, vp, MBI_WRITE));
242101099Srwatson}
243101099Srwatson
244184331Srwatsonint
245172955Srwatsonugidfw_vnode_check_setflags(struct ucred *cred, struct vnode *vp,
246168976Srwatson    struct label *vplabel, u_long flags)
247101099Srwatson{
248101099Srwatson
249172955Srwatson	return (ugidfw_check_vp(cred, vp, MBI_ADMIN));
250101099Srwatson}
251101099Srwatson
252184331Srwatsonint
253172955Srwatsonugidfw_vnode_check_setmode(struct ucred *cred, struct vnode *vp,
254168976Srwatson    struct label *vplabel, mode_t mode)
255101099Srwatson{
256101099Srwatson
257172955Srwatson	return (ugidfw_check_vp(cred, vp, MBI_ADMIN));
258101099Srwatson}
259101099Srwatson
260184331Srwatsonint
261172955Srwatsonugidfw_vnode_check_setowner(struct ucred *cred, struct vnode *vp,
262168976Srwatson    struct label *vplabel, uid_t uid, gid_t gid)
263101099Srwatson{
264101099Srwatson
265172955Srwatson	return (ugidfw_check_vp(cred, vp, MBI_ADMIN));
266101099Srwatson}
267101099Srwatson
268184331Srwatsonint
269172955Srwatsonugidfw_vnode_check_setutimes(struct ucred *cred, struct vnode *vp,
270168976Srwatson    struct label *vplabel, struct timespec atime, struct timespec utime)
271101099Srwatson{
272101099Srwatson
273172955Srwatson	return (ugidfw_check_vp(cred, vp, MBI_ADMIN));
274101099Srwatson}
275101099Srwatson
276184331Srwatsonint
277172955Srwatsonugidfw_vnode_check_stat(struct ucred *active_cred,
278168976Srwatson    struct ucred *file_cred, struct vnode *vp, struct label *vplabel)
279101099Srwatson{
280101099Srwatson
281172955Srwatson	return (ugidfw_check_vp(active_cred, vp, MBI_STAT));
282101099Srwatson}
283101099Srwatson
284184331Srwatsonint
285172955Srwatsonugidfw_vnode_check_unlink(struct ucred *cred, struct vnode *dvp,
286172107Srwatson    struct label *dvplabel, struct vnode *vp, struct label *vplabel,
287172107Srwatson    struct componentname *cnp)
288172107Srwatson{
289172107Srwatson	int error;
290172107Srwatson
291172955Srwatson	error = ugidfw_check_vp(cred, dvp, MBI_WRITE);
292172107Srwatson	if (error)
293172107Srwatson		return (error);
294172955Srwatson	return (ugidfw_check_vp(cred, vp, MBI_WRITE));
295172107Srwatson}
296