Merge tag 'integrity-v6.0' of git://git.kernel.org/pub/scm/linux/kernel/git/zohar/linux-integrity
Pull integrity updates from Mimi Zohar: "Aside from the one EVM cleanup patch, all the other changes are kexec related. On different architectures different keyrings are used to verify the kexec'ed kernel image signature. Here are a number of preparatory cleanup patches and the patches themselves for making the keyrings - builtin_trusted_keyring, .machine, .secondary_trusted_keyring, and .platform - consistent across the different architectures" * tag 'integrity-v6.0' of git://git.kernel.org/pub/scm/linux/kernel/git/zohar/linux-integrity: kexec, KEYS, s390: Make use of built-in and secondary keyring for signature verification arm64: kexec_file: use more system keyrings to verify kernel image signature kexec, KEYS: make the code in bzImage64_verify_sig generic kexec: clean up arch_kexec_kernel_verify_sig kexec: drop weak attribute from functions kexec_file: drop weak attribute from functions evm: Use IS_ENABLED to initialize .enabled
This commit is contained in:
@@ -591,11 +591,6 @@ static void kimage_free_extra_pages(struct kimage *image)
|
||||
|
||||
}
|
||||
|
||||
int __weak machine_kexec_post_load(struct kimage *image)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void kimage_terminate(struct kimage *image)
|
||||
{
|
||||
if (*image->entry != 0)
|
||||
@@ -1020,15 +1015,6 @@ size_t crash_get_memory_size(void)
|
||||
return size;
|
||||
}
|
||||
|
||||
void __weak crash_free_reserved_phys_range(unsigned long begin,
|
||||
unsigned long end)
|
||||
{
|
||||
unsigned long addr;
|
||||
|
||||
for (addr = begin; addr < end; addr += PAGE_SIZE)
|
||||
free_reserved_page(boot_pfn_to_page(addr >> PAGE_SHIFT));
|
||||
}
|
||||
|
||||
int crash_shrink_memory(unsigned long new_size)
|
||||
{
|
||||
int ret = 0;
|
||||
@@ -1225,16 +1211,3 @@ int kernel_kexec(void)
|
||||
mutex_unlock(&kexec_mutex);
|
||||
return error;
|
||||
}
|
||||
|
||||
/*
|
||||
* Protection mechanism for crashkernel reserved memory after
|
||||
* the kdump kernel is loaded.
|
||||
*
|
||||
* Provide an empty default implementation here -- architecture
|
||||
* code may override this
|
||||
*/
|
||||
void __weak arch_kexec_protect_crashkres(void)
|
||||
{}
|
||||
|
||||
void __weak arch_kexec_unprotect_crashkres(void)
|
||||
{}
|
||||
|
||||
@@ -62,14 +62,7 @@ int kexec_image_probe_default(struct kimage *image, void *buf,
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Architectures can provide this probe function */
|
||||
int __weak arch_kexec_kernel_image_probe(struct kimage *image, void *buf,
|
||||
unsigned long buf_len)
|
||||
{
|
||||
return kexec_image_probe_default(image, buf, buf_len);
|
||||
}
|
||||
|
||||
static void *kexec_image_load_default(struct kimage *image)
|
||||
void *kexec_image_load_default(struct kimage *image)
|
||||
{
|
||||
if (!image->fops || !image->fops->load)
|
||||
return ERR_PTR(-ENOEXEC);
|
||||
@@ -80,11 +73,6 @@ static void *kexec_image_load_default(struct kimage *image)
|
||||
image->cmdline_buf_len);
|
||||
}
|
||||
|
||||
void * __weak arch_kexec_kernel_image_load(struct kimage *image)
|
||||
{
|
||||
return kexec_image_load_default(image);
|
||||
}
|
||||
|
||||
int kexec_image_post_load_cleanup_default(struct kimage *image)
|
||||
{
|
||||
if (!image->fops || !image->fops->cleanup)
|
||||
@@ -93,30 +81,6 @@ int kexec_image_post_load_cleanup_default(struct kimage *image)
|
||||
return image->fops->cleanup(image->image_loader_data);
|
||||
}
|
||||
|
||||
int __weak arch_kimage_file_post_load_cleanup(struct kimage *image)
|
||||
{
|
||||
return kexec_image_post_load_cleanup_default(image);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_KEXEC_SIG
|
||||
static int kexec_image_verify_sig_default(struct kimage *image, void *buf,
|
||||
unsigned long buf_len)
|
||||
{
|
||||
if (!image->fops || !image->fops->verify_sig) {
|
||||
pr_debug("kernel loader does not support signature verification.\n");
|
||||
return -EKEYREJECTED;
|
||||
}
|
||||
|
||||
return image->fops->verify_sig(buf, buf_len);
|
||||
}
|
||||
|
||||
int __weak arch_kexec_kernel_verify_sig(struct kimage *image, void *buf,
|
||||
unsigned long buf_len)
|
||||
{
|
||||
return kexec_image_verify_sig_default(image, buf, buf_len);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Free up memory used by kernel, initrd, and command line. This is temporary
|
||||
* memory allocation which is not needed any more after these buffers have
|
||||
@@ -159,13 +123,41 @@ void kimage_file_post_load_cleanup(struct kimage *image)
|
||||
}
|
||||
|
||||
#ifdef CONFIG_KEXEC_SIG
|
||||
#ifdef CONFIG_SIGNED_PE_FILE_VERIFICATION
|
||||
int kexec_kernel_verify_pe_sig(const char *kernel, unsigned long kernel_len)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = verify_pefile_signature(kernel, kernel_len,
|
||||
VERIFY_USE_SECONDARY_KEYRING,
|
||||
VERIFYING_KEXEC_PE_SIGNATURE);
|
||||
if (ret == -ENOKEY && IS_ENABLED(CONFIG_INTEGRITY_PLATFORM_KEYRING)) {
|
||||
ret = verify_pefile_signature(kernel, kernel_len,
|
||||
VERIFY_USE_PLATFORM_KEYRING,
|
||||
VERIFYING_KEXEC_PE_SIGNATURE);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int kexec_image_verify_sig(struct kimage *image, void *buf,
|
||||
unsigned long buf_len)
|
||||
{
|
||||
if (!image->fops || !image->fops->verify_sig) {
|
||||
pr_debug("kernel loader does not support signature verification.\n");
|
||||
return -EKEYREJECTED;
|
||||
}
|
||||
|
||||
return image->fops->verify_sig(buf, buf_len);
|
||||
}
|
||||
|
||||
static int
|
||||
kimage_validate_signature(struct kimage *image)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = arch_kexec_kernel_verify_sig(image, image->kernel_buf,
|
||||
image->kernel_buf_len);
|
||||
ret = kexec_image_verify_sig(image, image->kernel_buf,
|
||||
image->kernel_buf_len);
|
||||
if (ret) {
|
||||
|
||||
if (sig_enforce) {
|
||||
@@ -621,19 +613,6 @@ int kexec_locate_mem_hole(struct kexec_buf *kbuf)
|
||||
return ret == 1 ? 0 : -EADDRNOTAVAIL;
|
||||
}
|
||||
|
||||
/**
|
||||
* arch_kexec_locate_mem_hole - Find free memory to place the segments.
|
||||
* @kbuf: Parameters for the memory search.
|
||||
*
|
||||
* On success, kbuf->mem will have the start address of the memory region found.
|
||||
*
|
||||
* Return: 0 on success, negative errno on error.
|
||||
*/
|
||||
int __weak arch_kexec_locate_mem_hole(struct kexec_buf *kbuf)
|
||||
{
|
||||
return kexec_locate_mem_hole(kbuf);
|
||||
}
|
||||
|
||||
/**
|
||||
* kexec_add_buffer - place a buffer in a kexec segment
|
||||
* @kbuf: Buffer contents and memory parameters.
|
||||
|
||||
Reference in New Issue
Block a user