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