]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
lsm: use lsm_prop in security_inode_getsecid
authorCasey Schaufler <casey@schaufler-ca.com>
Wed, 9 Oct 2024 17:32:16 +0000 (10:32 -0700)
committerPaul Moore <paul@paul-moore.com>
Fri, 11 Oct 2024 18:34:14 +0000 (14:34 -0400)
Change the security_inode_getsecid() interface to fill in a
lsm_prop structure instead of a u32 secid. This allows for its
callers to gather data from all registered LSMs. Data is provided
for IMA and audit. Change the name to security_inode_getlsmprop().

Cc: linux-integrity@vger.kernel.org
Cc: selinux@vger.kernel.org
Signed-off-by: Casey Schaufler <casey@schaufler-ca.com>
[PM: subj line tweak]
Signed-off-by: Paul Moore <paul@paul-moore.com>
include/linux/lsm_hook_defs.h
include/linux/security.h
kernel/auditsc.c
security/integrity/ima/ima_policy.c
security/security.c
security/selinux/hooks.c
security/smack/smack_lsm.c

index 8a90fd9ff3c83b976b6d316e9dc3cf47824fea60..23ad7e4f8c6787585460701182412d4e58cf8280 100644 (file)
@@ -176,7 +176,8 @@ LSM_HOOK(int, -EOPNOTSUPP, inode_setsecurity, struct inode *inode,
         const char *name, const void *value, size_t size, int flags)
 LSM_HOOK(int, 0, inode_listsecurity, struct inode *inode, char *buffer,
         size_t buffer_size)
-LSM_HOOK(void, LSM_RET_VOID, inode_getsecid, struct inode *inode, u32 *secid)
+LSM_HOOK(void, LSM_RET_VOID, inode_getlsmprop, struct inode *inode,
+        struct lsm_prop *prop)
 LSM_HOOK(int, 0, inode_copy_up, struct dentry *src, struct cred **new)
 LSM_HOOK(int, -EOPNOTSUPP, inode_copy_up_xattr, struct dentry *src,
         const char *name)
index 9bc8153f4e8b993ab70c165a49eda0414046821c..2b19ef5d799c0f1da2f03823ff07e981d6617a81 100644 (file)
@@ -452,7 +452,7 @@ int security_inode_getsecurity(struct mnt_idmap *idmap,
                               void **buffer, bool alloc);
 int security_inode_setsecurity(struct inode *inode, const char *name, const void *value, size_t size, int flags);
 int security_inode_listsecurity(struct inode *inode, char *buffer, size_t buffer_size);
-void security_inode_getsecid(struct inode *inode, u32 *secid);
+void security_inode_getlsmprop(struct inode *inode, struct lsm_prop *prop);
 int security_inode_copy_up(struct dentry *src, struct cred **new);
 int security_inode_copy_up_xattr(struct dentry *src, const char *name);
 int security_inode_setintegrity(const struct inode *inode,
@@ -1076,9 +1076,10 @@ static inline int security_inode_listsecurity(struct inode *inode, char *buffer,
        return 0;
 }
 
-static inline void security_inode_getsecid(struct inode *inode, u32 *secid)
+static inline void security_inode_getlsmprop(struct inode *inode,
+                                            struct lsm_prop *prop)
 {
-       *secid = 0;
+       lsmprop_init(prop);
 }
 
 static inline int security_inode_copy_up(struct dentry *src, struct cred **new)
index 6b2b2a8d564785fff63d58efe07c29cb4da41311..372302f0528b21a833c76216fd118a3aa763618d 100644 (file)
@@ -2276,13 +2276,17 @@ static void audit_copy_inode(struct audit_names *name,
                             const struct dentry *dentry,
                             struct inode *inode, unsigned int flags)
 {
+       struct lsm_prop prop;
+
        name->ino   = inode->i_ino;
        name->dev   = inode->i_sb->s_dev;
        name->mode  = inode->i_mode;
        name->uid   = inode->i_uid;
        name->gid   = inode->i_gid;
        name->rdev  = inode->i_rdev;
-       security_inode_getsecid(inode, &name->osid);
+       security_inode_getlsmprop(inode, &prop);
+       /* scaffolding */
+       name->osid = prop.scaffold.secid;
        if (flags & AUDIT_INODE_NOEVAL) {
                name->fcap_ver = -1;
                return;
index a96dc3ff6aa079f35cb2df7fe56b817a7dec5439..dbfd554b4624e7fd231abc3b0c6c463a8ada23f3 100644 (file)
@@ -649,8 +649,7 @@ retry:
                case LSM_OBJ_USER:
                case LSM_OBJ_ROLE:
                case LSM_OBJ_TYPE:
-                       /* scaffolding */
-                       security_inode_getsecid(inode, &prop.scaffold.secid);
+                       security_inode_getlsmprop(inode, &prop);
                        rc = ima_filter_rule_match(&prop, lsm_rule->lsm[i].type,
                                                   Audit_equal,
                                                   lsm_rule->lsm[i].rule);
index 5cdb5b171ff203645332f3a86e290d1d11907118..5e76e35dda092031627644bad9f6fdf5584810e0 100644 (file)
@@ -2724,16 +2724,15 @@ int security_inode_listsecurity(struct inode *inode,
 EXPORT_SYMBOL(security_inode_listsecurity);
 
 /**
- * security_inode_getsecid() - Get an inode's secid
+ * security_inode_getlsmprop() - Get an inode's LSM data
  * @inode: inode
- * @secid: secid to return
+ * @prop: lsm specific information to return
  *
- * Get the secid associated with the node.  In case of failure, @secid will be
- * set to zero.
+ * Get the lsm specific information associated with the node.
  */
-void security_inode_getsecid(struct inode *inode, u32 *secid)
+void security_inode_getlsmprop(struct inode *inode, struct lsm_prop *prop)
 {
-       call_void_hook(inode_getsecid, inode, secid);
+       call_void_hook(inode_getlsmprop, inode, prop);
 }
 
 /**
index 7d6ffd3483a80bb4eb4c85025dbaba4b6423ad44..a9f8d10062b58d5cf4e6f6e5d523c7e0e3529ac4 100644 (file)
@@ -3503,15 +3503,18 @@ static int selinux_inode_listsecurity(struct inode *inode, char *buffer, size_t
        return len;
 }
 
-static void selinux_inode_getsecid(struct inode *inode, u32 *secid)
+static void selinux_inode_getlsmprop(struct inode *inode, struct lsm_prop *prop)
 {
        struct inode_security_struct *isec = inode_security_novalidate(inode);
-       *secid = isec->sid;
+
+       prop->selinux.secid = isec->sid;
+       /* scaffolding */
+       prop->scaffold.secid = isec->sid;
 }
 
 static int selinux_inode_copy_up(struct dentry *src, struct cred **new)
 {
-       u32 sid;
+       struct lsm_prop prop;
        struct task_security_struct *tsec;
        struct cred *new_creds = *new;
 
@@ -3523,8 +3526,8 @@ static int selinux_inode_copy_up(struct dentry *src, struct cred **new)
 
        tsec = selinux_cred(new_creds);
        /* Get label from overlay inode and set it in create_sid */
-       selinux_inode_getsecid(d_inode(src), &sid);
-       tsec->create_sid = sid;
+       selinux_inode_getlsmprop(d_inode(src), &prop);
+       tsec->create_sid = prop.selinux.secid;
        *new = new_creds;
        return 0;
 }
@@ -7174,7 +7177,7 @@ static struct security_hook_list selinux_hooks[] __ro_after_init = {
        LSM_HOOK_INIT(inode_getsecurity, selinux_inode_getsecurity),
        LSM_HOOK_INIT(inode_setsecurity, selinux_inode_setsecurity),
        LSM_HOOK_INIT(inode_listsecurity, selinux_inode_listsecurity),
-       LSM_HOOK_INIT(inode_getsecid, selinux_inode_getsecid),
+       LSM_HOOK_INIT(inode_getlsmprop, selinux_inode_getlsmprop),
        LSM_HOOK_INIT(inode_copy_up, selinux_inode_copy_up),
        LSM_HOOK_INIT(inode_copy_up_xattr, selinux_inode_copy_up_xattr),
        LSM_HOOK_INIT(path_notify, selinux_path_notify),
index e74e22c4232fe3d0d9e69fcd5deb772694647eb0..5c3cb283710531ae7e5f53460e9c9c59615b50d6 100644 (file)
@@ -1649,15 +1649,17 @@ static int smack_inode_listsecurity(struct inode *inode, char *buffer,
 }
 
 /**
- * smack_inode_getsecid - Extract inode's security id
+ * smack_inode_getlsmprop - Extract inode's security id
  * @inode: inode to extract the info from
- * @secid: where result will be saved
+ * @prop: where result will be saved
  */
-static void smack_inode_getsecid(struct inode *inode, u32 *secid)
+static void smack_inode_getlsmprop(struct inode *inode, struct lsm_prop *prop)
 {
        struct smack_known *skp = smk_of_inode(inode);
 
-       *secid = skp->smk_secid;
+       prop->smack.skp = skp;
+       /* scaffolding */
+       prop->scaffold.secid = skp->smk_secid;
 }
 
 /*
@@ -5110,7 +5112,7 @@ static struct security_hook_list smack_hooks[] __ro_after_init = {
        LSM_HOOK_INIT(inode_getsecurity, smack_inode_getsecurity),
        LSM_HOOK_INIT(inode_setsecurity, smack_inode_setsecurity),
        LSM_HOOK_INIT(inode_listsecurity, smack_inode_listsecurity),
-       LSM_HOOK_INIT(inode_getsecid, smack_inode_getsecid),
+       LSM_HOOK_INIT(inode_getlsmprop, smack_inode_getlsmprop),
 
        LSM_HOOK_INIT(file_alloc_security, smack_file_alloc_security),
        LSM_HOOK_INIT(file_ioctl, smack_file_ioctl),