[v2,5/5] x86/crash: make the page that stores the dm crypt key inaccessible
Commit Message
This adds an addition layer of protection for the saved copy of dm
crypt key. Trying to access the saved copy will cause page fault.
Suggested-by: Pingfan Liu <kernelfans@gmail.com>
Signed-off-by: Coiby Xu <coxu@redhat.com>
---
arch/x86/kernel/machine_kexec_64.c | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
@@ -546,14 +546,32 @@ static void kexec_mark_crashkres(bool protect)
kexec_mark_range(control, crashk_res.end, protect);
}
+static void kexec_mark_dm_crypt_key(bool protect)
+{
+ unsigned long start_paddr, end_paddr;
+ unsigned int nr_pages;
+
+ if (kexec_crash_image->dm_crypt_key_addr) {
+ start_paddr = kexec_crash_image->dm_crypt_key_addr;
+ end_paddr = start_paddr + kexec_crash_image->dm_crypt_key_sz - 1;
+ nr_pages = (PAGE_ALIGN(end_paddr) - PAGE_ALIGN_DOWN(start_paddr))/PAGE_SIZE;
+ if (protect)
+ set_memory_np((unsigned long)phys_to_virt(start_paddr), nr_pages);
+ else
+ set_memory_rw((unsigned long)phys_to_virt(start_paddr), nr_pages);
+ }
+}
+
void arch_kexec_protect_crashkres(void)
{
kexec_mark_crashkres(true);
+ kexec_mark_dm_crypt_key(true);
}
void arch_kexec_unprotect_crashkres(void)
{
kexec_mark_crashkres(false);
+ kexec_mark_dm_crypt_key(false);
}
/*