On 6/6/23 11:59, Mimi Zohar wrote:
On Tue, 2023-06-06 at 11:37 -0400, Stefan Berger wrote:

On 5/31/23 18:43, Mimi Zohar wrote:
On Wed, 2023-05-31 at 15:02 -0700, Tushar Sugandhi wrote:
Hi Mimi,

On 5/31/23 04:39, Mimi Zohar wrote:
Hi Tushar,

On Thu, 2023-05-25 at 10:21 -0700, Tushar Sugandhi wrote:

The issue of IMA measurements getting lost between kexec 'load' and 'execute' 
still exists.
I verified it on the mainline kernel 6.4.rc3. See *Appendix A* for details.

I think there's a 2nd problem.  Once the IMA measurement list is frozen (at 
kexec 'exec' stage)
IMA must stop extending PCRs. It can log (into the void) if it wanted to but 
the PCR extensions
have to stop otherwise the TPM's PCR state won't match the log in the 
kexec'ed-to kernel. I have
seen that on PPC64 some processes are being kicked off by kexec 'exec' that end 
up causing TPM
driver error message due to what seems to be a shutdown of the driver subsystem 
at this point.
I am not sure what an elegant method would be to stop PCR extensions. Maybe a 
flag on the level
of IMA would do? Or notifying the TPM driver to reject PCR extensions or just 
any command?

Thank you for raising this concern.

Agreed "kexec exec" might trigger additional measurements.  As long as
these are known, consistent measurements, they could be pre-measured
before calling "kexec exec".


Tushar, Mimi,

  I tried this now on ppc64 and with the following patch applied on top of 
yours it seems to work.
Also the problem with the TPM PCR extensions seems to be gone with your changes 
to
ima_add_template_entry()  -- it's probably worth mentioning this in the patch 
description.

phys_to_page doesn't seem to be generally available, so hopefully this will be 
a solution for more architectures.
[I haven't tested this on x86_64 since I couldn't get kexec to work just to 
begin with in any of my VMs.]

Regards,
   Stefan

diff --git a/kernel/kexec_core.c b/kernel/kexec_core.c
index f0bbdd403b6c..30ab7f81b508 100644
--- a/kernel/kexec_core.c
+++ b/kernel/kexec_core.c
@@ -966,7 +966,7 @@ void *kimage_map_segment(struct kimage *image,
                else if (entry & IND_SOURCE) {
                        if (dest_page_addr >= addr && dest_page_addr < eaddr) {
                                src_page_addr = entry & PAGE_MASK;
-                               src_pages[i++] = phys_to_page(src_page_addr);
+                               src_pages[i++] = 
virt_to_page(__va(src_page_addr));
                                if (i == npages)
                                        break;
                                dest_page_addr += PAGE_SIZE;

_______________________________________________
kexec mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/kexec

Reply via email to