]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
security: Introduce key_post_create_or_update hook
authorRoberto Sassu <roberto.sassu@huawei.com>
Thu, 15 Feb 2024 10:31:06 +0000 (11:31 +0100)
committerPaul Moore <paul@paul-moore.com>
Fri, 16 Feb 2024 04:43:45 +0000 (23:43 -0500)
In preparation for moving IMA and EVM to the LSM infrastructure, introduce
the key_post_create_or_update hook.

Depending on policy, IMA measures the key content after creation or update,
so that remote verifiers are aware of the operation.

Other LSMs could similarly take some action after successful key creation
or update.

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>
Signed-off-by: Paul Moore <paul@paul-moore.com>
include/linux/lsm_hook_defs.h
include/linux/security.h
security/keys/key.c
security/security.c

index 7e414ba26333e0d35a0b98a9220d1501f9b7b6b1..7e4683035d348f389e19a1a3cf7a49f6052aa84e 100644 (file)
@@ -405,6 +405,9 @@ LSM_HOOK(void, LSM_RET_VOID, key_free, struct key *key)
 LSM_HOOK(int, 0, key_permission, key_ref_t key_ref, const struct cred *cred,
         enum key_need_perm need_perm)
 LSM_HOOK(int, 0, key_getsecurity, struct key *key, char **buffer)
+LSM_HOOK(void, LSM_RET_VOID, key_post_create_or_update, struct key *keyring,
+        struct key *key, const void *payload, size_t payload_len,
+        unsigned long flags, bool create)
 #endif /* CONFIG_KEYS */
 
 #ifdef CONFIG_AUDIT
index 4b03c76b91f14a505bb0f54b079d73963227cd95..8436f9abf43d4ca0947f33aa00483df63fa8aa73 100644 (file)
@@ -2004,6 +2004,9 @@ void security_key_free(struct key *key);
 int security_key_permission(key_ref_t key_ref, const struct cred *cred,
                            enum key_need_perm need_perm);
 int security_key_getsecurity(struct key *key, char **_buffer);
+void security_key_post_create_or_update(struct key *keyring, struct key *key,
+                                       const void *payload, size_t payload_len,
+                                       unsigned long flags, bool create);
 
 #else
 
@@ -2031,6 +2034,14 @@ static inline int security_key_getsecurity(struct key *key, char **_buffer)
        return 0;
 }
 
+static inline void security_key_post_create_or_update(struct key *keyring,
+                                                     struct key *key,
+                                                     const void *payload,
+                                                     size_t payload_len,
+                                                     unsigned long flags,
+                                                     bool create)
+{ }
+
 #endif
 #endif /* CONFIG_KEYS */
 
index 5b10641debd54910bbb4f2872ea6039a0471bcf5..31a8b9408b7cd547ca576ca34c5c652e94792111 100644 (file)
@@ -930,6 +930,8 @@ static key_ref_t __key_create_or_update(key_ref_t keyring_ref,
                goto error_link_end;
        }
 
+       security_key_post_create_or_update(keyring, key, payload, plen, flags,
+                                          true);
        ima_post_key_create_or_update(keyring, key, payload, plen,
                                      flags, true);
 
@@ -963,10 +965,13 @@ error:
 
        key_ref = __key_update(key_ref, &prep);
 
-       if (!IS_ERR(key_ref))
+       if (!IS_ERR(key_ref)) {
+               security_key_post_create_or_update(keyring, key, payload, plen,
+                                                  flags, false);
                ima_post_key_create_or_update(keyring, key,
                                              payload, plen,
                                              flags, false);
+       }
 
        goto error_free_prep;
 }
index 3bed660fc950f9ccdc7624838a44b1e35893ca8b..6c23c620e3c1773c9cc0b99bba8e6a035e60791b 100644 (file)
@@ -5453,6 +5453,25 @@ int security_key_getsecurity(struct key *key, char **buffer)
        *buffer = NULL;
        return call_int_hook(key_getsecurity, 0, key, buffer);
 }
+
+/**
+ * security_key_post_create_or_update() - Notification of key create or update
+ * @keyring: keyring to which the key is linked to
+ * @key: created or updated key
+ * @payload: data used to instantiate or update the key
+ * @payload_len: length of payload
+ * @flags: key flags
+ * @create: flag indicating whether the key was created or updated
+ *
+ * Notify the caller of a key creation or update.
+ */
+void security_key_post_create_or_update(struct key *keyring, struct key *key,
+                                       const void *payload, size_t payload_len,
+                                       unsigned long flags, bool create)
+{
+       call_void_hook(key_post_create_or_update, keyring, key, payload,
+                      payload_len, flags, create);
+}
 #endif /* CONFIG_KEYS */
 
 #ifdef CONFIG_AUDIT