]> Gentwo Git Trees - linux/.git/commitdiff
smack: fix bug: SMACK64TRANSMUTE set on non-directory
authorKonstantin Andreev <andreev@swemel.ru>
Mon, 16 Jun 2025 01:07:29 +0000 (04:07 +0300)
committerCasey Schaufler <casey@schaufler-ca.com>
Sun, 22 Jun 2025 15:51:32 +0000 (08:51 -0700)
When a new file system object is created
and the conditions for label transmutation are met,
the SMACK64TRANSMUTE extended attribute is set
on the object regardless of its type:
file, pipe, socket, symlink, or directory.

However,
SMACK64TRANSMUTE may only be set on directories.

This bug is a combined effect of the commits [1] and [2]
which both transfer functionality
from smack_d_instantiate() to smack_inode_init_security(),
but only in part.

Commit [1] set blank  SMACK64TRANSMUTE on improper object types.
Commit [2] set "TRUE" SMACK64TRANSMUTE on improper object types.

[1] 2023-06-10,
Fixes: baed456a6a2f ("smack: Set the SMACK64TRANSMUTE xattr in smack_inode_init_security()")
Link: https://lore.kernel.org/linux-security-module/20230610075738.3273764-3-roberto.sassu@huaweicloud.com/
[2] 2023-11-16,
Fixes: e63d86b8b764 ("smack: Initialize the in-memory inode in smack_inode_init_security()")
Link: https://lore.kernel.org/linux-security-module/20231116090125.187209-5-roberto.sassu@huaweicloud.com/
Signed-off-by: Konstantin Andreev <andreev@swemel.ru>
Signed-off-by: Casey Schaufler <casey@schaufler-ca.com>
security/smack/smack_lsm.c

index 8629e58ea4fa159bd94aa7eadc2dd6cf5f6228bd..d6f814aa15bae2170c98fe58c415009087a96baa 100644 (file)
@@ -1027,18 +1027,20 @@ static int smack_inode_init_security(struct inode *inode, struct inode *dir,
                if (!trans_cred)
                        issp->smk_inode = dsp;
 
-               issp->smk_flags |= SMK_INODE_TRANSMUTE;
-               xattr_transmute = lsm_get_xattr_slot(xattrs,
-                                                    xattr_count);
-               if (xattr_transmute) {
-                       xattr_transmute->value = kmemdup(TRANS_TRUE,
-                                                        TRANS_TRUE_SIZE,
-                                                        GFP_NOFS);
-                       if (!xattr_transmute->value)
-                               return -ENOMEM;
-
-                       xattr_transmute->value_len = TRANS_TRUE_SIZE;
-                       xattr_transmute->name = XATTR_SMACK_TRANSMUTE;
+               if (S_ISDIR(inode->i_mode)) {
+                       issp->smk_flags |= SMK_INODE_TRANSMUTE;
+                       xattr_transmute = lsm_get_xattr_slot(xattrs,
+                                                            xattr_count);
+                       if (xattr_transmute) {
+                               xattr_transmute->value = kmemdup(TRANS_TRUE,
+                                                                TRANS_TRUE_SIZE,
+                                                                GFP_NOFS);
+                               if (!xattr_transmute->value)
+                                       return -ENOMEM;
+
+                               xattr_transmute->value_len = TRANS_TRUE_SIZE;
+                               xattr_transmute->name = XATTR_SMACK_TRANSMUTE;
+                       }
                }
        }