* [PATCH v7 3/7] ima: kexec: skip IMA segment validation after kexec soft reboot
2025-02-03 18:42 [PATCH v7 0/7] ima: kexec: measure events between kexec load and excute steven chen
@ 2025-02-03 18:42 ` steven chen
0 siblings, 0 replies; 20+ messages in thread
From: steven chen @ 2025-02-03 18:42 UTC (permalink / raw)
To: zohar, stefanb, roberto.sassu, roberto.sassu, eric.snowberg,
ebiederm, paul, code, bauermann, inux-integrity, kexec,
linux-security-module, linux-kernel, chenste
Cc: madvenka, nramas, James.Bottomley
kexec_calculate_store_digests() calculates and stores the digest of the
segment at kexec_file_load syscall where the IMA segment is also
allocated. With this series, the IMA segment will be updated with the
measurement log at kexec excute stage when soft reboot is initiated.
Therefore, it may fail digest verification in verify_sha256_digest()
after kexec soft reboot into the new kernel. Therefore, the digest
calculation/verification of the IMA segment needs to be skipped.
Skip IMA segment from calculating and storing digest in function
kexec_calculate_store_digests() so that it is not added to the
'purgatory_sha_regions'.
Since verify_sha256_digest() only verifies 'purgatory_sha_regions',
no change is needed in verify_sha256_digest() in this context.
With this change, the IMA segment is not included in the digest
calculation, storage, and verification.
Author: Tushar Sugandhi <tusharsu@linux.microsoft.com>
Signed-off-by: Tushar Sugandhi <tusharsu@linux.microsoft.com>
Signed-off-by: steven chen <chenste@linux.microsoft.com>
---
include/linux/kexec.h | 3 +++
kernel/kexec_file.c | 23 +++++++++++++++++++++++
security/integrity/ima/ima_kexec.c | 3 +++
3 files changed, 29 insertions(+)
diff --git a/include/linux/kexec.h b/include/linux/kexec.h
index f8413ea5c8c8..f3246e881ac8 100644
--- a/include/linux/kexec.h
+++ b/include/linux/kexec.h
@@ -362,6 +362,9 @@ struct kimage {
phys_addr_t ima_buffer_addr;
size_t ima_buffer_size;
+
+ unsigned long ima_segment_index;
+ bool is_ima_segment_index_set;
#endif
/* Core ELF header buffer */
diff --git a/kernel/kexec_file.c b/kernel/kexec_file.c
index 3eedb8c226ad..a3370a0dce20 100644
--- a/kernel/kexec_file.c
+++ b/kernel/kexec_file.c
@@ -38,6 +38,22 @@ void set_kexec_sig_enforced(void)
}
#endif
+#ifdef CONFIG_IMA_KEXEC
+static bool check_ima_segment_index(struct kimage *image, int i)
+{
+ if (image->is_ima_segment_index_set &&
+ i == image->ima_segment_index)
+ return true;
+ else
+ return false;
+}
+#else
+static bool check_ima_segment_index(struct kimage *image, int i)
+{
+ return false;
+}
+#endif
+
static int kexec_calculate_store_digests(struct kimage *image);
/* Maximum size in bytes for kernel/initrd files. */
@@ -764,6 +780,13 @@ static int kexec_calculate_store_digests(struct kimage *image)
if (ksegment->kbuf == pi->purgatory_buf)
continue;
+ /*
+ * Skip the segment if ima_segment_index is set and matches
+ * the current index
+ */
+ if (check_ima_segment_index(image, i))
+ continue;
+
ret = crypto_shash_update(desc, ksegment->kbuf,
ksegment->bufsz);
if (ret)
diff --git a/security/integrity/ima/ima_kexec.c b/security/integrity/ima/ima_kexec.c
index b60a902460e2..283860d20521 100644
--- a/security/integrity/ima/ima_kexec.c
+++ b/security/integrity/ima/ima_kexec.c
@@ -162,6 +162,7 @@ void ima_add_kexec_buffer(struct kimage *image)
kbuf.buffer = kexec_buffer;
kbuf.bufsz = kexec_buffer_size;
kbuf.memsz = kexec_segment_size;
+ image->is_ima_segment_index_set = false;
ret = kexec_add_buffer(&kbuf);
if (ret) {
pr_err("Error passing over kexec measurement buffer.\n");
@@ -172,6 +173,8 @@ void ima_add_kexec_buffer(struct kimage *image)
image->ima_buffer_addr = kbuf.mem;
image->ima_buffer_size = kexec_segment_size;
image->ima_buffer = kexec_buffer;
+ image->ima_segment_index = image->nr_segments - 1;
+ image->is_ima_segment_index_set = true;
/*
* kexec owns kexec_buffer after kexec_add_buffer() is called
--
2.25.1
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v7 0/7] ima: kexec: measure events between kexec load and excute
@ 2025-02-03 18:45 steven chen
2025-02-03 18:45 ` [PATCH v7 1/7] ima: define and call ima_alloc_kexec_file_buf steven chen
` (8 more replies)
0 siblings, 9 replies; 20+ messages in thread
From: steven chen @ 2025-02-03 18:45 UTC (permalink / raw)
To: zohar, stefanb, roberto.sassu, roberto.sassu, eric.snowberg,
ebiederm, paul, code, bauermann, linux-integrity, kexec,
linux-security-module, linux-kernel, chenste
Cc: madvenka, nramas, James.Bottomley
The current kernel behavior is IMA measurements snapshot is taken at
kexec 'load' and not at kexec 'execute'. IMA log is then carried
over to the new kernel after kexec 'execute'.
New events can be measured during/after the IMA log snapshot at kexec
'load' and before the system boots to the new kernel. In this scenario,
the TPM PCRs are extended with these events, but they are not carried
over to the new kernel after kexec soft reboot since the snapshot is
already taken. This results in mismatch between TPM PCR quotes and the
actual IMA measurements list after kexec soft reboot, which in turn
results in remote attestation failure.
To solve this problem -
- allocate the necessary buffer at kexec 'load' time,
- populate the buffer with the IMA measurements at kexec 'execute' time,
- and measure two new IMA events 'kexec_load' and 'kexec_execute' as
critical data to help detect missing events after kexec soft reboot.
The solution details include:
- refactoring the existing code to allocate a buffer to hold IMA
measurements at kexec 'load', and dump the measurements at kexec
'execute'
- IMA functionality to suspend and resume measurements as needed during
buffer copy at kexec 'execute',
- kexec functionality for mapping the segments from the current kernel
to the subsequent one,
- necessary changes to the kexec_file_load syscall, enabling it to call
the ima functions,
- registering a reboot notifier which gets called during kexec
'execute',
- introducing a new Kconfig option to configure the extra memory to be
allocated for passing IMA log from the current Kernel to the next,
- introducing two new events to be measured by IMA during kexec, to
help diagnose if the IMA log was copied fully or partially, from the
current Kernel to the next,
- excluding IMA segment while calculating and storing digest in function
kexec_calculate_store_digests(), since IMA segment can be modified
after the digest is computed during kexec 'load'. This will ensure
that the segment is not added to the 'purgatory_sha_regions', and thus
not verified by verify_sha256_digest().
The changes proposed in this series ensure the integrity of the IMA
measurements is preserved across kexec soft reboots, thus significantly
improving the security of the kernel post kexec soft reboots.
There were previous attempts to fix this issue [1], [2], [3]. But they
were not merged into the mainline kernel.
We took inspiration from the past work [1] and [2] while working on this
patch series.
V4 of this series is available here[6] for reference.
V5 of this series is available here[7] for reference.
V6 of this series is available here[8] for reference.
References:
-----------
[1] [PATHC v2 5/9] ima: on soft reboot, save the measurement list
https://lore.kernel.org/lkml/1472596811-9596-6-git-send-email-zohar@linux.vnet.ibm.com/
[2] PATCH v2 4/6] kexec_file: Add mechanism to update kexec segments.
https://lkml.org/lkml/2016/8/16/577
[3] [PATCH 1/6] kexec_file: Add buffer hand-over support
https://lore.kernel.org/linuxppc-dev/1466473476-10104-6-git-send-email-bauerman@linux.vnet.ibm.com/T/
[4] [PATCH v2 0/7] ima: kexec: measure events between kexec load and execute
https://lore.kernel.org/all/20231005182602.634615-1-tusharsu@linux.microsoft.com/
[5] [PATCH v3 0/7] ima: kexec: measure events between kexec load and execute
https://lore.kernel.org/all/20231216010729.2904751-1-tusharsu@linux.microsoft.com/
[6] [PATCH v4 0/7] ima: kexec: measure events between kexec load and execute
https://lore.kernel.org/all/20240122183804.3293904-1-tusharsu@linux.microsoft.com/
[7] [PATCH v5 0/8] ima: kexec: measure events between kexec load and execute
https://lore.kernel.org/all/20240214153827.1087657-1-tusharsu@linux.microsoft.com/
[8] [PATCH v6 0/7] ima: kexec: measure events between kexec load and execute
https://lore.kernel.org/all/20250124225547.22684-1-chenste@linux.microsoft.com/
Change Log v7:
- Incorporated feedback from the community (Stefan Berger, Tyler Hicks)
on v6 of this series[8].
- Verified all the patches are bisect-safe by booting into each
patch and verifying multiple kexec 'load' operations work,
and also verifying kexec soft reboot works, and IMA log gets
carried over for each patch.
Change Log v6:
- Incorporated feedback from the community (Stefan Berger, Mimi Zohar,
and Petr Tesařík) on v5 of this series[7].
- Rebased the patch series to mainline 6.12.0.
- Verified all the patches are bisect-safe by booting into each
patch and verifying multiple kexec 'load' operations work,
and also verifying kexec soft reboot works, and IMA log gets
carried over for each patch.
- Compared the memory size allocated with memory size of the entire
measurement record. If there is not enough memory, it will copy as many
IMA measurement records as possible, and this situation will result
in a failure of remote attestation.
- [PATCH V5 6/8] was removed. Per petr comment on [PATCH V5 6/8], during
the handover, other CPUs are taken offline (look for
migrate_to_reboot_cpu() in kernel/kexec_core.c) and even the reboot CPU
will be sufficiently shut down as not to be able to add any more
measurements.
Change Log v5:
- Incorporated feedback from the community (Stefan Berger and
Mimi Zohar) on v4 of this series[6].
- Rebased the patch series to mainline 6.8.0-rc1.
- Verified all the patches are bisect-safe by booting into each
patch and verifying multiple kexec 'load' operations work,
and also verifying kexec soft reboot works, and IMA log gets
carried over for each patch.
- Divided the patch #4 in the v4 of the series[6] into two separate
patches. One to setup the infrastructure/stub functions to prepare
the IMA log copy from Kexec 'load' to 'execute', and another one
to actually copy the log.
- Updated the config description for IMA_KEXEC_EXTRA_MEMORY_KB
to remove unnecessary references related to backwards compatibility.
- Fixed a typo in log message/removed an extra line etc.
- Updated patch descriptions as necessary.
Change Log v4:
- Incorporated feedback from the community (Stefan Berger and
Mimi Zohar) on v3 of this series[5].
- Rearranged patches so that they remain bisect-safe i.e. the
system can go through kexec soft reboot, and IMA log is carried
over after each patch.
- Verified all the patches are bisect-safe by booting into each
patch and verifying kexec soft reboot works, and IMA log gets
carried over.
- Suspend-resume measurements is now a separate patch (patch #5)
and all the relevant code is part of the same patch.
- Excluding IMA segment from segment digest verification is now a
separate patch. (patch #3).
- Registering reboot notifier and functions related to move ima
log copy from kexec load to execute are now part of the same
patch (patch #4) to protect bisect-safeness of the series.
- Updated the title of patch #6 as per the feedback.
- The default value of kexec extra memory for IMA measurements
is set to half the PAGESIZE to maintain backwards compatibility.
- Added number of IMA measurement records as part of 'kexec_load'
and 'kexec_execute' IMA critical data events.
- Updated patch descriptions as necessary.
Change Log v3:
- Incorporated feedback from the community (Stefan Berger and
Mimi Zohar) on v2 of this series[4].
- Renamed functions and removed extraneous checks and code comments.
- Updated patch descriptions and titles as necessary.
- Updated kexec_calculate_store_digests() in patch 2/7 to exclude ima
segment from calculating and storing digest.
- Updated patch 3/7 to use kmalloc_array instead of kmalloc and freed
memory early to avoid potential memory leak.
- Updated patch 6/7 to change Kconfig option IMA_KEXEC_EXTRA_PAGES to
IMA_KEXEC_EXTRA_MEMORY_KB to allocate the memory in kb rather than
in number of pages.
- Optimized patch 7/7 not to free and alloc memory if the buffer size
hasn't changed during multiple kexec 'load' operations.
- Fixed a bug in patch 7/7 to measure multiple 'kexec_load' events even
if buffer size hasn't changed.
- Verified the patches are bisect-safe by compiling and booting into
each patch individually.
Change Log v2:
- Incorporated feedback from the community on v1 series.
- Refactored the existing ima_dump_measurement_list to move buffer
allocation functionality to ima_alloc_kexec_buf() function.
- Introduced a new Kconfig option to configure the memory.
- Updated the logic to copy the IMA log only in case of kexec soft
reboot, and not on kexec crash.
- Updated the logic to copy as many IMA events as possible in case of
memory constraint, rather than just bailing out.
- Introduced two new events to be measured by IMA during kexec, to
help diagnose if the IMA log was copied fully or partially from the
current Kernel to the next.
- Refactored patches to ensure no warnings during individual patch
compilation.
- Used virt_to_page instead of phys_to_page.
- Updated patch descriptions as necessary.
steven chen (7):
ima: define and call ima_alloc_kexec_file_buf
kexec: define functions to map and unmap segments
ima: kexec: skip IMA segment validation after kexec soft reboot
ima: kexec: define functions to copy IMA log at soft boot
ima: kexec: move IMA log copy from kexec load to execute
ima: make the kexec extra memory configurable
ima: measure kexec load and exec events as critical data
include/linux/ima.h | 3 +
include/linux/kexec.h | 10 ++
kernel/kexec_core.c | 54 ++++++++
kernel/kexec_file.c | 31 +++++
security/integrity/ima/Kconfig | 10 ++
security/integrity/ima/ima.h | 1 +
security/integrity/ima/ima_kexec.c | 208 ++++++++++++++++++++++++-----
security/integrity/ima/ima_queue.c | 4 +-
8 files changed, 284 insertions(+), 37 deletions(-)
--
2.25.1
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH v7 1/7] ima: define and call ima_alloc_kexec_file_buf
2025-02-03 18:45 [PATCH v7 0/7] ima: kexec: measure events between kexec load and excute steven chen
@ 2025-02-03 18:45 ` steven chen
2025-02-03 18:45 ` [PATCH v7 2/7] kexec: define functions to map and unmap segments steven chen
` (7 subsequent siblings)
8 siblings, 0 replies; 20+ messages in thread
From: steven chen @ 2025-02-03 18:45 UTC (permalink / raw)
To: zohar, stefanb, roberto.sassu, roberto.sassu, eric.snowberg,
ebiederm, paul, code, bauermann, linux-integrity, kexec,
linux-security-module, linux-kernel, chenste
Cc: madvenka, nramas, James.Bottomley
Carrying the IMA measurement list across kexec requires allocating a
buffer and copying the measurement records. Separate allocating the
buffer and copying the measurement records into separate functions in
order to allocate the buffer at kexec 'load' and copy the measurements
at kexec 'execute'.
This patch includes the following changes:
- Refactor ima_dump_measurement_list() to move the memory allocation
to a separate function ima_alloc_kexec_file_buf() which allocates
buffer of size 'kexec_segment_size' at kexec 'load'.
- Make the local variable ima_kexec_file in ima_dump_measurement_list()
a local static to the file, so that it can be accessed from
ima_alloc_kexec_file_buf(). Compare actual memory required to ensure
there is enough memory for the entire measurement record.
- Copy as many measurement events as possible.
- Make necessary changes to the function ima_add_kexec_buffer() to call
the above two functions.
- Compared the memory size allocated with memory size of the entire
measurement record. If there is not enough memory, it will copy as many
IMA measurement records as possible, and this situation will result
in a failure of remote attestation.
Author: Tushar Sugandhi <tusharsu@linux.microsoft.com>
Reviewed-by: Stefan Berger <stefanb@linux.ibm.com>
Suggested-by: Mimi Zohar <zohar@linux.ibm.com>
Signed-off-by: Tushar Sugandhi <tusharsu@linux.microsoft.com>
Signed-off-by: steven chen <chenste@linux.microsoft.com>
---
security/integrity/ima/ima.h | 1 +
security/integrity/ima/ima_kexec.c | 105 +++++++++++++++++++++--------
security/integrity/ima/ima_queue.c | 4 +-
3 files changed, 80 insertions(+), 30 deletions(-)
diff --git a/security/integrity/ima/ima.h b/security/integrity/ima/ima.h
index 3c323ca213d4..447a6eb07c2d 100644
--- a/security/integrity/ima/ima.h
+++ b/security/integrity/ima/ima.h
@@ -274,6 +274,7 @@ bool ima_template_has_modsig(const struct ima_template_desc *ima_template);
int ima_restore_measurement_entry(struct ima_template_entry *entry);
int ima_restore_measurement_list(loff_t bufsize, void *buf);
int ima_measurements_show(struct seq_file *m, void *v);
+int ima_get_binary_runtime_entry_size(struct ima_template_entry *entry);
unsigned long ima_get_binary_runtime_size(void);
int ima_init_template(void);
void ima_init_template_list(void);
diff --git a/security/integrity/ima/ima_kexec.c b/security/integrity/ima/ima_kexec.c
index 52e00332defe..b60a902460e2 100644
--- a/security/integrity/ima/ima_kexec.c
+++ b/security/integrity/ima/ima_kexec.c
@@ -15,62 +15,99 @@
#include "ima.h"
#ifdef CONFIG_IMA_KEXEC
+static struct seq_file ima_kexec_file;
+
+static void ima_reset_kexec_file(struct seq_file *sf)
+{
+ sf->buf = NULL;
+ sf->size = 0;
+ sf->read_pos = 0;
+ sf->count = 0;
+}
+
+static void ima_free_kexec_file_buf(struct seq_file *sf)
+{
+ vfree(sf->buf);
+ ima_reset_kexec_file(sf);
+}
+
+static int ima_alloc_kexec_file_buf(size_t segment_size)
+{
+ /*
+ * kexec 'load' may be called multiple times.
+ * Free and realloc the buffer only if the segment_size is
+ * changed from the previous kexec 'load' call.
+ */
+ if (ima_kexec_file.buf &&
+ (ima_kexec_file.size == segment_size)) {
+ goto out;
+ }
+
+ ima_free_kexec_file_buf(&ima_kexec_file);
+
+ /* segment size can't change between kexec load and execute */
+ ima_kexec_file.buf = vmalloc(segment_size);
+ if (!ima_kexec_file.buf)
+ return -ENOMEM;
+
+ ima_kexec_file.size = segment_size;
+
+out:
+ ima_kexec_file.read_pos = 0;
+ ima_kexec_file.count = sizeof(struct ima_kexec_hdr); /* reserved space */
+
+ return 0;
+}
+
static int ima_dump_measurement_list(unsigned long *buffer_size, void **buffer,
unsigned long segment_size)
{
struct ima_queue_entry *qe;
- struct seq_file file;
struct ima_kexec_hdr khdr;
int ret = 0;
+ size_t entry_size = 0;
- /* segment size can't change between kexec load and execute */
- file.buf = vmalloc(segment_size);
- if (!file.buf) {
- ret = -ENOMEM;
- goto out;
+ if (!ima_kexec_file.buf) {
+ pr_err("Kexec file buf not allocated\n");
+ return -EINVAL;
}
- file.file = NULL;
- file.size = segment_size;
- file.read_pos = 0;
- file.count = sizeof(khdr); /* reserved space */
-
memset(&khdr, 0, sizeof(khdr));
khdr.version = 1;
+
+ /* Copy as many IMA measurements list records as possible */
list_for_each_entry_rcu(qe, &ima_measurements, later) {
- if (file.count < file.size) {
+ entry_size += ima_get_binary_runtime_entry_size(qe->entry);
+ if (entry_size <= segment_size) {
khdr.count++;
- ima_measurements_show(&file, qe);
+ ima_measurements_show(&ima_kexec_file, qe);
} else {
ret = -EINVAL;
+ pr_err("IMA log file is too big for Kexec buf\n");
break;
}
}
- if (ret < 0)
- goto out;
-
/*
* fill in reserved space with some buffer details
* (eg. version, buffer size, number of measurements)
*/
- khdr.buffer_size = file.count;
+ khdr.buffer_size = ima_kexec_file.count;
if (ima_canonical_fmt) {
khdr.version = cpu_to_le16(khdr.version);
khdr.count = cpu_to_le64(khdr.count);
khdr.buffer_size = cpu_to_le64(khdr.buffer_size);
}
- memcpy(file.buf, &khdr, sizeof(khdr));
+ memcpy(ima_kexec_file.buf, &khdr, sizeof(khdr));
print_hex_dump_debug("ima dump: ", DUMP_PREFIX_NONE, 16, 1,
- file.buf, file.count < 100 ? file.count : 100,
+ ima_kexec_file.buf, ima_kexec_file.count < 100 ?
+ ima_kexec_file.count : 100,
true);
- *buffer_size = file.count;
- *buffer = file.buf;
-out:
- if (ret == -EINVAL)
- vfree(file.buf);
+ *buffer_size = ima_kexec_file.count;
+ *buffer = ima_kexec_file.buf;
+
return ret;
}
@@ -89,7 +126,7 @@ void ima_add_kexec_buffer(struct kimage *image)
/* use more understandable variable names than defined in kbuf */
void *kexec_buffer = NULL;
- size_t kexec_buffer_size;
+ size_t kexec_buffer_size = 0;
size_t kexec_segment_size;
int ret;
@@ -109,13 +146,19 @@ void ima_add_kexec_buffer(struct kimage *image)
return;
}
- ima_dump_measurement_list(&kexec_buffer_size, &kexec_buffer,
- kexec_segment_size);
- if (!kexec_buffer) {
+ ret = ima_alloc_kexec_file_buf(kexec_segment_size);
+ if (ret < 0) {
pr_err("Not enough memory for the kexec measurement buffer.\n");
return;
}
+ ret = ima_dump_measurement_list(&kexec_buffer_size, &kexec_buffer,
+ kexec_segment_size);
+ if (ret < 0) {
+ pr_err("Failed to dump IMA measurements. Error:%d.\n", ret);
+ return;
+ }
+
kbuf.buffer = kexec_buffer;
kbuf.bufsz = kexec_buffer_size;
kbuf.memsz = kexec_segment_size;
@@ -130,6 +173,12 @@ void ima_add_kexec_buffer(struct kimage *image)
image->ima_buffer_size = kexec_segment_size;
image->ima_buffer = kexec_buffer;
+ /*
+ * kexec owns kexec_buffer after kexec_add_buffer() is called
+ * and it will vfree() that buffer.
+ */
+ ima_reset_kexec_file(&ima_kexec_file);
+
kexec_dprintk("kexec measurement buffer for the loaded kernel at 0x%lx.\n",
kbuf.mem);
}
diff --git a/security/integrity/ima/ima_queue.c b/security/integrity/ima/ima_queue.c
index 532da87ce519..a3559bae251f 100644
--- a/security/integrity/ima/ima_queue.c
+++ b/security/integrity/ima/ima_queue.c
@@ -71,7 +71,7 @@ static struct ima_queue_entry *ima_lookup_digest_entry(u8 *digest_value,
* binary_runtime_measurement list entry, which contains a
* couple of variable length fields (e.g template name and data).
*/
-static int get_binary_runtime_size(struct ima_template_entry *entry)
+int ima_get_binary_runtime_entry_size(struct ima_template_entry *entry)
{
int size = 0;
@@ -115,7 +115,7 @@ static int ima_add_digest_entry(struct ima_template_entry *entry,
if (binary_runtime_size != ULONG_MAX) {
int size;
- size = get_binary_runtime_size(entry);
+ size = ima_get_binary_runtime_entry_size(entry);
binary_runtime_size = (binary_runtime_size < ULONG_MAX - size) ?
binary_runtime_size + size : ULONG_MAX;
}
--
2.25.1
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v7 2/7] kexec: define functions to map and unmap segments
2025-02-03 18:45 [PATCH v7 0/7] ima: kexec: measure events between kexec load and excute steven chen
2025-02-03 18:45 ` [PATCH v7 1/7] ima: define and call ima_alloc_kexec_file_buf steven chen
@ 2025-02-03 18:45 ` steven chen
2025-02-03 18:45 ` [PATCH v7 3/7] ima: kexec: skip IMA segment validation after kexec soft reboot steven chen
` (6 subsequent siblings)
8 siblings, 0 replies; 20+ messages in thread
From: steven chen @ 2025-02-03 18:45 UTC (permalink / raw)
To: zohar, stefanb, roberto.sassu, roberto.sassu, eric.snowberg,
ebiederm, paul, code, bauermann, linux-integrity, kexec,
linux-security-module, linux-kernel, chenste
Cc: madvenka, nramas, James.Bottomley
Currently, the mechanism to map and unmap segments to the kimage
structure is not available to the subsystems outside of kexec. This
functionality is needed when IMA is allocating the memory segments
during kexec 'load' operation. Implement functions to map and unmap
segments to kimage.
Implement kimage_map_segment() to enable mapping of IMA buffer source
pages to the kimage structure post kexec 'load'. This function,
accepting a kimage pointer, an address, and a size, will gather the
source pages within the specified address range, create an array of page
pointers, and map these to a contiguous virtual address range. The
function returns the start of this range if successful, or NULL if
unsuccessful.
Implement kimage_unmap_segment() for unmapping segments
using vunmap().
From: Tushar Sugandhi <tusharsu@linux.microsoft.com>
Author: Tushar Sugandhi <tusharsu@linux.microsoft.com>
Reviewed-by: Stefan Berger <stefanb@linux.ibm.com>
Reviewed-by: Mimi Zohar <zohar@linux.ibm.com>
Signed-off-by: Tushar Sugandhi <tusharsu@linux.microsoft.com>
Signed-off-by: steven chen <chenste@linux.microsoft.com>
---
include/linux/kexec.h | 7 ++++++
kernel/kexec_core.c | 54 +++++++++++++++++++++++++++++++++++++++++++
2 files changed, 61 insertions(+)
diff --git a/include/linux/kexec.h b/include/linux/kexec.h
index f0e9f8eda7a3..f8413ea5c8c8 100644
--- a/include/linux/kexec.h
+++ b/include/linux/kexec.h
@@ -467,6 +467,9 @@ extern bool kexec_file_dbg_print;
#define kexec_dprintk(fmt, arg...) \
do { if (kexec_file_dbg_print) pr_info(fmt, ##arg); } while (0)
+extern void *kimage_map_segment(struct kimage *image,
+ unsigned long addr, unsigned long size);
+extern void kimage_unmap_segment(void *buffer);
#else /* !CONFIG_KEXEC_CORE */
struct pt_regs;
struct task_struct;
@@ -474,6 +477,10 @@ static inline void __crash_kexec(struct pt_regs *regs) { }
static inline void crash_kexec(struct pt_regs *regs) { }
static inline int kexec_should_crash(struct task_struct *p) { return 0; }
static inline int kexec_crash_loaded(void) { return 0; }
+static inline void *kimage_map_segment(struct kimage *image,
+ unsigned long addr, unsigned long size)
+{ return NULL; }
+static inline void kimage_unmap_segment(void *buffer) { }
#define kexec_in_progress false
#endif /* CONFIG_KEXEC_CORE */
diff --git a/kernel/kexec_core.c b/kernel/kexec_core.c
index c0caa14880c3..4029df8f6860 100644
--- a/kernel/kexec_core.c
+++ b/kernel/kexec_core.c
@@ -867,6 +867,60 @@ int kimage_load_segment(struct kimage *image,
return result;
}
+void *kimage_map_segment(struct kimage *image,
+ unsigned long addr, unsigned long size)
+{
+ unsigned long eaddr = addr + size;
+ unsigned long src_page_addr, dest_page_addr;
+ unsigned int npages;
+ struct page **src_pages;
+ int i;
+ kimage_entry_t *ptr, entry;
+ void *vaddr = NULL;
+
+ /*
+ * Collect the source pages and map them in a contiguous VA range.
+ */
+ npages = PFN_UP(eaddr) - PFN_DOWN(addr);
+ src_pages = kmalloc_array(npages, sizeof(*src_pages), GFP_KERNEL);
+ if (!src_pages) {
+ pr_err("Could not allocate ima pages array.\n");
+ return NULL;
+ }
+
+ i = 0;
+ for_each_kimage_entry(image, ptr, entry) {
+ if (entry & IND_DESTINATION)
+ dest_page_addr = entry & PAGE_MASK;
+ else if (entry & IND_SOURCE) {
+ if (dest_page_addr >= addr && dest_page_addr < eaddr) {
+ src_page_addr = entry & PAGE_MASK;
+ src_pages[i++] =
+ virt_to_page(__va(src_page_addr));
+ if (i == npages)
+ break;
+ dest_page_addr += PAGE_SIZE;
+ }
+ }
+ }
+
+ /* Sanity check. */
+ WARN_ON(i < npages);
+
+ vaddr = vmap(src_pages, npages, VM_MAP, PAGE_KERNEL);
+ kfree(src_pages);
+
+ if (!vaddr)
+ pr_err("Could not map ima buffer.\n");
+
+ return vaddr;
+}
+
+void kimage_unmap_segment(void *segment_buffer)
+{
+ vunmap(segment_buffer);
+}
+
struct kexec_load_limit {
/* Mutex protects the limit count. */
struct mutex mutex;
--
2.25.1
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v7 3/7] ima: kexec: skip IMA segment validation after kexec soft reboot
2025-02-03 18:45 [PATCH v7 0/7] ima: kexec: measure events between kexec load and excute steven chen
2025-02-03 18:45 ` [PATCH v7 1/7] ima: define and call ima_alloc_kexec_file_buf steven chen
2025-02-03 18:45 ` [PATCH v7 2/7] kexec: define functions to map and unmap segments steven chen
@ 2025-02-03 18:45 ` steven chen
2025-02-03 18:45 ` [PATCH v7 4/7] ima: kexec: define functions to copy IMA log at soft boot steven chen
` (5 subsequent siblings)
8 siblings, 0 replies; 20+ messages in thread
From: steven chen @ 2025-02-03 18:45 UTC (permalink / raw)
To: zohar, stefanb, roberto.sassu, roberto.sassu, eric.snowberg,
ebiederm, paul, code, bauermann, linux-integrity, kexec,
linux-security-module, linux-kernel, chenste
Cc: madvenka, nramas, James.Bottomley
kexec_calculate_store_digests() calculates and stores the digest of the
segment at kexec_file_load syscall where the IMA segment is also
allocated. With this series, the IMA segment will be updated with the
measurement log at kexec excute stage when soft reboot is initiated.
Therefore, it may fail digest verification in verify_sha256_digest()
after kexec soft reboot into the new kernel. Therefore, the digest
calculation/verification of the IMA segment needs to be skipped.
Skip IMA segment from calculating and storing digest in function
kexec_calculate_store_digests() so that it is not added to the
'purgatory_sha_regions'.
Since verify_sha256_digest() only verifies 'purgatory_sha_regions',
no change is needed in verify_sha256_digest() in this context.
With this change, the IMA segment is not included in the digest
calculation, storage, and verification.
Author: Tushar Sugandhi <tusharsu@linux.microsoft.com>
Signed-off-by: Tushar Sugandhi <tusharsu@linux.microsoft.com>
Signed-off-by: steven chen <chenste@linux.microsoft.com>
---
include/linux/kexec.h | 3 +++
kernel/kexec_file.c | 23 +++++++++++++++++++++++
security/integrity/ima/ima_kexec.c | 3 +++
3 files changed, 29 insertions(+)
diff --git a/include/linux/kexec.h b/include/linux/kexec.h
index f8413ea5c8c8..f3246e881ac8 100644
--- a/include/linux/kexec.h
+++ b/include/linux/kexec.h
@@ -362,6 +362,9 @@ struct kimage {
phys_addr_t ima_buffer_addr;
size_t ima_buffer_size;
+
+ unsigned long ima_segment_index;
+ bool is_ima_segment_index_set;
#endif
/* Core ELF header buffer */
diff --git a/kernel/kexec_file.c b/kernel/kexec_file.c
index 3eedb8c226ad..a3370a0dce20 100644
--- a/kernel/kexec_file.c
+++ b/kernel/kexec_file.c
@@ -38,6 +38,22 @@ void set_kexec_sig_enforced(void)
}
#endif
+#ifdef CONFIG_IMA_KEXEC
+static bool check_ima_segment_index(struct kimage *image, int i)
+{
+ if (image->is_ima_segment_index_set &&
+ i == image->ima_segment_index)
+ return true;
+ else
+ return false;
+}
+#else
+static bool check_ima_segment_index(struct kimage *image, int i)
+{
+ return false;
+}
+#endif
+
static int kexec_calculate_store_digests(struct kimage *image);
/* Maximum size in bytes for kernel/initrd files. */
@@ -764,6 +780,13 @@ static int kexec_calculate_store_digests(struct kimage *image)
if (ksegment->kbuf == pi->purgatory_buf)
continue;
+ /*
+ * Skip the segment if ima_segment_index is set and matches
+ * the current index
+ */
+ if (check_ima_segment_index(image, i))
+ continue;
+
ret = crypto_shash_update(desc, ksegment->kbuf,
ksegment->bufsz);
if (ret)
diff --git a/security/integrity/ima/ima_kexec.c b/security/integrity/ima/ima_kexec.c
index b60a902460e2..283860d20521 100644
--- a/security/integrity/ima/ima_kexec.c
+++ b/security/integrity/ima/ima_kexec.c
@@ -162,6 +162,7 @@ void ima_add_kexec_buffer(struct kimage *image)
kbuf.buffer = kexec_buffer;
kbuf.bufsz = kexec_buffer_size;
kbuf.memsz = kexec_segment_size;
+ image->is_ima_segment_index_set = false;
ret = kexec_add_buffer(&kbuf);
if (ret) {
pr_err("Error passing over kexec measurement buffer.\n");
@@ -172,6 +173,8 @@ void ima_add_kexec_buffer(struct kimage *image)
image->ima_buffer_addr = kbuf.mem;
image->ima_buffer_size = kexec_segment_size;
image->ima_buffer = kexec_buffer;
+ image->ima_segment_index = image->nr_segments - 1;
+ image->is_ima_segment_index_set = true;
/*
* kexec owns kexec_buffer after kexec_add_buffer() is called
--
2.25.1
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v7 4/7] ima: kexec: define functions to copy IMA log at soft boot
2025-02-03 18:45 [PATCH v7 0/7] ima: kexec: measure events between kexec load and excute steven chen
` (2 preceding siblings ...)
2025-02-03 18:45 ` [PATCH v7 3/7] ima: kexec: skip IMA segment validation after kexec soft reboot steven chen
@ 2025-02-03 18:45 ` steven chen
2025-02-03 18:45 ` steven chen
` (4 subsequent siblings)
8 siblings, 0 replies; 20+ messages in thread
From: steven chen @ 2025-02-03 18:45 UTC (permalink / raw)
To: zohar, stefanb, roberto.sassu, roberto.sassu, eric.snowberg,
ebiederm, paul, code, bauermann, linux-integrity, kexec,
linux-security-module, linux-kernel, chenste
Cc: madvenka, nramas, James.Bottomley
IMA log is copied to the new Kernel during kexec 'load' using
ima_dump_measurement_list(). The log copy at kexec 'load' may result in
loss of IMA measurements during kexec soft reboot. It needs to be copied
over during kexec 'execute'. Setup the needed infrastructure to move the
IMA log copy from kexec 'load' to 'execute'.
Define a new IMA hook ima_update_kexec_buffer() as a stub function.
It will be used to call ima_dump_measurement_list() during kexec
'execute'.
Implement ima_kexec_post_load() function to be invoked after the new
Kernel image has been loaded for kexec. ima_kexec_post_load() maps the
IMA buffer to a segment in the newly loaded Kernel. It also registers
the reboot notifier_block to trigger ima_update_kexec_buffer() at
exec 'execute'.
Author: Tushar Sugandhi <tusharsu@linux.microsoft.com>
Reviewed-by: Stefan Berger <stefanb@linux.ibm.com>
Suggested-by: Mimi Zohar <zohar@linux.ibm.com>
Reviewed-by: "Petr Tesařík" <petr@tesarici.cz>
Signed-off-by: Tushar Sugandhi <tusharsu@linux.microsoft.com>
Signed-off-by: steven chen <chenste@linux.microsoft.com>
---
include/linux/ima.h | 3 ++
security/integrity/ima/ima_kexec.c | 46 ++++++++++++++++++++++++++++++
2 files changed, 49 insertions(+)
diff --git a/include/linux/ima.h b/include/linux/ima.h
index 0bae61a15b60..8e29cb4e6a01 100644
--- a/include/linux/ima.h
+++ b/include/linux/ima.h
@@ -32,6 +32,9 @@ static inline void ima_appraise_parse_cmdline(void) {}
#ifdef CONFIG_IMA_KEXEC
extern void ima_add_kexec_buffer(struct kimage *image);
+extern void ima_kexec_post_load(struct kimage *image);
+#else
+static inline void ima_kexec_post_load(struct kimage *image) {}
#endif
#else
diff --git a/security/integrity/ima/ima_kexec.c b/security/integrity/ima/ima_kexec.c
index 283860d20521..854b90d34e2d 100644
--- a/security/integrity/ima/ima_kexec.c
+++ b/security/integrity/ima/ima_kexec.c
@@ -12,10 +12,14 @@
#include <linux/kexec.h>
#include <linux/of.h>
#include <linux/ima.h>
+#include <linux/reboot.h>
+#include <asm/page.h>
#include "ima.h"
#ifdef CONFIG_IMA_KEXEC
static struct seq_file ima_kexec_file;
+static void *ima_kexec_buffer;
+static bool ima_kexec_update_registered;
static void ima_reset_kexec_file(struct seq_file *sf)
{
@@ -185,6 +189,48 @@ void ima_add_kexec_buffer(struct kimage *image)
kexec_dprintk("kexec measurement buffer for the loaded kernel at 0x%lx.\n",
kbuf.mem);
}
+
+/*
+ * Called during kexec execute so that IMA can update the measurement list.
+ */
+static int ima_update_kexec_buffer(struct notifier_block *self,
+ unsigned long action, void *data)
+{
+ return NOTIFY_OK;
+}
+
+struct notifier_block update_buffer_nb = {
+ .notifier_call = ima_update_kexec_buffer,
+};
+
+/*
+ * Create a mapping for the source pages that contain the IMA buffer
+ * so we can update it later.
+ */
+void ima_kexec_post_load(struct kimage *image)
+{
+ if (ima_kexec_buffer) {
+ kimage_unmap_segment(ima_kexec_buffer);
+ ima_kexec_buffer = NULL;
+ }
+
+ if (!image->ima_buffer_addr)
+ return;
+
+ ima_kexec_buffer = kimage_map_segment(image,
+ image->ima_buffer_addr,
+ image->ima_buffer_size);
+ if (!ima_kexec_buffer) {
+ pr_err("Could not map measurements buffer.\n");
+ return;
+ }
+
+ if (!ima_kexec_update_registered) {
+ register_reboot_notifier(&update_buffer_nb);
+ ima_kexec_update_registered = true;
+ }
+}
+
#endif /* IMA_KEXEC */
/*
--
2.25.1
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v7 4/7] ima: kexec: define functions to copy IMA log at soft boot
2025-02-03 18:45 [PATCH v7 0/7] ima: kexec: measure events between kexec load and excute steven chen
` (3 preceding siblings ...)
2025-02-03 18:45 ` [PATCH v7 4/7] ima: kexec: define functions to copy IMA log at soft boot steven chen
@ 2025-02-03 18:45 ` steven chen
2025-02-03 18:45 ` [PATCH v7 6/7] ima: make the kexec extra memory configurable steven chen
` (3 subsequent siblings)
8 siblings, 0 replies; 20+ messages in thread
From: steven chen @ 2025-02-03 18:45 UTC (permalink / raw)
To: zohar, stefanb, roberto.sassu, roberto.sassu, eric.snowberg,
ebiederm, paul, code, bauermann, linux-integrity, kexec,
linux-security-module, linux-kernel, chenste
Cc: madvenka, nramas, James.Bottomley
IMA log is copied to the new Kernel during kexec 'load' using
ima_dump_measurement_list(). The log copy at kexec 'load' may result in
loss of IMA measurements during kexec soft reboot. It needs to be copied
over during kexec 'execute'. Setup the needed infrastructure to move the
IMA log copy from kexec 'load' to 'execute'.
Define a new IMA hook ima_update_kexec_buffer() as a stub function.
It will be used to call ima_dump_measurement_list() during kexec
'execute'.
Implement ima_kexec_post_load() function to be invoked after the new
Kernel image has been loaded for kexec. ima_kexec_post_load() maps the
IMA buffer to a segment in the newly loaded Kernel. It also registers
the reboot notifier_block to trigger ima_update_kexec_buffer() at
exec 'execute'.
Author: Tushar Sugandhi <tusharsu@linux.microsoft.com>
Reviewed-by: Stefan Berger <stefanb@linux.ibm.com>
Suggested-by: Mimi Zohar <zohar@linux.ibm.com>
Reviewed-by: "Petr Tesařík" <petr@tesarici.cz>
Signed-off-by: Tushar Sugandhi <tusharsu@linux.microsoft.com>
Signed-off-by: steven chen <chenste@linux.microsoft.com>
---
include/linux/ima.h | 3 ++
security/integrity/ima/ima_kexec.c | 46 ++++++++++++++++++++++++++++++
2 files changed, 49 insertions(+)
diff --git a/include/linux/ima.h b/include/linux/ima.h
index 0bae61a15b60..8e29cb4e6a01 100644
--- a/include/linux/ima.h
+++ b/include/linux/ima.h
@@ -32,6 +32,9 @@ static inline void ima_appraise_parse_cmdline(void) {}
#ifdef CONFIG_IMA_KEXEC
extern void ima_add_kexec_buffer(struct kimage *image);
+extern void ima_kexec_post_load(struct kimage *image);
+#else
+static inline void ima_kexec_post_load(struct kimage *image) {}
#endif
#else
diff --git a/security/integrity/ima/ima_kexec.c b/security/integrity/ima/ima_kexec.c
index 283860d20521..854b90d34e2d 100644
--- a/security/integrity/ima/ima_kexec.c
+++ b/security/integrity/ima/ima_kexec.c
@@ -12,10 +12,14 @@
#include <linux/kexec.h>
#include <linux/of.h>
#include <linux/ima.h>
+#include <linux/reboot.h>
+#include <asm/page.h>
#include "ima.h"
#ifdef CONFIG_IMA_KEXEC
static struct seq_file ima_kexec_file;
+static void *ima_kexec_buffer;
+static bool ima_kexec_update_registered;
static void ima_reset_kexec_file(struct seq_file *sf)
{
@@ -185,6 +189,48 @@ void ima_add_kexec_buffer(struct kimage *image)
kexec_dprintk("kexec measurement buffer for the loaded kernel at 0x%lx.\n",
kbuf.mem);
}
+
+/*
+ * Called during kexec execute so that IMA can update the measurement list.
+ */
+static int ima_update_kexec_buffer(struct notifier_block *self,
+ unsigned long action, void *data)
+{
+ return NOTIFY_OK;
+}
+
+struct notifier_block update_buffer_nb = {
+ .notifier_call = ima_update_kexec_buffer,
+};
+
+/*
+ * Create a mapping for the source pages that contain the IMA buffer
+ * so we can update it later.
+ */
+void ima_kexec_post_load(struct kimage *image)
+{
+ if (ima_kexec_buffer) {
+ kimage_unmap_segment(ima_kexec_buffer);
+ ima_kexec_buffer = NULL;
+ }
+
+ if (!image->ima_buffer_addr)
+ return;
+
+ ima_kexec_buffer = kimage_map_segment(image,
+ image->ima_buffer_addr,
+ image->ima_buffer_size);
+ if (!ima_kexec_buffer) {
+ pr_err("Could not map measurements buffer.\n");
+ return;
+ }
+
+ if (!ima_kexec_update_registered) {
+ register_reboot_notifier(&update_buffer_nb);
+ ima_kexec_update_registered = true;
+ }
+}
+
#endif /* IMA_KEXEC */
/*
--
2.25.1
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v7 6/7] ima: make the kexec extra memory configurable
2025-02-03 18:45 [PATCH v7 0/7] ima: kexec: measure events between kexec load and excute steven chen
` (4 preceding siblings ...)
2025-02-03 18:45 ` steven chen
@ 2025-02-03 18:45 ` steven chen
2025-02-03 18:45 ` [PATCH v7 7/7] ima: measure kexec load and exec events as critical data steven chen
` (2 subsequent siblings)
8 siblings, 0 replies; 20+ messages in thread
From: steven chen @ 2025-02-03 18:45 UTC (permalink / raw)
To: zohar, stefanb, roberto.sassu, roberto.sassu, eric.snowberg,
ebiederm, paul, code, bauermann, linux-integrity, kexec,
linux-security-module, linux-kernel, chenste
Cc: madvenka, nramas, James.Bottomley
The extra memory allocated for carrying the IMA measurement list across
kexec is hard-coded as half a PAGE. Make it configurable.
Define a Kconfig option, IMA_KEXEC_EXTRA_MEMORY_KB, to configure the
extra memory (in kb) to be allocated for IMA measurements added during
kexec soft reboot. Ensure the default value of the option is set such
that extra half a page of memory for additional measurements is allocated
for the additional measurements.
Update ima_add_kexec_buffer() function to allocate memory based on the
Kconfig option value, rather than the currently hard-coded one.
From: Tushar Sugandhi <tusharsu@linux.microsoft.com>
Author: Tushar Sugandhi <tusharsu@linux.microsoft.com>
Suggested-by: Stefan Berger <stefanb@linux.ibm.com>
Signed-off-by: Tushar Sugandhi <tusharsu@linux.microsoft.com>
Signed-off-by: steven chen <chenste@linux.microsoft.com>
---
security/integrity/ima/Kconfig | 10 ++++++++++
security/integrity/ima/ima_kexec.c | 16 ++++++++++------
2 files changed, 20 insertions(+), 6 deletions(-)
diff --git a/security/integrity/ima/Kconfig b/security/integrity/ima/Kconfig
index 475c32615006..54b145ae6096 100644
--- a/security/integrity/ima/Kconfig
+++ b/security/integrity/ima/Kconfig
@@ -321,4 +321,14 @@ config IMA_DISABLE_HTABLE
help
This option disables htable to allow measurement of duplicate records.
+config IMA_KEXEC_EXTRA_MEMORY_KB
+ int "Extra memory for IMA measurements added during kexec soft reboot"
+ depends on IMA_KEXEC
+ default 0
+ help
+ IMA_KEXEC_EXTRA_MEMORY_KB determines the extra memory to be
+ allocated (in kb) for IMA measurements added during kexec soft reboot.
+ If set to the default value, an extra half a page of memory for those
+ additional measurements will be allocated.
+
endif
diff --git a/security/integrity/ima/ima_kexec.c b/security/integrity/ima/ima_kexec.c
index d5f004cfeaec..c9c916f69ca7 100644
--- a/security/integrity/ima/ima_kexec.c
+++ b/security/integrity/ima/ima_kexec.c
@@ -128,22 +128,26 @@ void ima_add_kexec_buffer(struct kimage *image)
.buf_min = 0, .buf_max = ULONG_MAX,
.top_down = true };
unsigned long binary_runtime_size;
-
+ unsigned long extra_size;
/* use more understandable variable names than defined in kbuf */
void *kexec_buffer = NULL;
size_t kexec_buffer_size = 0;
int ret;
/*
- * Reserve an extra half page of memory for additional measurements
- * added during the kexec load.
+ * Reserve extra memory for measurements added during kexec.
*/
- binary_runtime_size = ima_get_binary_runtime_size();
+ if (CONFIG_IMA_KEXEC_EXTRA_MEMORY_KB <= 0)
+ extra_size = PAGE_SIZE / 2;
+ else
+ extra_size = CONFIG_IMA_KEXEC_EXTRA_MEMORY_KB * 1024;
+ binary_runtime_size = ima_get_binary_runtime_size() + extra_size;
+
if (binary_runtime_size >= ULONG_MAX - PAGE_SIZE)
kexec_segment_size = ULONG_MAX;
else
- kexec_segment_size = ALIGN(ima_get_binary_runtime_size() +
- PAGE_SIZE / 2, PAGE_SIZE);
+ kexec_segment_size = ALIGN(binary_runtime_size, PAGE_SIZE);
+
if ((kexec_segment_size == ULONG_MAX) ||
((kexec_segment_size >> PAGE_SHIFT) > totalram_pages() / 2)) {
pr_err("Binary measurement list too large.\n");
--
2.25.1
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v7 7/7] ima: measure kexec load and exec events as critical data
2025-02-03 18:45 [PATCH v7 0/7] ima: kexec: measure events between kexec load and excute steven chen
` (5 preceding siblings ...)
2025-02-03 18:45 ` [PATCH v7 6/7] ima: make the kexec extra memory configurable steven chen
@ 2025-02-03 18:45 ` steven chen
2025-02-03 22:44 ` [PATCH v7 0/7] ima: kexec: measure events between kexec load and excute Stefan Berger
2025-02-03 23:25 ` steven chen
8 siblings, 0 replies; 20+ messages in thread
From: steven chen @ 2025-02-03 18:45 UTC (permalink / raw)
To: zohar, stefanb, roberto.sassu, roberto.sassu, eric.snowberg,
ebiederm, paul, code, bauermann, linux-integrity, kexec,
linux-security-module, linux-kernel, chenste
Cc: madvenka, nramas, James.Bottomley
The amount of memory allocated at kexec load, even with the extra memory
allocated, might not be large enough for the entire measurement list. The
indeterminate interval between kexec 'load' and 'execute' could exacerbate
this problem.
Define two new IMA events, 'kexec_load' and 'kexec_execute', to be
measured as critical data at kexec 'load' and 'execute' respectively.
Report the allocated kexec segment size, IMA binary log size and the
runtime measurements count as part of those events.
These events, and the values reported through them, serve as markers in
the IMA log to verify the IMA events are captured during kexec soft
reboot. The presence of a 'kexec_load' event in between the last two
'boot_aggregate' events in the IMA log implies this is a kexec soft
reboot, and not a cold-boot. And the absence of 'kexec_execute' event
after kexec soft reboot implies missing events in that window which
results in inconsistency with TPM PCR quotes, necessitating a cold boot
for a successful remote attestation.
Reviewed-by: Stefan Berger <stefanb@linux.ibm.com>
Author: Tushar Sugandhi <tusharsu@linux.microsoft.com>
Signed-off-by: Tushar Sugandhi <tusharsu@linux.microsoft.com>
Signed-off-by: steven chen <chenste@linux.microsoft.com>
---
security/integrity/ima/ima_kexec.c | 23 +++++++++++++++++++++++
1 file changed, 23 insertions(+)
diff --git a/security/integrity/ima/ima_kexec.c b/security/integrity/ima/ima_kexec.c
index c9c916f69ca7..0342ddfa9342 100644
--- a/security/integrity/ima/ima_kexec.c
+++ b/security/integrity/ima/ima_kexec.c
@@ -17,6 +17,8 @@
#include "ima.h"
#ifdef CONFIG_IMA_KEXEC
+#define IMA_KEXEC_EVENT_LEN 256
+
static struct seq_file ima_kexec_file;
static void *ima_kexec_buffer;
static size_t kexec_segment_size;
@@ -36,6 +38,24 @@ static void ima_free_kexec_file_buf(struct seq_file *sf)
ima_reset_kexec_file(sf);
}
+static void ima_measure_kexec_event(const char *event_name)
+{
+ char ima_kexec_event[IMA_KEXEC_EVENT_LEN];
+ size_t buf_size = 0;
+ long len;
+
+ buf_size = ima_get_binary_runtime_size();
+ len = atomic_long_read(&ima_htable.len);
+
+ scnprintf(ima_kexec_event, IMA_KEXEC_EVENT_LEN,
+ "kexec_segment_size=%lu;ima_binary_runtime_size=%lu;"
+ "ima_runtime_measurements_count=%ld;",
+ kexec_segment_size, buf_size, len);
+
+ ima_measure_critical_data("ima_kexec", event_name, ima_kexec_event,
+ strlen(ima_kexec_event), false, NULL, 0);
+}
+
static int ima_alloc_kexec_file_buf(size_t segment_size)
{
/*
@@ -60,6 +80,7 @@ static int ima_alloc_kexec_file_buf(size_t segment_size)
out:
ima_kexec_file.read_pos = 0;
ima_kexec_file.count = sizeof(struct ima_kexec_hdr); /* reserved space */
+ ima_measure_kexec_event("kexec_load");
return 0;
}
@@ -201,6 +222,8 @@ static int ima_update_kexec_buffer(struct notifier_block *self,
return ret;
}
+ ima_measure_kexec_event("kexec_execute");
+
ret = ima_dump_measurement_list(&buf_size, &buf,
kexec_segment_size);
--
2.25.1
^ permalink raw reply related [flat|nested] 20+ messages in thread
* Re: [PATCH v7 0/7] ima: kexec: measure events between kexec load and excute
2025-02-03 18:45 [PATCH v7 0/7] ima: kexec: measure events between kexec load and excute steven chen
` (6 preceding siblings ...)
2025-02-03 18:45 ` [PATCH v7 7/7] ima: measure kexec load and exec events as critical data steven chen
@ 2025-02-03 22:44 ` Stefan Berger
2025-02-03 23:25 ` steven chen
8 siblings, 0 replies; 20+ messages in thread
From: Stefan Berger @ 2025-02-03 22:44 UTC (permalink / raw)
To: steven chen, zohar, roberto.sassu, roberto.sassu, eric.snowberg,
ebiederm, paul, code, bauermann, linux-integrity, kexec,
linux-security-module, linux-kernel
Cc: madvenka, nramas, James.Bottomley
On 2/3/25 1:45 PM, steven chen wrote:
It looks like 5/7 is missing.
Does it apply to 6.13?
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH v7 3/7] ima: kexec: skip IMA segment validation after kexec soft reboot
2025-02-03 23:20 [PATCH v7 0/7] ima: kexec: measure events between kexec load and excute steven chen
@ 2025-02-03 23:20 ` steven chen
2025-02-04 19:39 ` Stefan Berger
0 siblings, 1 reply; 20+ messages in thread
From: steven chen @ 2025-02-03 23:20 UTC (permalink / raw)
To: zohar, stefanb, roberto.sassu, roberto.sassu, eric.snowberg,
ebiederm, paul, code, bauermann, linux-integrity, kexec,
linux-security-module, linux-kernel, chenste
Cc: madvenka, nramas, James.Bottomley
kexec_calculate_store_digests() calculates and stores the digest of the
segment at kexec_file_load syscall where the IMA segment is also
allocated. With this series, the IMA segment will be updated with the
measurement log at kexec excute stage when soft reboot is initiated.
Therefore, it may fail digest verification in verify_sha256_digest()
after kexec soft reboot into the new kernel. Therefore, the digest
calculation/verification of the IMA segment needs to be skipped.
Skip IMA segment from calculating and storing digest in function
kexec_calculate_store_digests() so that it is not added to the
'purgatory_sha_regions'.
Since verify_sha256_digest() only verifies 'purgatory_sha_regions',
no change is needed in verify_sha256_digest() in this context.
With this change, the IMA segment is not included in the digest
calculation, storage, and verification.
Author: Tushar Sugandhi <tusharsu@linux.microsoft.com>
Signed-off-by: Tushar Sugandhi <tusharsu@linux.microsoft.com>
Signed-off-by: steven chen <chenste@linux.microsoft.com>
---
include/linux/kexec.h | 3 +++
kernel/kexec_file.c | 23 +++++++++++++++++++++++
security/integrity/ima/ima_kexec.c | 3 +++
3 files changed, 29 insertions(+)
diff --git a/include/linux/kexec.h b/include/linux/kexec.h
index f8413ea5c8c8..f3246e881ac8 100644
--- a/include/linux/kexec.h
+++ b/include/linux/kexec.h
@@ -362,6 +362,9 @@ struct kimage {
phys_addr_t ima_buffer_addr;
size_t ima_buffer_size;
+
+ unsigned long ima_segment_index;
+ bool is_ima_segment_index_set;
#endif
/* Core ELF header buffer */
diff --git a/kernel/kexec_file.c b/kernel/kexec_file.c
index 3eedb8c226ad..a3370a0dce20 100644
--- a/kernel/kexec_file.c
+++ b/kernel/kexec_file.c
@@ -38,6 +38,22 @@ void set_kexec_sig_enforced(void)
}
#endif
+#ifdef CONFIG_IMA_KEXEC
+static bool check_ima_segment_index(struct kimage *image, int i)
+{
+ if (image->is_ima_segment_index_set &&
+ i == image->ima_segment_index)
+ return true;
+ else
+ return false;
+}
+#else
+static bool check_ima_segment_index(struct kimage *image, int i)
+{
+ return false;
+}
+#endif
+
static int kexec_calculate_store_digests(struct kimage *image);
/* Maximum size in bytes for kernel/initrd files. */
@@ -764,6 +780,13 @@ static int kexec_calculate_store_digests(struct kimage *image)
if (ksegment->kbuf == pi->purgatory_buf)
continue;
+ /*
+ * Skip the segment if ima_segment_index is set and matches
+ * the current index
+ */
+ if (check_ima_segment_index(image, i))
+ continue;
+
ret = crypto_shash_update(desc, ksegment->kbuf,
ksegment->bufsz);
if (ret)
diff --git a/security/integrity/ima/ima_kexec.c b/security/integrity/ima/ima_kexec.c
index b60a902460e2..283860d20521 100644
--- a/security/integrity/ima/ima_kexec.c
+++ b/security/integrity/ima/ima_kexec.c
@@ -162,6 +162,7 @@ void ima_add_kexec_buffer(struct kimage *image)
kbuf.buffer = kexec_buffer;
kbuf.bufsz = kexec_buffer_size;
kbuf.memsz = kexec_segment_size;
+ image->is_ima_segment_index_set = false;
ret = kexec_add_buffer(&kbuf);
if (ret) {
pr_err("Error passing over kexec measurement buffer.\n");
@@ -172,6 +173,8 @@ void ima_add_kexec_buffer(struct kimage *image)
image->ima_buffer_addr = kbuf.mem;
image->ima_buffer_size = kexec_segment_size;
image->ima_buffer = kexec_buffer;
+ image->ima_segment_index = image->nr_segments - 1;
+ image->is_ima_segment_index_set = true;
/*
* kexec owns kexec_buffer after kexec_add_buffer() is called
--
2.25.1
^ permalink raw reply related [flat|nested] 20+ messages in thread
* Re: [PATCH v7 0/7] ima: kexec: measure events between kexec load and excute
2025-02-03 18:45 [PATCH v7 0/7] ima: kexec: measure events between kexec load and excute steven chen
` (7 preceding siblings ...)
2025-02-03 22:44 ` [PATCH v7 0/7] ima: kexec: measure events between kexec load and excute Stefan Berger
@ 2025-02-03 23:25 ` steven chen
2025-02-04 0:50 ` Mimi Zohar
8 siblings, 1 reply; 20+ messages in thread
From: steven chen @ 2025-02-03 23:25 UTC (permalink / raw)
To: zohar, stefanb, roberto.sassu, roberto.sassu, eric.snowberg,
ebiederm, paul, code, bauermann, linux-integrity, kexec,
linux-security-module, linux-kernel
Cc: madvenka, nramas, James.Bottomley
On 2/3/2025 10:45 AM, steven chen wrote:
> The current kernel behavior is IMA measurements snapshot is taken at
> kexec 'load' and not at kexec 'execute'. IMA log is then carried
> over to the new kernel after kexec 'execute'.
>
> New events can be measured during/after the IMA log snapshot at kexec
> 'load' and before the system boots to the new kernel. In this scenario,
> the TPM PCRs are extended with these events, but they are not carried
> over to the new kernel after kexec soft reboot since the snapshot is
> already taken. This results in mismatch between TPM PCR quotes and the
> actual IMA measurements list after kexec soft reboot, which in turn
> results in remote attestation failure.
>
> To solve this problem -
> - allocate the necessary buffer at kexec 'load' time,
> - populate the buffer with the IMA measurements at kexec 'execute' time,
> - and measure two new IMA events 'kexec_load' and 'kexec_execute' as
> critical data to help detect missing events after kexec soft reboot.
>
> The solution details include:
> - refactoring the existing code to allocate a buffer to hold IMA
> measurements at kexec 'load', and dump the measurements at kexec
> 'execute'
>
> - IMA functionality to suspend and resume measurements as needed during
> buffer copy at kexec 'execute',
>
> - kexec functionality for mapping the segments from the current kernel
> to the subsequent one,
>
> - necessary changes to the kexec_file_load syscall, enabling it to call
> the ima functions,
>
> - registering a reboot notifier which gets called during kexec
> 'execute',
>
> - introducing a new Kconfig option to configure the extra memory to be
> allocated for passing IMA log from the current Kernel to the next,
>
> - introducing two new events to be measured by IMA during kexec, to
> help diagnose if the IMA log was copied fully or partially, from the
> current Kernel to the next,
>
> - excluding IMA segment while calculating and storing digest in function
> kexec_calculate_store_digests(), since IMA segment can be modified
> after the digest is computed during kexec 'load'. This will ensure
> that the segment is not added to the 'purgatory_sha_regions', and thus
> not verified by verify_sha256_digest().
>
> The changes proposed in this series ensure the integrity of the IMA
> measurements is preserved across kexec soft reboots, thus significantly
> improving the security of the kernel post kexec soft reboots.
>
> There were previous attempts to fix this issue [1], [2], [3]. But they
> were not merged into the mainline kernel.
>
> We took inspiration from the past work [1] and [2] while working on this
> patch series.
>
> V4 of this series is available here[6] for reference.
>
> V5 of this series is available here[7] for reference.
>
> V6 of this series is available here[8] for reference.
>
> References:
> -----------
>
> [1] [PATHC v2 5/9] ima: on soft reboot, save the measurement list
> https://lore.kernel.org/lkml/1472596811-9596-6-git-send-email-zohar@linux.vnet.ibm.com/
>
> [2] PATCH v2 4/6] kexec_file: Add mechanism to update kexec segments.
> https://lkml.org/lkml/2016/8/16/577
>
> [3] [PATCH 1/6] kexec_file: Add buffer hand-over support
> https://lore.kernel.org/linuxppc-dev/1466473476-10104-6-git-send-email-bauerman@linux.vnet.ibm.com/T/
>
> [4] [PATCH v2 0/7] ima: kexec: measure events between kexec load and execute
> https://lore.kernel.org/all/20231005182602.634615-1-tusharsu@linux.microsoft.com/
>
> [5] [PATCH v3 0/7] ima: kexec: measure events between kexec load and execute
> https://lore.kernel.org/all/20231216010729.2904751-1-tusharsu@linux.microsoft.com/
>
> [6] [PATCH v4 0/7] ima: kexec: measure events between kexec load and execute
> https://lore.kernel.org/all/20240122183804.3293904-1-tusharsu@linux.microsoft.com/
>
> [7] [PATCH v5 0/8] ima: kexec: measure events between kexec load and execute
> https://lore.kernel.org/all/20240214153827.1087657-1-tusharsu@linux.microsoft.com/
>
> [8] [PATCH v6 0/7] ima: kexec: measure events between kexec load and execute
> https://lore.kernel.org/all/20250124225547.22684-1-chenste@linux.microsoft.com/
>
> Change Log v7:
> - Incorporated feedback from the community (Stefan Berger, Tyler Hicks)
> on v6 of this series[8].
> - Verified all the patches are bisect-safe by booting into each
> patch and verifying multiple kexec 'load' operations work,
> and also verifying kexec soft reboot works, and IMA log gets
> carried over for each patch.
>
> Change Log v6:
> - Incorporated feedback from the community (Stefan Berger, Mimi Zohar,
> and Petr Tesařík) on v5 of this series[7].
> - Rebased the patch series to mainline 6.12.0.
> - Verified all the patches are bisect-safe by booting into each
> patch and verifying multiple kexec 'load' operations work,
> and also verifying kexec soft reboot works, and IMA log gets
> carried over for each patch.
> - Compared the memory size allocated with memory size of the entire
> measurement record. If there is not enough memory, it will copy as many
> IMA measurement records as possible, and this situation will result
> in a failure of remote attestation.
> - [PATCH V5 6/8] was removed. Per petr comment on [PATCH V5 6/8], during
> the handover, other CPUs are taken offline (look for
> migrate_to_reboot_cpu() in kernel/kexec_core.c) and even the reboot CPU
> will be sufficiently shut down as not to be able to add any more
> measurements.
>
> Change Log v5:
> - Incorporated feedback from the community (Stefan Berger and
> Mimi Zohar) on v4 of this series[6].
> - Rebased the patch series to mainline 6.8.0-rc1.
> - Verified all the patches are bisect-safe by booting into each
> patch and verifying multiple kexec 'load' operations work,
> and also verifying kexec soft reboot works, and IMA log gets
> carried over for each patch.
> - Divided the patch #4 in the v4 of the series[6] into two separate
> patches. One to setup the infrastructure/stub functions to prepare
> the IMA log copy from Kexec 'load' to 'execute', and another one
> to actually copy the log.
> - Updated the config description for IMA_KEXEC_EXTRA_MEMORY_KB
> to remove unnecessary references related to backwards compatibility.
> - Fixed a typo in log message/removed an extra line etc.
> - Updated patch descriptions as necessary.
>
> Change Log v4:
> - Incorporated feedback from the community (Stefan Berger and
> Mimi Zohar) on v3 of this series[5].
> - Rearranged patches so that they remain bisect-safe i.e. the
> system can go through kexec soft reboot, and IMA log is carried
> over after each patch.
> - Verified all the patches are bisect-safe by booting into each
> patch and verifying kexec soft reboot works, and IMA log gets
> carried over.
> - Suspend-resume measurements is now a separate patch (patch #5)
> and all the relevant code is part of the same patch.
> - Excluding IMA segment from segment digest verification is now a
> separate patch. (patch #3).
> - Registering reboot notifier and functions related to move ima
> log copy from kexec load to execute are now part of the same
> patch (patch #4) to protect bisect-safeness of the series.
> - Updated the title of patch #6 as per the feedback.
> - The default value of kexec extra memory for IMA measurements
> is set to half the PAGESIZE to maintain backwards compatibility.
> - Added number of IMA measurement records as part of 'kexec_load'
> and 'kexec_execute' IMA critical data events.
> - Updated patch descriptions as necessary.
>
> Change Log v3:
> - Incorporated feedback from the community (Stefan Berger and
> Mimi Zohar) on v2 of this series[4].
> - Renamed functions and removed extraneous checks and code comments.
> - Updated patch descriptions and titles as necessary.
> - Updated kexec_calculate_store_digests() in patch 2/7 to exclude ima
> segment from calculating and storing digest.
> - Updated patch 3/7 to use kmalloc_array instead of kmalloc and freed
> memory early to avoid potential memory leak.
> - Updated patch 6/7 to change Kconfig option IMA_KEXEC_EXTRA_PAGES to
> IMA_KEXEC_EXTRA_MEMORY_KB to allocate the memory in kb rather than
> in number of pages.
> - Optimized patch 7/7 not to free and alloc memory if the buffer size
> hasn't changed during multiple kexec 'load' operations.
> - Fixed a bug in patch 7/7 to measure multiple 'kexec_load' events even
> if buffer size hasn't changed.
> - Verified the patches are bisect-safe by compiling and booting into
> each patch individually.
>
>
> Change Log v2:
> - Incorporated feedback from the community on v1 series.
> - Refactored the existing ima_dump_measurement_list to move buffer
> allocation functionality to ima_alloc_kexec_buf() function.
> - Introduced a new Kconfig option to configure the memory.
> - Updated the logic to copy the IMA log only in case of kexec soft
> reboot, and not on kexec crash.
> - Updated the logic to copy as many IMA events as possible in case of
> memory constraint, rather than just bailing out.
> - Introduced two new events to be measured by IMA during kexec, to
> help diagnose if the IMA log was copied fully or partially from the
> current Kernel to the next.
> - Refactored patches to ensure no warnings during individual patch
> compilation.
> - Used virt_to_page instead of phys_to_page.
> - Updated patch descriptions as necessary.
>
> steven chen (7):
> ima: define and call ima_alloc_kexec_file_buf
> kexec: define functions to map and unmap segments
> ima: kexec: skip IMA segment validation after kexec soft reboot
> ima: kexec: define functions to copy IMA log at soft boot
> ima: kexec: move IMA log copy from kexec load to execute
> ima: make the kexec extra memory configurable
> ima: measure kexec load and exec events as critical data
>
> include/linux/ima.h | 3 +
> include/linux/kexec.h | 10 ++
> kernel/kexec_core.c | 54 ++++++++
> kernel/kexec_file.c | 31 +++++
> security/integrity/ima/Kconfig | 10 ++
> security/integrity/ima/ima.h | 1 +
> security/integrity/ima/ima_kexec.c | 208 ++++++++++++++++++++++++-----
> security/integrity/ima/ima_queue.c | 4 +-
> 8 files changed, 284 insertions(+), 37 deletions(-)
>
Hi all,
The below is the correct version for review.
[PATCH v7 0/7] ima: kexec: measure events between kexec load and excute
<https://lore.kernel.org/linux-integrity/20250203232033.64123-1-chenste@linux.microsoft.com/T/#t>
Please ignore the this version because patch 5 is missing.
I am really sorry to have troubled you.
Steven
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH v7 0/7] ima: kexec: measure events between kexec load and excute
2025-02-03 23:25 ` steven chen
@ 2025-02-04 0:50 ` Mimi Zohar
2025-02-04 0:56 ` steven chen
0 siblings, 1 reply; 20+ messages in thread
From: Mimi Zohar @ 2025-02-04 0:50 UTC (permalink / raw)
To: steven chen, stefanb, roberto.sassu, roberto.sassu, eric.snowberg,
ebiederm, paul, code, bauermann, linux-integrity, kexec,
linux-security-module, linux-kernel
Cc: madvenka, nramas, James.Bottomley
On Mon, 2025-02-03 at 15:25 -0800, steven chen wrote:
> Hi all,
>
> The below is the correct version for review.
>
> [PATCH v7 0/7] ima: kexec: measure events between kexec load and excute
> <
> https://lore.kernel.org/linux-integrity/20250203232033.64123-1-chenste@linux.microso
> ft.com/T/#t>
>
> Please ignore the this version because patch 5 is missing.
>
> I am really sorry to have troubled you.
Thanks, Steven. I was able to apply the patch set to v6.13. For some reason, b4
downloads a duplicate 4/7 patch.
Mimi
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH v7 0/7] ima: kexec: measure events between kexec load and excute
2025-02-04 0:50 ` Mimi Zohar
@ 2025-02-04 0:56 ` steven chen
2025-02-07 20:02 ` Mimi Zohar
0 siblings, 1 reply; 20+ messages in thread
From: steven chen @ 2025-02-04 0:56 UTC (permalink / raw)
To: Mimi Zohar, stefanb, roberto.sassu, roberto.sassu, eric.snowberg,
ebiederm, paul, code, bauermann, linux-integrity, kexec,
linux-security-module, linux-kernel
Cc: madvenka, nramas, James.Bottomley
On 2/3/2025 4:50 PM, Mimi Zohar wrote:
> On Mon, 2025-02-03 at 15:25 -0800, steven chen wrote:
>> Hi all,
>>
>> The below is the correct version for review.
>>
>> [PATCH v7 0/7] ima: kexec: measure events between kexec load and excute
>> <
>> https://lore.kernel.org/linux-integrity/20250203232033.64123-1-chenste@linux.microso
>> ft.com/T/#t>
>>
>> Please ignore the this version because patch 5 is missing.
>>
>> I am really sorry to have troubled you.
> Thanks, Steven. I was able to apply the patch set to v6.13. For some reason, b4
> downloads a duplicate 4/7 patch.
>
> Mimi
Hi Mimi,
Please use the one below
[PATCH v7 0/7] ima: kexec: measure events between kexec load and excute
<https://lore.kernel.org/linux-integrity/20250203232033.64123-1-chenste@linux.microsoft.com/T/#t>
Please ignore the this version because patch 5 is missing.
I am really sorry.
Steven
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH v7 3/7] ima: kexec: skip IMA segment validation after kexec soft reboot
2025-02-03 23:20 ` [PATCH v7 3/7] ima: kexec: skip IMA segment validation after kexec soft reboot steven chen
@ 2025-02-04 19:39 ` Stefan Berger
2025-02-04 20:28 ` steven chen
2025-02-07 19:24 ` steven chen
0 siblings, 2 replies; 20+ messages in thread
From: Stefan Berger @ 2025-02-04 19:39 UTC (permalink / raw)
To: steven chen, zohar, roberto.sassu, roberto.sassu, eric.snowberg,
ebiederm, paul, code, bauermann, linux-integrity, kexec,
linux-security-module, linux-kernel
Cc: madvenka, nramas, James.Bottomley
On 2/3/25 6:20 PM, steven chen wrote:
> kexec_calculate_store_digests() calculates and stores the digest of the
> segment at kexec_file_load syscall where the IMA segment is also
> allocated. With this series, the IMA segment will be updated with the
> measurement log at kexec excute stage when soft reboot is initiated.
s/excute/execute
> Therefore, it may fail digest verification in verify_sha256_digest()
> after kexec soft reboot into the new kernel. Therefore, the digest
> calculation/verification of the IMA segment needs to be skipped.
>
> Skip IMA segment from calculating and storing digest in function
Skip the calculation and storing of the digest of the IMA segment in
kexec_calculate_store_digests() so that ...
> kexec_calculate_store_digests() so that it is not added to the
> 'purgatory_sha_regions'.
>
> Since verify_sha256_digest() only verifies 'purgatory_sha_regions',
> no change is needed in verify_sha256_digest() in this context.
>
> With this change, the IMA segment is not included in the digest
> calculation, storage, and verification.
>
> Author: Tushar Sugandhi <tusharsu@linux.microsoft.com>
> Signed-off-by: Tushar Sugandhi <tusharsu@linux.microsoft.com>
> Signed-off-by: steven chen <chenste@linux.microsoft.com>
> ---> include/linux/kexec.h | 3 +++
> kernel/kexec_file.c | 23 +++++++++++++++++++++++
> security/integrity/ima/ima_kexec.c | 3 +++
> 3 files changed, 29 insertions(+)
>
> diff --git a/include/linux/kexec.h b/include/linux/kexec.h
> index f8413ea5c8c8..f3246e881ac8 100644
> --- a/include/linux/kexec.h
> +++ b/include/linux/kexec.h
> @@ -362,6 +362,9 @@ struct kimage {
>
> phys_addr_t ima_buffer_addr;
> size_t ima_buffer_size;
> +
> + unsigned long ima_segment_index;
> + bool is_ima_segment_index_set;
> #endif
>
> /* Core ELF header buffer */
> diff --git a/kernel/kexec_file.c b/kernel/kexec_file.c
> index 3eedb8c226ad..a3370a0dce20 100644
> --- a/kernel/kexec_file.c
> +++ b/kernel/kexec_file.c
> @@ -38,6 +38,22 @@ void set_kexec_sig_enforced(void)
> }
> #endif
>
> +#ifdef CONFIG_IMA_KEXEC
> +static bool check_ima_segment_index(struct kimage *image, int i)
> +{
> + if (image->is_ima_segment_index_set &&
> + i == image->ima_segment_index)
The 'i =' should be indented under 'image->'.
With these nits fixed:
Reviewed-by: Stefan Berger <stefanb@linux.ibm.com>
> + return true;
> + else
> + return false;
> +}
> +#else
> +static bool check_ima_segment_index(struct kimage *image, int i)
> +{
> + return false;
> +}
> +#endif
> +
> static int kexec_calculate_store_digests(struct kimage *image);
>
> /* Maximum size in bytes for kernel/initrd files. */
> @@ -764,6 +780,13 @@ static int kexec_calculate_store_digests(struct kimage *image)
> if (ksegment->kbuf == pi->purgatory_buf)
> continue;
>
> + /*
> + * Skip the segment if ima_segment_index is set and matches
> + * the current index
> + */
> + if (check_ima_segment_index(image, i))
> + continue;
> +
> ret = crypto_shash_update(desc, ksegment->kbuf,
> ksegment->bufsz);
> if (ret)
> diff --git a/security/integrity/ima/ima_kexec.c b/security/integrity/ima/ima_kexec.c
> index b60a902460e2..283860d20521 100644
> --- a/security/integrity/ima/ima_kexec.c
> +++ b/security/integrity/ima/ima_kexec.c
> @@ -162,6 +162,7 @@ void ima_add_kexec_buffer(struct kimage *image)
> kbuf.buffer = kexec_buffer;
> kbuf.bufsz = kexec_buffer_size;
> kbuf.memsz = kexec_segment_size;
> + image->is_ima_segment_index_set = false;
> ret = kexec_add_buffer(&kbuf);
> if (ret) {
> pr_err("Error passing over kexec measurement buffer.\n");
> @@ -172,6 +173,8 @@ void ima_add_kexec_buffer(struct kimage *image)
> image->ima_buffer_addr = kbuf.mem;
> image->ima_buffer_size = kexec_segment_size;
> image->ima_buffer = kexec_buffer;
> + image->ima_segment_index = image->nr_segments - 1;
> + image->is_ima_segment_index_set = true;
>
> /*
> * kexec owns kexec_buffer after kexec_add_buffer() is called
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH v7 3/7] ima: kexec: skip IMA segment validation after kexec soft reboot
2025-02-04 19:39 ` Stefan Berger
@ 2025-02-04 20:28 ` steven chen
2025-02-04 22:51 ` Stefan Berger
2025-02-07 19:24 ` steven chen
1 sibling, 1 reply; 20+ messages in thread
From: steven chen @ 2025-02-04 20:28 UTC (permalink / raw)
To: Stefan Berger, zohar, roberto.sassu, roberto.sassu, eric.snowberg,
ebiederm, paul, code, bauermann, linux-integrity, kexec,
linux-security-module, linux-kernel
Cc: madvenka, nramas, James.Bottomley
On 2/4/2025 11:39 AM, Stefan Berger wrote:
> On 2/3/25 6:20 PM, steven chen wrote:
>> kexec_calculate_store_digests() calculates and stores the digest of the
>> segment at kexec_file_load syscall where the IMA segment is also
>> allocated. With this series, the IMA segment will be updated with the
>> measurement log at kexec excute stage when soft reboot is initiated.
>
> s/excute/execute
>
>> Therefore, it may fail digest verification in verify_sha256_digest()
>> after kexec soft reboot into the new kernel. Therefore, the digest
>> calculation/verification of the IMA segment needs to be skipped.
>>
>> Skip IMA segment from calculating and storing digest in function
>
> Skip the calculation and storing of the digest of the IMA segment in
> kexec_calculate_store_digests() so that ...
>
>
>> kexec_calculate_store_digests() so that it is not added to the
>> 'purgatory_sha_regions'.
>>
>> Since verify_sha256_digest() only verifies 'purgatory_sha_regions',
>> no change is needed in verify_sha256_digest() in this context.
>>
>> With this change, the IMA segment is not included in the digest
>> calculation, storage, and verification.
>>
>> Author: Tushar Sugandhi <tusharsu@linux.microsoft.com>
>> Signed-off-by: Tushar Sugandhi <tusharsu@linux.microsoft.com>
>> Signed-off-by: steven chen <chenste@linux.microsoft.com>
> > ---> include/linux/kexec.h | 3 +++
>> kernel/kexec_file.c | 23 +++++++++++++++++++++++
>> security/integrity/ima/ima_kexec.c | 3 +++
>> 3 files changed, 29 insertions(+)
>>
>> diff --git a/include/linux/kexec.h b/include/linux/kexec.h
>> index f8413ea5c8c8..f3246e881ac8 100644
>> --- a/include/linux/kexec.h
>> +++ b/include/linux/kexec.h
>> @@ -362,6 +362,9 @@ struct kimage {
>> phys_addr_t ima_buffer_addr;
>> size_t ima_buffer_size;
>> +
>> + unsigned long ima_segment_index;
>> + bool is_ima_segment_index_set;
>> #endif
>> /* Core ELF header buffer */
>> diff --git a/kernel/kexec_file.c b/kernel/kexec_file.c
>> index 3eedb8c226ad..a3370a0dce20 100644
>> --- a/kernel/kexec_file.c
>> +++ b/kernel/kexec_file.c
>> @@ -38,6 +38,22 @@ void set_kexec_sig_enforced(void)
>> }
>> #endif
>> +#ifdef CONFIG_IMA_KEXEC
>> +static bool check_ima_segment_index(struct kimage *image, int i)
>> +{
>> + if (image->is_ima_segment_index_set &&
>> + i == image->ima_segment_index)
>
> The 'i =' should be indented under 'image->'.
>
> With these nits fixed:
>
> Reviewed-by: Stefan Berger <stefanb@linux.ibm.com>
>
>> + return true;
>> + else
>> + return false;
>> +}
>> +#else
>> +static bool check_ima_segment_index(struct kimage *image, int i)
>> +{
>> + return false;
>> +}
>> +#endif
>> +
>> static int kexec_calculate_store_digests(struct kimage *image);
>> /* Maximum size in bytes for kernel/initrd files. */
>> @@ -764,6 +780,13 @@ static int kexec_calculate_store_digests(struct
>> kimage *image)
>> if (ksegment->kbuf == pi->purgatory_buf)
>> continue;
>> + /*
>> + * Skip the segment if ima_segment_index is set and matches
>> + * the current index
>> + */
>> + if (check_ima_segment_index(image, i))
>> + continue;
>> +
>> ret = crypto_shash_update(desc, ksegment->kbuf,
>> ksegment->bufsz);
>> if (ret)
>> diff --git a/security/integrity/ima/ima_kexec.c
>> b/security/integrity/ima/ima_kexec.c
>> index b60a902460e2..283860d20521 100644
>> --- a/security/integrity/ima/ima_kexec.c
>> +++ b/security/integrity/ima/ima_kexec.c
>> @@ -162,6 +162,7 @@ void ima_add_kexec_buffer(struct kimage *image)
>> kbuf.buffer = kexec_buffer;
>> kbuf.bufsz = kexec_buffer_size;
>> kbuf.memsz = kexec_segment_size;
>> + image->is_ima_segment_index_set = false;
>> ret = kexec_add_buffer(&kbuf);
>> if (ret) {
>> pr_err("Error passing over kexec measurement buffer.\n");
>> @@ -172,6 +173,8 @@ void ima_add_kexec_buffer(struct kimage *image)
>> image->ima_buffer_addr = kbuf.mem;
>> image->ima_buffer_size = kexec_segment_size;
>> image->ima_buffer = kexec_buffer;
>> + image->ima_segment_index = image->nr_segments - 1;
>> + image->is_ima_segment_index_set = true;
>> /*
>> * kexec owns kexec_buffer after kexec_add_buffer() is called
Hi Stefan, I will update in next release. Thanks!
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH v7 3/7] ima: kexec: skip IMA segment validation after kexec soft reboot
2025-02-04 20:28 ` steven chen
@ 2025-02-04 22:51 ` Stefan Berger
0 siblings, 0 replies; 20+ messages in thread
From: Stefan Berger @ 2025-02-04 22:51 UTC (permalink / raw)
To: steven chen, zohar, roberto.sassu, roberto.sassu, eric.snowberg,
ebiederm, paul, code, bauermann, linux-integrity, kexec,
linux-security-module, linux-kernel
Cc: madvenka, nramas, James.Bottomley
On 2/4/25 3:28 PM, steven chen wrote:
> On 2/4/2025 11:39 AM, Stefan Berger wrote:
>> On 2/3/25 6:20 PM, steven chen wrote:
>
>
> Hi Stefan, I will update in next release. Thanks!
You should try to rebase it on 6.14-rc1. There were a few changes.
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH v7 3/7] ima: kexec: skip IMA segment validation after kexec soft reboot
2025-02-04 19:39 ` Stefan Berger
2025-02-04 20:28 ` steven chen
@ 2025-02-07 19:24 ` steven chen
1 sibling, 0 replies; 20+ messages in thread
From: steven chen @ 2025-02-07 19:24 UTC (permalink / raw)
To: Stefan Berger, zohar, roberto.sassu, roberto.sassu, eric.snowberg,
ebiederm, paul, code, bauermann, linux-integrity, kexec,
linux-security-module, linux-kernel
Cc: madvenka, nramas, James.Bottomley
On 2/4/2025 11:39 AM, Stefan Berger wrote:
> On 2/3/25 6:20 PM, steven chen wrote:
>> kexec_calculate_store_digests() calculates and stores the digest of the
>> segment at kexec_file_load syscall where the IMA segment is also
>> allocated. With this series, the IMA segment will be updated with the
>> measurement log at kexec excute stage when soft reboot is initiated.
>
> s/excute/execute
>
>> Therefore, it may fail digest verification in verify_sha256_digest()
>> after kexec soft reboot into the new kernel. Therefore, the digest
>> calculation/verification of the IMA segment needs to be skipped.
>>
>> Skip IMA segment from calculating and storing digest in function
>
> Skip the calculation and storing of the digest of the IMA segment in
> kexec_calculate_store_digests() so that ...
>
>
>> kexec_calculate_store_digests() so that it is not added to the
>> 'purgatory_sha_regions'.
>>
>> Since verify_sha256_digest() only verifies 'purgatory_sha_regions',
>> no change is needed in verify_sha256_digest() in this context.
>>
>> With this change, the IMA segment is not included in the digest
>> calculation, storage, and verification.
>>
>> Author: Tushar Sugandhi <tusharsu@linux.microsoft.com>
>> Signed-off-by: Tushar Sugandhi <tusharsu@linux.microsoft.com>
>> Signed-off-by: steven chen <chenste@linux.microsoft.com>
> > ---> include/linux/kexec.h | 3 +++
>> kernel/kexec_file.c | 23 +++++++++++++++++++++++
>> security/integrity/ima/ima_kexec.c | 3 +++
>> 3 files changed, 29 insertions(+)
>>
>> diff --git a/include/linux/kexec.h b/include/linux/kexec.h
>> index f8413ea5c8c8..f3246e881ac8 100644
>> --- a/include/linux/kexec.h
>> +++ b/include/linux/kexec.h
>> @@ -362,6 +362,9 @@ struct kimage {
>> phys_addr_t ima_buffer_addr;
>> size_t ima_buffer_size;
>> +
>> + unsigned long ima_segment_index;
>> + bool is_ima_segment_index_set;
>> #endif
>> /* Core ELF header buffer */
>> diff --git a/kernel/kexec_file.c b/kernel/kexec_file.c
>> index 3eedb8c226ad..a3370a0dce20 100644
>> --- a/kernel/kexec_file.c
>> +++ b/kernel/kexec_file.c
>> @@ -38,6 +38,22 @@ void set_kexec_sig_enforced(void)
>> }
>> #endif
>> +#ifdef CONFIG_IMA_KEXEC
>> +static bool check_ima_segment_index(struct kimage *image, int i)
>> +{
>> + if (image->is_ima_segment_index_set &&
>> + i == image->ima_segment_index)
>
> The 'i =' should be indented under 'image->'.
>
> With these nits fixed:
>
> Reviewed-by: Stefan Berger <stefanb@linux.ibm.com>
>
>> + return true;
>> + else
>> + return false;
>> +}
>> +#else
>> +static bool check_ima_segment_index(struct kimage *image, int i)
>> +{
>> + return false;
>> +}
>> +#endif
>> +
>> static int kexec_calculate_store_digests(struct kimage *image);
>> /* Maximum size in bytes for kernel/initrd files. */
>> @@ -764,6 +780,13 @@ static int kexec_calculate_store_digests(struct
>> kimage *image)
>> if (ksegment->kbuf == pi->purgatory_buf)
>> continue;
>> + /*
>> + * Skip the segment if ima_segment_index is set and matches
>> + * the current index
>> + */
>> + if (check_ima_segment_index(image, i))
>> + continue;
>> +
>> ret = crypto_shash_update(desc, ksegment->kbuf,
>> ksegment->bufsz);
>> if (ret)
>> diff --git a/security/integrity/ima/ima_kexec.c
>> b/security/integrity/ima/ima_kexec.c
>> index b60a902460e2..283860d20521 100644
>> --- a/security/integrity/ima/ima_kexec.c
>> +++ b/security/integrity/ima/ima_kexec.c
>> @@ -162,6 +162,7 @@ void ima_add_kexec_buffer(struct kimage *image)
>> kbuf.buffer = kexec_buffer;
>> kbuf.bufsz = kexec_buffer_size;
>> kbuf.memsz = kexec_segment_size;
>> + image->is_ima_segment_index_set = false;
>> ret = kexec_add_buffer(&kbuf);
>> if (ret) {
>> pr_err("Error passing over kexec measurement buffer.\n");
>> @@ -172,6 +173,8 @@ void ima_add_kexec_buffer(struct kimage *image)
>> image->ima_buffer_addr = kbuf.mem;
>> image->ima_buffer_size = kexec_segment_size;
>> image->ima_buffer = kexec_buffer;
>> + image->ima_segment_index = image->nr_segments - 1;
>> + image->is_ima_segment_index_set = true;
>> /*
>> * kexec owns kexec_buffer after kexec_add_buffer() is called
Thanks, Stefan, I will update it in next version
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH v7 0/7] ima: kexec: measure events between kexec load and excute
2025-02-04 0:56 ` steven chen
@ 2025-02-07 20:02 ` Mimi Zohar
0 siblings, 0 replies; 20+ messages in thread
From: Mimi Zohar @ 2025-02-07 20:02 UTC (permalink / raw)
To: steven chen, stefanb, roberto.sassu, roberto.sassu, eric.snowberg,
ebiederm, paul, code, bauermann, linux-integrity, kexec,
linux-security-module, linux-kernel
Cc: madvenka, nramas, James.Bottomley
On Mon, 2025-02-03 at 16:56 -0800, steven chen wrote:
> On 2/3/2025 4:50 PM, Mimi Zohar wrote:
> > On Mon, 2025-02-03 at 15:25 -0800, steven chen wrote:
> > > Hi all,
> > >
> > > The below is the correct version for review.
> > >
> > > [PATCH v7 0/7] ima: kexec: measure events between kexec load and excute
> > > <
> > > https://lore.kernel.org/linux-integrity/20250203232033.64123-1-chenste@linux.microso
> > > ft.com/T/#t>
> > >
> > > Please ignore the this version because patch 5 is missing.
> > >
> > > I am really sorry to have troubled you.
> > Thanks, Steven. I was able to apply the patch set to v6.13. For some reason, b4
> > downloads a duplicate 4/7 patch.
> >
> > Mimi
>
> Hi Mimi,
>
> Please use the one below
>
> [PATCH v7 0/7] ima: kexec: measure events between kexec load and excute
> <
> https://lore.kernel.org/linux-integrity/20250203232033.64123-1-chenste@linux.microso
> ft.com/T/#t>
>
> Please ignore the this version because patch 5 is missing.
>
> I am really sorry.
No problem. My point I was trying to make the other day was that I was able to apply
the NEW version of the patch set (even though b4 got confused), in order to give a
heads up for anyone else trying to apply it.
new: b4 am -o /tmp 20250203232033.64123-1-chenste@linux.microsoft.com
old: b4 am -o /tmp 20250203184558.61367-1-chenste@linux.microsoft.com
Mimi
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH v7 3/7] ima: kexec: skip IMA segment validation after kexec soft reboot
2025-02-18 17:20 [PATCH v7 0/7] ima: kexec: measure events between kexec load and execute steven chen
@ 2025-02-18 17:20 ` steven chen
0 siblings, 0 replies; 20+ messages in thread
From: steven chen @ 2025-02-18 17:20 UTC (permalink / raw)
To: zohar, stefanb, roberto.sassu, roberto.sassu, eric.snowberg,
ebiederm, paul, code, bauermann, linux-integrity, kexec,
linux-security-module, linux-kernel
Cc: madvenka, nramas, James.Bottomley, bhe, vgoyal, dyoung
kexec_calculate_store_digests() calculates and stores the digest of the
segment at kexec_file_load syscall where the IMA segment is also
allocated. With this series, the IMA segment will be updated with the
measurement log at kexec excute stage when soft reboot is initiated.
Therefore, it may fail digest verification in verify_sha256_digest()
after kexec soft reboot into the new kernel. Therefore, the digest
calculation/verification of the IMA segment needs to be skipped.
Skip IMA segment from calculating and storing digest in function
kexec_calculate_store_digests() so that it is not added to the
'purgatory_sha_regions'.
Since verify_sha256_digest() only verifies 'purgatory_sha_regions',
no change is needed in verify_sha256_digest() in this context.
With this change, the IMA segment is not included in the digest
calculation, storage, and verification.
Author: Tushar Sugandhi <tusharsu@linux.microsoft.com>
Signed-off-by: Tushar Sugandhi <tusharsu@linux.microsoft.com>
Signed-off-by: steven chen <chenste@linux.microsoft.com>
---
include/linux/kexec.h | 3 +++
kernel/kexec_file.c | 23 +++++++++++++++++++++++
security/integrity/ima/ima_kexec.c | 3 +++
3 files changed, 29 insertions(+)
diff --git a/include/linux/kexec.h b/include/linux/kexec.h
index f8413ea5c8c8..f3246e881ac8 100644
--- a/include/linux/kexec.h
+++ b/include/linux/kexec.h
@@ -362,6 +362,9 @@ struct kimage {
phys_addr_t ima_buffer_addr;
size_t ima_buffer_size;
+
+ unsigned long ima_segment_index;
+ bool is_ima_segment_index_set;
#endif
/* Core ELF header buffer */
diff --git a/kernel/kexec_file.c b/kernel/kexec_file.c
index 3eedb8c226ad..a3370a0dce20 100644
--- a/kernel/kexec_file.c
+++ b/kernel/kexec_file.c
@@ -38,6 +38,22 @@ void set_kexec_sig_enforced(void)
}
#endif
+#ifdef CONFIG_IMA_KEXEC
+static bool check_ima_segment_index(struct kimage *image, int i)
+{
+ if (image->is_ima_segment_index_set &&
+ i == image->ima_segment_index)
+ return true;
+ else
+ return false;
+}
+#else
+static bool check_ima_segment_index(struct kimage *image, int i)
+{
+ return false;
+}
+#endif
+
static int kexec_calculate_store_digests(struct kimage *image);
/* Maximum size in bytes for kernel/initrd files. */
@@ -764,6 +780,13 @@ static int kexec_calculate_store_digests(struct kimage *image)
if (ksegment->kbuf == pi->purgatory_buf)
continue;
+ /*
+ * Skip the segment if ima_segment_index is set and matches
+ * the current index
+ */
+ if (check_ima_segment_index(image, i))
+ continue;
+
ret = crypto_shash_update(desc, ksegment->kbuf,
ksegment->bufsz);
if (ret)
diff --git a/security/integrity/ima/ima_kexec.c b/security/integrity/ima/ima_kexec.c
index b60a902460e2..283860d20521 100644
--- a/security/integrity/ima/ima_kexec.c
+++ b/security/integrity/ima/ima_kexec.c
@@ -162,6 +162,7 @@ void ima_add_kexec_buffer(struct kimage *image)
kbuf.buffer = kexec_buffer;
kbuf.bufsz = kexec_buffer_size;
kbuf.memsz = kexec_segment_size;
+ image->is_ima_segment_index_set = false;
ret = kexec_add_buffer(&kbuf);
if (ret) {
pr_err("Error passing over kexec measurement buffer.\n");
@@ -172,6 +173,8 @@ void ima_add_kexec_buffer(struct kimage *image)
image->ima_buffer_addr = kbuf.mem;
image->ima_buffer_size = kexec_segment_size;
image->ima_buffer = kexec_buffer;
+ image->ima_segment_index = image->nr_segments - 1;
+ image->is_ima_segment_index_set = true;
/*
* kexec owns kexec_buffer after kexec_add_buffer() is called
--
2.25.1
^ permalink raw reply related [flat|nested] 20+ messages in thread
end of thread, other threads:[~2025-02-18 17:20 UTC | newest]
Thread overview: 20+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-02-03 18:45 [PATCH v7 0/7] ima: kexec: measure events between kexec load and excute steven chen
2025-02-03 18:45 ` [PATCH v7 1/7] ima: define and call ima_alloc_kexec_file_buf steven chen
2025-02-03 18:45 ` [PATCH v7 2/7] kexec: define functions to map and unmap segments steven chen
2025-02-03 18:45 ` [PATCH v7 3/7] ima: kexec: skip IMA segment validation after kexec soft reboot steven chen
2025-02-03 18:45 ` [PATCH v7 4/7] ima: kexec: define functions to copy IMA log at soft boot steven chen
2025-02-03 18:45 ` steven chen
2025-02-03 18:45 ` [PATCH v7 6/7] ima: make the kexec extra memory configurable steven chen
2025-02-03 18:45 ` [PATCH v7 7/7] ima: measure kexec load and exec events as critical data steven chen
2025-02-03 22:44 ` [PATCH v7 0/7] ima: kexec: measure events between kexec load and excute Stefan Berger
2025-02-03 23:25 ` steven chen
2025-02-04 0:50 ` Mimi Zohar
2025-02-04 0:56 ` steven chen
2025-02-07 20:02 ` Mimi Zohar
-- strict thread matches above, loose matches on Subject: below --
2025-02-18 17:20 [PATCH v7 0/7] ima: kexec: measure events between kexec load and execute steven chen
2025-02-18 17:20 ` [PATCH v7 3/7] ima: kexec: skip IMA segment validation after kexec soft reboot steven chen
2025-02-03 23:20 [PATCH v7 0/7] ima: kexec: measure events between kexec load and excute steven chen
2025-02-03 23:20 ` [PATCH v7 3/7] ima: kexec: skip IMA segment validation after kexec soft reboot steven chen
2025-02-04 19:39 ` Stefan Berger
2025-02-04 20:28 ` steven chen
2025-02-04 22:51 ` Stefan Berger
2025-02-07 19:24 ` steven chen
2025-02-03 18:42 [PATCH v7 0/7] ima: kexec: measure events between kexec load and excute steven chen
2025-02-03 18:42 ` [PATCH v7 3/7] ima: kexec: skip IMA segment validation after kexec soft reboot steven chen
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).