Skip to content
  • Sami Tolvanen's avatar
    ff301ceb
    cfi: add __cficanonical · ff301ceb
    Sami Tolvanen authored
    
    
    With CONFIG_CFI_CLANG, the compiler replaces a function address taken
    in C code with the address of a local jump table entry, which passes
    runtime indirect call checks. However, the compiler won't replace
    addresses taken in assembly code, which will result in a CFI failure
    if we later jump to such an address in instrumented C code. The code
    generated for the non-canonical jump table looks this:
    
      <noncanonical.cfi_jt>: /* In C, &noncanonical points here */
    	jmp noncanonical
      ...
      <noncanonical>:        /* function body */
    	...
    
    This change adds the __cficanonical attribute, which tells the
    compiler to use a canonical jump table for the function instead. This
    means the compiler will rename the actual function to <function>.cfi
    and points the original symbol to the jump table entry instead:
    
      <canonical>:           /* jump table entry */
    	jmp canonical.cfi
      ...
      <canonical.cfi>:       /* function body */
    	...
    
    As a result, the address taken in assembly, or other non-instrumented
    code always points to the jump table and therefore, can be used for
    indirect calls in instrumented code without tripping CFI checks.
    
    Signed-off-by: default avatarSami Tolvanen <samitolvanen@google.com>
    Reviewed-by: default avatarKees Cook <keescook@chromium.org>
    Acked-by: Bjorn Helgaas <bhelgaas@google.com>   # pci.h
    Tested-by: default avatarNathan Chancellor <nathan@kernel.org>
    Signed-off-by: default avatarKees Cook <keescook@chromium.org>
    Link: https://lore.kernel.org/r/20210408182843.1754385-3-samitolvanen@google.com
    ff301ceb
    cfi: add __cficanonical
    Sami Tolvanen authored
    
    
    With CONFIG_CFI_CLANG, the compiler replaces a function address taken
    in C code with the address of a local jump table entry, which passes
    runtime indirect call checks. However, the compiler won't replace
    addresses taken in assembly code, which will result in a CFI failure
    if we later jump to such an address in instrumented C code. The code
    generated for the non-canonical jump table looks this:
    
      <noncanonical.cfi_jt>: /* In C, &noncanonical points here */
    	jmp noncanonical
      ...
      <noncanonical>:        /* function body */
    	...
    
    This change adds the __cficanonical attribute, which tells the
    compiler to use a canonical jump table for the function instead. This
    means the compiler will rename the actual function to <function>.cfi
    and points the original symbol to the jump table entry instead:
    
      <canonical>:           /* jump table entry */
    	jmp canonical.cfi
      ...
      <canonical.cfi>:       /* function body */
    	...
    
    As a result, the address taken in assembly, or other non-instrumented
    code always points to the jump table and therefore, can be used for
    indirect calls in instrumented code without tripping CFI checks.
    
    Signed-off-by: default avatarSami Tolvanen <samitolvanen@google.com>
    Reviewed-by: default avatarKees Cook <keescook@chromium.org>
    Acked-by: Bjorn Helgaas <bhelgaas@google.com>   # pci.h
    Tested-by: default avatarNathan Chancellor <nathan@kernel.org>
    Signed-off-by: default avatarKees Cook <keescook@chromium.org>
    Link: https://lore.kernel.org/r/20210408182843.1754385-3-samitolvanen@google.com
Loading