Merge tag 'hardening-v6.18-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux

Pull hardening updates from Kees Cook:
 "One notable addition is the creation of the 'transitional' keyword for
  kconfig so CONFIG renaming can go more smoothly.

  This has been a long-standing deficiency, and with the renaming of
  CONFIG_CFI_CLANG to CONFIG_CFI (since GCC will soon have KCFI
  support), this came up again.

  The breadth of the diffstat is mainly this renaming.

   - Clean up usage of TRAILING_OVERLAP() (Gustavo A. R. Silva)

   - lkdtm: fortify: Fix potential NULL dereference on kmalloc failure
     (Junjie Cao)

   - Add str_assert_deassert() helper (Lad Prabhakar)

   - gcc-plugins: Remove TODO_verify_il for GCC >= 16

   - kconfig: Fix BrokenPipeError warnings in selftests

   - kconfig: Add transitional symbol attribute for migration support

   - kcfi: Rename CONFIG_CFI_CLANG to CONFIG_CFI"

* tag 'hardening-v6.18-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux:
  lib/string_choices: Add str_assert_deassert() helper
  kcfi: Rename CONFIG_CFI_CLANG to CONFIG_CFI
  kconfig: Add transitional symbol attribute for migration support
  kconfig: Fix BrokenPipeError warnings in selftests
  gcc-plugins: Remove TODO_verify_il for GCC >= 16
  stddef: Introduce __TRAILING_OVERLAP()
  stddef: Remove token-pasting in TRAILING_OVERLAP()
  lkdtm: fortify: Fix potential NULL dereference on kmalloc failure
This commit is contained in:
Linus Torvalds
2025-09-29 17:48:27 -07:00
72 changed files with 464 additions and 99 deletions
+32
View File
@@ -232,6 +232,38 @@ applicable everywhere (see syntax).
enables the third modular state for all config symbols. enables the third modular state for all config symbols.
At most one symbol may have the "modules" option set. At most one symbol may have the "modules" option set.
- transitional attribute: "transitional"
This declares the symbol as transitional, meaning it should be processed
during configuration but omitted from newly written .config files.
Transitional symbols are useful for backward compatibility during config
option migrations - they allow olddefconfig to process existing .config
files while ensuring the old option doesn't appear in new configurations.
A transitional symbol:
- Has no prompt (is not visible to users in menus)
- Is processed normally during configuration (values are read and used)
- Can be referenced in default expressions of other symbols
- Is not written to new .config files
- Cannot have any other properties (it is a pass-through option)
Example migration from OLD_NAME to NEW_NAME::
config NEW_NAME
bool "New option name"
default OLD_NAME
help
This replaces the old CONFIG_OLD_NAME option.
config OLD_NAME
bool
transitional
help
Transitional config for OLD_NAME to NEW_NAME migration.
With this setup, existing .config files with "CONFIG_OLD_NAME=y" will
result in "CONFIG_NEW_NAME=y" being set, while CONFIG_OLD_NAME will be
omitted from newly written .config files.
Menu dependencies Menu dependencies
----------------- -----------------
+1 -1
View File
@@ -1020,7 +1020,7 @@ KBUILD_AFLAGS += -fno-lto
export CC_FLAGS_LTO export CC_FLAGS_LTO
endif endif
ifdef CONFIG_CFI_CLANG ifdef CONFIG_CFI
CC_FLAGS_CFI := -fsanitize=kcfi CC_FLAGS_CFI := -fsanitize=kcfi
ifdef CONFIG_CFI_ICALL_NORMALIZE_INTEGERS ifdef CONFIG_CFI_ICALL_NORMALIZE_INTEGERS
CC_FLAGS_CFI += -fsanitize-cfi-icall-experimental-normalize-integers CC_FLAGS_CFI += -fsanitize-cfi-icall-experimental-normalize-integers
+23 -13
View File
@@ -867,22 +867,26 @@ config PROPELLER_CLANG
If unsure, say N. If unsure, say N.
config ARCH_SUPPORTS_CFI_CLANG config ARCH_SUPPORTS_CFI
bool bool
help help
An architecture should select this option if it can support Clang's An architecture should select this option if it can support Kernel
Control-Flow Integrity (CFI) checking. Control-Flow Integrity (CFI) checking (-fsanitize=kcfi).
config ARCH_USES_CFI_TRAPS config ARCH_USES_CFI_TRAPS
bool bool
help
An architecture should select this option if it requires the
.kcfi_traps section for KCFI trap handling.
config CFI_CLANG config CFI
bool "Use Clang's Control Flow Integrity (CFI)" bool "Use Kernel Control Flow Integrity (kCFI)"
depends on ARCH_SUPPORTS_CFI_CLANG default CFI_CLANG
depends on ARCH_SUPPORTS_CFI
depends on $(cc-option,-fsanitize=kcfi) depends on $(cc-option,-fsanitize=kcfi)
help help
This option enables Clang's forward-edge Control Flow Integrity This option enables forward-edge Control Flow Integrity (CFI)
(CFI) checking, where the compiler injects a runtime check to each checking, where the compiler injects a runtime check to each
indirect function call to ensure the target is a valid function with indirect function call to ensure the target is a valid function with
the correct static type. This restricts possible call targets and the correct static type. This restricts possible call targets and
makes it more difficult for an attacker to exploit bugs that allow makes it more difficult for an attacker to exploit bugs that allow
@@ -891,10 +895,16 @@ config CFI_CLANG
https://clang.llvm.org/docs/ControlFlowIntegrity.html https://clang.llvm.org/docs/ControlFlowIntegrity.html
config CFI_CLANG
bool
transitional
help
Transitional config for CFI_CLANG to CFI migration.
config CFI_ICALL_NORMALIZE_INTEGERS config CFI_ICALL_NORMALIZE_INTEGERS
bool "Normalize CFI tags for integers" bool "Normalize CFI tags for integers"
depends on CFI_CLANG depends on CFI
depends on HAVE_CFI_ICALL_NORMALIZE_INTEGERS_CLANG depends on HAVE_CFI_ICALL_NORMALIZE_INTEGERS
help help
This option normalizes the CFI tags for integer types so that all This option normalizes the CFI tags for integer types so that all
integer types of the same size and signedness receive the same CFI integer types of the same size and signedness receive the same CFI
@@ -907,7 +917,7 @@ config CFI_ICALL_NORMALIZE_INTEGERS
This option is necessary for using CFI with Rust. If unsure, say N. This option is necessary for using CFI with Rust. If unsure, say N.
config HAVE_CFI_ICALL_NORMALIZE_INTEGERS_CLANG config HAVE_CFI_ICALL_NORMALIZE_INTEGERS
def_bool y def_bool y
depends on $(cc-option,-fsanitize=kcfi -fsanitize-cfi-icall-experimental-normalize-integers) depends on $(cc-option,-fsanitize=kcfi -fsanitize-cfi-icall-experimental-normalize-integers)
# With GCOV/KASAN we need this fix: https://github.com/llvm/llvm-project/pull/104826 # With GCOV/KASAN we need this fix: https://github.com/llvm/llvm-project/pull/104826
@@ -915,7 +925,7 @@ config HAVE_CFI_ICALL_NORMALIZE_INTEGERS_CLANG
config HAVE_CFI_ICALL_NORMALIZE_INTEGERS_RUSTC config HAVE_CFI_ICALL_NORMALIZE_INTEGERS_RUSTC
def_bool y def_bool y
depends on HAVE_CFI_ICALL_NORMALIZE_INTEGERS_CLANG depends on HAVE_CFI_ICALL_NORMALIZE_INTEGERS
depends on RUSTC_VERSION >= 107900 depends on RUSTC_VERSION >= 107900
# With GCOV/KASAN we need this fix: https://github.com/rust-lang/rust/pull/129373 # With GCOV/KASAN we need this fix: https://github.com/rust-lang/rust/pull/129373
depends on (RUSTC_LLVM_VERSION >= 190103 && RUSTC_VERSION >= 108200) || \ depends on (RUSTC_LLVM_VERSION >= 190103 && RUSTC_VERSION >= 108200) || \
@@ -923,7 +933,7 @@ config HAVE_CFI_ICALL_NORMALIZE_INTEGERS_RUSTC
config CFI_PERMISSIVE config CFI_PERMISSIVE
bool "Use CFI in permissive mode" bool "Use CFI in permissive mode"
depends on CFI_CLANG depends on CFI
help help
When selected, Control Flow Integrity (CFI) violations result in a When selected, Control Flow Integrity (CFI) violations result in a
warning instead of a kernel panic. This option should only be used warning instead of a kernel panic. This option should only be used
+1 -1
View File
@@ -38,7 +38,7 @@ config ARM
select ARCH_OPTIONAL_KERNEL_RWX_DEFAULT if CPU_V7 select ARCH_OPTIONAL_KERNEL_RWX_DEFAULT if CPU_V7
select ARCH_NEED_CMPXCHG_1_EMU if CPU_V6 select ARCH_NEED_CMPXCHG_1_EMU if CPU_V6
select ARCH_SUPPORTS_ATOMIC_RMW select ARCH_SUPPORTS_ATOMIC_RMW
select ARCH_SUPPORTS_CFI_CLANG select ARCH_SUPPORTS_CFI
select ARCH_SUPPORTS_HUGETLBFS if ARM_LPAE select ARCH_SUPPORTS_HUGETLBFS if ARM_LPAE
select ARCH_SUPPORTS_PER_VMA_LOCK select ARCH_SUPPORTS_PER_VMA_LOCK
select ARCH_USE_BUILTIN_BSWAP select ARCH_USE_BUILTIN_BSWAP
+1 -1
View File
@@ -904,7 +904,7 @@ unlock:
watchpoint_single_step_handler(addr); watchpoint_single_step_handler(addr);
} }
#ifdef CONFIG_CFI_CLANG #ifdef CONFIG_CFI
static void hw_breakpoint_cfi_handler(struct pt_regs *regs) static void hw_breakpoint_cfi_handler(struct pt_regs *regs)
{ {
/* /*
+1 -1
View File
@@ -89,7 +89,7 @@ obj-$(CONFIG_CPU_V6) += proc-v6.o
obj-$(CONFIG_CPU_V6K) += proc-v6.o obj-$(CONFIG_CPU_V6K) += proc-v6.o
obj-$(CONFIG_CPU_V7) += proc-v7.o proc-v7-bugs.o obj-$(CONFIG_CPU_V7) += proc-v7.o proc-v7-bugs.o
obj-$(CONFIG_CPU_V7M) += proc-v7m.o obj-$(CONFIG_CPU_V7M) += proc-v7m.o
obj-$(CONFIG_CFI_CLANG) += proc.o obj-$(CONFIG_CFI) += proc.o
obj-$(CONFIG_OUTER_CACHE) += l2c-common.o obj-$(CONFIG_OUTER_CACHE) += l2c-common.o
obj-$(CONFIG_CACHE_B15_RAC) += cache-b15-rac.o obj-$(CONFIG_CACHE_B15_RAC) += cache-b15-rac.o
+1 -1
View File
@@ -112,7 +112,7 @@ SYM_FUNC_END(fa_flush_user_cache_range)
* - end - virtual end address * - end - virtual end address
*/ */
SYM_TYPED_FUNC_START(fa_coherent_kern_range) SYM_TYPED_FUNC_START(fa_coherent_kern_range)
#ifdef CONFIG_CFI_CLANG /* Fallthrough if !CFI */ #ifdef CONFIG_CFI /* Fallthrough if !CFI */
b fa_coherent_user_range b fa_coherent_user_range
#endif #endif
SYM_FUNC_END(fa_coherent_kern_range) SYM_FUNC_END(fa_coherent_kern_range)
+1 -1
View File
@@ -104,7 +104,7 @@ SYM_FUNC_END(v4_coherent_user_range)
* - size - region size * - size - region size
*/ */
SYM_TYPED_FUNC_START(v4_flush_kern_dcache_area) SYM_TYPED_FUNC_START(v4_flush_kern_dcache_area)
#ifdef CONFIG_CFI_CLANG /* Fallthrough if !CFI */ #ifdef CONFIG_CFI /* Fallthrough if !CFI */
b v4_dma_flush_range b v4_dma_flush_range
#endif #endif
SYM_FUNC_END(v4_flush_kern_dcache_area) SYM_FUNC_END(v4_flush_kern_dcache_area)
+2 -2
View File
@@ -136,7 +136,7 @@ SYM_FUNC_END(v4wb_flush_user_cache_range)
*/ */
SYM_TYPED_FUNC_START(v4wb_flush_kern_dcache_area) SYM_TYPED_FUNC_START(v4wb_flush_kern_dcache_area)
add r1, r0, r1 add r1, r0, r1
#ifdef CONFIG_CFI_CLANG /* Fallthrough if !CFI */ #ifdef CONFIG_CFI /* Fallthrough if !CFI */
b v4wb_coherent_user_range b v4wb_coherent_user_range
#endif #endif
SYM_FUNC_END(v4wb_flush_kern_dcache_area) SYM_FUNC_END(v4wb_flush_kern_dcache_area)
@@ -152,7 +152,7 @@ SYM_FUNC_END(v4wb_flush_kern_dcache_area)
* - end - virtual end address * - end - virtual end address
*/ */
SYM_TYPED_FUNC_START(v4wb_coherent_kern_range) SYM_TYPED_FUNC_START(v4wb_coherent_kern_range)
#ifdef CONFIG_CFI_CLANG /* Fallthrough if !CFI */ #ifdef CONFIG_CFI /* Fallthrough if !CFI */
b v4wb_coherent_user_range b v4wb_coherent_user_range
#endif #endif
SYM_FUNC_END(v4wb_coherent_kern_range) SYM_FUNC_END(v4wb_coherent_kern_range)
+1 -1
View File
@@ -108,7 +108,7 @@ SYM_FUNC_END(v4wt_flush_user_cache_range)
* - end - virtual end address * - end - virtual end address
*/ */
SYM_TYPED_FUNC_START(v4wt_coherent_kern_range) SYM_TYPED_FUNC_START(v4wt_coherent_kern_range)
#ifdef CONFIG_CFI_CLANG /* Fallthrough if !CFI */ #ifdef CONFIG_CFI /* Fallthrough if !CFI */
b v4wt_coherent_user_range b v4wt_coherent_user_range
#endif #endif
SYM_FUNC_END(v4wt_coherent_kern_range) SYM_FUNC_END(v4wt_coherent_kern_range)
+1 -1
View File
@@ -117,7 +117,7 @@ SYM_FUNC_END(v6_flush_user_cache_range)
* - the Icache does not read data from the write buffer * - the Icache does not read data from the write buffer
*/ */
SYM_TYPED_FUNC_START(v6_coherent_kern_range) SYM_TYPED_FUNC_START(v6_coherent_kern_range)
#ifdef CONFIG_CFI_CLANG /* Fallthrough if !CFI */ #ifdef CONFIG_CFI /* Fallthrough if !CFI */
b v6_coherent_user_range b v6_coherent_user_range
#endif #endif
SYM_FUNC_END(v6_coherent_kern_range) SYM_FUNC_END(v6_coherent_kern_range)
+1 -1
View File
@@ -261,7 +261,7 @@ SYM_FUNC_END(v7_flush_user_cache_range)
* - the Icache does not read data from the write buffer * - the Icache does not read data from the write buffer
*/ */
SYM_TYPED_FUNC_START(v7_coherent_kern_range) SYM_TYPED_FUNC_START(v7_coherent_kern_range)
#ifdef CONFIG_CFI_CLANG /* Fallthrough if !CFI */ #ifdef CONFIG_CFI /* Fallthrough if !CFI */
b v7_coherent_user_range b v7_coherent_user_range
#endif #endif
SYM_FUNC_END(v7_coherent_kern_range) SYM_FUNC_END(v7_coherent_kern_range)
+1 -1
View File
@@ -286,7 +286,7 @@ SYM_FUNC_END(v7m_flush_user_cache_range)
* - the Icache does not read data from the write buffer * - the Icache does not read data from the write buffer
*/ */
SYM_TYPED_FUNC_START(v7m_coherent_kern_range) SYM_TYPED_FUNC_START(v7m_coherent_kern_range)
#ifdef CONFIG_CFI_CLANG /* Fallthrough if !CFI */ #ifdef CONFIG_CFI /* Fallthrough if !CFI */
b v7m_coherent_user_range b v7m_coherent_user_range
#endif #endif
SYM_FUNC_END(v7m_coherent_kern_range) SYM_FUNC_END(v7m_coherent_kern_range)
+1 -1
View File
@@ -203,7 +203,7 @@ SYM_FUNC_END(arm1020_flush_user_cache_range)
* - end - virtual end address * - end - virtual end address
*/ */
SYM_TYPED_FUNC_START(arm1020_coherent_kern_range) SYM_TYPED_FUNC_START(arm1020_coherent_kern_range)
#ifdef CONFIG_CFI_CLANG /* Fallthrough if !CFI */ #ifdef CONFIG_CFI /* Fallthrough if !CFI */
b arm1020_coherent_user_range b arm1020_coherent_user_range
#endif #endif
SYM_FUNC_END(arm1020_coherent_kern_range) SYM_FUNC_END(arm1020_coherent_kern_range)
+1 -1
View File
@@ -200,7 +200,7 @@ SYM_FUNC_END(arm1020e_flush_user_cache_range)
* - end - virtual end address * - end - virtual end address
*/ */
SYM_TYPED_FUNC_START(arm1020e_coherent_kern_range) SYM_TYPED_FUNC_START(arm1020e_coherent_kern_range)
#ifdef CONFIG_CFI_CLANG /* Fallthrough if !CFI */ #ifdef CONFIG_CFI /* Fallthrough if !CFI */
b arm1020e_coherent_user_range b arm1020e_coherent_user_range
#endif #endif
SYM_FUNC_END(arm1020e_coherent_kern_range) SYM_FUNC_END(arm1020e_coherent_kern_range)
+1 -1
View File
@@ -199,7 +199,7 @@ SYM_FUNC_END(arm1022_flush_user_cache_range)
* - end - virtual end address * - end - virtual end address
*/ */
SYM_TYPED_FUNC_START(arm1022_coherent_kern_range) SYM_TYPED_FUNC_START(arm1022_coherent_kern_range)
#ifdef CONFIG_CFI_CLANG /* Fallthrough if !CFI */ #ifdef CONFIG_CFI /* Fallthrough if !CFI */
b arm1022_coherent_user_range b arm1022_coherent_user_range
#endif #endif
SYM_FUNC_END(arm1022_coherent_kern_range) SYM_FUNC_END(arm1022_coherent_kern_range)
+1 -1
View File
@@ -194,7 +194,7 @@ SYM_FUNC_END(arm1026_flush_user_cache_range)
* - end - virtual end address * - end - virtual end address
*/ */
SYM_TYPED_FUNC_START(arm1026_coherent_kern_range) SYM_TYPED_FUNC_START(arm1026_coherent_kern_range)
#ifdef CONFIG_CFI_CLANG /* Fallthrough if !CFI */ #ifdef CONFIG_CFI /* Fallthrough if !CFI */
b arm1026_coherent_user_range b arm1026_coherent_user_range
#endif #endif
SYM_FUNC_END(arm1026_coherent_kern_range) SYM_FUNC_END(arm1026_coherent_kern_range)
+1 -1
View File
@@ -180,7 +180,7 @@ SYM_FUNC_END(arm920_flush_user_cache_range)
* - end - virtual end address * - end - virtual end address
*/ */
SYM_TYPED_FUNC_START(arm920_coherent_kern_range) SYM_TYPED_FUNC_START(arm920_coherent_kern_range)
#ifdef CONFIG_CFI_CLANG /* Fallthrough if !CFI */ #ifdef CONFIG_CFI /* Fallthrough if !CFI */
b arm920_coherent_user_range b arm920_coherent_user_range
#endif #endif
SYM_FUNC_END(arm920_coherent_kern_range) SYM_FUNC_END(arm920_coherent_kern_range)
+1 -1
View File
@@ -182,7 +182,7 @@ SYM_FUNC_END(arm922_flush_user_cache_range)
* - end - virtual end address * - end - virtual end address
*/ */
SYM_TYPED_FUNC_START(arm922_coherent_kern_range) SYM_TYPED_FUNC_START(arm922_coherent_kern_range)
#ifdef CONFIG_CFI_CLANG /* Fallthrough if !CFI */ #ifdef CONFIG_CFI /* Fallthrough if !CFI */
b arm922_coherent_user_range b arm922_coherent_user_range
#endif #endif
SYM_FUNC_END(arm922_coherent_kern_range) SYM_FUNC_END(arm922_coherent_kern_range)
+1 -1
View File
@@ -229,7 +229,7 @@ SYM_FUNC_END(arm925_flush_user_cache_range)
* - end - virtual end address * - end - virtual end address
*/ */
SYM_TYPED_FUNC_START(arm925_coherent_kern_range) SYM_TYPED_FUNC_START(arm925_coherent_kern_range)
#ifdef CONFIG_CFI_CLANG /* Fallthrough if !CFI */ #ifdef CONFIG_CFI /* Fallthrough if !CFI */
b arm925_coherent_user_range b arm925_coherent_user_range
#endif #endif
SYM_FUNC_END(arm925_coherent_kern_range) SYM_FUNC_END(arm925_coherent_kern_range)

Some files were not shown because too many files have changed in this diff Show More