Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 35a9ff4e authored by Quentin Casasnovas's avatar Quentin Casasnovas Committed by Borislav Petkov
Browse files

x86/microcode/intel: Handle truncated microcode images more robustly



We do not check the input data bounds containing the microcode before
copying a struct microcode_intel_header from it. A specially crafted
microcode could cause the kernel to read invalid memory and lead to a
denial-of-service.

Signed-off-by: default avatarQuentin Casasnovas <quentin.casasnovas@oracle.com>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Fenghua Yu <fenghua.yu@intel.com>
Link: http://lkml.kernel.org/r/1422964824-22056-3-git-send-email-quentin.casasnovas@oracle.com


[ Made error message differ from the next one and flipped comparison. ]
Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
parent f84598bd
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -196,6 +196,11 @@ static enum ucode_state generic_load_microcode(int cpu, void *data, size_t size,
		struct microcode_header_intel mc_header;
		unsigned int mc_size;

		if (leftover < sizeof(mc_header)) {
			pr_err("error! Truncated header in microcode data file\n");
			break;
		}

		if (get_ucode_data(&mc_header, ucode_ptr, sizeof(mc_header)))
			break;

+4 −0
Original line number Diff line number Diff line
@@ -322,6 +322,10 @@ get_matching_model_microcode(int cpu, unsigned long start,
	int i;

	while (leftover && mc_saved_count < ARRAY_SIZE(mc_saved_tmp)) {

		if (leftover < sizeof(mc_header))
			break;

		mc_header = (struct microcode_header_intel *)ucode_ptr;

		mc_size = get_totalsize(mc_header);