Skip to content

Commit 3e3e24b

Browse files
jlebonpcmoore
authored andcommitted
selinux: allow labeling before policy is loaded
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] coreos/fedora-coreos-tracker#94 [3] https://www.spinics.net/lists/linux-initramfs/msg04593.html Co-developed-by: Victor Kamensky <[email protected]> Signed-off-by: Victor Kamensky <[email protected]> Signed-off-by: Jonathan Lebon <[email protected]> Signed-off-by: Paul Moore <[email protected]>
1 parent e40642d commit 3e3e24b

File tree

1 file changed

+12
-0
lines changed

1 file changed

+12
-0
lines changed

security/selinux/hooks.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3144,6 +3144,9 @@ static int selinux_inode_setxattr(struct dentry *dentry, const char *name,
31443144
return dentry_has_perm(current_cred(), dentry, FILE__SETATTR);
31453145
}
31463146

3147+
if (!selinux_state.initialized)
3148+
return (inode_owner_or_capable(inode) ? 0 : -EPERM);
3149+
31473150
sbsec = inode->i_sb->s_security;
31483151
if (!(sbsec->flags & SBLABEL_MNT))
31493152
return -EOPNOTSUPP;
@@ -3227,6 +3230,15 @@ static void selinux_inode_post_setxattr(struct dentry *dentry, const char *name,
32273230
return;
32283231
}
32293232

3233+
if (!selinux_state.initialized) {
3234+
/* If we haven't even been initialized, then we can't validate
3235+
* against a policy, so leave the label as invalid. It may
3236+
* resolve to a valid label on the next revalidation try if
3237+
* we've since initialized.
3238+
*/
3239+
return;
3240+
}
3241+
32303242
rc = security_context_to_sid_force(&selinux_state, value, size,
32313243
&newsid);
32323244
if (rc) {

0 commit comments

Comments
 (0)