• C
    x86/microcode/intel: Change checksum variables to u32 · bc864af1
    Chris Bainbridge 提交于
    Microcode checksum verification should be done using unsigned 32-bit
    values otherwise the calculation overflow results in undefined
    behaviour.
    
    This is also nicely documented in the SDM, section "Microcode Update
    Checksum":
    
      "To check for a corrupt microcode update, software must perform a
      unsigned DWORD (32-bit) checksum of the microcode update. Even though
      some fields are signed, the checksum procedure treats all DWORDs as
      unsigned. Microcode updates with a header version equal to 00000001H
      must sum all DWORDs that comprise the microcode update. A valid
      checksum check will yield a value of 00000000H."
    
    but for some reason the code has been using ints from the very
    beginning.
    
    In practice, this bug possibly manifested itself only when doing the
    microcode data checksum - apparently, currently shipped Intel microcode
    doesn't have an extended signature table for which we do checksum
    verification too.
    
      UBSAN: Undefined behaviour in arch/x86/kernel/cpu/microcode/intel_lib.c:105:12
      signed integer overflow:
      -1500151068 + -2125470173 cannot be represented in type 'int'
      CPU: 0 PID: 0 Comm: swapper Not tainted 4.5.0-rc5+ #495
      ...
      Call Trace:
       dump_stack
       ? inotify_ioctl
       ubsan_epilogue
       handle_overflow
       __ubsan_handle_add_overflow
       microcode_sanity_check
       get_matching_model_microcode.isra.2.constprop.8
       ? early_idt_handler_common
       ? strlcpy
       ? find_cpio_data
       load_ucode_intel_bsp
       load_ucode_bsp
       ? load_ucode_bsp
       x86_64_start_kernel
    
    [ Expand and massage commit message. ]
    Signed-off-by: NChris Bainbridge <chris.bainbridge@gmail.com>
    Signed-off-by: NBorislav Petkov <bp@suse.de>
    Cc: hmh@hmh.eng.br
    Link: http://lkml.kernel.org/r/1456834359-5132-1-git-send-email-chris.bainbridge@gmail.comSigned-off-by: NThomas Gleixner <tglx@linutronix.de>
    bc864af1
intel_lib.c 4.4 KB