All of lore.kernel.org
 help / color / mirror / Atom feed
From: Kees Cook <keescook@chromium.org>
To: Sami Tolvanen <samitolvanen@google.com>
Cc: Nathan Chancellor <nathan@kernel.org>,
	Nick Desaulniers <ndesaulniers@google.com>,
	Masahiro Yamada <masahiroy@kernel.org>,
	Will Deacon <will@kernel.org>, Jessica Yu <jeyu@kernel.org>,
	Arnd Bergmann <arnd@arndb.de>, Tejun Heo <tj@kernel.org>,
	bpf@vger.kernel.org, linux-hardening@vger.kernel.org,
	linux-arch@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
	linux-kbuild@vger.kernel.org, linux-pci@vger.kernel.org,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH 01/17] add support for Clang CFI
Date: Thu, 11 Mar 2021 18:39:44 -0800	[thread overview]
Message-ID: <202103111839.4A4375E@keescook> (raw)
In-Reply-To: <20210312004919.669614-2-samitolvanen@google.com>

On Thu, Mar 11, 2021 at 04:49:03PM -0800, Sami Tolvanen wrote:
> This change adds support for Clang’s forward-edge Control Flow
> Integrity (CFI) checking. With CONFIG_CFI_CLANG, the compiler
> injects a runtime check before each indirect function call to ensure
> the target is a valid function with the correct static type. This
> restricts possible call targets and makes it more difficult for
> an attacker to exploit bugs that allow the modification of stored
> function pointers. For more details, see:
> 
>   https://clang.llvm.org/docs/ControlFlowIntegrity.html
> 
> Clang requires CONFIG_LTO_CLANG to be enabled with CFI to gain
> visibility to possible call targets. Kernel modules are supported
> with Clang’s cross-DSO CFI mode, which allows checking between
> independently compiled components.
> 
> With CFI enabled, the compiler injects a __cfi_check() function into
> the kernel and each module for validating local call targets. For
> cross-module calls that cannot be validated locally, the compiler
> calls the global __cfi_slowpath_diag() function, which determines
> the target module and calls the correct __cfi_check() function. This
> patch includes a slowpath implementation that uses __module_address()
> to resolve call targets, and with CONFIG_CFI_CLANG_SHADOW enabled, a
> shadow map that speeds up module look-ups by ~3x.
> 
> Clang implements indirect call checking using jump tables and
> offers two methods of generating them. With canonical jump tables,
> the compiler renames each address-taken function to <function>.cfi
> and points the original symbol to a jump table entry, which passes
> __cfi_check() validation. This isn’t compatible with stand-alone
> assembly code, which the compiler doesn’t instrument, and would
> result in indirect calls to assembly code to fail. Therefore, we
> default to using non-canonical jump tables instead, where the compiler
> generates a local jump table entry <function>.cfi_jt for each
> address-taken function, and replaces all references to the function
> with the address of the jump table entry.
> 
> Note that because non-canonical jump table addresses are local
> to each component, they break cross-module function address
> equality. Specifically, the address of a global function will be
> different in each module, as it's replaced with the address of a local
> jump table entry. If this address is passed to a different module,
> it won’t match the address of the same function taken there. This
> may break code that relies on comparing addresses passed from other
> components.
> 
> CFI checking can be disabled in a function with the __nocfi attribute.
> Additionally, CFI can be disabled for an entire compilation unit by
> filtering out CC_FLAGS_CFI.
> 
> By default, CFI failures result in a kernel panic to stop a potential
> exploit. CONFIG_CFI_PERMISSIVE enables a permissive mode, where the
> kernel prints out a rate-limited warning instead, and allows execution
> to continue. This option is helpful for locating type mismatches, but
> should only be enabled during development.
> 
> Signed-off-by: Sami Tolvanen <samitolvanen@google.com>

Reviewed-by: Kees Cook <keescook@chromium.org>

-- 
Kees Cook

WARNING: multiple messages have this Message-ID (diff)
From: Kees Cook <keescook@chromium.org>
To: Sami Tolvanen <samitolvanen@google.com>
Cc: Nathan Chancellor <nathan@kernel.org>,
	Nick Desaulniers <ndesaulniers@google.com>,
	Masahiro Yamada <masahiroy@kernel.org>,
	Will Deacon <will@kernel.org>, Jessica Yu <jeyu@kernel.org>,
	Arnd Bergmann <arnd@arndb.de>, Tejun Heo <tj@kernel.org>,
	bpf@vger.kernel.org, linux-hardening@vger.kernel.org,
	linux-arch@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
	linux-kbuild@vger.kernel.org, linux-pci@vger.kernel.org,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH 01/17] add support for Clang CFI
Date: Thu, 11 Mar 2021 18:39:44 -0800	[thread overview]
Message-ID: <202103111839.4A4375E@keescook> (raw)
In-Reply-To: <20210312004919.669614-2-samitolvanen@google.com>

On Thu, Mar 11, 2021 at 04:49:03PM -0800, Sami Tolvanen wrote:
> This change adds support for Clang’s forward-edge Control Flow
> Integrity (CFI) checking. With CONFIG_CFI_CLANG, the compiler
> injects a runtime check before each indirect function call to ensure
> the target is a valid function with the correct static type. This
> restricts possible call targets and makes it more difficult for
> an attacker to exploit bugs that allow the modification of stored
> function pointers. For more details, see:
> 
>   https://clang.llvm.org/docs/ControlFlowIntegrity.html
> 
> Clang requires CONFIG_LTO_CLANG to be enabled with CFI to gain
> visibility to possible call targets. Kernel modules are supported
> with Clang’s cross-DSO CFI mode, which allows checking between
> independently compiled components.
> 
> With CFI enabled, the compiler injects a __cfi_check() function into
> the kernel and each module for validating local call targets. For
> cross-module calls that cannot be validated locally, the compiler
> calls the global __cfi_slowpath_diag() function, which determines
> the target module and calls the correct __cfi_check() function. This
> patch includes a slowpath implementation that uses __module_address()
> to resolve call targets, and with CONFIG_CFI_CLANG_SHADOW enabled, a
> shadow map that speeds up module look-ups by ~3x.
> 
> Clang implements indirect call checking using jump tables and
> offers two methods of generating them. With canonical jump tables,
> the compiler renames each address-taken function to <function>.cfi
> and points the original symbol to a jump table entry, which passes
> __cfi_check() validation. This isn’t compatible with stand-alone
> assembly code, which the compiler doesn’t instrument, and would
> result in indirect calls to assembly code to fail. Therefore, we
> default to using non-canonical jump tables instead, where the compiler
> generates a local jump table entry <function>.cfi_jt for each
> address-taken function, and replaces all references to the function
> with the address of the jump table entry.
> 
> Note that because non-canonical jump table addresses are local
> to each component, they break cross-module function address
> equality. Specifically, the address of a global function will be
> different in each module, as it's replaced with the address of a local
> jump table entry. If this address is passed to a different module,
> it won’t match the address of the same function taken there. This
> may break code that relies on comparing addresses passed from other
> components.
> 
> CFI checking can be disabled in a function with the __nocfi attribute.
> Additionally, CFI can be disabled for an entire compilation unit by
> filtering out CC_FLAGS_CFI.
> 
> By default, CFI failures result in a kernel panic to stop a potential
> exploit. CONFIG_CFI_PERMISSIVE enables a permissive mode, where the
> kernel prints out a rate-limited warning instead, and allows execution
> to continue. This option is helpful for locating type mismatches, but
> should only be enabled during development.
> 
> Signed-off-by: Sami Tolvanen <samitolvanen@google.com>

Reviewed-by: Kees Cook <keescook@chromium.org>

-- 
Kees Cook

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

  reply	other threads:[~2021-03-12  2:40 UTC|newest]

Thread overview: 84+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-12  0:49 [PATCH 00/17] Add support for Clang CFI Sami Tolvanen
2021-03-12  0:49 ` Sami Tolvanen
2021-03-12  0:49 ` [PATCH 01/17] add " Sami Tolvanen
2021-03-12  0:49   ` Sami Tolvanen
2021-03-12  2:39   ` Kees Cook [this message]
2021-03-12  2:39     ` Kees Cook
2021-03-12  0:49 ` [PATCH 02/17] cfi: add __cficanonical Sami Tolvanen
2021-03-12  0:49   ` Sami Tolvanen
2021-03-12  2:40   ` Kees Cook
2021-03-12  2:40     ` Kees Cook
2021-03-12 20:28   ` Bjorn Helgaas
2021-03-12 20:28     ` Bjorn Helgaas
2021-03-12  0:49 ` [PATCH 03/17] mm: add generic __va_function and __pa_function macros Sami Tolvanen
2021-03-12  0:49   ` Sami Tolvanen
2021-03-12  2:40   ` Kees Cook
2021-03-12  2:40     ` Kees Cook
2021-03-12  0:49 ` [PATCH 04/17] module: cfi: ensure __cfi_check alignment Sami Tolvanen
2021-03-12  0:49   ` Sami Tolvanen
2021-03-12  2:39   ` Kees Cook
2021-03-12  2:39     ` Kees Cook
2021-03-16 20:03     ` Sami Tolvanen
2021-03-16 20:03       ` Sami Tolvanen
2021-03-12  0:49 ` [PATCH 05/17] workqueue: cfi: disable callback pointer check with modules Sami Tolvanen
2021-03-12  0:49   ` Sami Tolvanen
2021-03-12  2:43   ` Kees Cook
2021-03-12  2:43     ` Kees Cook
2021-03-12  0:49 ` [PATCH 06/17] kthread: " Sami Tolvanen
2021-03-12  0:49   ` Sami Tolvanen
2021-03-12  2:43   ` Kees Cook
2021-03-12  2:43     ` Kees Cook
2021-03-12  6:13   ` Christoph Hellwig
2021-03-12  6:13     ` Christoph Hellwig
2021-03-17 16:05     ` Sami Tolvanen
2021-03-17 16:05       ` Sami Tolvanen
2021-03-12  0:49 ` [PATCH 07/17] kallsyms: cfi: strip hashes from static functions Sami Tolvanen
2021-03-12  0:49   ` Sami Tolvanen
2021-03-12  2:45   ` Kees Cook
2021-03-12  2:45     ` Kees Cook
2021-03-16 20:33     ` Sami Tolvanen
2021-03-16 20:33       ` Sami Tolvanen
2021-03-12  0:49 ` [PATCH 08/17] bpf: disable CFI in dispatcher functions Sami Tolvanen
2021-03-12  0:49   ` Sami Tolvanen
2021-03-12  2:45   ` Kees Cook
2021-03-12  2:45     ` Kees Cook
2021-03-12  0:49 ` [PATCH 09/17] lib/list_sort: fix function type mismatches Sami Tolvanen
2021-03-12  0:49   ` Sami Tolvanen
2021-03-12  2:45   ` Kees Cook
2021-03-12  2:45     ` Kees Cook
2021-03-12  0:49 ` [PATCH 10/17] lkdtm: use __va_function Sami Tolvanen
2021-03-12  0:49   ` Sami Tolvanen
2021-03-12  2:45   ` Kees Cook
2021-03-12  2:45     ` Kees Cook
2021-03-12  0:49 ` [PATCH 11/17] psci: use __pa_function for cpu_resume Sami Tolvanen
2021-03-12  0:49   ` Sami Tolvanen
2021-03-12  2:45   ` Kees Cook
2021-03-12  2:45     ` Kees Cook
2021-03-12  0:49 ` [PATCH 12/17] arm64: implement __va_function Sami Tolvanen
2021-03-12  0:49   ` Sami Tolvanen
2021-03-12  2:46   ` Kees Cook
2021-03-12  2:46     ` Kees Cook
2021-03-12  0:49 ` [PATCH 13/17] arm64: use __pa_function Sami Tolvanen
2021-03-12  0:49   ` Sami Tolvanen
2021-03-12  2:46   ` Kees Cook
2021-03-12  2:46     ` Kees Cook
2021-03-12  0:49 ` [PATCH 14/17] arm64: add __nocfi to functions that jump to a physical address Sami Tolvanen
2021-03-12  0:49   ` Sami Tolvanen
2021-03-12  2:47   ` Kees Cook
2021-03-12  2:47     ` Kees Cook
2021-03-12  0:49 ` [PATCH 15/17] arm64: add __nocfi to __apply_alternatives Sami Tolvanen
2021-03-12  0:49   ` Sami Tolvanen
2021-03-12  2:50   ` Kees Cook
2021-03-12  2:50     ` Kees Cook
2021-03-12  0:49 ` [PATCH 16/17] KVM: arm64: Disable CFI for nVHE Sami Tolvanen
2021-03-12  0:49   ` Sami Tolvanen
2021-03-12  2:50   ` Kees Cook
2021-03-12  2:50     ` Kees Cook
2021-03-12  0:49 ` [PATCH 17/17] arm64: allow CONFIG_CFI_CLANG to be selected Sami Tolvanen
2021-03-12  0:49   ` Sami Tolvanen
2021-03-12  2:51   ` Kees Cook
2021-03-12  2:51     ` Kees Cook
2021-03-16 20:44     ` Sami Tolvanen
2021-03-16 20:44       ` Sami Tolvanen
2021-03-16 23:02       ` Kees Cook
2021-03-16 23:02         ` Kees Cook

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=202103111839.4A4375E@keescook \
    --to=keescook@chromium.org \
    --cc=arnd@arndb.de \
    --cc=bpf@vger.kernel.org \
    --cc=jeyu@kernel.org \
    --cc=linux-arch@vger.kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-hardening@vger.kernel.org \
    --cc=linux-kbuild@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=masahiroy@kernel.org \
    --cc=nathan@kernel.org \
    --cc=ndesaulniers@google.com \
    --cc=samitolvanen@google.com \
    --cc=tj@kernel.org \
    --cc=will@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.