LCOV - code coverage report
Current view: top level - security - commoncap.c (source / functions) Hit Total Coverage
Test: landlock.info Lines: 267 495 53.9 %
Date: 2021-04-22 12:43:58 Functions: 28 34 82.4 %

          Line data    Source code
       1             : // SPDX-License-Identifier: GPL-2.0-or-later
       2             : /* Common capabilities, needed by capability.o.
       3             :  */
       4             : 
       5             : #include <linux/capability.h>
       6             : #include <linux/audit.h>
       7             : #include <linux/init.h>
       8             : #include <linux/kernel.h>
       9             : #include <linux/lsm_hooks.h>
      10             : #include <linux/file.h>
      11             : #include <linux/mm.h>
      12             : #include <linux/mman.h>
      13             : #include <linux/pagemap.h>
      14             : #include <linux/swap.h>
      15             : #include <linux/skbuff.h>
      16             : #include <linux/netlink.h>
      17             : #include <linux/ptrace.h>
      18             : #include <linux/xattr.h>
      19             : #include <linux/hugetlb.h>
      20             : #include <linux/mount.h>
      21             : #include <linux/sched.h>
      22             : #include <linux/prctl.h>
      23             : #include <linux/securebits.h>
      24             : #include <linux/user_namespace.h>
      25             : #include <linux/binfmts.h>
      26             : #include <linux/personality.h>
      27             : 
      28             : /*
      29             :  * If a non-root user executes a setuid-root binary in
      30             :  * !secure(SECURE_NOROOT) mode, then we raise capabilities.
      31             :  * However if fE is also set, then the intent is for only
      32             :  * the file capabilities to be applied, and the setuid-root
      33             :  * bit is left on either to change the uid (plausible) or
      34             :  * to get full privilege on a kernel without file capabilities
      35             :  * support.  So in that case we do not raise capabilities.
      36             :  *
      37             :  * Warn if that happens, once per boot.
      38             :  */
      39           0 : static void warn_setuid_and_fcaps_mixed(const char *fname)
      40             : {
      41           0 :         static int warned;
      42           0 :         if (!warned) {
      43           0 :                 printk(KERN_INFO "warning: `%s' has both setuid-root and"
      44             :                         " effective capabilities. Therefore not raising all"
      45             :                         " capabilities.\n", fname);
      46           0 :                 warned = 1;
      47             :         }
      48           0 : }
      49             : 
      50             : /**
      51             :  * cap_capable - Determine whether a task has a particular effective capability
      52             :  * @cred: The credentials to use
      53             :  * @ns:  The user namespace in which we need the capability
      54             :  * @cap: The capability to check for
      55             :  * @opts: Bitmask of options defined in include/linux/security.h
      56             :  *
      57             :  * Determine whether the nominated task has the specified capability amongst
      58             :  * its effective set, returning 0 if it does, -ve if it does not.
      59             :  *
      60             :  * NOTE WELL: cap_has_capability() cannot be used like the kernel's capable()
      61             :  * and has_capability() functions.  That is, it has the reverse semantics:
      62             :  * cap_has_capability() returns 0 when a task has a capability, but the
      63             :  * kernel's capable() and has_capability() returns 1 for this case.
      64             :  */
      65       89346 : int cap_capable(const struct cred *cred, struct user_namespace *targ_ns,
      66             :                 int cap, unsigned int opts)
      67             : {
      68       89346 :         struct user_namespace *ns = targ_ns;
      69             : 
      70             :         /* See if cred has the capability in the target user namespace
      71             :          * by examining the target user namespace and all of the target
      72             :          * user namespace's parents.
      73             :          */
      74       89346 :         for (;;) {
      75             :                 /* Do we have the necessary capabilities? */
      76       89346 :                 if (ns == cred->user_ns)
      77       89346 :                         return cap_raised(cred->cap_effective, cap) ? 0 : -EPERM;
      78             : 
      79             :                 /*
      80             :                  * If we're already at a lower level than we're looking for,
      81             :                  * we're done searching.
      82             :                  */
      83           0 :                 if (ns->level <= cred->user_ns->level)
      84             :                         return -EPERM;
      85             : 
      86             :                 /* 
      87             :                  * The owner of the user namespace in the parent of the
      88             :                  * user namespace has all caps.
      89             :                  */
      90           0 :                 if ((ns->parent == cred->user_ns) && uid_eq(ns->owner, cred->euid))
      91             :                         return 0;
      92             : 
      93             :                 /*
      94             :                  * If you have a capability in a parent user ns, then you have
      95             :                  * it over all children user namespaces as well.
      96             :                  */
      97             :                 ns = ns->parent;
      98             :         }
      99             : 
     100             :         /* We never get here */
     101             : }
     102             : 
     103             : /**
     104             :  * cap_settime - Determine whether the current process may set the system clock
     105             :  * @ts: The time to set
     106             :  * @tz: The timezone to set
     107             :  *
     108             :  * Determine whether the current process may set the system clock and timezone
     109             :  * information, returning 0 if permission granted, -ve if denied.
     110             :  */
     111           1 : int cap_settime(const struct timespec64 *ts, const struct timezone *tz)
     112             : {
     113           1 :         if (!capable(CAP_SYS_TIME))
     114           0 :                 return -EPERM;
     115             :         return 0;
     116             : }
     117             : 
     118             : /**
     119             :  * cap_ptrace_access_check - Determine whether the current process may access
     120             :  *                         another
     121             :  * @child: The process to be accessed
     122             :  * @mode: The mode of attachment.
     123             :  *
     124             :  * If we are in the same or an ancestor user_ns and have all the target
     125             :  * task's capabilities, then ptrace access is allowed.
     126             :  * If we have the ptrace capability to the target user_ns, then ptrace
     127             :  * access is allowed.
     128             :  * Else denied.
     129             :  *
     130             :  * Determine whether a process may access another, returning 0 if permission
     131             :  * granted, -ve if denied.
     132             :  */
     133         229 : int cap_ptrace_access_check(struct task_struct *child, unsigned int mode)
     134             : {
     135         229 :         int ret = 0;
     136         229 :         const struct cred *cred, *child_cred;
     137         229 :         const kernel_cap_t *caller_caps;
     138             : 
     139         229 :         rcu_read_lock();
     140         229 :         cred = current_cred();
     141         229 :         child_cred = __task_cred(child);
     142         229 :         if (mode & PTRACE_MODE_FSCREDS)
     143         213 :                 caller_caps = &cred->cap_effective;
     144             :         else
     145          16 :                 caller_caps = &cred->cap_permitted;
     146         229 :         if (cred->user_ns == child_cred->user_ns &&
     147         229 :             cap_issubset(child_cred->cap_permitted, *caller_caps))
     148         180 :                 goto out;
     149          49 :         if (ns_capable(child_cred->user_ns, CAP_SYS_PTRACE))
     150          48 :                 goto out;
     151             :         ret = -EPERM;
     152         229 : out:
     153         229 :         rcu_read_unlock();
     154         229 :         return ret;
     155             : }
     156             : 
     157             : /**
     158             :  * cap_ptrace_traceme - Determine whether another process may trace the current
     159             :  * @parent: The task proposed to be the tracer
     160             :  *
     161             :  * If parent is in the same or an ancestor user_ns and has all current's
     162             :  * capabilities, then ptrace access is allowed.
     163             :  * If parent has the ptrace capability to current's user_ns, then ptrace
     164             :  * access is allowed.
     165             :  * Else denied.
     166             :  *
     167             :  * Determine whether the nominated task is permitted to trace the current
     168             :  * process, returning 0 if permission is granted, -ve if denied.
     169             :  */
     170           8 : int cap_ptrace_traceme(struct task_struct *parent)
     171             : {
     172           8 :         int ret = 0;
     173           8 :         const struct cred *cred, *child_cred;
     174             : 
     175           8 :         rcu_read_lock();
     176           8 :         cred = __task_cred(parent);
     177           8 :         child_cred = current_cred();
     178           8 :         if (cred->user_ns == child_cred->user_ns &&
     179           8 :             cap_issubset(child_cred->cap_permitted, cred->cap_permitted))
     180           8 :                 goto out;
     181           0 :         if (has_ns_capability(parent, child_cred->user_ns, CAP_SYS_PTRACE))
     182           0 :                 goto out;
     183             :         ret = -EPERM;
     184           8 : out:
     185           8 :         rcu_read_unlock();
     186           8 :         return ret;
     187             : }
     188             : 
     189             : /**
     190             :  * cap_capget - Retrieve a task's capability sets
     191             :  * @target: The task from which to retrieve the capability sets
     192             :  * @effective: The place to record the effective set
     193             :  * @inheritable: The place to record the inheritable set
     194             :  * @permitted: The place to record the permitted set
     195             :  *
     196             :  * This function retrieves the capabilities of the nominated task and returns
     197             :  * them to the caller.
     198             :  */
     199         522 : int cap_capget(struct task_struct *target, kernel_cap_t *effective,
     200             :                kernel_cap_t *inheritable, kernel_cap_t *permitted)
     201             : {
     202         522 :         const struct cred *cred;
     203             : 
     204             :         /* Derived from kernel/capability.c:sys_capget. */
     205         522 :         rcu_read_lock();
     206         522 :         cred = __task_cred(target);
     207         522 :         *effective   = cred->cap_effective;
     208         522 :         *inheritable = cred->cap_inheritable;
     209         522 :         *permitted   = cred->cap_permitted;
     210         522 :         rcu_read_unlock();
     211         522 :         return 0;
     212             : }
     213             : 
     214             : /*
     215             :  * Determine whether the inheritable capabilities are limited to the old
     216             :  * permitted set.  Returns 1 if they are limited, 0 if they are not.
     217             :  */
     218         477 : static inline int cap_inh_is_capped(void)
     219             : {
     220             :         /* they are so limited unless the current task has the CAP_SETPCAP
     221             :          * capability
     222             :          */
     223         477 :         if (cap_capable(current_cred(), current_cred()->user_ns,
     224             :                         CAP_SETPCAP, CAP_OPT_NONE) == 0)
     225          63 :                 return 0;
     226             :         return 1;
     227             : }
     228             : 
     229             : /**
     230             :  * cap_capset - Validate and apply proposed changes to current's capabilities
     231             :  * @new: The proposed new credentials; alterations should be made here
     232             :  * @old: The current task's current credentials
     233             :  * @effective: A pointer to the proposed new effective capabilities set
     234             :  * @inheritable: A pointer to the proposed new inheritable capabilities set
     235             :  * @permitted: A pointer to the proposed new permitted capabilities set
     236             :  *
     237             :  * This function validates and applies a proposed mass change to the current
     238             :  * process's capability sets.  The changes are made to the proposed new
     239             :  * credentials, and assuming no error, will be committed by the caller of LSM.
     240             :  */
     241         477 : int cap_capset(struct cred *new,
     242             :                const struct cred *old,
     243             :                const kernel_cap_t *effective,
     244             :                const kernel_cap_t *inheritable,
     245             :                const kernel_cap_t *permitted)
     246             : {
     247         477 :         if (cap_inh_is_capped() &&
     248         414 :             !cap_issubset(*inheritable,
     249             :                           cap_combine(old->cap_inheritable,
     250             :                                       old->cap_permitted)))
     251             :                 /* incapable of using this inheritable set */
     252             :                 return -EPERM;
     253             : 
     254         954 :         if (!cap_issubset(*inheritable,
     255             :                           cap_combine(old->cap_inheritable,
     256             :                                       old->cap_bset)))
     257             :                 /* no new pI capabilities outside bounding set */
     258             :                 return -EPERM;
     259             : 
     260             :         /* verify restrictions on target's new Permitted set */
     261         477 :         if (!cap_issubset(*permitted, old->cap_permitted))
     262             :                 return -EPERM;
     263             : 
     264             :         /* verify the _new_Effective_ is a subset of the _new_Permitted_ */
     265         477 :         if (!cap_issubset(*effective, *permitted))
     266             :                 return -EPERM;
     267             : 
     268         477 :         new->cap_effective   = *effective;
     269         477 :         new->cap_inheritable = *inheritable;
     270         477 :         new->cap_permitted   = *permitted;
     271             : 
     272             :         /*
     273             :          * Mask off ambient bits that are no longer both permitted and
     274             :          * inheritable.
     275             :          */
     276         954 :         new->cap_ambient = cap_intersect(new->cap_ambient,
     277             :                                          cap_intersect(*permitted,
     278             :                                                        *inheritable));
     279         477 :         if (WARN_ON(!cap_ambient_invariant_ok(new)))
     280           0 :                 return -EINVAL;
     281             :         return 0;
     282             : }
     283             : 
     284             : /**
     285             :  * cap_inode_need_killpriv - Determine if inode change affects privileges
     286             :  * @dentry: The inode/dentry in being changed with change marked ATTR_KILL_PRIV
     287             :  *
     288             :  * Determine if an inode having a change applied that's marked ATTR_KILL_PRIV
     289             :  * affects the security markings on that inode, and if it is, should
     290             :  * inode_killpriv() be invoked or the change rejected.
     291             :  *
     292             :  * Returns 1 if security.capability has a value, meaning inode_killpriv()
     293             :  * is required, 0 otherwise, meaning inode_killpriv() is not required.
     294             :  */
     295         845 : int cap_inode_need_killpriv(struct dentry *dentry)
     296             : {
     297         845 :         struct inode *inode = d_backing_inode(dentry);
     298         845 :         int error;
     299             : 
     300         845 :         error = __vfs_getxattr(dentry, inode, XATTR_NAME_CAPS, NULL, 0);
     301         845 :         return error > 0;
     302             : }
     303             : 
     304             : /**
     305             :  * cap_inode_killpriv - Erase the security markings on an inode
     306             :  *
     307             :  * @mnt_userns: user namespace of the mount the inode was found from
     308             :  * @dentry:     The inode/dentry to alter
     309             :  *
     310             :  * Erase the privilege-enhancing security markings on an inode.
     311             :  *
     312             :  * If the inode has been found through an idmapped mount the user namespace of
     313             :  * the vfsmount must be passed through @mnt_userns. This function will then
     314             :  * take care to map the inode according to @mnt_userns before checking
     315             :  * permissions. On non-idmapped mounts or if permission checking is to be
     316             :  * performed on the raw inode simply passs init_user_ns.
     317             :  *
     318             :  * Returns 0 if successful, -ve on error.
     319             :  */
     320           0 : int cap_inode_killpriv(struct user_namespace *mnt_userns, struct dentry *dentry)
     321             : {
     322           0 :         int error;
     323             : 
     324           0 :         error = __vfs_removexattr(mnt_userns, dentry, XATTR_NAME_CAPS);
     325           0 :         if (error == -EOPNOTSUPP)
     326           0 :                 error = 0;
     327           0 :         return error;
     328             : }
     329             : 
     330           0 : static bool rootid_owns_currentns(kuid_t kroot)
     331             : {
     332           0 :         struct user_namespace *ns;
     333             : 
     334           0 :         if (!uid_valid(kroot))
     335             :                 return false;
     336             : 
     337           0 :         for (ns = current_user_ns(); ; ns = ns->parent) {
     338           0 :                 if (from_kuid(ns, kroot) == 0)
     339           0 :                         return true;
     340             :                 if (ns == &init_user_ns)
     341             :                         break;
     342             :         }
     343             : 
     344             :         return false;
     345             : }
     346             : 
     347           0 : static __u32 sansflags(__u32 m)
     348             : {
     349           0 :         return m & ~VFS_CAP_FLAGS_EFFECTIVE;
     350             : }
     351             : 
     352           0 : static bool is_v2header(size_t size, const struct vfs_cap_data *cap)
     353             : {
     354           0 :         if (size != XATTR_CAPS_SZ_2)
     355             :                 return false;
     356           0 :         return sansflags(le32_to_cpu(cap->magic_etc)) == VFS_CAP_REVISION_2;
     357             : }
     358             : 
     359           0 : static bool is_v3header(size_t size, const struct vfs_cap_data *cap)
     360             : {
     361           0 :         if (size != XATTR_CAPS_SZ_3)
     362             :                 return false;
     363           0 :         return sansflags(le32_to_cpu(cap->magic_etc)) == VFS_CAP_REVISION_3;
     364             : }
     365             : 
     366             : /*
     367             :  * getsecurity: We are called for security.* before any attempt to read the
     368             :  * xattr from the inode itself.
     369             :  *
     370             :  * This gives us a chance to read the on-disk value and convert it.  If we
     371             :  * return -EOPNOTSUPP, then vfs_getxattr() will call the i_op handler.
     372             :  *
     373             :  * Note we are not called by vfs_getxattr_alloc(), but that is only called
     374             :  * by the integrity subsystem, which really wants the unconverted values -
     375             :  * so that's good.
     376             :  */
     377           0 : int cap_inode_getsecurity(struct user_namespace *mnt_userns,
     378             :                           struct inode *inode, const char *name, void **buffer,
     379             :                           bool alloc)
     380             : {
     381           0 :         int size, ret;
     382           0 :         kuid_t kroot;
     383           0 :         u32 nsmagic, magic;
     384           0 :         uid_t root, mappedroot;
     385           0 :         char *tmpbuf = NULL;
     386           0 :         struct vfs_cap_data *cap;
     387           0 :         struct vfs_ns_cap_data *nscap = NULL;
     388           0 :         struct dentry *dentry;
     389           0 :         struct user_namespace *fs_ns;
     390             : 
     391           0 :         if (strcmp(name, "capability") != 0)
     392             :                 return -EOPNOTSUPP;
     393             : 
     394           0 :         dentry = d_find_any_alias(inode);
     395           0 :         if (!dentry)
     396             :                 return -EINVAL;
     397             : 
     398           0 :         size = sizeof(struct vfs_ns_cap_data);
     399           0 :         ret = (int)vfs_getxattr_alloc(mnt_userns, dentry, XATTR_NAME_CAPS,
     400             :                                       &tmpbuf, size, GFP_NOFS);
     401           0 :         dput(dentry);
     402             : 
     403           0 :         if (ret < 0)
     404             :                 return ret;
     405             : 
     406           0 :         fs_ns = inode->i_sb->s_user_ns;
     407           0 :         cap = (struct vfs_cap_data *) tmpbuf;
     408           0 :         if (is_v2header((size_t) ret, cap)) {
     409             :                 root = 0;
     410           0 :         } else if (is_v3header((size_t) ret, cap)) {
     411           0 :                 nscap = (struct vfs_ns_cap_data *) tmpbuf;
     412           0 :                 root = le32_to_cpu(nscap->rootid);
     413             :         } else {
     414           0 :                 size = -EINVAL;
     415           0 :                 goto out_free;
     416             :         }
     417             : 
     418           0 :         kroot = make_kuid(fs_ns, root);
     419             : 
     420             :         /* If this is an idmapped mount shift the kuid. */
     421           0 :         kroot = kuid_into_mnt(mnt_userns, kroot);
     422             : 
     423             :         /* If the root kuid maps to a valid uid in current ns, then return
     424             :          * this as a nscap. */
     425           0 :         mappedroot = from_kuid(current_user_ns(), kroot);
     426           0 :         if (mappedroot != (uid_t)-1 && mappedroot != (uid_t)0) {
     427           0 :                 size = sizeof(struct vfs_ns_cap_data);
     428           0 :                 if (alloc) {
     429           0 :                         if (!nscap) {
     430             :                                 /* v2 -> v3 conversion */
     431           0 :                                 nscap = kzalloc(size, GFP_ATOMIC);
     432           0 :                                 if (!nscap) {
     433           0 :                                         size = -ENOMEM;
     434           0 :                                         goto out_free;
     435             :                                 }
     436           0 :                                 nsmagic = VFS_CAP_REVISION_3;
     437           0 :                                 magic = le32_to_cpu(cap->magic_etc);
     438           0 :                                 if (magic & VFS_CAP_FLAGS_EFFECTIVE)
     439             :                                         nsmagic |= VFS_CAP_FLAGS_EFFECTIVE;
     440           0 :                                 memcpy(&nscap->data, &cap->data, sizeof(__le32) * 2 * VFS_CAP_U32);
     441           0 :                                 nscap->magic_etc = cpu_to_le32(nsmagic);
     442             :                         } else {
     443             :                                 /* use allocated v3 buffer */
     444           0 :                                 tmpbuf = NULL;
     445             :                         }
     446           0 :                         nscap->rootid = cpu_to_le32(mappedroot);
     447           0 :                         *buffer = nscap;
     448             :                 }
     449           0 :                 goto out_free;
     450             :         }
     451             : 
     452           0 :         if (!rootid_owns_currentns(kroot)) {
     453           0 :                 size = -EOVERFLOW;
     454           0 :                 goto out_free;
     455             :         }
     456             : 
     457             :         /* This comes from a parent namespace.  Return as a v2 capability */
     458           0 :         size = sizeof(struct vfs_cap_data);
     459           0 :         if (alloc) {
     460           0 :                 if (nscap) {
     461             :                         /* v3 -> v2 conversion */
     462           0 :                         cap = kzalloc(size, GFP_ATOMIC);
     463           0 :                         if (!cap) {
     464           0 :                                 size = -ENOMEM;
     465           0 :                                 goto out_free;
     466             :                         }
     467           0 :                         magic = VFS_CAP_REVISION_2;
     468           0 :                         nsmagic = le32_to_cpu(nscap->magic_etc);
     469           0 :                         if (nsmagic & VFS_CAP_FLAGS_EFFECTIVE)
     470             :                                 magic |= VFS_CAP_FLAGS_EFFECTIVE;
     471           0 :                         memcpy(&cap->data, &nscap->data, sizeof(__le32) * 2 * VFS_CAP_U32);
     472           0 :                         cap->magic_etc = cpu_to_le32(magic);
     473             :                 } else {
     474             :                         /* use unconverted v2 */
     475           0 :                         tmpbuf = NULL;
     476             :                 }
     477           0 :                 *buffer = cap;
     478             :         }
     479           0 : out_free:
     480           0 :         kfree(tmpbuf);
     481           0 :         return size;
     482             : }
     483             : 
     484             : /**
     485             :  * rootid_from_xattr - translate root uid of vfs caps
     486             :  *
     487             :  * @value:      vfs caps value which may be modified by this function
     488             :  * @size:       size of @ivalue
     489             :  * @task_ns:    user namespace of the caller
     490             :  * @mnt_userns: user namespace of the mount the inode was found from
     491             :  *
     492             :  * If the inode has been found through an idmapped mount the user namespace of
     493             :  * the vfsmount must be passed through @mnt_userns. This function will then
     494             :  * take care to map the inode according to @mnt_userns before checking
     495             :  * permissions. On non-idmapped mounts or if permission checking is to be
     496             :  * performed on the raw inode simply passs init_user_ns.
     497             :  */
     498           0 : static kuid_t rootid_from_xattr(const void *value, size_t size,
     499             :                                 struct user_namespace *task_ns,
     500             :                                 struct user_namespace *mnt_userns)
     501             : {
     502           0 :         const struct vfs_ns_cap_data *nscap = value;
     503           0 :         kuid_t rootkid;
     504           0 :         uid_t rootid = 0;
     505             : 
     506           0 :         if (size == XATTR_CAPS_SZ_3)
     507           0 :                 rootid = le32_to_cpu(nscap->rootid);
     508             : 
     509           0 :         rootkid = make_kuid(task_ns, rootid);
     510           0 :         return kuid_from_mnt(mnt_userns, rootkid);
     511             : }
     512             : 
     513           0 : static bool validheader(size_t size, const struct vfs_cap_data *cap)
     514             : {
     515           0 :         return is_v2header(size, cap) || is_v3header(size, cap);
     516             : }
     517             : 
     518             : /**
     519             :  * cap_convert_nscap - check vfs caps
     520             :  *
     521             :  * @mnt_userns: user namespace of the mount the inode was found from
     522             :  * @dentry:     used to retrieve inode to check permissions on
     523             :  * @ivalue:     vfs caps value which may be modified by this function
     524             :  * @size:       size of @ivalue
     525             :  *
     526             :  * User requested a write of security.capability.  If needed, update the
     527             :  * xattr to change from v2 to v3, or to fixup the v3 rootid.
     528             :  *
     529             :  * If the inode has been found through an idmapped mount the user namespace of
     530             :  * the vfsmount must be passed through @mnt_userns. This function will then
     531             :  * take care to map the inode according to @mnt_userns before checking
     532             :  * permissions. On non-idmapped mounts or if permission checking is to be
     533             :  * performed on the raw inode simply passs init_user_ns.
     534             :  *
     535             :  * If all is ok, we return the new size, on error return < 0.
     536             :  */
     537           0 : int cap_convert_nscap(struct user_namespace *mnt_userns, struct dentry *dentry,
     538             :                       const void **ivalue, size_t size)
     539             : {
     540           0 :         struct vfs_ns_cap_data *nscap;
     541           0 :         uid_t nsrootid;
     542           0 :         const struct vfs_cap_data *cap = *ivalue;
     543           0 :         __u32 magic, nsmagic;
     544           0 :         struct inode *inode = d_backing_inode(dentry);
     545           0 :         struct user_namespace *task_ns = current_user_ns(),
     546           0 :                 *fs_ns = inode->i_sb->s_user_ns;
     547           0 :         kuid_t rootid;
     548           0 :         size_t newsize;
     549             : 
     550           0 :         if (!*ivalue)
     551             :                 return -EINVAL;
     552           0 :         if (!validheader(size, cap))
     553             :                 return -EINVAL;
     554           0 :         if (!capable_wrt_inode_uidgid(mnt_userns, inode, CAP_SETFCAP))
     555             :                 return -EPERM;
     556           0 :         if (size == XATTR_CAPS_SZ_2 && (mnt_userns == &init_user_ns))
     557           0 :                 if (ns_capable(inode->i_sb->s_user_ns, CAP_SETFCAP))
     558             :                         /* user is privileged, just write the v2 */
     559             :                         return size;
     560             : 
     561           0 :         rootid = rootid_from_xattr(*ivalue, size, task_ns, mnt_userns);
     562           0 :         if (!uid_valid(rootid))
     563             :                 return -EINVAL;
     564             : 
     565           0 :         nsrootid = from_kuid(fs_ns, rootid);
     566           0 :         if (nsrootid == -1)
     567             :                 return -EINVAL;
     568             : 
     569           0 :         newsize = sizeof(struct vfs_ns_cap_data);
     570           0 :         nscap = kmalloc(newsize, GFP_ATOMIC);
     571           0 :         if (!nscap)
     572             :                 return -ENOMEM;
     573           0 :         nscap->rootid = cpu_to_le32(nsrootid);
     574           0 :         nsmagic = VFS_CAP_REVISION_3;
     575           0 :         magic = le32_to_cpu(cap->magic_etc);
     576           0 :         if (magic & VFS_CAP_FLAGS_EFFECTIVE)
     577             :                 nsmagic |= VFS_CAP_FLAGS_EFFECTIVE;
     578           0 :         nscap->magic_etc = cpu_to_le32(nsmagic);
     579           0 :         memcpy(&nscap->data, &cap->data, sizeof(__le32) * 2 * VFS_CAP_U32);
     580             : 
     581           0 :         *ivalue = nscap;
     582           0 :         return newsize;
     583             : }
     584             : 
     585             : /*
     586             :  * Calculate the new process capability sets from the capability sets attached
     587             :  * to a file.
     588             :  */
     589           0 : static inline int bprm_caps_from_vfs_caps(struct cpu_vfs_cap_data *caps,
     590             :                                           struct linux_binprm *bprm,
     591             :                                           bool *effective,
     592             :                                           bool *has_fcap)
     593             : {
     594           0 :         struct cred *new = bprm->cred;
     595           0 :         unsigned i;
     596           0 :         int ret = 0;
     597             : 
     598           0 :         if (caps->magic_etc & VFS_CAP_FLAGS_EFFECTIVE)
     599           0 :                 *effective = true;
     600             : 
     601           0 :         if (caps->magic_etc & VFS_CAP_REVISION_MASK)
     602           0 :                 *has_fcap = true;
     603             : 
     604           0 :         CAP_FOR_EACH_U32(i) {
     605           0 :                 __u32 permitted = caps->permitted.cap[i];
     606           0 :                 __u32 inheritable = caps->inheritable.cap[i];
     607             : 
     608             :                 /*
     609             :                  * pP' = (X & fP) | (pI & fI)
     610             :                  * The addition of pA' is handled later.
     611             :                  */
     612           0 :                 new->cap_permitted.cap[i] =
     613           0 :                         (new->cap_bset.cap[i] & permitted) |
     614           0 :                         (new->cap_inheritable.cap[i] & inheritable);
     615             : 
     616           0 :                 if (permitted & ~new->cap_permitted.cap[i])
     617             :                         /* insufficient to execute correctly */
     618           0 :                         ret = -EPERM;
     619             :         }
     620             : 
     621             :         /*
     622             :          * For legacy apps, with no internal support for recognizing they
     623             :          * do not have enough capabilities, we return an error if they are
     624             :          * missing some "forced" (aka file-permitted) capabilities.
     625             :          */
     626           0 :         return *effective ? ret : 0;
     627             : }
     628             : 
     629             : /**
     630             :  * get_vfs_caps_from_disk - retrieve vfs caps from disk
     631             :  *
     632             :  * @mnt_userns: user namespace of the mount the inode was found from
     633             :  * @dentry:     dentry from which @inode is retrieved
     634             :  * @cpu_caps:   vfs capabilities
     635             :  *
     636             :  * Extract the on-exec-apply capability sets for an executable file.
     637             :  *
     638             :  * If the inode has been found through an idmapped mount the user namespace of
     639             :  * the vfsmount must be passed through @mnt_userns. This function will then
     640             :  * take care to map the inode according to @mnt_userns before checking
     641             :  * permissions. On non-idmapped mounts or if permission checking is to be
     642             :  * performed on the raw inode simply passs init_user_ns.
     643             :  */
     644        1367 : int get_vfs_caps_from_disk(struct user_namespace *mnt_userns,
     645             :                            const struct dentry *dentry,
     646             :                            struct cpu_vfs_cap_data *cpu_caps)
     647             : {
     648        1367 :         struct inode *inode = d_backing_inode(dentry);
     649        1367 :         __u32 magic_etc;
     650        1367 :         unsigned tocopy, i;
     651        1367 :         int size;
     652        1367 :         struct vfs_ns_cap_data data, *nscaps = &data;
     653        1367 :         struct vfs_cap_data *caps = (struct vfs_cap_data *) &data;
     654        1367 :         kuid_t rootkuid;
     655        1367 :         struct user_namespace *fs_ns;
     656             : 
     657        1367 :         memset(cpu_caps, 0, sizeof(struct cpu_vfs_cap_data));
     658             : 
     659        1367 :         if (!inode)
     660             :                 return -ENODATA;
     661             : 
     662        1367 :         fs_ns = inode->i_sb->s_user_ns;
     663        1367 :         size = __vfs_getxattr((struct dentry *)dentry, inode,
     664             :                               XATTR_NAME_CAPS, &data, XATTR_CAPS_SZ);
     665        1367 :         if (size == -ENODATA || size == -EOPNOTSUPP)
     666             :                 /* no data, that's ok */
     667             :                 return -ENODATA;
     668             : 
     669           0 :         if (size < 0)
     670             :                 return size;
     671             : 
     672           0 :         if (size < sizeof(magic_etc))
     673             :                 return -EINVAL;
     674             : 
     675           0 :         cpu_caps->magic_etc = magic_etc = le32_to_cpu(caps->magic_etc);
     676             : 
     677           0 :         rootkuid = make_kuid(fs_ns, 0);
     678           0 :         switch (magic_etc & VFS_CAP_REVISION_MASK) {
     679           0 :         case VFS_CAP_REVISION_1:
     680           0 :                 if (size != XATTR_CAPS_SZ_1)
     681             :                         return -EINVAL;
     682             :                 tocopy = VFS_CAP_U32_1;
     683             :                 break;
     684           0 :         case VFS_CAP_REVISION_2:
     685           0 :                 if (size != XATTR_CAPS_SZ_2)
     686             :                         return -EINVAL;
     687             :                 tocopy = VFS_CAP_U32_2;
     688             :                 break;
     689           0 :         case VFS_CAP_REVISION_3:
     690           0 :                 if (size != XATTR_CAPS_SZ_3)
     691             :                         return -EINVAL;
     692           0 :                 tocopy = VFS_CAP_U32_3;
     693           0 :                 rootkuid = make_kuid(fs_ns, le32_to_cpu(nscaps->rootid));
     694             :                 break;
     695             : 
     696             :         default:
     697             :                 return -EINVAL;
     698             :         }
     699             :         /* Limit the caps to the mounter of the filesystem
     700             :          * or the more limited uid specified in the xattr.
     701             :          */
     702           0 :         rootkuid = kuid_into_mnt(mnt_userns, rootkuid);
     703           0 :         if (!rootid_owns_currentns(rootkuid))
     704             :                 return -ENODATA;
     705             : 
     706           0 :         CAP_FOR_EACH_U32(i) {
     707           0 :                 if (i >= tocopy)
     708             :                         break;
     709           0 :                 cpu_caps->permitted.cap[i] = le32_to_cpu(caps->data[i].permitted);
     710           0 :                 cpu_caps->inheritable.cap[i] = le32_to_cpu(caps->data[i].inheritable);
     711             :         }
     712             : 
     713           0 :         cpu_caps->permitted.cap[CAP_LAST_U32] &= CAP_LAST_U32_VALID_MASK;
     714           0 :         cpu_caps->inheritable.cap[CAP_LAST_U32] &= CAP_LAST_U32_VALID_MASK;
     715             : 
     716           0 :         cpu_caps->rootid = rootkuid;
     717             : 
     718           0 :         return 0;
     719             : }
     720             : 
     721             : /*
     722             :  * Attempt to get the on-exec apply capability sets for an executable file from
     723             :  * its xattrs and, if present, apply them to the proposed credentials being
     724             :  * constructed by execve().
     725             :  */
     726        1367 : static int get_file_caps(struct linux_binprm *bprm, struct file *file,
     727             :                          bool *effective, bool *has_fcap)
     728             : {
     729        1367 :         int rc = 0;
     730        1367 :         struct cpu_vfs_cap_data vcaps;
     731             : 
     732        1367 :         cap_clear(bprm->cred->cap_permitted);
     733             : 
     734        1367 :         if (!file_caps_enabled)
     735             :                 return 0;
     736             : 
     737        1367 :         if (!mnt_may_suid(file->f_path.mnt))
     738             :                 return 0;
     739             : 
     740             :         /*
     741             :          * This check is redundant with mnt_may_suid() but is kept to make
     742             :          * explicit that capability bits are limited to s_user_ns and its
     743             :          * descendants.
     744             :          */
     745        1367 :         if (!current_in_userns(file->f_path.mnt->mnt_sb->s_user_ns))
     746             :                 return 0;
     747             : 
     748        1367 :         rc = get_vfs_caps_from_disk(file_mnt_user_ns(file),
     749        1367 :                                     file->f_path.dentry, &vcaps);
     750        1367 :         if (rc < 0) {
     751        1367 :                 if (rc == -EINVAL)
     752           0 :                         printk(KERN_NOTICE "Invalid argument reading file caps for %s\n",
     753             :                                         bprm->filename);
     754        1367 :                 else if (rc == -ENODATA)
     755        1367 :                         rc = 0;
     756           0 :                 goto out;
     757             :         }
     758             : 
     759           0 :         rc = bprm_caps_from_vfs_caps(&vcaps, bprm, effective, has_fcap);
     760             : 
     761           0 : out:
     762        1367 :         if (rc)
     763           0 :                 cap_clear(bprm->cred->cap_permitted);
     764             : 
     765             :         return rc;
     766             : }
     767             : 
     768        4054 : static inline bool root_privileged(void) { return !issecure(SECURE_NOROOT); }
     769             : 
     770        2715 : static inline bool __is_real(kuid_t uid, struct cred *cred)
     771        1370 : { return uid_eq(cred->uid, uid); }
     772             : 
     773        4079 : static inline bool __is_eff(kuid_t uid, struct cred *cred)
     774        1345 : { return uid_eq(cred->euid, uid); }
     775             : 
     776        1345 : static inline bool __is_suid(kuid_t uid, struct cred *cred)
     777        1345 : { return !__is_real(uid, cred) && __is_eff(uid, cred); }
     778             : 
     779             : /*
     780             :  * handle_privileged_root - Handle case of privileged root
     781             :  * @bprm: The execution parameters, including the proposed creds
     782             :  * @has_fcap: Are any file capabilities set?
     783             :  * @effective: Do we have effective root privilege?
     784             :  * @root_uid: This namespace' root UID WRT initial USER namespace
     785             :  *
     786             :  * Handle the case where root is privileged and hasn't been neutered by
     787             :  * SECURE_NOROOT.  If file capabilities are set, they won't be combined with
     788             :  * set UID root and nothing is changed.  If we are root, cap_permitted is
     789             :  * updated.  If we have become set UID root, the effective bit is set.
     790             :  */
     791        1367 : static void handle_privileged_root(struct linux_binprm *bprm, bool has_fcap,
     792             :                                    bool *effective, kuid_t root_uid)
     793             : {
     794        1367 :         const struct cred *old = current_cred();
     795        1367 :         struct cred *new = bprm->cred;
     796             : 
     797        1367 :         if (!root_privileged())
     798             :                 return;
     799             :         /*
     800             :          * If the legacy file capability is set, then don't set privs
     801             :          * for a setuid root binary run by a non-root user.  Do set it
     802             :          * for a root user just to cause least surprise to an admin.
     803             :          */
     804        1367 :         if (has_fcap && __is_suid(root_uid, new)) {
     805           0 :                 warn_setuid_and_fcaps_mixed(bprm->filename);
     806           0 :                 return;
     807             :         }
     808             :         /*
     809             :          * To support inheritance of root-permissions and suid-root
     810             :          * executables under compatibility mode, we override the
     811             :          * capability sets for the file.
     812             :          */
     813        1367 :         if (__is_eff(root_uid, new) || __is_real(root_uid, new)) {
     814             :                 /* pP' = (cap_bset & ~0) | (pI & ~0) */
     815        2728 :                 new->cap_permitted = cap_combine(old->cap_bset,
     816             :                                                  old->cap_inheritable);
     817             :         }
     818             :         /*
     819             :          * If only the real uid is 0, we do not set the effective bit.
     820             :          */
     821        1367 :         if (__is_eff(root_uid, new))
     822        1364 :                 *effective = true;
     823             : }
     824             : 
     825             : #define __cap_gained(field, target, source) \
     826             :         !cap_issubset(target->cap_##field, source->cap_##field)
     827             : #define __cap_grew(target, source, cred) \
     828             :         !cap_issubset(cred->cap_##target, cred->cap_##source)
     829             : #define __cap_full(field, cred) \
     830             :         cap_issubset(CAP_FULL_SET, cred->cap_##field)
     831             : 
     832        2712 : static inline bool __is_setuid(struct cred *new, const struct cred *old)
     833        1345 : { return !uid_eq(new->euid, old->uid); }
     834             : 
     835        1367 : static inline bool __is_setgid(struct cred *new, const struct cred *old)
     836        1367 : { return !gid_eq(new->egid, old->gid); }
     837             : 
     838             : /*
     839             :  * 1) Audit candidate if current->cap_effective is set
     840             :  *
     841             :  * We do not bother to audit if 3 things are true:
     842             :  *   1) cap_effective has all caps
     843             :  *   2) we became root *OR* are were already root
     844             :  *   3) root is supposed to have all caps (SECURE_NOROOT)
     845             :  * Since this is just a normal root execing a process.
     846             :  *
     847             :  * Number 1 above might fail if you don't have a full bset, but I think
     848             :  * that is interesting information to audit.
     849             :  *
     850             :  * A number of other conditions require logging:
     851             :  * 2) something prevented setuid root getting all caps
     852             :  * 3) non-setuid root gets fcaps
     853             :  * 4) non-setuid root gets ambient
     854             :  */
     855        1367 : static inline bool nonroot_raised_pE(struct cred *new, const struct cred *old,
     856             :                                      kuid_t root, bool has_fcap)
     857             : {
     858        1367 :         bool ret = false;
     859             : 
     860        1367 :         if ((__cap_grew(effective, ambient, new) &&
     861        2706 :              !(__cap_full(effective, new) &&
     862        1342 :                (__is_eff(root, new) || __is_real(root, new)) &&
     863        2687 :                root_privileged())) ||
     864        1345 :             (root_privileged() &&
     865        1345 :              __is_suid(root, new) &&
     866           0 :              !__cap_full(effective, new)) ||
     867        1345 :             (!__is_setuid(new, old) &&
     868           0 :              ((has_fcap &&
     869           0 :                __cap_gained(permitted, new, old)) ||
     870        1345 :               __cap_gained(ambient, new, old))))
     871             : 
     872             :                 ret = true;
     873             : 
     874        1367 :         return ret;
     875             : }
     876             : 
     877             : /**
     878             :  * cap_bprm_creds_from_file - Set up the proposed credentials for execve().
     879             :  * @bprm: The execution parameters, including the proposed creds
     880             :  * @file: The file to pull the credentials from
     881             :  *
     882             :  * Set up the proposed credentials for a new execution context being
     883             :  * constructed by execve().  The proposed creds in @bprm->cred is altered,
     884             :  * which won't take effect immediately.  Returns 0 if successful, -ve on error.
     885             :  */
     886        1367 : int cap_bprm_creds_from_file(struct linux_binprm *bprm, struct file *file)
     887             : {
     888             :         /* Process setpcap binaries and capabilities for uid 0 */
     889        1367 :         const struct cred *old = current_cred();
     890        1367 :         struct cred *new = bprm->cred;
     891        1367 :         bool effective = false, has_fcap = false, is_setid;
     892        1367 :         int ret;
     893        1367 :         kuid_t root_uid;
     894             : 
     895        1367 :         if (WARN_ON(!cap_ambient_invariant_ok(old)))
     896             :                 return -EPERM;
     897             : 
     898        1367 :         ret = get_file_caps(bprm, file, &effective, &has_fcap);
     899        1367 :         if (ret < 0)
     900             :                 return ret;
     901             : 
     902        1367 :         root_uid = make_kuid(new->user_ns, 0);
     903             : 
     904        1367 :         handle_privileged_root(bprm, has_fcap, &effective, root_uid);
     905             : 
     906             :         /* if we have fs caps, clear dangerous personality flags */
     907        1367 :         if (__cap_gained(permitted, new, old))
     908           2 :                 bprm->per_clear |= PER_CLEAR_ON_SETID;
     909             : 
     910             :         /* Don't let someone trace a set[ug]id/setpcap binary with the revised
     911             :          * credentials unless they have the appropriate permit.
     912             :          *
     913             :          * In addition, if NO_NEW_PRIVS, then ensure we get no new privs.
     914             :          */
     915        1367 :         is_setid = __is_setuid(new, old) || __is_setgid(new, old);
     916             : 
     917        1367 :         if ((is_setid || __cap_gained(permitted, new, old)) &&
     918           2 :             ((bprm->unsafe & ~LSM_UNSAFE_PTRACE) ||
     919           0 :              !ptracer_capable(current, new->user_ns))) {
     920             :                 /* downgrade; they get no more than they had, and maybe less */
     921           2 :                 if (!ns_capable(new->user_ns, CAP_SETUID) ||
     922           0 :                     (bprm->unsafe & LSM_UNSAFE_NO_NEW_PRIVS)) {
     923           2 :                         new->euid = new->uid;
     924           2 :                         new->egid = new->gid;
     925             :                 }
     926           4 :                 new->cap_permitted = cap_intersect(new->cap_permitted,
     927             :                                                    old->cap_permitted);
     928             :         }
     929             : 
     930        1367 :         new->suid = new->fsuid = new->euid;
     931        1367 :         new->sgid = new->fsgid = new->egid;
     932             : 
     933             :         /* File caps or setid cancels ambient. */
     934        1367 :         if (has_fcap || is_setid)
     935           0 :                 cap_clear(new->cap_ambient);
     936             : 
     937             :         /*
     938             :          * Now that we've computed pA', update pP' to give:
     939             :          *   pP' = (X & fP) | (pI & fI) | pA'
     940             :          */
     941        1367 :         new->cap_permitted = cap_combine(new->cap_permitted, new->cap_ambient);
     942             : 
     943             :         /*
     944             :          * Set pE' = (fE ? pP' : pA').  Because pA' is zero if fE is set,
     945             :          * this is the same as pE' = (fE ? pP' : 0) | pA'.
     946             :          */
     947        1367 :         if (effective)
     948        1364 :                 new->cap_effective = new->cap_permitted;
     949             :         else
     950           3 :                 new->cap_effective = new->cap_ambient;
     951             : 
     952        1367 :         if (WARN_ON(!cap_ambient_invariant_ok(new)))
     953             :                 return -EPERM;
     954             : 
     955        1367 :         if (nonroot_raised_pE(new, old, root_uid, has_fcap)) {
     956        1367 :                 ret = audit_log_bprm_fcaps(bprm, new, old);
     957             :                 if (ret < 0)
     958             :                         return ret;
     959             :         }
     960             : 
     961        1367 :         new->securebits &= ~issecure_mask(SECURE_KEEP_CAPS);
     962             : 
     963        1367 :         if (WARN_ON(!cap_ambient_invariant_ok(new)))
     964             :                 return -EPERM;
     965             : 
     966             :         /* Check for privilege-elevated exec. */
     967        1367 :         if (is_setid ||
     968        1367 :             (!__is_real(root_uid, new) &&
     969           3 :              (effective ||
     970           3 :               __cap_grew(permitted, ambient, new))))
     971           0 :                 bprm->secureexec = 1;
     972             : 
     973             :         return 0;
     974             : }
     975             : 
     976             : /**
     977             :  * cap_inode_setxattr - Determine whether an xattr may be altered
     978             :  * @dentry: The inode/dentry being altered
     979             :  * @name: The name of the xattr to be changed
     980             :  * @value: The value that the xattr will be changed to
     981             :  * @size: The size of value
     982             :  * @flags: The replacement flag
     983             :  *
     984             :  * Determine whether an xattr may be altered or set on an inode, returning 0 if
     985             :  * permission is granted, -ve if denied.
     986             :  *
     987             :  * This is used to make sure security xattrs don't get updated or set by those
     988             :  * who aren't privileged to do so.
     989             :  */
     990          61 : int cap_inode_setxattr(struct dentry *dentry, const char *name,
     991             :                        const void *value, size_t size, int flags)
     992             : {
     993          61 :         struct user_namespace *user_ns = dentry->d_sb->s_user_ns;
     994             : 
     995             :         /* Ignore non-security xattrs */
     996          61 :         if (strncmp(name, XATTR_SECURITY_PREFIX,
     997             :                         XATTR_SECURITY_PREFIX_LEN) != 0)
     998             :                 return 0;
     999             : 
    1000             :         /*
    1001             :          * For XATTR_NAME_CAPS the check will be done in
    1002             :          * cap_convert_nscap(), called by setxattr()
    1003             :          */
    1004           0 :         if (strcmp(name, XATTR_NAME_CAPS) == 0)
    1005             :                 return 0;
    1006             : 
    1007           0 :         if (!ns_capable(user_ns, CAP_SYS_ADMIN))
    1008           0 :                 return -EPERM;
    1009             :         return 0;
    1010             : }
    1011             : 
    1012             : /**
    1013             :  * cap_inode_removexattr - Determine whether an xattr may be removed
    1014             :  *
    1015             :  * @mnt_userns: User namespace of the mount the inode was found from
    1016             :  * @dentry:     The inode/dentry being altered
    1017             :  * @name:       The name of the xattr to be changed
    1018             :  *
    1019             :  * Determine whether an xattr may be removed from an inode, returning 0 if
    1020             :  * permission is granted, -ve if denied.
    1021             :  *
    1022             :  * If the inode has been found through an idmapped mount the user namespace of
    1023             :  * the vfsmount must be passed through @mnt_userns. This function will then
    1024             :  * take care to map the inode according to @mnt_userns before checking
    1025             :  * permissions. On non-idmapped mounts or if permission checking is to be
    1026             :  * performed on the raw inode simply passs init_user_ns.
    1027             :  *
    1028             :  * This is used to make sure security xattrs don't get removed by those who
    1029             :  * aren't privileged to remove them.
    1030             :  */
    1031           8 : int cap_inode_removexattr(struct user_namespace *mnt_userns,
    1032             :                           struct dentry *dentry, const char *name)
    1033             : {
    1034           8 :         struct user_namespace *user_ns = dentry->d_sb->s_user_ns;
    1035             : 
    1036             :         /* Ignore non-security xattrs */
    1037           8 :         if (strncmp(name, XATTR_SECURITY_PREFIX,
    1038             :                         XATTR_SECURITY_PREFIX_LEN) != 0)
    1039             :                 return 0;
    1040             : 
    1041           0 :         if (strcmp(name, XATTR_NAME_CAPS) == 0) {
    1042             :                 /* security.capability gets namespaced */
    1043           0 :                 struct inode *inode = d_backing_inode(dentry);
    1044           0 :                 if (!inode)
    1045             :                         return -EINVAL;
    1046           0 :                 if (!capable_wrt_inode_uidgid(mnt_userns, inode, CAP_SETFCAP))
    1047             :                         return -EPERM;
    1048           0 :                 return 0;
    1049             :         }
    1050             : 
    1051           0 :         if (!ns_capable(user_ns, CAP_SYS_ADMIN))
    1052           0 :                 return -EPERM;
    1053             :         return 0;
    1054             : }
    1055             : 
    1056             : /*
    1057             :  * cap_emulate_setxuid() fixes the effective / permitted capabilities of
    1058             :  * a process after a call to setuid, setreuid, or setresuid.
    1059             :  *
    1060             :  *  1) When set*uiding _from_ one of {r,e,s}uid == 0 _to_ all of
    1061             :  *  {r,e,s}uid != 0, the permitted and effective capabilities are
    1062             :  *  cleared.
    1063             :  *
    1064             :  *  2) When set*uiding _from_ euid == 0 _to_ euid != 0, the effective
    1065             :  *  capabilities of the process are cleared.
    1066             :  *
    1067             :  *  3) When set*uiding _from_ euid != 0 _to_ euid == 0, the effective
    1068             :  *  capabilities are set to the permitted capabilities.
    1069             :  *
    1070             :  *  fsuid is handled elsewhere. fsuid == 0 and {r,e,s}uid!= 0 should
    1071             :  *  never happen.
    1072             :  *
    1073             :  *  -astor
    1074             :  *
    1075             :  * cevans - New behaviour, Oct '99
    1076             :  * A process may, via prctl(), elect to keep its capabilities when it
    1077             :  * calls setuid() and switches away from uid==0. Both permitted and
    1078             :  * effective sets will be retained.
    1079             :  * Without this change, it was impossible for a daemon to drop only some
    1080             :  * of its privilege. The call to setuid(!=0) would drop all privileges!
    1081             :  * Keeping uid 0 is not an option because uid 0 owns too many vital
    1082             :  * files..
    1083             :  * Thanks to Olaf Kirch and Peter Benie for spotting this.
    1084             :  */
    1085          61 : static inline void cap_emulate_setxuid(struct cred *new, const struct cred *old)
    1086             : {
    1087          61 :         kuid_t root_uid = make_kuid(old->user_ns, 0);
    1088             : 
    1089          61 :         if ((uid_eq(old->uid, root_uid) ||
    1090           5 :              uid_eq(old->euid, root_uid) ||
    1091           0 :              uid_eq(old->suid, root_uid)) &&
    1092          61 :             (!uid_eq(new->uid, root_uid) &&
    1093          16 :              !uid_eq(new->euid, root_uid) &&
    1094          11 :              !uid_eq(new->suid, root_uid))) {
    1095          11 :                 if (!issecure(SECURE_KEEP_CAPS)) {
    1096           9 :                         cap_clear(new->cap_permitted);
    1097           9 :                         cap_clear(new->cap_effective);
    1098             :                 }
    1099             : 
    1100             :                 /*
    1101             :                  * Pre-ambient programs expect setresuid to nonroot followed
    1102             :                  * by exec to drop capabilities.  We should make sure that
    1103             :                  * this remains the case.
    1104             :                  */
    1105          11 :                 cap_clear(new->cap_ambient);
    1106             :         }
    1107          61 :         if (uid_eq(old->euid, root_uid) && !uid_eq(new->euid, root_uid))
    1108          17 :                 cap_clear(new->cap_effective);
    1109          61 :         if (!uid_eq(old->euid, root_uid) && uid_eq(new->euid, root_uid))
    1110           5 :                 new->cap_effective = new->cap_permitted;
    1111          61 : }
    1112             : 
    1113             : /**
    1114             :  * cap_task_fix_setuid - Fix up the results of setuid() call
    1115             :  * @new: The proposed credentials
    1116             :  * @old: The current task's current credentials
    1117             :  * @flags: Indications of what has changed
    1118             :  *
    1119             :  * Fix up the results of setuid() call before the credential changes are
    1120             :  * actually applied, returning 0 to grant the changes, -ve to deny them.
    1121             :  */
    1122          61 : int cap_task_fix_setuid(struct cred *new, const struct cred *old, int flags)
    1123             : {
    1124          61 :         switch (flags) {
    1125          61 :         case LSM_SETID_RE:
    1126             :         case LSM_SETID_ID:
    1127             :         case LSM_SETID_RES:
    1128             :                 /* juggle the capabilities to follow [RES]UID changes unless
    1129             :                  * otherwise suppressed */
    1130          61 :                 if (!issecure(SECURE_NO_SETUID_FIXUP))
    1131          61 :                         cap_emulate_setxuid(new, old);
    1132             :                 break;
    1133             : 
    1134           0 :         case LSM_SETID_FS:
    1135             :                 /* juggle the capabilties to follow FSUID changes, unless
    1136             :                  * otherwise suppressed
    1137             :                  *
    1138             :                  * FIXME - is fsuser used for all CAP_FS_MASK capabilities?
    1139             :                  *          if not, we might be a bit too harsh here.
    1140             :                  */
    1141           0 :                 if (!issecure(SECURE_NO_SETUID_FIXUP)) {
    1142           0 :                         kuid_t root_uid = make_kuid(old->user_ns, 0);
    1143           0 :                         if (uid_eq(old->fsuid, root_uid) && !uid_eq(new->fsuid, root_uid))
    1144           0 :                                 new->cap_effective =
    1145           0 :                                         cap_drop_fs_set(new->cap_effective);
    1146             : 
    1147           0 :                         if (!uid_eq(old->fsuid, root_uid) && uid_eq(new->fsuid, root_uid))
    1148           0 :                                 new->cap_effective =
    1149           0 :                                         cap_raise_fs_set(new->cap_effective,
    1150             :                                                          new->cap_permitted);
    1151             :                 }
    1152             :                 break;
    1153             : 
    1154             :         default:
    1155             :                 return -EINVAL;
    1156             :         }
    1157             : 
    1158             :         return 0;
    1159             : }
    1160             : 
    1161             : /*
    1162             :  * Rationale: code calling task_setscheduler, task_setioprio, and
    1163             :  * task_setnice, assumes that
    1164             :  *   . if capable(cap_sys_nice), then those actions should be allowed
    1165             :  *   . if not capable(cap_sys_nice), but acting on your own processes,
    1166             :  *      then those actions should be allowed
    1167             :  * This is insufficient now since you can call code without suid, but
    1168             :  * yet with increased caps.
    1169             :  * So we check for increased caps on the target process.
    1170             :  */
    1171          18 : static int cap_safe_nice(struct task_struct *p)
    1172             : {
    1173          18 :         int is_subset, ret = 0;
    1174             : 
    1175          18 :         rcu_read_lock();
    1176          18 :         is_subset = cap_issubset(__task_cred(p)->cap_permitted,
    1177          18 :                                  current_cred()->cap_permitted);
    1178          18 :         if (!is_subset && !ns_capable(__task_cred(p)->user_ns, CAP_SYS_NICE))
    1179           0 :                 ret = -EPERM;
    1180          18 :         rcu_read_unlock();
    1181             : 
    1182          18 :         return ret;
    1183             : }
    1184             : 
    1185             : /**
    1186             :  * cap_task_setscheduler - Detemine if scheduler policy change is permitted
    1187             :  * @p: The task to affect
    1188             :  *
    1189             :  * Detemine if the requested scheduler policy change is permitted for the
    1190             :  * specified task, returning 0 if permission is granted, -ve if denied.
    1191             :  */
    1192           3 : int cap_task_setscheduler(struct task_struct *p)
    1193             : {
    1194           3 :         return cap_safe_nice(p);
    1195             : }
    1196             : 
    1197             : /**
    1198             :  * cap_task_ioprio - Detemine if I/O priority change is permitted
    1199             :  * @p: The task to affect
    1200             :  * @ioprio: The I/O priority to set
    1201             :  *
    1202             :  * Detemine if the requested I/O priority change is permitted for the specified
    1203             :  * task, returning 0 if permission is granted, -ve if denied.
    1204             :  */
    1205           6 : int cap_task_setioprio(struct task_struct *p, int ioprio)
    1206             : {
    1207           6 :         return cap_safe_nice(p);
    1208             : }
    1209             : 
    1210             : /**
    1211             :  * cap_task_ioprio - Detemine if task priority change is permitted
    1212             :  * @p: The task to affect
    1213             :  * @nice: The nice value to set
    1214             :  *
    1215             :  * Detemine if the requested task priority change is permitted for the
    1216             :  * specified task, returning 0 if permission is granted, -ve if denied.
    1217             :  */
    1218           9 : int cap_task_setnice(struct task_struct *p, int nice)
    1219             : {
    1220           9 :         return cap_safe_nice(p);
    1221             : }
    1222             : 
    1223             : /*
    1224             :  * Implement PR_CAPBSET_DROP.  Attempt to remove the specified capability from
    1225             :  * the current task's bounding set.  Returns 0 on success, -ve on error.
    1226             :  */
    1227         104 : static int cap_prctl_drop(unsigned long cap)
    1228             : {
    1229         104 :         struct cred *new;
    1230             : 
    1231         104 :         if (!ns_capable(current_user_ns(), CAP_SETPCAP))
    1232             :                 return -EPERM;
    1233         104 :         if (!cap_valid(cap))
    1234             :                 return -EINVAL;
    1235             : 
    1236         104 :         new = prepare_creds();
    1237         104 :         if (!new)
    1238             :                 return -ENOMEM;
    1239         104 :         cap_lower(new->cap_bset, cap);
    1240         104 :         return commit_creds(new);
    1241             : }
    1242             : 
    1243             : /**
    1244             :  * cap_task_prctl - Implement process control functions for this security module
    1245             :  * @option: The process control function requested
    1246             :  * @arg2, @arg3, @arg4, @arg5: The argument data for this function
    1247             :  *
    1248             :  * Allow process control functions (sys_prctl()) to alter capabilities; may
    1249             :  * also deny access to other functions not otherwise implemented here.
    1250             :  *
    1251             :  * Returns 0 or +ve on success, -ENOSYS if this function is not implemented
    1252             :  * here, other -ve on error.  If -ENOSYS is returned, sys_prctl() and other LSM
    1253             :  * modules will consider performing the function.
    1254             :  */
    1255         696 : int cap_task_prctl(int option, unsigned long arg2, unsigned long arg3,
    1256             :                    unsigned long arg4, unsigned long arg5)
    1257             : {
    1258         696 :         const struct cred *old = current_cred();
    1259         696 :         struct cred *new;
    1260             : 
    1261         696 :         switch (option) {
    1262           0 :         case PR_CAPBSET_READ:
    1263           0 :                 if (!cap_valid(arg2))
    1264             :                         return -EINVAL;
    1265           0 :                 return !!cap_raised(old->cap_bset, arg2);
    1266             : 
    1267         104 :         case PR_CAPBSET_DROP:
    1268         104 :                 return cap_prctl_drop(arg2);
    1269             : 
    1270             :         /*
    1271             :          * The next four prctl's remain to assist with transitioning a
    1272             :          * system from legacy UID=0 based privilege (when filesystem
    1273             :          * capabilities are not in use) to a system using filesystem
    1274             :          * capabilities only - as the POSIX.1e draft intended.
    1275             :          *
    1276             :          * Note:
    1277             :          *
    1278             :          *  PR_SET_SECUREBITS =
    1279             :          *      issecure_mask(SECURE_KEEP_CAPS_LOCKED)
    1280             :          *    | issecure_mask(SECURE_NOROOT)
    1281             :          *    | issecure_mask(SECURE_NOROOT_LOCKED)
    1282             :          *    | issecure_mask(SECURE_NO_SETUID_FIXUP)
    1283             :          *    | issecure_mask(SECURE_NO_SETUID_FIXUP_LOCKED)
    1284             :          *
    1285             :          * will ensure that the current process and all of its
    1286             :          * children will be locked into a pure
    1287             :          * capability-based-privilege environment.
    1288             :          */
    1289           1 :         case PR_SET_SECUREBITS:
    1290           1 :                 if ((((old->securebits & SECURE_ALL_LOCKS) >> 1)
    1291           1 :                      & (old->securebits ^ arg2))                 /*[1]*/
    1292           1 :                     || ((old->securebits & SECURE_ALL_LOCKS & ~arg2))        /*[2]*/
    1293           1 :                     || (arg2 & ~(SECURE_ALL_LOCKS | SECURE_ALL_BITS))       /*[3]*/
    1294           1 :                     || (cap_capable(current_cred(),
    1295           1 :                                     current_cred()->user_ns,
    1296             :                                     CAP_SETPCAP,
    1297             :                                     CAP_OPT_NONE) != 0)                 /*[4]*/
    1298             :                         /*
    1299             :                          * [1] no changing of bits that are locked
    1300             :                          * [2] no unlocking of locks
    1301             :                          * [3] no setting of unsupported bits
    1302             :                          * [4] doing anything requires privilege (go read about
    1303             :                          *     the "sendmail capabilities bug")
    1304             :                          */
    1305             :                     )
    1306             :                         /* cannot change a locked bit */
    1307           0 :                         return -EPERM;
    1308             : 
    1309           1 :                 new = prepare_creds();
    1310           1 :                 if (!new)
    1311             :                         return -ENOMEM;
    1312           1 :                 new->securebits = arg2;
    1313           1 :                 return commit_creds(new);
    1314             : 
    1315          47 :         case PR_GET_SECUREBITS:
    1316          47 :                 return old->securebits;
    1317             : 
    1318           0 :         case PR_GET_KEEPCAPS:
    1319           0 :                 return !!issecure(SECURE_KEEP_CAPS);
    1320             : 
    1321           2 :         case PR_SET_KEEPCAPS:
    1322           2 :                 if (arg2 > 1) /* Note, we rely on arg2 being unsigned here */
    1323             :                         return -EINVAL;
    1324           2 :                 if (issecure(SECURE_KEEP_CAPS_LOCKED))
    1325             :                         return -EPERM;
    1326             : 
    1327           2 :                 new = prepare_creds();
    1328           2 :                 if (!new)
    1329             :                         return -ENOMEM;
    1330           2 :                 if (arg2)
    1331           1 :                         new->securebits |= issecure_mask(SECURE_KEEP_CAPS);
    1332             :                 else
    1333           1 :                         new->securebits &= ~issecure_mask(SECURE_KEEP_CAPS);
    1334           2 :                 return commit_creds(new);
    1335             : 
    1336           3 :         case PR_CAP_AMBIENT:
    1337           3 :                 if (arg2 == PR_CAP_AMBIENT_CLEAR_ALL) {
    1338           0 :                         if (arg3 | arg4 | arg5)
    1339             :                                 return -EINVAL;
    1340             : 
    1341           0 :                         new = prepare_creds();
    1342           0 :                         if (!new)
    1343             :                                 return -ENOMEM;
    1344           0 :                         cap_clear(new->cap_ambient);
    1345           0 :                         return commit_creds(new);
    1346             :                 }
    1347             : 
    1348           3 :                 if (((!cap_valid(arg3)) | arg4 | arg5))
    1349             :                         return -EINVAL;
    1350             : 
    1351           3 :                 if (arg2 == PR_CAP_AMBIENT_IS_SET) {
    1352           1 :                         return !!cap_raised(current_cred()->cap_ambient, arg3);
    1353           2 :                 } else if (arg2 != PR_CAP_AMBIENT_RAISE &&
    1354             :                            arg2 != PR_CAP_AMBIENT_LOWER) {
    1355             :                         return -EINVAL;
    1356             :                 } else {
    1357           4 :                         if (arg2 == PR_CAP_AMBIENT_RAISE &&
    1358           4 :                             (!cap_raised(current_cred()->cap_permitted, arg3) ||
    1359           2 :                              !cap_raised(current_cred()->cap_inheritable,
    1360           2 :                                          arg3) ||
    1361           2 :                              issecure(SECURE_NO_CAP_AMBIENT_RAISE)))
    1362           0 :                                 return -EPERM;
    1363             : 
    1364           2 :                         new = prepare_creds();
    1365           2 :                         if (!new)
    1366             :                                 return -ENOMEM;
    1367           2 :                         if (arg2 == PR_CAP_AMBIENT_RAISE)
    1368           2 :                                 cap_raise(new->cap_ambient, arg3);
    1369             :                         else
    1370           0 :                                 cap_lower(new->cap_ambient, arg3);
    1371           2 :                         return commit_creds(new);
    1372             :                 }
    1373             : 
    1374             :         default:
    1375             :                 /* No functionality available - continue with default */
    1376             :                 return -ENOSYS;
    1377             :         }
    1378             : }
    1379             : 
    1380             : /**
    1381             :  * cap_vm_enough_memory - Determine whether a new virtual mapping is permitted
    1382             :  * @mm: The VM space in which the new mapping is to be made
    1383             :  * @pages: The size of the mapping
    1384             :  *
    1385             :  * Determine whether the allocation of a new virtual mapping by the current
    1386             :  * task is permitted, returning 1 if permission is granted, 0 if not.
    1387             :  */
    1388       58420 : int cap_vm_enough_memory(struct mm_struct *mm, long pages)
    1389             : {
    1390       58420 :         int cap_sys_admin = 0;
    1391             : 
    1392       58420 :         if (cap_capable(current_cred(), &init_user_ns,
    1393             :                                 CAP_SYS_ADMIN, CAP_OPT_NOAUDIT) == 0)
    1394       56854 :                 cap_sys_admin = 1;
    1395             : 
    1396       58422 :         return cap_sys_admin;
    1397             : }
    1398             : 
    1399             : /*
    1400             :  * cap_mmap_addr - check if able to map given addr
    1401             :  * @addr: address attempting to be mapped
    1402             :  *
    1403             :  * If the process is attempting to map memory below dac_mmap_min_addr they need
    1404             :  * CAP_SYS_RAWIO.  The other parameters to this function are unused by the
    1405             :  * capability security module.  Returns 0 if this mapping should be allowed
    1406             :  * -EPERM if not.
    1407             :  */
    1408       40701 : int cap_mmap_addr(unsigned long addr)
    1409             : {
    1410       40701 :         int ret = 0;
    1411             : 
    1412       40701 :         if (addr < dac_mmap_min_addr) {
    1413           0 :                 ret = cap_capable(current_cred(), &init_user_ns, CAP_SYS_RAWIO,
    1414             :                                   CAP_OPT_NONE);
    1415             :                 /* set PF_SUPERPRIV if it turns out we allow the low mmap */
    1416           0 :                 if (ret == 0)
    1417           0 :                         current->flags |= PF_SUPERPRIV;
    1418             :         }
    1419       40701 :         return ret;
    1420             : }
    1421             : 
    1422       35741 : int cap_mmap_file(struct file *file, unsigned long reqprot,
    1423             :                   unsigned long prot, unsigned long flags)
    1424             : {
    1425       35741 :         return 0;
    1426             : }
    1427             : 
    1428             : #ifdef CONFIG_SECURITY
    1429             : 
    1430             : static struct security_hook_list capability_hooks[] __lsm_ro_after_init = {
    1431             :         LSM_HOOK_INIT(capable, cap_capable),
    1432             :         LSM_HOOK_INIT(settime, cap_settime),
    1433             :         LSM_HOOK_INIT(ptrace_access_check, cap_ptrace_access_check),
    1434             :         LSM_HOOK_INIT(ptrace_traceme, cap_ptrace_traceme),
    1435             :         LSM_HOOK_INIT(capget, cap_capget),
    1436             :         LSM_HOOK_INIT(capset, cap_capset),
    1437             :         LSM_HOOK_INIT(bprm_creds_from_file, cap_bprm_creds_from_file),
    1438             :         LSM_HOOK_INIT(inode_need_killpriv, cap_inode_need_killpriv),
    1439             :         LSM_HOOK_INIT(inode_killpriv, cap_inode_killpriv),
    1440             :         LSM_HOOK_INIT(inode_getsecurity, cap_inode_getsecurity),
    1441             :         LSM_HOOK_INIT(mmap_addr, cap_mmap_addr),
    1442             :         LSM_HOOK_INIT(mmap_file, cap_mmap_file),
    1443             :         LSM_HOOK_INIT(task_fix_setuid, cap_task_fix_setuid),
    1444             :         LSM_HOOK_INIT(task_prctl, cap_task_prctl),
    1445             :         LSM_HOOK_INIT(task_setscheduler, cap_task_setscheduler),
    1446             :         LSM_HOOK_INIT(task_setioprio, cap_task_setioprio),
    1447             :         LSM_HOOK_INIT(task_setnice, cap_task_setnice),
    1448             :         LSM_HOOK_INIT(vm_enough_memory, cap_vm_enough_memory),
    1449             : };
    1450             : 
    1451           1 : static int __init capability_init(void)
    1452             : {
    1453           1 :         security_add_hooks(capability_hooks, ARRAY_SIZE(capability_hooks),
    1454             :                                 "capability");
    1455           1 :         return 0;
    1456             : }
    1457             : 
    1458             : DEFINE_LSM(capability) = {
    1459             :         .name = "capability",
    1460             :         .order = LSM_ORDER_FIRST,
    1461             :         .init = capability_init,
    1462             : };
    1463             : 
    1464             : #endif /* CONFIG_SECURITY */

Generated by: LCOV version 1.14