]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
evm: Use ordered xattrs list to calculate HMAC in evm_init_hmac()
authorRoberto Sassu <roberto.sassu@huawei.com>
Tue, 20 Jan 2026 14:53:41 +0000 (15:53 +0100)
committerMimi Zohar <zohar@linux.ibm.com>
Fri, 23 Jan 2026 19:31:41 +0000 (14:31 -0500)
Commit 8e5d9f916a96 ("smack: deduplicate xattr setting in
smack_inode_init_security()") introduced xattr_dupval() to simplify setting
the xattrs to be provided by the SMACK LSM on inode creation, in the
smack_inode_init_security().

Unfortunately, moving lsm_get_xattr_slot() caused the SMACK64TRANSMUTE
xattr be added in the array of new xattrs before SMACK64. This causes the
HMAC of xattrs calculated by evm_init_hmac() for new files to diverge from
the one calculated by both evm_calc_hmac_or_hash() and evmctl.

evm_init_hmac() calculates the HMAC of the xattrs of new files based on the
order LSMs provide them, while evm_calc_hmac_or_hash() and evmctl calculate
the HMAC based on an ordered xattrs list.

Fix the issue by making evm_init_hmac() calculate the HMAC of new files
based on the ordered xattrs list too.

Fixes: 8e5d9f916a96 ("smack: deduplicate xattr setting in smack_inode_init_security()")
Signed-off-by: Roberto Sassu <roberto.sassu@huawei.com>
Signed-off-by: Mimi Zohar <zohar@linux.ibm.com>
security/integrity/evm/evm_crypto.c

index a5e730ffda57fbc0a91124adaa77b946a12d08b4..5a8cef45bacf014b580c7db4ca89257e842b5668 100644 (file)
@@ -401,6 +401,7 @@ int evm_init_hmac(struct inode *inode, const struct xattr *xattrs,
 {
        struct shash_desc *desc;
        const struct xattr *xattr;
+       struct xattr_list *xattr_entry;
 
        desc = init_desc(EVM_XATTR_HMAC, HASH_ALGO_SHA1);
        if (IS_ERR(desc)) {
@@ -408,11 +409,16 @@ int evm_init_hmac(struct inode *inode, const struct xattr *xattrs,
                return PTR_ERR(desc);
        }
 
-       for (xattr = xattrs; xattr->name; xattr++) {
-               if (!evm_protected_xattr(xattr->name))
-                       continue;
+       list_for_each_entry_lockless(xattr_entry, &evm_config_xattrnames,
+                                    list) {
+               for (xattr = xattrs; xattr->name; xattr++) {
+                       if (strcmp(xattr_entry->name +
+                                  XATTR_SECURITY_PREFIX_LEN, xattr->name) != 0)
+                               continue;
 
-               crypto_shash_update(desc, xattr->value, xattr->value_len);
+                       crypto_shash_update(desc, xattr->value,
+                                           xattr->value_len);
+               }
        }
 
        hmac_add_misc(desc, inode, EVM_XATTR_HMAC, hmac_val);