x86/ucode/amd: Fix OoB read in cpu_request_microcode()
authorAndrew Cooper <andrew.cooper3@citrix.com>
Fri, 5 Mar 2021 14:31:50 +0000 (15:31 +0100)
committerJan Beulich <jbeulich@suse.com>
Fri, 5 Mar 2021 14:31:50 +0000 (15:31 +0100)
verify_patch_size() is a maximum size check, and doesn't have a minimum bound.

If the microcode container encodes a blob with a length less than 64 bytes,
the subsequent calls to microcode_fits()/compare_header() may read off the end
of the buffer.

Fixes: 4de936a38a ("x86/ucode/amd: Rework parsing logic in cpu_request_microcode()")
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
master commit: 1cbc4d89c45cba3929f1c0cb4bca0b000c4f174b
master date: 2021-02-10 13:23:51 +0000

xen/arch/x86/cpu/microcode/amd.c

index cd532321e8ca9b631a2d8a746e216bdeb3411775..5b45530d936055332ff948b7a148b14d5f7a6a3d 100644 (file)
@@ -346,6 +346,7 @@ static struct microcode_patch *cpu_request_microcode(const void *buf, size_t siz
             if ( size < sizeof(*mc) ||
                  (mc = buf)->type != UCODE_UCODE_TYPE ||
                  size - sizeof(*mc) < mc->len ||
+                 mc->len < sizeof(struct microcode_patch) ||
                  (!skip_ucode && !verify_patch_size(mc->len)) )
             {
                 printk(XENLOG_ERR "microcode: Bad microcode data\n");