Re: [PATCH] selinux: correctly label /proc inodes in use before the policy is loaded

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Apr 09, 2014 at 12:17:19PM -0400, Paul Moore wrote:
> 
> Requesting a stable backport of a SELinux bugfix that is currently in
> Linus' tree for 3.15.
>

Thanks Paul, I'm queuing it for the 3.11 kernel.

Cheers,
--
Luís

> commit f64410ec665479d7b4b77b7519e814253ed0f686
> Author: Paul Moore <pmoore@xxxxxxxxxx>
> Date:   Wed Mar 19 16:46:18 2014 -0400
> 
>     selinux: correctly label /proc inodes in use before the policy is loaded
>     
>     This patch is based on an earlier patch by Eric Paris, he describes
>     the problem below:
>     
>       "If an inode is accessed before policy load it will get placed on a
>        list of inodes to be initialized after policy load.  After policy
>        load we call inode_doinit() which calls inode_doinit_with_dentry()
>        on all inodes accessed before policy load.  In the case of inodes
>        in procfs that means we'll end up at the bottom where it does:
>     
>          /* Default to the fs superblock SID. */
>          isec->sid = sbsec->sid;
>     
>          if ((sbsec->flags & SE_SBPROC) && !S_ISLNK(inode->i_mode)) {
>                  if (opt_dentry) {
>                          isec->sclass = inode_mode_to_security_class(...)
>                          rc = selinux_proc_get_sid(opt_dentry,
>                                                    isec->sclass,
>                                                    &sid);
>                          if (rc)
>                                  goto out_unlock;
>                          isec->sid = sid;
>                  }
>          }
>     
>        Since opt_dentry is null, we'll never call selinux_proc_get_sid()
>        and will leave the inode labeled with the label on the superblock.
>        I believe a fix would be to mimic the behavior of xattrs.  Look
>        for an alias of the inode.  If it can't be found, just leave the
>        inode uninitialized (and pick it up later) if it can be found, we
>        should be able to call selinux_proc_get_sid() ..."
>     
>     On a system exhibiting this problem, you will notice a lot of files in
>     /proc with the generic "proc_t" type (at least the ones that were
>     accessed early in the boot), for example:
>     
>        # ls -Z /proc/sys/kernel/shmmax | awk '{ print $4 " " $5 }'
>        system_u:object_r:proc_t:s0 /proc/sys/kernel/shmmax
>     
>     However, with this patch in place we see the expected result:
>     
>        # ls -Z /proc/sys/kernel/shmmax | awk '{ print $4 " " $5 }'
>        system_u:object_r:sysctl_kernel_t:s0 /proc/sys/kernel/shmmax
>     
>     Cc: Eric Paris <eparis@xxxxxxxxxx>
>     Signed-off-by: Paul Moore <pmoore@xxxxxxxxxx>
>     Acked-by: Eric Paris <eparis@xxxxxxxxxx>
> 
> diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c
> index 1dd9484..d5d67c9 100644
> --- a/security/selinux/hooks.c
> +++ b/security/selinux/hooks.c
> @@ -1402,15 +1402,33 @@ static int inode_doinit_with_dentry(struct inode *inode, struct dentry *opt_dent
>  		isec->sid = sbsec->sid;
>  
>  		if ((sbsec->flags & SE_SBPROC) && !S_ISLNK(inode->i_mode)) {
> -			if (opt_dentry) {
> -				isec->sclass = inode_mode_to_security_class(inode->i_mode);
> -				rc = selinux_proc_get_sid(opt_dentry,
> -							  isec->sclass,
> -							  &sid);
> -				if (rc)
> -					goto out_unlock;
> -				isec->sid = sid;
> -			}
> +			/* We must have a dentry to determine the label on
> +			 * procfs inodes */
> +			if (opt_dentry)
> +				/* Called from d_instantiate or
> +				 * d_splice_alias. */
> +				dentry = dget(opt_dentry);
> +			else
> +				/* Called from selinux_complete_init, try to
> +				 * find a dentry. */
> +				dentry = d_find_alias(inode);
> +			/*
> +			 * This can be hit on boot when a file is accessed
> +			 * before the policy is loaded.  When we load policy we
> +			 * may find inodes that have no dentry on the
> +			 * sbsec->isec_head list.  No reason to complain as
> +			 * these will get fixed up the next time we go through
> +			 * inode_doinit() with a dentry, before these inodes
> +			 * could be used again by userspace.
> +			 */
> +			if (!dentry)
> +				goto out_unlock;
> +			isec->sclass = inode_mode_to_security_class(inode->i_mode);
> +			rc = selinux_proc_get_sid(dentry, isec->sclass, &sid);
> +			dput(dentry);
> +			if (rc)
> +				goto out_unlock;
> +			isec->sid = sid;
>  		}
>  		break;
>  	}
> 
> 
> --
> To unsubscribe from this list: send the line "unsubscribe stable" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Kernel]     [Kernel Development Newbies]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Hiking]     [Linux Kernel]     [Linux SCSI]