Skip to content

Commit

Permalink
ima: Free IMA measurement buffer after kexec syscall
Browse files Browse the repository at this point in the history
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 <[email protected]>
Suggested-by: Tyler Hicks <[email protected]>
Reviewed-by: Thiago Jung Bauermann <[email protected]>
Reviewed-by: Tyler Hicks <[email protected]>
Fixes: 7b8589c ("ima: on soft reboot, save the measurement list")
Signed-off-by: Mimi Zohar <[email protected]>
  • Loading branch information
nramas authored and mimizohar committed Feb 10, 2021
1 parent 6d14c65 commit f31e338
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 0 deletions.
5 changes: 5 additions & 0 deletions include/linux/kexec.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down
5 changes: 5 additions & 0 deletions kernel/kexec_file.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
2 changes: 2 additions & 0 deletions security/integrity/ima/ima_kexec.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down

0 comments on commit f31e338

Please sign in to comment.