]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
IMA: extend critical data hook to limit the measurement based on a label
authorTushar Sugandhi <tusharsu@linux.microsoft.com>
Fri, 8 Jan 2021 04:07:06 +0000 (20:07 -0800)
committerMimi Zohar <zohar@linux.ibm.com>
Fri, 15 Jan 2021 04:41:38 +0000 (23:41 -0500)
The IMA hook ima_measure_critical_data() does not support a way to
specify the source of the critical data provider.  Thus, the data
measurement cannot be constrained based on the data source label
in the IMA policy.

Extend the IMA hook ima_measure_critical_data() to support passing
the data source label as an input parameter, so that the policy rule can
be used to limit the measurements based on the label.

Signed-off-by: Tushar Sugandhi <tusharsu@linux.microsoft.com>
Reviewed-by: Tyler Hicks <tyhicks@linux.microsoft.com>
Signed-off-by: Mimi Zohar <zohar@linux.ibm.com>
include/linux/ima.h
security/integrity/ima/ima_main.c

index 59bd90ac3c35c04fedcf098cbc6e2af71b097a1e..2ac834badbbefc548d8ec0d28d055191ffdf62fa 100644 (file)
@@ -31,7 +31,8 @@ extern void ima_post_path_mknod(struct dentry *dentry);
 extern int ima_file_hash(struct file *file, char *buf, size_t buf_size);
 extern int ima_inode_hash(struct inode *inode, char *buf, size_t buf_size);
 extern void ima_kexec_cmdline(int kernel_fd, const void *buf, int size);
-extern void ima_measure_critical_data(const char *event_name,
+extern void ima_measure_critical_data(const char *event_label,
+                                     const char *event_name,
                                      const void *buf, size_t buf_len,
                                      bool hash);
 
@@ -132,9 +133,11 @@ static inline int ima_inode_hash(struct inode *inode, char *buf, size_t buf_size
 
 static inline void ima_kexec_cmdline(int kernel_fd, const void *buf, int size) {}
 
-static inline void ima_measure_critical_data(const char *event_name,
+static inline void ima_measure_critical_data(const char *event_label,
+                                            const char *event_name,
                                             const void *buf, size_t buf_len,
                                             bool hash) {}
+
 #endif /* CONFIG_IMA */
 
 #ifndef CONFIG_IMA_KEXEC
index 251e7b4006f4b897941d713e06020f88ce4f367f..6a429846f90a2acbcd3c6978d331ab140d9e2b7b 100644 (file)
@@ -945,6 +945,7 @@ void ima_kexec_cmdline(int kernel_fd, const void *buf, int size)
 
 /**
  * ima_measure_critical_data - measure kernel integrity critical data
+ * @event_label: unique event label for grouping and limiting critical data
  * @event_name: event name for the record in the IMA measurement list
  * @buf: pointer to buffer data
  * @buf_len: length of buffer data (in bytes)
@@ -955,15 +956,16 @@ void ima_kexec_cmdline(int kernel_fd, const void *buf, int size)
  * structures, policies, and states stored in kernel memory that can
  * impact the integrity of the system.
  */
-void ima_measure_critical_data(const char *event_name,
+void ima_measure_critical_data(const char *event_label,
+                              const char *event_name,
                               const void *buf, size_t buf_len,
                               bool hash)
 {
-       if (!event_name || !buf || !buf_len)
+       if (!event_name || !event_label || !buf || !buf_len)
                return;
 
        process_buffer_measurement(NULL, buf, buf_len, event_name,
-                                  CRITICAL_DATA, 0, NULL,
+                                  CRITICAL_DATA, 0, event_label,
                                   hash);
 }