From: steven chen <chenste@linux.microsoft.com>
To: zohar@linux.ibm.com, stefanb@linux.ibm.com,
roberto.sassu@huaweicloud.com, roberto.sassu@huawei.com,
eric.snowberg@oracle.com, ebiederm@xmission.com,
paul@paul-moore.com, code@tyhicks.com, bauermann@kolabnow.com,
kexec@lists.infradead.org, linux-security-module@vger.kernel.org,
linux-kernel@vger.kernel.org
Cc: madvenka@linux.microsoft.com, nramas@linux.microsoft.com,
James.Bottomley@HansenPartnership.com
Subject: Re: [PATCH v7 0/7] ima: kexec: measure events between kexec load and excute
Date: Mon, 3 Feb 2025 10:52:55 -0800 [thread overview]
Message-ID: <0cf35986-e856-4cf7-83c0-56f89959c0ab@linux.microsoft.com> (raw)
In-Reply-To: <20250203184256.61285-1-chenste@linux.microsoft.com>
On 2/3/2025 10:42 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.
https://lore.kernel.org/linux-integrity/20250203184558.61367-1-chenste@linux.microsoft.com/T/#t
Please ignore the this version because I have a typo in linux-integrity mail
I am really sorry to have troubled you.
Steven
next prev parent reply other threads:[~2025-02-03 18:52 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
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 1/7] ima: define and call ima_alloc_kexec_file_buf steven chen
2025-02-03 18:42 ` [PATCH v7 2/7] kexec: define functions to map and unmap segments steven chen
2025-02-03 18:42 ` [PATCH v7 3/7] ima: kexec: skip IMA segment validation after kexec soft reboot steven chen
2025-02-03 18:42 ` [PATCH v7 4/7] ima: kexec: define functions to copy IMA log at soft boot steven chen
2025-02-03 18:42 ` steven chen
2025-02-03 18:42 ` [PATCH v7 6/7] ima: make the kexec extra memory configurable steven chen
2025-02-03 18:42 ` [PATCH v7 7/7] ima: measure kexec load and exec events as critical data steven chen
2025-02-03 18:52 ` steven chen [this message]
-- strict thread matches above, loose matches on Subject: below --
2025-02-03 18:45 [PATCH v7 0/7] ima: kexec: measure events between kexec load and excute steven chen
2025-02-03 22:44 ` 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
2025-02-03 23:20 steven chen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=0cf35986-e856-4cf7-83c0-56f89959c0ab@linux.microsoft.com \
--to=chenste@linux.microsoft.com \
--cc=James.Bottomley@HansenPartnership.com \
--cc=bauermann@kolabnow.com \
--cc=code@tyhicks.com \
--cc=ebiederm@xmission.com \
--cc=eric.snowberg@oracle.com \
--cc=kexec@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-security-module@vger.kernel.org \
--cc=madvenka@linux.microsoft.com \
--cc=nramas@linux.microsoft.com \
--cc=paul@paul-moore.com \
--cc=roberto.sassu@huawei.com \
--cc=roberto.sassu@huaweicloud.com \
--cc=stefanb@linux.ibm.com \
--cc=zohar@linux.ibm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox