security: Introduce inode_post_remove_acl hook
authorRoberto Sassu <roberto.sassu@huawei.com>
Thu, 15 Feb 2024 10:31:05 +0000 (11:31 +0100)
committerPaul Moore <paul@paul-moore.com>
Fri, 16 Feb 2024 04:43:44 +0000 (23:43 -0500)
In preparation for moving IMA and EVM to the LSM infrastructure, introduce
the inode_post_remove_acl hook.

At inode_remove_acl hook, EVM verifies the file's existing HMAC value. At
inode_post_remove_acl, EVM re-calculates the file's HMAC with the passed
POSIX ACL removed and other file metadata.

Other LSMs could similarly take some action after successful POSIX ACL
removal.

The new hook cannot return an error and cannot cause the operation to be
reverted.

Signed-off-by: Roberto Sassu <roberto.sassu@huawei.com>
Reviewed-by: Stefan Berger <stefanb@linux.ibm.com>
Acked-by: Casey Schaufler <casey@schaufler-ca.com>
Reviewed-by: Mimi Zohar <zohar@linux.ibm.com>
Acked-by: Christian Brauner <brauner@kernel.org>
Signed-off-by: Paul Moore <paul@paul-moore.com>
fs/posix_acl.c
include/linux/lsm_hook_defs.h
include/linux/security.h
security/security.c

index 7556ee9f8a514fe54887d1e6a154607f5f54d11c..0d2371240c1bf1936fcc0da788d5bdeabbdd0545 100644 (file)
@@ -1246,6 +1246,7 @@ retry_deleg:
                error = -EIO;
        if (!error) {
                fsnotify_xattr(dentry);
+               security_inode_post_remove_acl(idmap, dentry, acl_name);
                evm_inode_post_remove_acl(idmap, dentry, acl_name);
        }
 
index b0125c99f80a3ad747c0a92f637b9a7e3e9f6e0e..7e414ba26333e0d35a0b98a9220d1501f9b7b6b1 100644 (file)
@@ -163,6 +163,8 @@ LSM_HOOK(int, 0, inode_get_acl, struct mnt_idmap *idmap,
         struct dentry *dentry, const char *acl_name)
 LSM_HOOK(int, 0, inode_remove_acl, struct mnt_idmap *idmap,
         struct dentry *dentry, const char *acl_name)
+LSM_HOOK(void, LSM_RET_VOID, inode_post_remove_acl, struct mnt_idmap *idmap,
+        struct dentry *dentry, const char *acl_name)
 LSM_HOOK(int, 0, inode_need_killpriv, struct dentry *dentry)
 LSM_HOOK(int, 0, inode_killpriv, struct mnt_idmap *idmap,
         struct dentry *dentry)
index c372797e16170a303906351ad1636e960f86c53f..4b03c76b91f14a505bb0f54b079d73963227cd95 100644 (file)
@@ -378,6 +378,9 @@ int security_inode_get_acl(struct mnt_idmap *idmap,
                           struct dentry *dentry, const char *acl_name);
 int security_inode_remove_acl(struct mnt_idmap *idmap,
                              struct dentry *dentry, const char *acl_name);
+void security_inode_post_remove_acl(struct mnt_idmap *idmap,
+                                   struct dentry *dentry,
+                                   const char *acl_name);
 void security_inode_post_setxattr(struct dentry *dentry, const char *name,
                                  const void *value, size_t size, int flags);
 int security_inode_getxattr(struct dentry *dentry, const char *name);
@@ -936,6 +939,11 @@ static inline int security_inode_remove_acl(struct mnt_idmap *idmap,
        return 0;
 }
 
+static inline void security_inode_post_remove_acl(struct mnt_idmap *idmap,
+                                                 struct dentry *dentry,
+                                                 const char *acl_name)
+{ }
+
 static inline void security_inode_post_setxattr(struct dentry *dentry,
                const char *name, const void *value, size_t size, int flags)
 { }
index 52f62f7850870f19c3432bad17409dc270c7a470..3bed660fc950f9ccdc7624838a44b1e35893ca8b 100644 (file)
@@ -2413,6 +2413,23 @@ int security_inode_remove_acl(struct mnt_idmap *idmap,
        return evm_inode_remove_acl(idmap, dentry, acl_name);
 }
 
+/**
+ * security_inode_post_remove_acl() - Update inode security after rm posix acls
+ * @idmap: idmap of the mount
+ * @dentry: file
+ * @acl_name: acl name
+ *
+ * Update inode security data after successfully removing posix acls on
+ * @dentry in @idmap. The posix acls are identified by @acl_name.
+ */
+void security_inode_post_remove_acl(struct mnt_idmap *idmap,
+                                   struct dentry *dentry, const char *acl_name)
+{
+       if (unlikely(IS_PRIVATE(d_backing_inode(dentry))))
+               return;
+       call_void_hook(inode_post_remove_acl, idmap, dentry, acl_name);
+}
+
 /**
  * security_inode_post_setxattr() - Update the inode after a setxattr operation
  * @dentry: file