[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/security/mac_seeotheruids/mac_seeotheruids.c

Version: -  FREEBSD  -  FREEBSD8  -  FREEBSD7  -  FREEBSD72  -  FREEBSD71  -  FREEBSD70  -  FREEBSD6  -  FREEBSD64  -  FREEBSD63  -  FREEBSD62  -  FREEBSD61  -  FREEBSD60  -  FREEBSD5  -  FREEBSD55  -  FREEBSD54  -  FREEBSD53  -  FREEBSD52  -  FREEBSD51  -  FREEBSD50  -  FREEBSD4  -  FREEBSD3  -  FREEBSD22  -  linux-2.6  -  linux-2.4.22  -  MK83  -  MK84  -  PLAN9  -  DFBSD  -  NETBSD  -  NETBSD5  -  NETBSD4  -  NETBSD3  -  NETBSD20  -  OPENBSD  -  xnu-517  -  xnu-792  -  xnu-792.6.70  -  xnu-1228  -  xnu-1456.1.26  -  OPENSOLARIS  -  minix-3-1-1  -  FREEBSD-LIBC  -  FREEBSD7-LIBC  -  FREEBSD6-LIBC  -  GLIBC27 
SearchContext: -  none  -  excerpts  -  bigexcerpts 

    1 /*-
    2  * Copyright (c) 1999-2002, 2007 Robert N. M. Watson
    3  * Copyright (c) 2001-2002 Networks Associates Technology, Inc.
    4  * All rights reserved.
    5  *
    6  * This software was developed by Robert Watson for the TrustedBSD Project.
    7  *
    8  * This software was developed for the FreeBSD Project in part by Network
    9  * Associates Laboratories, the Security Research Division of Network
   10  * Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035 ("CBOSS"),
   11  * as part of the DARPA CHATS research program.
   12  *
   13  * Redistribution and use in source and binary forms, with or without
   14  * modification, are permitted provided that the following conditions
   15  * are met:
   16  * 1. Redistributions of source code must retain the above copyright
   17  *    notice, this list of conditions and the following disclaimer.
   18  * 2. Redistributions in binary form must reproduce the above copyright
   19  *    notice, this list of conditions and the following disclaimer in the
   20  *    documentation and/or other materials provided with the distribution.
   21  *
   22  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
   23  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   24  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   25  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
   26  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   27  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   28  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   29  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   31  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   32  * SUCH DAMAGE.
   33  *
   34  * $FreeBSD$
   35  */
   36 
   37 /*
   38  * Developed by the TrustedBSD Project.
   39  *
   40  * Prevent processes owned by a particular uid from seeing various transient
   41  * kernel objects associated with other uids.
   42  */
   43 
   44 #include <sys/param.h>
   45 #include <sys/kernel.h>
   46 #include <sys/module.h>
   47 #include <sys/priv.h>
   48 #include <sys/proc.h>
   49 #include <sys/systm.h>
   50 #include <sys/socket.h>
   51 #include <sys/socketvar.h>
   52 #include <sys/sysctl.h>
   53 
   54 #include <net/route.h>
   55 #include <netinet/in.h>
   56 #include <netinet/in_pcb.h>
   57 
   58 #include <security/mac/mac_policy.h>
   59 
   60 SYSCTL_DECL(_security_mac);
   61 
   62 SYSCTL_NODE(_security_mac, OID_AUTO, seeotheruids, CTLFLAG_RW, 0,
   63     "TrustedBSD mac_seeotheruids policy controls");
   64 
   65 static int      seeotheruids_enabled = 1;
   66 SYSCTL_INT(_security_mac_seeotheruids, OID_AUTO, enabled, CTLFLAG_RW,
   67     &seeotheruids_enabled, 0, "Enforce seeotheruids policy");
   68 
   69 /*
   70  * Exception: allow credentials to be aware of other credentials with the
   71  * same primary gid.
   72  */
   73 static int      primarygroup_enabled = 0;
   74 SYSCTL_INT(_security_mac_seeotheruids, OID_AUTO, primarygroup_enabled,
   75     CTLFLAG_RW, &primarygroup_enabled, 0, "Make an exception for credentials "
   76     "with the same real primary group id");
   77 
   78 /*
   79  * Exception: allow the root user to be aware of other credentials by virtue
   80  * of privilege.
   81  */
   82 static int      suser_privileged = 1;
   83 SYSCTL_INT(_security_mac_seeotheruids, OID_AUTO, suser_privileged,
   84     CTLFLAG_RW, &suser_privileged, 0, "Make an exception for superuser");
   85 
   86 /*
   87  * Exception: allow processes with a specific gid to be exempt from the
   88  * policy.  One sysctl enables this functionality; the other sets the
   89  * exempt gid.
   90  */
   91 static int      specificgid_enabled = 0;
   92 SYSCTL_INT(_security_mac_seeotheruids, OID_AUTO, specificgid_enabled,
   93     CTLFLAG_RW, &specificgid_enabled, 0, "Make an exception for credentials "
   94     "with a specific gid as their real primary group id or group set");
   95 
   96 static gid_t    specificgid = 0;
   97 SYSCTL_INT(_security_mac_seeotheruids, OID_AUTO, specificgid, CTLFLAG_RW,
   98     &specificgid, 0, "Specific gid to be exempt from seeotheruids policy");
   99 
  100 static int
  101 seeotheruids_check(struct ucred *cr1, struct ucred *cr2)
  102 {
  103 
  104         if (!seeotheruids_enabled)
  105                 return (0);
  106 
  107         if (primarygroup_enabled) {
  108                 if (cr1->cr_rgid == cr2->cr_rgid)
  109                         return (0);
  110         }
  111 
  112         if (specificgid_enabled) {
  113                 if (cr1->cr_rgid == specificgid ||
  114                     groupmember(specificgid, cr1))
  115                         return (0);
  116         }
  117 
  118         if (cr1->cr_ruid == cr2->cr_ruid)
  119                 return (0);
  120 
  121         if (suser_privileged) {
  122                 if (priv_check_cred(cr1, PRIV_SEEOTHERUIDS, 0) == 0)
  123                         return (0);
  124         }
  125 
  126         return (ESRCH);
  127 }
  128 
  129 static int
  130 seeotheruids_check_cred_visible(struct ucred *cr1, struct ucred *cr2)
  131 {
  132 
  133         return (seeotheruids_check(cr1, cr2));
  134 }
  135 
  136 static int
  137 seeotheruids_check_inpcb_visible(struct ucred *cred, struct inpcb *inp,
  138     struct label *inplabel)
  139 {
  140 
  141         return (seeotheruids_check(cred, inp->inp_cred));
  142 }
  143 
  144 static int
  145 seeotheruids_check_proc_signal(struct ucred *cred, struct proc *p,
  146     int signum)
  147 {
  148 
  149         return (seeotheruids_check(cred, p->p_ucred));
  150 }
  151 
  152 static int
  153 seeotheruids_check_proc_sched(struct ucred *cred, struct proc *p)
  154 {
  155 
  156         return (seeotheruids_check(cred, p->p_ucred));
  157 }
  158 
  159 static int
  160 seeotheruids_check_proc_debug(struct ucred *cred, struct proc *p)
  161 {
  162 
  163         return (seeotheruids_check(cred, p->p_ucred));
  164 }
  165 
  166 static int
  167 seeotheruids_check_socket_visible(struct ucred *cred, struct socket *so,
  168     struct label *solabel)
  169 {
  170 
  171         return (seeotheruids_check(cred, so->so_cred));
  172 }
  173 
  174 static struct mac_policy_ops seeotheruids_ops =
  175 {
  176         .mpo_check_cred_visible = seeotheruids_check_cred_visible,
  177         .mpo_check_inpcb_visible = seeotheruids_check_inpcb_visible,
  178         .mpo_check_proc_debug = seeotheruids_check_proc_debug,
  179         .mpo_check_proc_sched = seeotheruids_check_proc_sched,
  180         .mpo_check_proc_signal = seeotheruids_check_proc_signal,
  181         .mpo_check_socket_visible = seeotheruids_check_socket_visible,
  182 };
  183 
  184 MAC_POLICY_SET(&seeotheruids_ops, mac_seeotheruids,
  185     "TrustedBSD MAC/seeotheruids", MPC_LOADTIME_FLAG_UNLOADOK, NULL);

Cache object: ff1d75389691e7835a7dc0f64b15a0bc


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.