LCOV - code coverage report
Current view: top level - security - commoncap.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 116 230 50.4 %
Date: 2014-02-18 Functions: 20 25 80.0 %
Branches: 106 232 45.7 %

           Branch data     Line data    Source code
       1                 :            : /* Common capabilities, needed by capability.o.
       2                 :            :  *
       3                 :            :  *      This program is free software; you can redistribute it and/or modify
       4                 :            :  *      it under the terms of the GNU General Public License as published by
       5                 :            :  *      the Free Software Foundation; either version 2 of the License, or
       6                 :            :  *      (at your option) any later version.
       7                 :            :  *
       8                 :            :  */
       9                 :            : 
      10                 :            : #include <linux/capability.h>
      11                 :            : #include <linux/audit.h>
      12                 :            : #include <linux/module.h>
      13                 :            : #include <linux/init.h>
      14                 :            : #include <linux/kernel.h>
      15                 :            : #include <linux/security.h>
      16                 :            : #include <linux/file.h>
      17                 :            : #include <linux/mm.h>
      18                 :            : #include <linux/mman.h>
      19                 :            : #include <linux/pagemap.h>
      20                 :            : #include <linux/swap.h>
      21                 :            : #include <linux/skbuff.h>
      22                 :            : #include <linux/netlink.h>
      23                 :            : #include <linux/ptrace.h>
      24                 :            : #include <linux/xattr.h>
      25                 :            : #include <linux/hugetlb.h>
      26                 :            : #include <linux/mount.h>
      27                 :            : #include <linux/sched.h>
      28                 :            : #include <linux/prctl.h>
      29                 :            : #include <linux/securebits.h>
      30                 :            : #include <linux/user_namespace.h>
      31                 :            : #include <linux/binfmts.h>
      32                 :            : #include <linux/personality.h>
      33                 :            : 
      34                 :            : #ifdef CONFIG_ANDROID_PARANOID_NETWORK
      35                 :            : #include <linux/android_aid.h>
      36                 :            : #endif
      37                 :            : 
      38                 :            : /*
      39                 :            :  * If a non-root user executes a setuid-root binary in
      40                 :            :  * !secure(SECURE_NOROOT) mode, then we raise capabilities.
      41                 :            :  * However if fE is also set, then the intent is for only
      42                 :            :  * the file capabilities to be applied, and the setuid-root
      43                 :            :  * bit is left on either to change the uid (plausible) or
      44                 :            :  * to get full privilege on a kernel without file capabilities
      45                 :            :  * support.  So in that case we do not raise capabilities.
      46                 :            :  *
      47                 :            :  * Warn if that happens, once per boot.
      48                 :            :  */
      49                 :            : static void warn_setuid_and_fcaps_mixed(const char *fname)
      50                 :            : {
      51                 :            :         static int warned;
      52         [ #  # ]:          0 :         if (!warned) {
      53                 :          0 :                 printk(KERN_INFO "warning: `%s' has both setuid-root and"
      54                 :            :                         " effective capabilities. Therefore not raising all"
      55                 :            :                         " capabilities.\n", fname);
      56                 :          0 :                 warned = 1;
      57                 :            :         }
      58                 :            : }
      59                 :            : 
      60                 :          0 : int cap_netlink_send(struct sock *sk, struct sk_buff *skb)
      61                 :            : {
      62                 :       3819 :         return 0;
      63                 :            : }
      64                 :            : 
      65                 :            : /**
      66                 :            :  * cap_capable - Determine whether a task has a particular effective capability
      67                 :            :  * @cred: The credentials to use
      68                 :            :  * @ns:  The user namespace in which we need the capability
      69                 :            :  * @cap: The capability to check for
      70                 :            :  * @audit: Whether to write an audit message or not
      71                 :            :  *
      72                 :            :  * Determine whether the nominated task has the specified capability amongst
      73                 :            :  * its effective set, returning 0 if it does, -ve if it does not.
      74                 :            :  *
      75                 :            :  * NOTE WELL: cap_has_capability() cannot be used like the kernel's capable()
      76                 :            :  * and has_capability() functions.  That is, it has the reverse semantics:
      77                 :            :  * cap_has_capability() returns 0 when a task has a capability, but the
      78                 :            :  * kernel's capable() and has_capability() returns 1 for this case.
      79                 :            :  */
      80                 :   16992617 : int cap_capable(const struct cred *cred, struct user_namespace *targ_ns,
      81                 :            :                 int cap, int audit)
      82                 :            : {
      83                 :            :         struct user_namespace *ns = targ_ns;
      84                 :            : 
      85                 :            : #ifdef CONFIG_ANDROID_PARANOID_NETWORK
      86                 :            :         if (cap == CAP_NET_RAW && in_egroup_p(AID_NET_RAW))
      87                 :            :                 return 0;
      88                 :            :         if (cap == CAP_NET_ADMIN && in_egroup_p(AID_NET_ADMIN))
      89                 :            :                 return 0;
      90                 :            : #endif
      91                 :            : 
      92                 :            :         /* See if cred has the capability in the target user namespace
      93                 :            :          * by examining the target user namespace and all of the target
      94                 :            :          * user namespace's parents.
      95                 :            :          */
      96                 :            :         for (;;) {
      97                 :            :                 /* Do we have the necessary capabilities? */
      98         [ +  - ]:   16992617 :                 if (ns == cred->user_ns)
      99         [ +  + ]:   16992617 :                         return cap_raised(cred->cap_effective, cap) ? 0 : -EPERM;
     100                 :            : 
     101                 :            :                 /* Have we tried all of the parent namespaces? */
     102         [ #  # ]:          0 :                 if (ns == &init_user_ns)
     103                 :            :                         return -EPERM;
     104                 :            : 
     105                 :            :                 /* 
     106                 :            :                  * The owner of the user namespace in the parent of the
     107                 :            :                  * user namespace has all caps.
     108                 :            :                  */
     109 [ #  # ][ #  # ]:          0 :                 if ((ns->parent == cred->user_ns) && uid_eq(ns->owner, cred->euid))
     110                 :            :                         return 0;
     111                 :            : 
     112                 :            :                 /*
     113                 :            :                  * If you have a capability in a parent user ns, then you have
     114                 :            :                  * it over all children user namespaces as well.
     115                 :            :                  */
     116                 :            :                 ns = ns->parent;
     117                 :            :         }
     118                 :            : 
     119                 :            :         /* We never get here */
     120                 :            : }
     121                 :            : 
     122                 :            : /**
     123                 :            :  * cap_settime - Determine whether the current process may set the system clock
     124                 :            :  * @ts: The time to set
     125                 :            :  * @tz: The timezone to set
     126                 :            :  *
     127                 :            :  * Determine whether the current process may set the system clock and timezone
     128                 :            :  * information, returning 0 if permission granted, -ve if denied.
     129                 :            :  */
     130                 :          0 : int cap_settime(const struct timespec *ts, const struct timezone *tz)
     131                 :            : {
     132         [ +  + ]:         13 :         if (!capable(CAP_SYS_TIME))
     133                 :            :                 return -EPERM;
     134                 :         10 :         return 0;
     135                 :            : }
     136                 :            : 
     137                 :            : /**
     138                 :            :  * cap_ptrace_access_check - Determine whether the current process may access
     139                 :            :  *                         another
     140                 :            :  * @child: The process to be accessed
     141                 :            :  * @mode: The mode of attachment.
     142                 :            :  *
     143                 :            :  * If we are in the same or an ancestor user_ns and have all the target
     144                 :            :  * task's capabilities, then ptrace access is allowed.
     145                 :            :  * If we have the ptrace capability to the target user_ns, then ptrace
     146                 :            :  * access is allowed.
     147                 :            :  * Else denied.
     148                 :            :  *
     149                 :            :  * Determine whether a process may access another, returning 0 if permission
     150                 :            :  * granted, -ve if denied.
     151                 :            :  */
     152                 :          0 : int cap_ptrace_access_check(struct task_struct *child, unsigned int mode)
     153                 :            : {
     154                 :            :         int ret = 0;
     155                 :            :         const struct cred *cred, *child_cred;
     156                 :            : 
     157                 :            :         rcu_read_lock();
     158                 :      73654 :         cred = current_cred();
     159                 :      73654 :         child_cred = __task_cred(child);
     160 [ +  - ][ -  + ]:     147308 :         if (cred->user_ns == child_cred->user_ns &&
     161                 :            :             cap_issubset(child_cred->cap_permitted, cred->cap_permitted))
     162                 :            :                 goto out;
     163         [ #  # ]:          0 :         if (ns_capable(child_cred->user_ns, CAP_SYS_PTRACE))
     164                 :            :                 goto out;
     165                 :            :         ret = -EPERM;
     166                 :            : out:
     167                 :            :         rcu_read_unlock();
     168                 :      73654 :         return ret;
     169                 :            : }
     170                 :            : 
     171                 :            : /**
     172                 :            :  * cap_ptrace_traceme - Determine whether another process may trace the current
     173                 :            :  * @parent: The task proposed to be the tracer
     174                 :            :  *
     175                 :            :  * If parent is in the same or an ancestor user_ns and has all current's
     176                 :            :  * capabilities, then ptrace access is allowed.
     177                 :            :  * If parent has the ptrace capability to current's user_ns, then ptrace
     178                 :            :  * access is allowed.
     179                 :            :  * Else denied.
     180                 :            :  *
     181                 :            :  * Determine whether the nominated task is permitted to trace the current
     182                 :            :  * process, returning 0 if permission is granted, -ve if denied.
     183                 :            :  */
     184                 :          0 : int cap_ptrace_traceme(struct task_struct *parent)
     185                 :            : {
     186                 :            :         int ret = 0;
     187                 :            :         const struct cred *cred, *child_cred;
     188                 :            : 
     189                 :            :         rcu_read_lock();
     190                 :        102 :         cred = __task_cred(parent);
     191                 :        102 :         child_cred = current_cred();
     192 [ +  - ][ -  + ]:        204 :         if (cred->user_ns == child_cred->user_ns &&
     193                 :            :             cap_issubset(child_cred->cap_permitted, cred->cap_permitted))
     194                 :            :                 goto out;
     195         [ #  # ]:          0 :         if (has_ns_capability(parent, child_cred->user_ns, CAP_SYS_PTRACE))
     196                 :            :                 goto out;
     197                 :            :         ret = -EPERM;
     198                 :            : out:
     199                 :            :         rcu_read_unlock();
     200                 :        102 :         return ret;
     201                 :            : }
     202                 :            : 
     203                 :            : /**
     204                 :            :  * cap_capget - Retrieve a task's capability sets
     205                 :            :  * @target: The task from which to retrieve the capability sets
     206                 :            :  * @effective: The place to record the effective set
     207                 :            :  * @inheritable: The place to record the inheritable set
     208                 :            :  * @permitted: The place to record the permitted set
     209                 :            :  *
     210                 :            :  * This function retrieves the capabilities of the nominated task and returns
     211                 :            :  * them to the caller.
     212                 :            :  */
     213                 :          0 : int cap_capget(struct task_struct *target, kernel_cap_t *effective,
     214                 :            :                kernel_cap_t *inheritable, kernel_cap_t *permitted)
     215                 :            : {
     216                 :            :         const struct cred *cred;
     217                 :            : 
     218                 :            :         /* Derived from kernel/capability.c:sys_capget. */
     219                 :            :         rcu_read_lock();
     220                 :          0 :         cred = __task_cred(target);
     221                 :          0 :         *effective   = cred->cap_effective;
     222                 :          0 :         *inheritable = cred->cap_inheritable;
     223                 :          0 :         *permitted   = cred->cap_permitted;
     224                 :            :         rcu_read_unlock();
     225                 :          0 :         return 0;
     226                 :            : }
     227                 :            : 
     228                 :            : /*
     229                 :            :  * Determine whether the inheritable capabilities are limited to the old
     230                 :            :  * permitted set.  Returns 1 if they are limited, 0 if they are not.
     231                 :            :  */
     232                 :            : static inline int cap_inh_is_capped(void)
     233                 :            : {
     234                 :            : 
     235                 :            :         /* they are so limited unless the current task has the CAP_SETPCAP
     236                 :            :          * capability
     237                 :            :          */
     238         [ -  + ]:          1 :         if (cap_capable(current_cred(), current_cred()->user_ns,
     239                 :            :                         CAP_SETPCAP, SECURITY_CAP_AUDIT) == 0)
     240                 :            :                 return 0;
     241                 :            :         return 1;
     242                 :            : }
     243                 :            : 
     244                 :            : /**
     245                 :            :  * cap_capset - Validate and apply proposed changes to current's capabilities
     246                 :            :  * @new: The proposed new credentials; alterations should be made here
     247                 :            :  * @old: The current task's current credentials
     248                 :            :  * @effective: A pointer to the proposed new effective capabilities set
     249                 :            :  * @inheritable: A pointer to the proposed new inheritable capabilities set
     250                 :            :  * @permitted: A pointer to the proposed new permitted capabilities set
     251                 :            :  *
     252                 :            :  * This function validates and applies a proposed mass change to the current
     253                 :            :  * process's capability sets.  The changes are made to the proposed new
     254                 :            :  * credentials, and assuming no error, will be committed by the caller of LSM.
     255                 :            :  */
     256                 :          0 : int cap_capset(struct cred *new,
     257                 :            :                const struct cred *old,
     258                 :            :                const kernel_cap_t *effective,
     259                 :            :                const kernel_cap_t *inheritable,
     260                 :            :                const kernel_cap_t *permitted)
     261                 :            : {
     262 [ -  + ][ #  # ]:          1 :         if (cap_inh_is_capped() &&
     263                 :            :             !cap_issubset(*inheritable,
     264                 :            :                           cap_combine(old->cap_inheritable,
     265                 :            :                                       old->cap_permitted)))
     266                 :            :                 /* incapable of using this inheritable set */
     267                 :            :                 return -EPERM;
     268                 :            : 
     269         [ +  - ]:          1 :         if (!cap_issubset(*inheritable,
     270                 :            :                           cap_combine(old->cap_inheritable,
     271                 :            :                                       old->cap_bset)))
     272                 :            :                 /* no new pI capabilities outside bounding set */
     273                 :            :                 return -EPERM;
     274                 :            : 
     275                 :            :         /* verify restrictions on target's new Permitted set */
     276         [ +  - ]:          1 :         if (!cap_issubset(*permitted, old->cap_permitted))
     277                 :            :                 return -EPERM;
     278                 :            : 
     279                 :            :         /* verify the _new_Effective_ is a subset of the _new_Permitted_ */
     280         [ +  - ]:          1 :         if (!cap_issubset(*effective, *permitted))
     281                 :            :                 return -EPERM;
     282                 :            : 
     283                 :          1 :         new->cap_effective   = *effective;
     284                 :          1 :         new->cap_inheritable = *inheritable;
     285                 :          1 :         new->cap_permitted   = *permitted;
     286                 :          1 :         return 0;
     287                 :            : }
     288                 :            : 
     289                 :            : /*
     290                 :            :  * Clear proposed capability sets for execve().
     291                 :            :  */
     292                 :            : static inline void bprm_clear_caps(struct linux_binprm *bprm)
     293                 :            : {
     294                 :      60168 :         cap_clear(bprm->cred->cap_permitted);
     295                 :          0 :         bprm->cap_effective = false;
     296                 :            : }
     297                 :            : 
     298                 :            : /**
     299                 :            :  * cap_inode_need_killpriv - Determine if inode change affects privileges
     300                 :            :  * @dentry: The inode/dentry in being changed with change marked ATTR_KILL_PRIV
     301                 :            :  *
     302                 :            :  * Determine if an inode having a change applied that's marked ATTR_KILL_PRIV
     303                 :            :  * affects the security markings on that inode, and if it is, should
     304                 :            :  * inode_killpriv() be invoked or the change rejected?
     305                 :            :  *
     306                 :            :  * Returns 0 if granted; +ve if granted, but inode_killpriv() is required; and
     307                 :            :  * -ve to deny the change.
     308                 :            :  */
     309                 :          0 : int cap_inode_need_killpriv(struct dentry *dentry)
     310                 :            : {
     311                 :      47335 :         struct inode *inode = dentry->d_inode;
     312                 :            :         int error;
     313                 :            : 
     314         [ +  + ]:      47335 :         if (!inode->i_op->getxattr)
     315                 :            :                return 0;
     316                 :            : 
     317                 :      47240 :         error = inode->i_op->getxattr(dentry, XATTR_NAME_CAPS, NULL, 0);
     318         [ -  + ]:      47240 :         if (error <= 0)
     319                 :            :                 return 0;
     320                 :          0 :         return 1;
     321                 :            : }
     322                 :            : 
     323                 :            : /**
     324                 :            :  * cap_inode_killpriv - Erase the security markings on an inode
     325                 :            :  * @dentry: The inode/dentry to alter
     326                 :            :  *
     327                 :            :  * Erase the privilege-enhancing security markings on an inode.
     328                 :            :  *
     329                 :            :  * Returns 0 if successful, -ve on error.
     330                 :            :  */
     331                 :          0 : int cap_inode_killpriv(struct dentry *dentry)
     332                 :            : {
     333                 :          0 :         struct inode *inode = dentry->d_inode;
     334                 :            : 
     335         [ #  # ]:          0 :         if (!inode->i_op->removexattr)
     336                 :            :                return 0;
     337                 :            : 
     338                 :          0 :         return inode->i_op->removexattr(dentry, XATTR_NAME_CAPS);
     339                 :            : }
     340                 :            : 
     341                 :            : /*
     342                 :            :  * Calculate the new process capability sets from the capability sets attached
     343                 :            :  * to a file.
     344                 :            :  */
     345                 :            : static inline int bprm_caps_from_vfs_caps(struct cpu_vfs_cap_data *caps,
     346                 :            :                                           struct linux_binprm *bprm,
     347                 :            :                                           bool *effective,
     348                 :            :                                           bool *has_cap)
     349                 :            : {
     350                 :            :         struct cred *new = bprm->cred;
     351                 :            :         unsigned i;
     352                 :            :         int ret = 0;
     353                 :            : 
     354         [ #  # ]:      60168 :         if (caps->magic_etc & VFS_CAP_FLAGS_EFFECTIVE)
     355                 :          0 :                 *effective = true;
     356                 :            : 
     357         [ #  # ]:          0 :         if (caps->magic_etc & VFS_CAP_REVISION_MASK)
     358                 :          0 :                 *has_cap = true;
     359                 :            : 
     360         [ #  # ]:          0 :         CAP_FOR_EACH_U32(i) {
     361                 :          0 :                 __u32 permitted = caps->permitted.cap[i];
     362                 :          0 :                 __u32 inheritable = caps->inheritable.cap[i];
     363                 :            : 
     364                 :            :                 /*
     365                 :            :                  * pP' = (X & fP) | (pI & fI)
     366                 :            :                  */
     367                 :          0 :                 new->cap_permitted.cap[i] =
     368                 :          0 :                         (new->cap_bset.cap[i] & permitted) |
     369                 :          0 :                         (new->cap_inheritable.cap[i] & inheritable);
     370                 :            : 
     371         [ #  # ]:          0 :                 if (permitted & ~new->cap_permitted.cap[i])
     372                 :            :                         /* insufficient to execute correctly */
     373                 :            :                         ret = -EPERM;
     374                 :            :         }
     375                 :            : 
     376                 :            :         /*
     377                 :            :          * For legacy apps, with no internal support for recognizing they
     378                 :            :          * do not have enough capabilities, we return an error if they are
     379                 :            :          * missing some "forced" (aka file-permitted) capabilities.
     380                 :            :          */
     381         [ #  # ]:          0 :         return *effective ? ret : 0;
     382                 :            : }
     383                 :            : 
     384                 :            : /*
     385                 :            :  * Extract the on-exec-apply capability sets for an executable file.
     386                 :            :  */
     387                 :          0 : int get_vfs_caps_from_disk(const struct dentry *dentry, struct cpu_vfs_cap_data *cpu_caps)
     388                 :            : {
     389                 :      60391 :         struct inode *inode = dentry->d_inode;
     390                 :            :         __u32 magic_etc;
     391                 :            :         unsigned tocopy, i;
     392                 :            :         int size;
     393                 :            :         struct vfs_cap_data caps;
     394                 :            : 
     395                 :      60391 :         memset(cpu_caps, 0, sizeof(struct cpu_vfs_cap_data));
     396                 :            : 
     397 [ +  + ][ +  + ]:      60362 :         if (!inode || !inode->i_op->getxattr)
     398                 :            :                 return -ENODATA;
     399                 :            : 
     400                 :      60291 :         size = inode->i_op->getxattr((struct dentry *)dentry, XATTR_NAME_CAPS, &caps,
     401                 :            :                                    XATTR_CAPS_SZ);
     402         [ -  + ]:      60308 :         if (size == -ENODATA || size == -EOPNOTSUPP)
     403                 :            :                 /* no data, that's ok */
     404                 :            :                 return -ENODATA;
     405         [ #  # ]:          0 :         if (size < 0)
     406                 :            :                 return size;
     407                 :            : 
     408         [ #  # ]:          0 :         if (size < sizeof(magic_etc))
     409                 :            :                 return -EINVAL;
     410                 :            : 
     411                 :          0 :         cpu_caps->magic_etc = magic_etc = le32_to_cpu(caps.magic_etc);
     412                 :            : 
     413      [ #  #  # ]:          0 :         switch (magic_etc & VFS_CAP_REVISION_MASK) {
     414                 :            :         case VFS_CAP_REVISION_1:
     415         [ #  # ]:          0 :                 if (size != XATTR_CAPS_SZ_1)
     416                 :            :                         return -EINVAL;
     417                 :            :                 tocopy = VFS_CAP_U32_1;
     418                 :            :                 break;
     419                 :            :         case VFS_CAP_REVISION_2:
     420         [ #  # ]:          0 :                 if (size != XATTR_CAPS_SZ_2)
     421                 :            :                         return -EINVAL;
     422                 :            :                 tocopy = VFS_CAP_U32_2;
     423                 :            :                 break;
     424                 :            :         default:
     425                 :            :                 return -EINVAL;
     426                 :            :         }
     427                 :            : 
     428         [ #  # ]:          0 :         CAP_FOR_EACH_U32(i) {
     429         [ #  # ]:          0 :                 if (i >= tocopy)
     430                 :            :                         break;
     431                 :          0 :                 cpu_caps->permitted.cap[i] = le32_to_cpu(caps.data[i].permitted);
     432                 :          0 :                 cpu_caps->inheritable.cap[i] = le32_to_cpu(caps.data[i].inheritable);
     433                 :            :         }
     434                 :            : 
     435                 :            :         return 0;
     436                 :            : }
     437                 :            : 
     438                 :            : /*
     439                 :            :  * Attempt to get the on-exec apply capability sets for an executable file from
     440                 :            :  * its xattrs and, if present, apply them to the proposed credentials being
     441                 :            :  * constructed by execve().
     442                 :            :  */
     443                 :          0 : static int get_file_caps(struct linux_binprm *bprm, bool *effective, bool *has_cap)
     444                 :            : {
     445                 :            :         struct dentry *dentry;
     446                 :            :         int rc = 0;
     447                 :            :         struct cpu_vfs_cap_data vcaps;
     448                 :            : 
     449                 :            :         bprm_clear_caps(bprm);
     450                 :            : 
     451         [ +  + ]:      60168 :         if (!file_caps_enabled)
     452                 :            :                 return 0;
     453                 :            : 
     454         [ +  + ]:      60096 :         if (bprm->file->f_path.mnt->mnt_flags & MNT_NOSUID)
     455                 :            :                 return 0;
     456                 :            : 
     457                 :      60094 :         dentry = dget(bprm->file->f_dentry);
     458                 :            : 
     459                 :      60094 :         rc = get_vfs_caps_from_disk(dentry, &vcaps);
     460         [ +  + ]:     120267 :         if (rc < 0) {
     461         [ -  + ]:      60099 :                 if (rc == -EINVAL)
     462                 :          0 :                         printk(KERN_NOTICE "%s: get_vfs_caps_from_disk returned %d for %s\n",
     463                 :            :                                 __func__, rc, bprm->filename);
     464         [ +  + ]:      60099 :                 else if (rc == -ENODATA)
     465                 :            :                         rc = 0;
     466                 :            :                 goto out;
     467                 :            :         }
     468                 :            : 
     469                 :            :         rc = bprm_caps_from_vfs_caps(&vcaps, bprm, effective, has_cap);
     470         [ #  # ]:          0 :         if (rc == -EINVAL)
     471                 :          0 :                 printk(KERN_NOTICE "%s: cap_from_disk returned %d for %s\n",
     472                 :            :                        __func__, rc, bprm->filename);
     473                 :            : 
     474                 :            : out:
     475                 :      60099 :         dput(dentry);
     476         [ -  + ]:      60165 :         if (rc)
     477                 :            :                 bprm_clear_caps(bprm);
     478                 :            : 
     479                 :      60165 :         return rc;
     480                 :            : }
     481                 :            : 
     482                 :            : /**
     483                 :            :  * cap_bprm_set_creds - Set up the proposed credentials for execve().
     484                 :            :  * @bprm: The execution parameters, including the proposed creds
     485                 :            :  *
     486                 :            :  * Set up the proposed credentials for a new execution context being
     487                 :            :  * constructed by execve().  The proposed creds in @bprm->cred is altered,
     488                 :            :  * which won't take effect immediately.  Returns 0 if successful, -ve on error.
     489                 :            :  */
     490                 :          0 : int cap_bprm_set_creds(struct linux_binprm *bprm)
     491                 :            : {
     492                 :      60118 :         const struct cred *old = current_cred();
     493                 :      60118 :         struct cred *new = bprm->cred;
     494                 :      60118 :         bool effective, has_cap = false;
     495                 :            :         int ret;
     496                 :            :         kuid_t root_uid;
     497                 :            : 
     498                 :      60118 :         effective = false;
     499                 :      60118 :         ret = get_file_caps(bprm, &effective, &has_cap);
     500            [ + ]:      60086 :         if (ret < 0)
     501                 :            :                 return ret;
     502                 :            : 
     503                 :            :         root_uid = make_kuid(new->user_ns, 0);
     504                 :            : 
     505         [ +  + ]:     120288 :         if (!issecure(SECURE_NOROOT)) {
     506                 :            :                 /*
     507                 :            :                  * If the legacy file capability is set, then don't set privs
     508                 :            :                  * for a setuid root binary run by a non-root user.  Do set it
     509                 :            :                  * for a root user just to cause least surprise to an admin.
     510                 :            :                  */
     511 [ -  + ][ #  # ]:      60093 :                 if (has_cap && !uid_eq(new->uid, root_uid) && uid_eq(new->euid, root_uid)) {
                 [ #  # ]
     512                 :          0 :                         warn_setuid_and_fcaps_mixed(bprm->filename);
     513                 :            :                         goto skip;
     514                 :            :                 }
     515                 :            :                 /*
     516                 :            :                  * To support inheritance of root-permissions and suid-root
     517                 :            :                  * executables under compatibility mode, we override the
     518                 :            :                  * capability sets for the file.
     519                 :            :                  *
     520                 :            :                  * If only the real uid is 0, we do not set the effective bit.
     521                 :            :                  */
     522    [ +  + ][ + ]:      60093 :                 if (uid_eq(new->euid, root_uid) || uid_eq(new->uid, root_uid)) {
     523                 :            :                         /* pP' = (cap_bset & ~0) | (pI & ~0) */
     524                 :      59798 :                         new->cap_permitted = cap_combine(old->cap_bset,
     525                 :            :                                                          old->cap_inheritable);
     526                 :            :                 }
     527         [ +  + ]:      60093 :                 if (uid_eq(new->euid, root_uid))
     528                 :     120288 :                         effective = true;
     529                 :            :         }
     530                 :            : skip:
     531                 :            : 
     532                 :            :         /* if we have fs caps, clear dangerous personality flags */
     533         [ -  + ]:      60170 :         if (!cap_issubset(new->cap_permitted, old->cap_permitted))
     534                 :          0 :                 bprm->per_clear |= PER_CLEAR_ON_SETID;
     535                 :            : 
     536                 :            : 
     537                 :            :         /* Don't let someone trace a set[ug]id/setpcap binary with the revised
     538                 :            :          * credentials unless they have the appropriate permit.
     539                 :            :          *
     540                 :            :          * In addition, if NO_NEW_PRIVS, then ensure we get no new privs.
     541                 :            :          */
     542 [ +  + ][ +  + ]:      60170 :         if ((!uid_eq(new->euid, old->uid) ||
     543            [ + ]:      60079 :              !gid_eq(new->egid, old->gid) ||
     544         [ -  + ]:         24 :              !cap_issubset(new->cap_permitted, old->cap_permitted)) &&
     545                 :         24 :             bprm->unsafe & ~LSM_UNSAFE_PTRACE_CAP) {
     546                 :            :                 /* downgrade; they get no more than they had, and maybe less */
     547 [ #  # ][ #  # ]:          0 :                 if (!capable(CAP_SETUID) ||
     548                 :          0 :                     (bprm->unsafe & LSM_UNSAFE_NO_NEW_PRIVS)) {
     549                 :          0 :                         new->euid = new->uid;
     550                 :          0 :                         new->egid = new->gid;
     551                 :            :                 }
     552                 :          0 :                 new->cap_permitted = cap_intersect(new->cap_permitted,
     553                 :            :                                                    old->cap_permitted);
     554                 :            :         }
     555                 :            : 
     556                 :      60170 :         new->suid = new->fsuid = new->euid;
     557                 :      60170 :         new->sgid = new->fsgid = new->egid;
     558                 :            : 
     559         [ +  + ]:      60170 :         if (effective)
     560                 :      59910 :                 new->cap_effective = new->cap_permitted;
     561                 :            :         else
     562                 :        260 :                 cap_clear(new->cap_effective);
     563                 :      60170 :         bprm->cap_effective = effective;
     564                 :            : 
     565                 :            :         /*
     566                 :            :          * Audit candidate if current->cap_effective is set
     567                 :            :          *
     568                 :            :          * We do not bother to audit if 3 things are true:
     569                 :            :          *   1) cap_effective has all caps
     570                 :            :          *   2) we are root
     571                 :            :          *   3) root is supposed to have all caps (SECURE_NOROOT)
     572                 :            :          * Since this is just a normal root execing a process.
     573                 :            :          *
     574                 :            :          * Number 1 above might fail if you don't have a full bset, but I think
     575                 :            :          * that is interesting information to audit.
     576                 :            :          */
     577         [ +  + ]:      60170 :         if (!cap_isclear(new->cap_effective)) {
     578 [ +  + ][ +  + ]:     119790 :                 if (!cap_issubset(CAP_FULL_SET, new->cap_effective) ||
     579 [ +  + ][ +  + ]:      59881 :                     !uid_eq(new->euid, root_uid) || !uid_eq(new->uid, root_uid) ||
     580                 :      59812 :                     issecure(SECURE_NOROOT)) {
     581                 :            :                         ret = audit_log_bprm_fcaps(bprm, new, old);
     582         [ #  # ]:          0 :                         if (ret < 0)
     583                 :            :                                 return ret;
     584                 :            :                 }
     585                 :            :         }
     586                 :            : 
     587                 :      60078 :         new->securebits &= ~issecure_mask(SECURE_KEEP_CAPS);
     588                 :      60078 :         return 0;
     589                 :            : }
     590                 :            : 
     591                 :            : /**
     592                 :            :  * cap_bprm_secureexec - Determine whether a secure execution is required
     593                 :            :  * @bprm: The execution parameters
     594                 :            :  *
     595                 :            :  * Determine whether a secure execution is required, return 1 if it is, and 0
     596                 :            :  * if it is not.
     597                 :            :  *
     598                 :            :  * The credentials have been committed by this point, and so are no longer
     599                 :            :  * available through @bprm->cred.
     600                 :            :  */
     601                 :          0 : int cap_bprm_secureexec(struct linux_binprm *bprm)
     602                 :            : {
     603                 :      58976 :         const struct cred *cred = current_cred();
     604                 :            :         kuid_t root_uid = make_kuid(cred->user_ns, 0);
     605                 :            : 
     606         [ +  + ]:      58976 :         if (!uid_eq(cred->uid, root_uid)) {
     607         [ +  - ]:        246 :                 if (bprm->cap_effective)
     608                 :            :                         return 1;
     609            [ + ]:        246 :                 if (!cap_isclear(cred->cap_permitted))
     610                 :            :                         return 1;
     611                 :            :         }
     612                 :            : 
     613    [ + ][ +  + ]:     117951 :         return (!uid_eq(cred->euid, cred->uid) ||
     614                 :      58976 :                 !gid_eq(cred->egid, cred->gid));
     615                 :            : }
     616                 :            : 
     617                 :            : /**
     618                 :            :  * cap_inode_setxattr - Determine whether an xattr may be altered
     619                 :            :  * @dentry: The inode/dentry being altered
     620                 :            :  * @name: The name of the xattr to be changed
     621                 :            :  * @value: The value that the xattr will be changed to
     622                 :            :  * @size: The size of value
     623                 :            :  * @flags: The replacement flag
     624                 :            :  *
     625                 :            :  * Determine whether an xattr may be altered or set on an inode, returning 0 if
     626                 :            :  * permission is granted, -ve if denied.
     627                 :            :  *
     628                 :            :  * This is used to make sure security xattrs don't get updated or set by those
     629                 :            :  * who aren't privileged to do so.
     630                 :            :  */
     631                 :          0 : int cap_inode_setxattr(struct dentry *dentry, const char *name,
     632                 :            :                        const void *value, size_t size, int flags)
     633                 :            : {
     634         [ -  + ]:       2636 :         if (!strcmp(name, XATTR_NAME_CAPS)) {
     635         [ #  # ]:          0 :                 if (!capable(CAP_SETFCAP))
     636                 :            :                         return -EPERM;
     637                 :          0 :                 return 0;
     638                 :            :         }
     639                 :            : 
     640         [ -  + ]:       2636 :         if (!strncmp(name, XATTR_SECURITY_PREFIX,
     641         [ #  # ]:          0 :                      sizeof(XATTR_SECURITY_PREFIX) - 1) &&
     642                 :          0 :             !capable(CAP_SYS_ADMIN))
     643                 :            :                 return -EPERM;
     644                 :            :         return 0;
     645                 :            : }
     646                 :            : 
     647                 :            : /**
     648                 :            :  * cap_inode_removexattr - Determine whether an xattr may be removed
     649                 :            :  * @dentry: The inode/dentry being altered
     650                 :            :  * @name: The name of the xattr to be changed
     651                 :            :  *
     652                 :            :  * Determine whether an xattr may be removed from an inode, returning 0 if
     653                 :            :  * permission is granted, -ve if denied.
     654                 :            :  *
     655                 :            :  * This is used to make sure security xattrs don't get removed by those who
     656                 :            :  * aren't privileged to remove them.
     657                 :            :  */
     658                 :          0 : int cap_inode_removexattr(struct dentry *dentry, const char *name)
     659                 :            : {
     660         [ #  # ]:          0 :         if (!strcmp(name, XATTR_NAME_CAPS)) {
     661         [ #  # ]:          0 :                 if (!capable(CAP_SETFCAP))
     662                 :            :                         return -EPERM;
     663                 :          0 :                 return 0;
     664                 :            :         }
     665                 :            : 
     666         [ #  # ]:          0 :         if (!strncmp(name, XATTR_SECURITY_PREFIX,
     667         [ #  # ]:          0 :                      sizeof(XATTR_SECURITY_PREFIX) - 1) &&
     668                 :          0 :             !capable(CAP_SYS_ADMIN))
     669                 :            :                 return -EPERM;
     670                 :            :         return 0;
     671                 :            : }
     672                 :            : 
     673                 :            : /*
     674                 :            :  * cap_emulate_setxuid() fixes the effective / permitted capabilities of
     675                 :            :  * a process after a call to setuid, setreuid, or setresuid.
     676                 :            :  *
     677                 :            :  *  1) When set*uiding _from_ one of {r,e,s}uid == 0 _to_ all of
     678                 :            :  *  {r,e,s}uid != 0, the permitted and effective capabilities are
     679                 :            :  *  cleared.
     680                 :            :  *
     681                 :            :  *  2) When set*uiding _from_ euid == 0 _to_ euid != 0, the effective
     682                 :            :  *  capabilities of the process are cleared.
     683                 :            :  *
     684                 :            :  *  3) When set*uiding _from_ euid != 0 _to_ euid == 0, the effective
     685                 :            :  *  capabilities are set to the permitted capabilities.
     686                 :            :  *
     687                 :            :  *  fsuid is handled elsewhere. fsuid == 0 and {r,e,s}uid!= 0 should
     688                 :            :  *  never happen.
     689                 :            :  *
     690                 :            :  *  -astor
     691                 :            :  *
     692                 :            :  * cevans - New behaviour, Oct '99
     693                 :            :  * A process may, via prctl(), elect to keep its capabilities when it
     694                 :            :  * calls setuid() and switches away from uid==0. Both permitted and
     695                 :            :  * effective sets will be retained.
     696                 :            :  * Without this change, it was impossible for a daemon to drop only some
     697                 :            :  * of its privilege. The call to setuid(!=0) would drop all privileges!
     698                 :            :  * Keeping uid 0 is not an option because uid 0 owns too many vital
     699                 :            :  * files..
     700                 :            :  * Thanks to Olaf Kirch and Peter Benie for spotting this.
     701                 :            :  */
     702                 :            : static inline void cap_emulate_setxuid(struct cred *new, const struct cred *old)
     703                 :            : {
     704                 :            :         kuid_t root_uid = make_kuid(old->user_ns, 0);
     705                 :            : 
     706 [ +  + ][ +  + ]:       8341 :         if ((uid_eq(old->uid, root_uid) ||
     707         [ +  + ]:         32 :              uid_eq(old->euid, root_uid) ||
     708         [ +  + ]:       8311 :              uid_eq(old->suid, root_uid)) &&
     709         [ +  + ]:        327 :             (!uid_eq(new->uid, root_uid) &&
     710         [ +  + ]:        313 :              !uid_eq(new->euid, root_uid) &&
     711         [ +  - ]:        311 :              !uid_eq(new->suid, root_uid)) &&
     712                 :        311 :             !issecure(SECURE_KEEP_CAPS)) {
     713                 :        311 :                 cap_clear(new->cap_permitted);
     714                 :        311 :                 cap_clear(new->cap_effective);
     715                 :            :         }
     716 [ +  + ][ +  + ]:       8341 :         if (uid_eq(old->euid, root_uid) && !uid_eq(new->euid, root_uid))
     717                 :       2030 :                 cap_clear(new->cap_effective);
     718 [ +  + ][ +  + ]:       8341 :         if (!uid_eq(old->euid, root_uid) && uid_eq(new->euid, root_uid))
     719                 :       1700 :                 new->cap_effective = new->cap_permitted;
     720                 :            : }
     721                 :            : 
     722                 :            : /**
     723                 :            :  * cap_task_fix_setuid - Fix up the results of setuid() call
     724                 :            :  * @new: The proposed credentials
     725                 :            :  * @old: The current task's current credentials
     726                 :            :  * @flags: Indications of what has changed
     727                 :            :  *
     728                 :            :  * Fix up the results of setuid() call before the credential changes are
     729                 :            :  * actually applied, returning 0 to grant the changes, -ve to deny them.
     730                 :            :  */
     731                 :          0 : int cap_task_fix_setuid(struct cred *new, const struct cred *old, int flags)
     732                 :            : {
     733      [ +  +  - ]:       8349 :         switch (flags) {
     734                 :            :         case LSM_SETID_RE:
     735                 :            :         case LSM_SETID_ID:
     736                 :            :         case LSM_SETID_RES:
     737                 :            :                 /* juggle the capabilities to follow [RES]UID changes unless
     738                 :            :                  * otherwise suppressed */
     739         [ +  - ]:       8341 :                 if (!issecure(SECURE_NO_SETUID_FIXUP))
     740                 :            :                         cap_emulate_setxuid(new, old);
     741                 :            :                 break;
     742                 :            : 
     743                 :            :         case LSM_SETID_FS:
     744                 :            :                 /* juggle the capabilties to follow FSUID changes, unless
     745                 :            :                  * otherwise suppressed
     746                 :            :                  *
     747                 :            :                  * FIXME - is fsuser used for all CAP_FS_MASK capabilities?
     748                 :            :                  *          if not, we might be a bit too harsh here.
     749                 :            :                  */
     750         [ +  - ]:          8 :                 if (!issecure(SECURE_NO_SETUID_FIXUP)) {
     751                 :            :                         kuid_t root_uid = make_kuid(old->user_ns, 0);
     752 [ +  + ][ +  - ]:          8 :                         if (uid_eq(old->fsuid, root_uid) && !uid_eq(new->fsuid, root_uid))
     753                 :          4 :                                 new->cap_effective =
     754                 :            :                                         cap_drop_fs_set(new->cap_effective);
     755                 :            : 
     756    [ +  + ][ + ]:          8 :                         if (!uid_eq(old->fsuid, root_uid) && uid_eq(new->fsuid, root_uid))
     757                 :          4 :                                 new->cap_effective =
     758                 :            :                                         cap_raise_fs_set(new->cap_effective,
     759                 :            :                                                          new->cap_permitted);
     760                 :            :                 }
     761                 :            :                 break;
     762                 :            : 
     763                 :            :         default:
     764                 :            :                 return -EINVAL;
     765                 :            :         }
     766                 :            : 
     767                 :            :         return 0;
     768                 :            : }
     769                 :            : 
     770                 :            : /*
     771                 :            :  * Rationale: code calling task_setscheduler, task_setioprio, and
     772                 :            :  * task_setnice, assumes that
     773                 :            :  *   . if capable(cap_sys_nice), then those actions should be allowed
     774                 :            :  *   . if not capable(cap_sys_nice), but acting on your own processes,
     775                 :            :  *      then those actions should be allowed
     776                 :            :  * This is insufficient now since you can call code without suid, but
     777                 :            :  * yet with increased caps.
     778                 :            :  * So we check for increased caps on the target process.
     779                 :            :  */
     780                 :          0 : static int cap_safe_nice(struct task_struct *p)
     781                 :            : {
     782                 :            :         int is_subset, ret = 0;
     783                 :            : 
     784                 :            :         rcu_read_lock();
     785                 :       1734 :         is_subset = cap_issubset(__task_cred(p)->cap_permitted,
     786                 :       1734 :                                  current_cred()->cap_permitted);
     787 [ -  + ][ #  # ]:       1734 :         if (!is_subset && !ns_capable(__task_cred(p)->user_ns, CAP_SYS_NICE))
     788                 :            :                 ret = -EPERM;
     789                 :            :         rcu_read_unlock();
     790                 :            : 
     791                 :       1734 :         return ret;
     792                 :            : }
     793                 :            : 
     794                 :            : /**
     795                 :            :  * cap_task_setscheduler - Detemine if scheduler policy change is permitted
     796                 :            :  * @p: The task to affect
     797                 :            :  *
     798                 :            :  * Detemine if the requested scheduler policy change is permitted for the
     799                 :            :  * specified task, returning 0 if permission is granted, -ve if denied.
     800                 :            :  */
     801                 :          0 : int cap_task_setscheduler(struct task_struct *p)
     802                 :            : {
     803                 :        190 :         return cap_safe_nice(p);
     804                 :            : }
     805                 :            : 
     806                 :            : /**
     807                 :            :  * cap_task_ioprio - Detemine if I/O priority change is permitted
     808                 :            :  * @p: The task to affect
     809                 :            :  * @ioprio: The I/O priority to set
     810                 :            :  *
     811                 :            :  * Detemine if the requested I/O priority change is permitted for the specified
     812                 :            :  * task, returning 0 if permission is granted, -ve if denied.
     813                 :            :  */
     814                 :          0 : int cap_task_setioprio(struct task_struct *p, int ioprio)
     815                 :            : {
     816                 :          4 :         return cap_safe_nice(p);
     817                 :            : }
     818                 :            : 
     819                 :            : /**
     820                 :            :  * cap_task_ioprio - Detemine if task priority change is permitted
     821                 :            :  * @p: The task to affect
     822                 :            :  * @nice: The nice value to set
     823                 :            :  *
     824                 :            :  * Detemine if the requested task priority change is permitted for the
     825                 :            :  * specified task, returning 0 if permission is granted, -ve if denied.
     826                 :            :  */
     827                 :          0 : int cap_task_setnice(struct task_struct *p, int nice)
     828                 :            : {
     829                 :       1540 :         return cap_safe_nice(p);
     830                 :            : }
     831                 :            : 
     832                 :            : /*
     833                 :            :  * Implement PR_CAPBSET_DROP.  Attempt to remove the specified capability from
     834                 :            :  * the current task's bounding set.  Returns 0 on success, -ve on error.
     835                 :            :  */
     836                 :          0 : static long cap_prctl_drop(struct cred *new, unsigned long cap)
     837                 :            : {
     838         [ #  # ]:          0 :         if (!ns_capable(current_user_ns(), CAP_SETPCAP))
     839                 :            :                 return -EPERM;
     840         [ #  # ]:          0 :         if (!cap_valid(cap))
     841                 :            :                 return -EINVAL;
     842                 :            : 
     843                 :          0 :         cap_lower(new->cap_bset, cap);
     844                 :          0 :         return 0;
     845                 :            : }
     846                 :            : 
     847                 :            : /**
     848                 :            :  * cap_task_prctl - Implement process control functions for this security module
     849                 :            :  * @option: The process control function requested
     850                 :            :  * @arg2, @arg3, @arg4, @arg5: The argument data for this function
     851                 :            :  *
     852                 :            :  * Allow process control functions (sys_prctl()) to alter capabilities; may
     853                 :            :  * also deny access to other functions not otherwise implemented here.
     854                 :            :  *
     855                 :            :  * Returns 0 or +ve on success, -ENOSYS if this function is not implemented
     856                 :            :  * here, other -ve on error.  If -ENOSYS is returned, sys_prctl() and other LSM
     857                 :            :  * modules will consider performing the function.
     858                 :            :  */
     859                 :          0 : int cap_task_prctl(int option, unsigned long arg2, unsigned long arg3,
     860                 :            :                    unsigned long arg4, unsigned long arg5)
     861                 :            : {
     862                 :            :         struct cred *new;
     863                 :            :         long error = 0;
     864                 :            : 
     865                 :      18514 :         new = prepare_creds();
     866            [ + ]:      18494 :         if (!new)
     867                 :            :                 return -ENOMEM;
     868                 :            : 
     869   [ -  -  -  -  :      18497 :         switch (option) {
                -  -  + ]
     870                 :            :         case PR_CAPBSET_READ:
     871                 :            :                 error = -EINVAL;
     872         [ #  # ]:          0 :                 if (!cap_valid(arg2))
     873                 :            :                         goto error;
     874                 :          0 :                 error = !!cap_raised(new->cap_bset, arg2);
     875                 :          0 :                 goto no_change;
     876                 :            : 
     877                 :            :         case PR_CAPBSET_DROP:
     878                 :          0 :                 error = cap_prctl_drop(new, arg2);
     879         [ #  # ]:          0 :                 if (error < 0)
     880                 :            :                         goto error;
     881                 :            :                 goto changed;
     882                 :            : 
     883                 :            :         /*
     884                 :            :          * The next four prctl's remain to assist with transitioning a
     885                 :            :          * system from legacy UID=0 based privilege (when filesystem
     886                 :            :          * capabilities are not in use) to a system using filesystem
     887                 :            :          * capabilities only - as the POSIX.1e draft intended.
     888                 :            :          *
     889                 :            :          * Note:
     890                 :            :          *
     891                 :            :          *  PR_SET_SECUREBITS =
     892                 :            :          *      issecure_mask(SECURE_KEEP_CAPS_LOCKED)
     893                 :            :          *    | issecure_mask(SECURE_NOROOT)
     894                 :            :          *    | issecure_mask(SECURE_NOROOT_LOCKED)
     895                 :            :          *    | issecure_mask(SECURE_NO_SETUID_FIXUP)
     896                 :            :          *    | issecure_mask(SECURE_NO_SETUID_FIXUP_LOCKED)
     897                 :            :          *
     898                 :            :          * will ensure that the current process and all of its
     899                 :            :          * children will be locked into a pure
     900                 :            :          * capability-based-privilege environment.
     901                 :            :          */
     902                 :            :         case PR_SET_SECUREBITS:
     903                 :            :                 error = -EPERM;
     904         [ #  # ]:          0 :                 if ((((new->securebits & SECURE_ALL_LOCKS) >> 1)
     905                 :          0 :                      & (new->securebits ^ arg2))                 /*[1]*/
     906         [ #  # ]:          0 :                     || ((new->securebits & SECURE_ALL_LOCKS & ~arg2))        /*[2]*/
     907         [ #  # ]:          0 :                     || (arg2 & ~(SECURE_ALL_LOCKS | SECURE_ALL_BITS))       /*[3]*/
     908         [ #  # ]:          0 :                     || (cap_capable(current_cred(),
     909                 :          0 :                                     current_cred()->user_ns, CAP_SETPCAP,
     910                 :            :                                     SECURITY_CAP_AUDIT) != 0)           /*[4]*/
     911                 :            :                         /*
     912                 :            :                          * [1] no changing of bits that are locked
     913                 :            :                          * [2] no unlocking of locks
     914                 :            :                          * [3] no setting of unsupported bits
     915                 :            :                          * [4] doing anything requires privilege (go read about
     916                 :            :                          *     the "sendmail capabilities bug")
     917                 :            :                          */
     918                 :            :                     )
     919                 :            :                         /* cannot change a locked bit */
     920                 :            :                         goto error;
     921                 :          0 :                 new->securebits = arg2;
     922                 :          0 :                 goto changed;
     923                 :            : 
     924                 :            :         case PR_GET_SECUREBITS:
     925                 :          0 :                 error = new->securebits;
     926                 :          0 :                 goto no_change;
     927                 :            : 
     928                 :            :         case PR_GET_KEEPCAPS:
     929         [ #  # ]:          0 :                 if (issecure(SECURE_KEEP_CAPS))
     930                 :            :                         error = 1;
     931                 :            :                 goto no_change;
     932                 :            : 
     933                 :            :         case PR_SET_KEEPCAPS:
     934                 :            :                 error = -EINVAL;
     935         [ #  # ]:          0 :                 if (arg2 > 1) /* Note, we rely on arg2 being unsigned here */
     936                 :            :                         goto error;
     937                 :            :                 error = -EPERM;
     938         [ #  # ]:          0 :                 if (issecure(SECURE_KEEP_CAPS_LOCKED))
     939                 :            :                         goto error;
     940         [ #  # ]:          0 :                 if (arg2)
     941                 :          0 :                         new->securebits |= issecure_mask(SECURE_KEEP_CAPS);
     942                 :            :                 else
     943                 :          0 :                         new->securebits &= ~issecure_mask(SECURE_KEEP_CAPS);
     944                 :            :                 goto changed;
     945                 :            : 
     946                 :            :         default:
     947                 :            :                 /* No functionality available - continue with default */
     948                 :            :                 error = -ENOSYS;
     949                 :            :                 goto error;
     950                 :            :         }
     951                 :            : 
     952                 :            :         /* Functionality provided */
     953                 :            : changed:
     954                 :          0 :         return commit_creds(new);
     955                 :            : 
     956                 :            : no_change:
     957                 :            : error:
     958                 :      18497 :         abort_creds(new);
     959                 :      18511 :         return error;
     960                 :            : }
     961                 :            : 
     962                 :            : /**
     963                 :            :  * cap_vm_enough_memory - Determine whether a new virtual mapping is permitted
     964                 :            :  * @mm: The VM space in which the new mapping is to be made
     965                 :            :  * @pages: The size of the mapping
     966                 :            :  *
     967                 :            :  * Determine whether the allocation of a new virtual mapping by the current
     968                 :            :  * task is permitted, returning 0 if permission is granted, -ve if not.
     969                 :            :  */
     970                 :          0 : int cap_vm_enough_memory(struct mm_struct *mm, long pages)
     971                 :            : {
     972                 :            :         int cap_sys_admin = 0;
     973                 :            : 
     974         [ +  + ]:   16880971 :         if (cap_capable(current_cred(), &init_user_ns, CAP_SYS_ADMIN,
     975                 :            :                         SECURITY_CAP_NOAUDIT) == 0)
     976                 :            :                 cap_sys_admin = 1;
     977                 :   16880887 :         return __vm_enough_memory(mm, pages, cap_sys_admin);
     978                 :            : }
     979                 :            : 
     980                 :            : /*
     981                 :            :  * cap_mmap_addr - check if able to map given addr
     982                 :            :  * @addr: address attempting to be mapped
     983                 :            :  *
     984                 :            :  * If the process is attempting to map memory below dac_mmap_min_addr they need
     985                 :            :  * CAP_SYS_RAWIO.  The other parameters to this function are unused by the
     986                 :            :  * capability security module.  Returns 0 if this mapping should be allowed
     987                 :            :  * -EPERM if not.
     988                 :            :  */
     989                 :          0 : int cap_mmap_addr(unsigned long addr)
     990                 :            : {
     991                 :            :         int ret = 0;
     992                 :            : 
     993         [ -  + ]:    5132615 :         if (addr < dac_mmap_min_addr) {
     994                 :          0 :                 ret = cap_capable(current_cred(), &init_user_ns, CAP_SYS_RAWIO,
     995                 :            :                                   SECURITY_CAP_AUDIT);
     996                 :            :                 /* set PF_SUPERPRIV if it turns out we allow the low mmap */
     997         [ #  # ]:          0 :                 if (ret == 0)
     998                 :          0 :                         current->flags |= PF_SUPERPRIV;
     999                 :            :         }
    1000                 :          0 :         return ret;
    1001                 :            : }
    1002                 :            : 
    1003                 :          0 : int cap_mmap_file(struct file *file, unsigned long reqprot,
    1004                 :            :                   unsigned long prot, unsigned long flags)
    1005                 :            : {
    1006                 :          0 :         return 0;
    1007                 :            : }

Generated by: LCOV version 1.9