diff options
author | Lakshmi Ramasubramanian <nramas@linux.microsoft.com> | 2021-02-04 09:49:51 -0800 |
---|---|---|
committer | Mimi Zohar <zohar@linux.ibm.com> | 2021-02-10 15:49:38 -0500 |
commit | f31e3386a4e92ba6eda7328cb508462956c94c64 (patch) | |
tree | d98da3e377fd2f3cfd48683f66c7e57246f70700 | |
parent | 6d14c6517885fa68524238787420511b87d671df (diff) | |
download | linux-integrity-ima-kexec-fixes.tar.gz |
ima: Free IMA measurement buffer after kexec syscallima-kexec-fixes
IMA allocates kernel virtual memory to carry forward the measurement
list, from the current kernel to the next kernel on kexec system call,
in ima_add_kexec_buffer() function. This buffer is not freed before
completing the kexec system call resulting in memory leak.
Add ima_buffer field in "struct kimage" to store the virtual address
of the buffer allocated for the IMA measurement list.
Free the memory allocated for the IMA measurement list in
kimage_file_post_load_cleanup() function.
Signed-off-by: Lakshmi Ramasubramanian <nramas@linux.microsoft.com>
Suggested-by: Tyler Hicks <tyhicks@linux.microsoft.com>
Reviewed-by: Thiago Jung Bauermann <bauerman@linux.ibm.com>
Reviewed-by: Tyler Hicks <tyhicks@linux.microsoft.com>
Fixes: 7b8589cc29e7 ("ima: on soft reboot, save the measurement list")
Signed-off-by: Mimi Zohar <zohar@linux.ibm.com>
-rw-r--r-- | include/linux/kexec.h | 5 | ||||
-rw-r--r-- | kernel/kexec_file.c | 5 | ||||
-rw-r--r-- | security/integrity/ima/ima_kexec.c | 2 |
3 files changed, 12 insertions, 0 deletions
diff --git a/include/linux/kexec.h b/include/linux/kexec.h index 9e93bef5296801..5f61389f5f361e 100644 --- a/include/linux/kexec.h +++ b/include/linux/kexec.h @@ -300,6 +300,11 @@ struct kimage { /* Information for loading purgatory */ struct purgatory_info purgatory_info; #endif + +#ifdef CONFIG_IMA_KEXEC + /* Virtual address of IMA measurement buffer for kexec syscall */ + void *ima_buffer; +#endif }; /* kexec interface functions */ diff --git a/kernel/kexec_file.c b/kernel/kexec_file.c index b02086d7049237..5c3447cf7ad584 100644 --- a/kernel/kexec_file.c +++ b/kernel/kexec_file.c @@ -166,6 +166,11 @@ void kimage_file_post_load_cleanup(struct kimage *image) vfree(pi->sechdrs); pi->sechdrs = NULL; +#ifdef CONFIG_IMA_KEXEC + vfree(image->ima_buffer); + image->ima_buffer = NULL; +#endif /* CONFIG_IMA_KEXEC */ + /* See if architecture has anything to cleanup post load */ arch_kimage_file_post_load_cleanup(image); diff --git a/security/integrity/ima/ima_kexec.c b/security/integrity/ima/ima_kexec.c index 206ddcaa5c67ae..e29bea3dd4ccd1 100644 --- a/security/integrity/ima/ima_kexec.c +++ b/security/integrity/ima/ima_kexec.c @@ -129,6 +129,8 @@ void ima_add_kexec_buffer(struct kimage *image) return; } + image->ima_buffer = kexec_buffer; + pr_debug("kexec measurement buffer for the loaded kernel at 0x%lx.\n", kbuf.mem); } |