Patch "selinux: allow labeling before policy is loaded" has been added to the 5.4-stable tree

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

 



This is a note to let you know that I've just added the patch titled

    selinux: allow labeling before policy is loaded

to the 5.4-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     selinux-allow-labeling-before-policy-is-loaded.patch
and it can be found in the queue-5.4 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 38f2ee3a8be2ae36e9b8c5754507889d14f6f8c0
Author: Jonathan Lebon <jlebon@xxxxxxxxxx>
Date:   Thu Sep 12 09:30:07 2019 -0400

    selinux: allow labeling before policy is loaded
    
    [ Upstream commit 3e3e24b42043eceb97ed834102c2d094dfd7aaa6 ]
    
    Currently, the SELinux LSM prevents one from setting the
    `security.selinux` xattr on an inode without a policy first being
    loaded. However, this restriction is problematic: it makes it impossible
    to have newly created files with the correct label before actually
    loading the policy.
    
    This is relevant in distributions like Fedora, where the policy is
    loaded by systemd shortly after pivoting out of the initrd. In such
    instances, all files created prior to pivoting will be unlabeled. One
    then has to relabel them after pivoting, an operation which inherently
    races with other processes trying to access those same files.
    
    Going further, there are use cases for creating the entire root
    filesystem on first boot from the initrd (e.g. Container Linux supports
    this today[1], and we'd like to support it in Fedora CoreOS as well[2]).
    One can imagine doing this in two ways: at the block device level (e.g.
    laying down a disk image), or at the filesystem level. In the former,
    labeling can simply be part of the image. But even in the latter
    scenario, one still really wants to be able to set the right labels when
    populating the new filesystem.
    
    This patch enables this by changing behaviour in the following two ways:
    1. allow `setxattr` if we're not initialized
    2. don't try to set the in-core inode SID if we're not initialized;
       instead leave it as `LABEL_INVALID` so that revalidation may be
       attempted at a later time
    
    Note the first hunk of this patch is mostly the same as a previously
    discussed one[3], though it was part of a larger series which wasn't
    accepted.
    
    [1] https://coreos.com/os/docs/latest/root-filesystem-placement.html
    [2] https://github.com/coreos/fedora-coreos-tracker/issues/94
    [3] https://www.spinics.net/lists/linux-initramfs/msg04593.html
    
    Co-developed-by: Victor Kamensky <kamensky@xxxxxxxxx>
    Signed-off-by: Victor Kamensky <kamensky@xxxxxxxxx>
    Signed-off-by: Jonathan Lebon <jlebon@xxxxxxxxxx>
    Signed-off-by: Paul Moore <paul@xxxxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c
index 552e73d90fd25..212f48025db81 100644
--- a/security/selinux/hooks.c
+++ b/security/selinux/hooks.c
@@ -3156,6 +3156,9 @@ static int selinux_inode_setxattr(struct dentry *dentry, const char *name,
 		return dentry_has_perm(current_cred(), dentry, FILE__SETATTR);
 	}
 
+	if (!selinux_state.initialized)
+		return (inode_owner_or_capable(inode) ? 0 : -EPERM);
+
 	sbsec = inode->i_sb->s_security;
 	if (!(sbsec->flags & SBLABEL_MNT))
 		return -EOPNOTSUPP;
@@ -3239,6 +3242,15 @@ static void selinux_inode_post_setxattr(struct dentry *dentry, const char *name,
 		return;
 	}
 
+	if (!selinux_state.initialized) {
+		/* If we haven't even been initialized, then we can't validate
+		 * against a policy, so leave the label as invalid. It may
+		 * resolve to a valid label on the next revalidation try if
+		 * we've since initialized.
+		 */
+		return;
+	}
+
 	rc = security_context_to_sid_force(&selinux_state, value, size,
 					   &newsid);
 	if (rc) {



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux