* [PATCH 0/3] ubsan/overflow: Enable pattern exclusions
@ 2025-03-07 4:19 Kees Cook
2025-03-07 4:19 ` [PATCH 1/3] ubsan/overflow: Rework integer overflow sanitizer option to turn on everything Kees Cook
` (2 more replies)
0 siblings, 3 replies; 9+ messages in thread
From: Kees Cook @ 2025-03-07 4:19 UTC (permalink / raw)
To: Justin Stitt
Cc: Kees Cook, Gustavo A. R. Silva, Andrew Morton, Marco Elver,
Andrey Konovalov, Andrey Ryabinin, Masahiro Yamada,
Nathan Chancellor, Nicolas Schier, Miguel Ojeda, Nick Desaulniers,
Hao Luo, Przemek Kitszel, Bill Wendling, Jakub Kicinski,
Tony Ambardar, Alexander Potapenko, Jan Hendrik Farr,
Alexander Lobakin, linux-kernel, linux-hardening, kasan-dev,
linux-kbuild, llvm
Hi,
This brings Linux's integer overflow mitigation integration up to the
current set of features available in Clang for handling things sanely
(i.e. pattern exclusions). While this isn't over yet, it puts all the
infrastructure in place to continue keeping up to date with current
Clang development. The next step is to add support for the coming
canonical wrapping and non-wrapping types[1].
-Kees
[1] https://discourse.llvm.org/t/rfc-clang-canonical-wrapping-and-non-wrapping-types/84356
Kees Cook (3):
ubsan/overflow: Rework integer overflow sanitizer option to turn on
everything
ubsan/overflow: Enable pattern exclusions
ubsan/overflow: Enable ignorelist parsing and add type filter
include/linux/compiler_types.h | 2 +-
kernel/configs/hardening.config | 2 +-
lib/Kconfig.ubsan | 25 +++++++++++++------------
lib/test_ubsan.c | 18 ++++++++++++++----
lib/ubsan.c | 28 ++++++++++++++++++++++++++--
lib/ubsan.h | 8 ++++++++
scripts/Makefile.lib | 4 ++--
scripts/Makefile.ubsan | 10 ++++++++--
scripts/integer-wrap-ignore.scl | 3 +++
9 files changed, 76 insertions(+), 24 deletions(-)
create mode 100644 scripts/integer-wrap-ignore.scl
--
2.34.1
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 1/3] ubsan/overflow: Rework integer overflow sanitizer option to turn on everything
2025-03-07 4:19 [PATCH 0/3] ubsan/overflow: Enable pattern exclusions Kees Cook
@ 2025-03-07 4:19 ` Kees Cook
2025-03-13 15:29 ` Marco Elver
2025-03-07 4:19 ` [PATCH 2/3] ubsan/overflow: Enable pattern exclusions Kees Cook
2025-03-07 4:19 ` [PATCH 3/3] ubsan/overflow: Enable ignorelist parsing and add type filter Kees Cook
2 siblings, 1 reply; 9+ messages in thread
From: Kees Cook @ 2025-03-07 4:19 UTC (permalink / raw)
To: Justin Stitt
Cc: Kees Cook, Gustavo A. R. Silva, Andrew Morton, Marco Elver,
Andrey Konovalov, Andrey Ryabinin, Masahiro Yamada,
Nathan Chancellor, Nicolas Schier, Miguel Ojeda, Nick Desaulniers,
Hao Luo, Przemek Kitszel, linux-hardening, kasan-dev,
linux-kbuild, Bill Wendling, Jakub Kicinski, Tony Ambardar,
Alexander Potapenko, Jan Hendrik Farr, Alexander Lobakin,
linux-kernel, llvm
Since we're going to approach integer overflow mitigation a type at a
time, we need to enable all of the associated sanitizers, and then opt
into types one at a time.
Rename the existing "signed wrap" sanitizer to just the entire topic area:
"integer wrap". Enable the implicit integer truncation sanitizers, with
required callbacks and tests.
Notably, this requires features (currently) only available in Clang,
so we can depend on the cc-option tests to determine availability
instead of doing version tests.
Signed-off-by: Kees Cook <kees@kernel.org>
---
Cc: Justin Stitt <justinstitt@google.com>
Cc: "Gustavo A. R. Silva" <gustavoars@kernel.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Marco Elver <elver@google.com>
Cc: Andrey Konovalov <andreyknvl@gmail.com>
Cc: Andrey Ryabinin <ryabinin.a.a@gmail.com>
Cc: Masahiro Yamada <masahiroy@kernel.org>
Cc: Nathan Chancellor <nathan@kernel.org>
Cc: Nicolas Schier <nicolas@fjasle.eu>
Cc: Miguel Ojeda <ojeda@kernel.org>
Cc: Nick Desaulniers <ndesaulniers@google.com>
Cc: Hao Luo <haoluo@google.com>
Cc: Przemek Kitszel <przemyslaw.kitszel@intel.com>
Cc: linux-hardening@vger.kernel.org
Cc: kasan-dev@googlegroups.com
Cc: linux-kbuild@vger.kernel.org
---
include/linux/compiler_types.h | 2 +-
kernel/configs/hardening.config | 2 +-
lib/Kconfig.ubsan | 23 +++++++++++------------
lib/test_ubsan.c | 18 ++++++++++++++----
lib/ubsan.c | 28 ++++++++++++++++++++++++++--
lib/ubsan.h | 8 ++++++++
scripts/Makefile.lib | 4 ++--
scripts/Makefile.ubsan | 8 ++++++--
8 files changed, 69 insertions(+), 24 deletions(-)
diff --git a/include/linux/compiler_types.h b/include/linux/compiler_types.h
index f59393464ea7..4ad3e900bc3d 100644
--- a/include/linux/compiler_types.h
+++ b/include/linux/compiler_types.h
@@ -360,7 +360,7 @@ struct ftrace_likely_data {
#endif
/* Do not trap wrapping arithmetic within an annotated function. */
-#ifdef CONFIG_UBSAN_SIGNED_WRAP
+#ifdef CONFIG_UBSAN_INTEGER_WRAP
# define __signed_wrap __attribute__((no_sanitize("signed-integer-overflow")))
#else
# define __signed_wrap
diff --git a/kernel/configs/hardening.config b/kernel/configs/hardening.config
index 3fabb8f55ef6..dd7c32fb5ac1 100644
--- a/kernel/configs/hardening.config
+++ b/kernel/configs/hardening.config
@@ -46,7 +46,7 @@ CONFIG_UBSAN_BOUNDS=y
# CONFIG_UBSAN_SHIFT is not set
# CONFIG_UBSAN_DIV_ZERO is not set
# CONFIG_UBSAN_UNREACHABLE is not set
-# CONFIG_UBSAN_SIGNED_WRAP is not set
+# CONFIG_UBSAN_INTEGER_WRAP is not set
# CONFIG_UBSAN_BOOL is not set
# CONFIG_UBSAN_ENUM is not set
# CONFIG_UBSAN_ALIGNMENT is not set
diff --git a/lib/Kconfig.ubsan b/lib/Kconfig.ubsan
index 1d4aa7a83b3a..63e5622010e0 100644
--- a/lib/Kconfig.ubsan
+++ b/lib/Kconfig.ubsan
@@ -116,21 +116,20 @@ config UBSAN_UNREACHABLE
This option enables -fsanitize=unreachable which checks for control
flow reaching an expected-to-be-unreachable position.
-config UBSAN_SIGNED_WRAP
- bool "Perform checking for signed arithmetic wrap-around"
+config UBSAN_INTEGER_WRAP
+ bool "Perform checking for integer arithmetic wrap-around"
default UBSAN
depends on !COMPILE_TEST
- # The no_sanitize attribute was introduced in GCC with version 8.
- depends on !CC_IS_GCC || GCC_VERSION >= 80000
depends on $(cc-option,-fsanitize=signed-integer-overflow)
- help
- This option enables -fsanitize=signed-integer-overflow which checks
- for wrap-around of any arithmetic operations with signed integers.
- This currently performs nearly no instrumentation due to the
- kernel's use of -fno-strict-overflow which converts all would-be
- arithmetic undefined behavior into wrap-around arithmetic. Future
- sanitizer versions will allow for wrap-around checking (rather than
- exclusively undefined behavior).
+ depends on $(cc-option,-fsanitize=unsigned-integer-overflow)
+ depends on $(cc-option,-fsanitize=implicit-signed-integer-truncation)
+ depends on $(cc-option,-fsanitize=implicit-unsigned-integer-truncation)
+ help
+ This option enables all of the sanitizers involved in integer overflow
+ (wrap-around) mitigation: signed-integer-overflow, unsigned-integer-overflow,
+ implicit-signed-integer-truncation, and implicit-unsigned-integer-truncation.
+ This is currently limited only to the size_t type while testing and
+ compiler development continues.
config UBSAN_BOOL
bool "Perform checking for non-boolean values used as boolean"
diff --git a/lib/test_ubsan.c b/lib/test_ubsan.c
index 5d7b10e98610..8772e5edaa4f 100644
--- a/lib/test_ubsan.c
+++ b/lib/test_ubsan.c
@@ -15,7 +15,7 @@ static void test_ubsan_add_overflow(void)
{
volatile int val = INT_MAX;
- UBSAN_TEST(CONFIG_UBSAN_SIGNED_WRAP);
+ UBSAN_TEST(CONFIG_UBSAN_INTEGER_WRAP);
val += 2;
}
@@ -24,7 +24,7 @@ static void test_ubsan_sub_overflow(void)
volatile int val = INT_MIN;
volatile int val2 = 2;
- UBSAN_TEST(CONFIG_UBSAN_SIGNED_WRAP);
+ UBSAN_TEST(CONFIG_UBSAN_INTEGER_WRAP);
val -= val2;
}
@@ -32,7 +32,7 @@ static void test_ubsan_mul_overflow(void)
{
volatile int val = INT_MAX / 2;
- UBSAN_TEST(CONFIG_UBSAN_SIGNED_WRAP);
+ UBSAN_TEST(CONFIG_UBSAN_INTEGER_WRAP);
val *= 3;
}
@@ -40,7 +40,7 @@ static void test_ubsan_negate_overflow(void)
{
volatile int val = INT_MIN;
- UBSAN_TEST(CONFIG_UBSAN_SIGNED_WRAP);
+ UBSAN_TEST(CONFIG_UBSAN_INTEGER_WRAP);
val = -val;
}
@@ -53,6 +53,15 @@ static void test_ubsan_divrem_overflow(void)
val /= val2;
}
+static void test_ubsan_truncate_signed(void)
+{
+ volatile long val = LONG_MAX;
+ volatile int val2 = 0;
+
+ UBSAN_TEST(CONFIG_UBSAN_INTEGER_WRAP);
+ val2 = val;
+}
+
static void test_ubsan_shift_out_of_bounds(void)
{
volatile int neg = -1, wrap = 4;
@@ -127,6 +136,7 @@ static const test_ubsan_fp test_ubsan_array[] = {
test_ubsan_sub_overflow,
test_ubsan_mul_overflow,
test_ubsan_negate_overflow,
+ test_ubsan_truncate_signed,
test_ubsan_shift_out_of_bounds,
test_ubsan_out_of_bounds,
test_ubsan_load_invalid_value,
diff --git a/lib/ubsan.c b/lib/ubsan.c
index a1c983d148f1..cdc1d31c3821 100644
--- a/lib/ubsan.c
+++ b/lib/ubsan.c
@@ -44,7 +44,7 @@ const char *report_ubsan_failure(struct pt_regs *regs, u32 check_type)
case ubsan_shift_out_of_bounds:
return "UBSAN: shift out of bounds";
#endif
-#if defined(CONFIG_UBSAN_DIV_ZERO) || defined(CONFIG_UBSAN_SIGNED_WRAP)
+#if defined(CONFIG_UBSAN_DIV_ZERO) || defined(CONFIG_UBSAN_INTEGER_WRAP)
/*
* SanitizerKind::IntegerDivideByZero and
* SanitizerKind::SignedIntegerOverflow emit
@@ -79,7 +79,7 @@ const char *report_ubsan_failure(struct pt_regs *regs, u32 check_type)
case ubsan_type_mismatch:
return "UBSAN: type mismatch";
#endif
-#ifdef CONFIG_UBSAN_SIGNED_WRAP
+#ifdef CONFIG_UBSAN_INTEGER_WRAP
/*
* SanitizerKind::SignedIntegerOverflow emits
* SanitizerHandler::AddOverflow, SanitizerHandler::SubOverflow,
@@ -303,6 +303,30 @@ void __ubsan_handle_negate_overflow(void *_data, void *old_val)
}
EXPORT_SYMBOL(__ubsan_handle_negate_overflow);
+void __ubsan_handle_implicit_conversion(void *_data, void *from_val, void *to_val)
+{
+ struct implicit_conversion_data *data = _data;
+ char from_val_str[VALUE_LENGTH];
+ char to_val_str[VALUE_LENGTH];
+
+ if (suppress_report(&data->location))
+ return;
+
+ val_to_string(from_val_str, sizeof(from_val_str), data->from_type, from_val);
+ val_to_string(to_val_str, sizeof(to_val_str), data->to_type, to_val);
+
+ ubsan_prologue(&data->location, "implicit-conversion");
+
+ pr_err("cannot represent %s value %s during %s %s, truncated to %s\n",
+ data->from_type->type_name,
+ from_val_str,
+ type_check_kinds[data->type_check_kind],
+ data->to_type->type_name,
+ to_val_str);
+
+ ubsan_epilogue();
+}
+EXPORT_SYMBOL(__ubsan_handle_implicit_conversion);
void __ubsan_handle_divrem_overflow(void *_data, void *lhs, void *rhs)
{
diff --git a/lib/ubsan.h b/lib/ubsan.h
index 07e37d4429b4..b37e22374e77 100644
--- a/lib/ubsan.h
+++ b/lib/ubsan.h
@@ -62,6 +62,13 @@ struct overflow_data {
struct type_descriptor *type;
};
+struct implicit_conversion_data {
+ struct source_location location;
+ struct type_descriptor *from_type;
+ struct type_descriptor *to_type;
+ unsigned char type_check_kind;
+};
+
struct type_mismatch_data {
struct source_location location;
struct type_descriptor *type;
@@ -142,6 +149,7 @@ void ubsan_linkage __ubsan_handle_sub_overflow(void *data, void *lhs, void *rhs)
void ubsan_linkage __ubsan_handle_mul_overflow(void *data, void *lhs, void *rhs);
void ubsan_linkage __ubsan_handle_negate_overflow(void *_data, void *old_val);
void ubsan_linkage __ubsan_handle_divrem_overflow(void *_data, void *lhs, void *rhs);
+void ubsan_linkage __ubsan_handle_implicit_conversion(void *_data, void *lhs, void *rhs);
void ubsan_linkage __ubsan_handle_type_mismatch(struct type_mismatch_data *data, void *ptr);
void ubsan_linkage __ubsan_handle_type_mismatch_v1(void *_data, void *ptr);
void ubsan_linkage __ubsan_handle_out_of_bounds(void *_data, void *index);
diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib
index cad20f0e66ee..981d14ef9db2 100644
--- a/scripts/Makefile.lib
+++ b/scripts/Makefile.lib
@@ -166,8 +166,8 @@ _c_flags += $(if $(patsubst n%,, \
$(UBSAN_SANITIZE_$(target-stem).o)$(UBSAN_SANITIZE)$(is-kernel-object)), \
$(CFLAGS_UBSAN))
_c_flags += $(if $(patsubst n%,, \
- $(UBSAN_SIGNED_WRAP_$(target-stem).o)$(UBSAN_SANITIZE_$(target-stem).o)$(UBSAN_SIGNED_WRAP)$(UBSAN_SANITIZE)$(is-kernel-object)), \
- $(CFLAGS_UBSAN_SIGNED_WRAP))
+ $(UBSAN_INTEGER_WRAP_$(target-stem).o)$(UBSAN_SANITIZE_$(target-stem).o)$(UBSAN_INTEGER_WRAP)$(UBSAN_SANITIZE)$(is-kernel-object)), \
+ $(CFLAGS_UBSAN_INTEGER_WRAP))
endif
ifeq ($(CONFIG_KCOV),y)
diff --git a/scripts/Makefile.ubsan b/scripts/Makefile.ubsan
index b2d3b273b802..4fad9afed24c 100644
--- a/scripts/Makefile.ubsan
+++ b/scripts/Makefile.ubsan
@@ -14,5 +14,9 @@ ubsan-cflags-$(CONFIG_UBSAN_TRAP) += $(call cc-option,-fsanitize-trap=undefined
export CFLAGS_UBSAN := $(ubsan-cflags-y)
-ubsan-signed-wrap-cflags-$(CONFIG_UBSAN_SIGNED_WRAP) += -fsanitize=signed-integer-overflow
-export CFLAGS_UBSAN_SIGNED_WRAP := $(ubsan-signed-wrap-cflags-y)
+ubsan-integer-wrap-cflags-$(CONFIG_UBSAN_INTEGER_WRAP) += \
+ -fsanitize=signed-integer-overflow \
+ -fsanitize=unsigned-integer-overflow \
+ -fsanitize=implicit-signed-integer-truncation \
+ -fsanitize=implicit-unsigned-integer-truncation
+export CFLAGS_UBSAN_INTEGER_WRAP := $(ubsan-integer-wrap-cflags-y)
--
2.34.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 2/3] ubsan/overflow: Enable pattern exclusions
2025-03-07 4:19 [PATCH 0/3] ubsan/overflow: Enable pattern exclusions Kees Cook
2025-03-07 4:19 ` [PATCH 1/3] ubsan/overflow: Rework integer overflow sanitizer option to turn on everything Kees Cook
@ 2025-03-07 4:19 ` Kees Cook
2025-03-07 23:12 ` Justin Stitt
2025-03-07 4:19 ` [PATCH 3/3] ubsan/overflow: Enable ignorelist parsing and add type filter Kees Cook
2 siblings, 1 reply; 9+ messages in thread
From: Kees Cook @ 2025-03-07 4:19 UTC (permalink / raw)
To: Justin Stitt
Cc: Kees Cook, Gustavo A. R. Silva, Masahiro Yamada,
Nathan Chancellor, Nicolas Schier, Marco Elver, Andrey Konovalov,
Andrey Ryabinin, linux-kbuild, kasan-dev, linux-hardening,
Andrew Morton, Miguel Ojeda, Nick Desaulniers, Hao Luo,
Przemek Kitszel, Bill Wendling, Jakub Kicinski, Tony Ambardar,
Alexander Potapenko, Jan Hendrik Farr, Alexander Lobakin,
linux-kernel, llvm
To make integer wrap-around mitigation actually useful, the associated
sanitizers must not instrument cases where the wrap-around is explicitly
defined (e.g. "-2UL"), being tested for (e.g. "if (a + b < a)"), or
where it has no impact on code flow (e.g. "while (var--)"). Enable
pattern exclusions for the integer wrap sanitizers.
Signed-off-by: Kees Cook <kees@kernel.org>
---
Cc: Justin Stitt <justinstitt@google.com>
Cc: "Gustavo A. R. Silva" <gustavoars@kernel.org>
Cc: Masahiro Yamada <masahiroy@kernel.org>
Cc: Nathan Chancellor <nathan@kernel.org>
Cc: Nicolas Schier <nicolas@fjasle.eu>
Cc: Marco Elver <elver@google.com>
Cc: Andrey Konovalov <andreyknvl@gmail.com>
Cc: Andrey Ryabinin <ryabinin.a.a@gmail.com>
Cc: linux-kbuild@vger.kernel.org
Cc: kasan-dev@googlegroups.com
Cc: linux-hardening@vger.kernel.org
---
lib/Kconfig.ubsan | 1 +
scripts/Makefile.ubsan | 1 +
2 files changed, 2 insertions(+)
diff --git a/lib/Kconfig.ubsan b/lib/Kconfig.ubsan
index 63e5622010e0..888c2e72c586 100644
--- a/lib/Kconfig.ubsan
+++ b/lib/Kconfig.ubsan
@@ -120,6 +120,7 @@ config UBSAN_INTEGER_WRAP
bool "Perform checking for integer arithmetic wrap-around"
default UBSAN
depends on !COMPILE_TEST
+ depends on $(cc-option,-fsanitize-undefined-ignore-overflow-pattern=all)
depends on $(cc-option,-fsanitize=signed-integer-overflow)
depends on $(cc-option,-fsanitize=unsigned-integer-overflow)
depends on $(cc-option,-fsanitize=implicit-signed-integer-truncation)
diff --git a/scripts/Makefile.ubsan b/scripts/Makefile.ubsan
index 4fad9afed24c..233379c193a7 100644
--- a/scripts/Makefile.ubsan
+++ b/scripts/Makefile.ubsan
@@ -15,6 +15,7 @@ ubsan-cflags-$(CONFIG_UBSAN_TRAP) += $(call cc-option,-fsanitize-trap=undefined
export CFLAGS_UBSAN := $(ubsan-cflags-y)
ubsan-integer-wrap-cflags-$(CONFIG_UBSAN_INTEGER_WRAP) += \
+ -fsanitize-undefined-ignore-overflow-pattern=all \
-fsanitize=signed-integer-overflow \
-fsanitize=unsigned-integer-overflow \
-fsanitize=implicit-signed-integer-truncation \
--
2.34.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 3/3] ubsan/overflow: Enable ignorelist parsing and add type filter
2025-03-07 4:19 [PATCH 0/3] ubsan/overflow: Enable pattern exclusions Kees Cook
2025-03-07 4:19 ` [PATCH 1/3] ubsan/overflow: Rework integer overflow sanitizer option to turn on everything Kees Cook
2025-03-07 4:19 ` [PATCH 2/3] ubsan/overflow: Enable pattern exclusions Kees Cook
@ 2025-03-07 4:19 ` Kees Cook
2025-03-07 23:33 ` Justin Stitt
2025-03-07 23:39 ` Justin Stitt
2 siblings, 2 replies; 9+ messages in thread
From: Kees Cook @ 2025-03-07 4:19 UTC (permalink / raw)
To: Justin Stitt
Cc: Kees Cook, Gustavo A. R. Silva, Marco Elver, Andrey Konovalov,
Andrey Ryabinin, Andrew Morton, Masahiro Yamada,
Nathan Chancellor, Nicolas Schier, kasan-dev, linux-hardening,
linux-kbuild, Miguel Ojeda, Nick Desaulniers, Hao Luo,
Przemek Kitszel, Bill Wendling, Jakub Kicinski, Tony Ambardar,
Alexander Potapenko, Jan Hendrik Farr, Alexander Lobakin,
linux-kernel, llvm
Limit integer wrap-around mitigation to only the "size_t" type (for
now). Notably this covers all special functions/builtins that return
"size_t", like sizeof(). This remains an experimental feature and is
likely to be replaced with type annotations.
Signed-off-by: Kees Cook <kees@kernel.org>
---
Cc: Justin Stitt <justinstitt@google.com>
Cc: "Gustavo A. R. Silva" <gustavoars@kernel.org>
Cc: Marco Elver <elver@google.com>
Cc: Andrey Konovalov <andreyknvl@gmail.com>
Cc: Andrey Ryabinin <ryabinin.a.a@gmail.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Masahiro Yamada <masahiroy@kernel.org>
Cc: Nathan Chancellor <nathan@kernel.org>
Cc: Nicolas Schier <nicolas@fjasle.eu>
Cc: kasan-dev@googlegroups.com
Cc: linux-hardening@vger.kernel.org
Cc: linux-kbuild@vger.kernel.org
---
lib/Kconfig.ubsan | 1 +
scripts/Makefile.ubsan | 3 ++-
scripts/integer-wrap-ignore.scl | 3 +++
3 files changed, 6 insertions(+), 1 deletion(-)
create mode 100644 scripts/integer-wrap-ignore.scl
diff --git a/lib/Kconfig.ubsan b/lib/Kconfig.ubsan
index 888c2e72c586..4216b3a4ff21 100644
--- a/lib/Kconfig.ubsan
+++ b/lib/Kconfig.ubsan
@@ -125,6 +125,7 @@ config UBSAN_INTEGER_WRAP
depends on $(cc-option,-fsanitize=unsigned-integer-overflow)
depends on $(cc-option,-fsanitize=implicit-signed-integer-truncation)
depends on $(cc-option,-fsanitize=implicit-unsigned-integer-truncation)
+ depends on $(cc-option,-fsanitize-ignorelist=/dev/null)
help
This option enables all of the sanitizers involved in integer overflow
(wrap-around) mitigation: signed-integer-overflow, unsigned-integer-overflow,
diff --git a/scripts/Makefile.ubsan b/scripts/Makefile.ubsan
index 233379c193a7..9e35198edbf0 100644
--- a/scripts/Makefile.ubsan
+++ b/scripts/Makefile.ubsan
@@ -19,5 +19,6 @@ ubsan-integer-wrap-cflags-$(CONFIG_UBSAN_INTEGER_WRAP) += \
-fsanitize=signed-integer-overflow \
-fsanitize=unsigned-integer-overflow \
-fsanitize=implicit-signed-integer-truncation \
- -fsanitize=implicit-unsigned-integer-truncation
+ -fsanitize=implicit-unsigned-integer-truncation \
+ -fsanitize-ignorelist=$(srctree)/scripts/integer-wrap-ignore.scl
export CFLAGS_UBSAN_INTEGER_WRAP := $(ubsan-integer-wrap-cflags-y)
diff --git a/scripts/integer-wrap-ignore.scl b/scripts/integer-wrap-ignore.scl
new file mode 100644
index 000000000000..431c3053a4a2
--- /dev/null
+++ b/scripts/integer-wrap-ignore.scl
@@ -0,0 +1,3 @@
+[{unsigned-integer-overflow,signed-integer-overflow,implicit-signed-integer-truncation,implicit-unsigned-integer-truncation}]
+type:*
+type:size_t=sanitize
--
2.34.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH 2/3] ubsan/overflow: Enable pattern exclusions
2025-03-07 4:19 ` [PATCH 2/3] ubsan/overflow: Enable pattern exclusions Kees Cook
@ 2025-03-07 23:12 ` Justin Stitt
0 siblings, 0 replies; 9+ messages in thread
From: Justin Stitt @ 2025-03-07 23:12 UTC (permalink / raw)
To: Kees Cook
Cc: Gustavo A. R. Silva, Masahiro Yamada, Nathan Chancellor,
Nicolas Schier, Marco Elver, Andrey Konovalov, Andrey Ryabinin,
linux-kbuild, kasan-dev, linux-hardening, Andrew Morton,
Miguel Ojeda, Nick Desaulniers, Hao Luo, Przemek Kitszel,
Bill Wendling, Jakub Kicinski, Tony Ambardar, Alexander Potapenko,
Jan Hendrik Farr, Alexander Lobakin, linux-kernel, llvm
Hi,
On Thu, Mar 06, 2025 at 08:19:10PM -0800, Kees Cook wrote:
> To make integer wrap-around mitigation actually useful, the associated
> sanitizers must not instrument cases where the wrap-around is explicitly
> defined (e.g. "-2UL"), being tested for (e.g. "if (a + b < a)"), or
> where it has no impact on code flow (e.g. "while (var--)"). Enable
> pattern exclusions for the integer wrap sanitizers.
>
> Signed-off-by: Kees Cook <kees@kernel.org>
> ---
> Cc: Justin Stitt <justinstitt@google.com>
> Cc: "Gustavo A. R. Silva" <gustavoars@kernel.org>
> Cc: Masahiro Yamada <masahiroy@kernel.org>
> Cc: Nathan Chancellor <nathan@kernel.org>
> Cc: Nicolas Schier <nicolas@fjasle.eu>
> Cc: Marco Elver <elver@google.com>
> Cc: Andrey Konovalov <andreyknvl@gmail.com>
> Cc: Andrey Ryabinin <ryabinin.a.a@gmail.com>
> Cc: linux-kbuild@vger.kernel.org
> Cc: kasan-dev@googlegroups.com
> Cc: linux-hardening@vger.kernel.org
> ---
> lib/Kconfig.ubsan | 1 +
> scripts/Makefile.ubsan | 1 +
> 2 files changed, 2 insertions(+)
>
> diff --git a/lib/Kconfig.ubsan b/lib/Kconfig.ubsan
> index 63e5622010e0..888c2e72c586 100644
> --- a/lib/Kconfig.ubsan
> +++ b/lib/Kconfig.ubsan
> @@ -120,6 +120,7 @@ config UBSAN_INTEGER_WRAP
> bool "Perform checking for integer arithmetic wrap-around"
> default UBSAN
> depends on !COMPILE_TEST
> + depends on $(cc-option,-fsanitize-undefined-ignore-overflow-pattern=all)
This option group "all" may be expanded in the future, e.g., negations
of unsigned integers (not just unsigned integer literals). As these are
deliberately designed for the kernel, I think we will want them anyways.
So, all is good.
> depends on $(cc-option,-fsanitize=signed-integer-overflow)
> depends on $(cc-option,-fsanitize=unsigned-integer-overflow)
> depends on $(cc-option,-fsanitize=implicit-signed-integer-truncation)
> diff --git a/scripts/Makefile.ubsan b/scripts/Makefile.ubsan
> index 4fad9afed24c..233379c193a7 100644
> --- a/scripts/Makefile.ubsan
> +++ b/scripts/Makefile.ubsan
> @@ -15,6 +15,7 @@ ubsan-cflags-$(CONFIG_UBSAN_TRAP) += $(call cc-option,-fsanitize-trap=undefined
> export CFLAGS_UBSAN := $(ubsan-cflags-y)
>
> ubsan-integer-wrap-cflags-$(CONFIG_UBSAN_INTEGER_WRAP) += \
> + -fsanitize-undefined-ignore-overflow-pattern=all \
> -fsanitize=signed-integer-overflow \
> -fsanitize=unsigned-integer-overflow \
> -fsanitize=implicit-signed-integer-truncation \
> --
> 2.34.1
>
Reviewed-by: Justin Stitt <justinstitt@google.com>
Justin
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 3/3] ubsan/overflow: Enable ignorelist parsing and add type filter
2025-03-07 4:19 ` [PATCH 3/3] ubsan/overflow: Enable ignorelist parsing and add type filter Kees Cook
@ 2025-03-07 23:33 ` Justin Stitt
2025-03-07 23:39 ` Justin Stitt
1 sibling, 0 replies; 9+ messages in thread
From: Justin Stitt @ 2025-03-07 23:33 UTC (permalink / raw)
To: Kees Cook
Cc: Gustavo A. R. Silva, Marco Elver, Andrey Konovalov,
Andrey Ryabinin, Andrew Morton, Masahiro Yamada,
Nathan Chancellor, Nicolas Schier, kasan-dev, linux-hardening,
linux-kbuild, Miguel Ojeda, Nick Desaulniers, Hao Luo,
Przemek Kitszel, Bill Wendling, Jakub Kicinski, Tony Ambardar,
Alexander Potapenko, Jan Hendrik Farr, Alexander Lobakin,
linux-kernel, llvm
Hi,
On Thu, Mar 06, 2025 at 08:19:11PM -0800, Kees Cook wrote:
> Limit integer wrap-around mitigation to only the "size_t" type (for
> now). Notably this covers all special functions/builtins that return
> "size_t", like sizeof(). This remains an experimental feature and is
> likely to be replaced with type annotations.
For future travelers, track the progress of type annotations over at
[1]. There's still discussion on how these will be implemented in Clang.
>
> Signed-off-by: Kees Cook <kees@kernel.org>
> ---
> Cc: Justin Stitt <justinstitt@google.com>
> Cc: "Gustavo A. R. Silva" <gustavoars@kernel.org>
> Cc: Marco Elver <elver@google.com>
> Cc: Andrey Konovalov <andreyknvl@gmail.com>
> Cc: Andrey Ryabinin <ryabinin.a.a@gmail.com>
> Cc: Andrew Morton <akpm@linux-foundation.org>
> Cc: Masahiro Yamada <masahiroy@kernel.org>
> Cc: Nathan Chancellor <nathan@kernel.org>
> Cc: Nicolas Schier <nicolas@fjasle.eu>
> Cc: kasan-dev@googlegroups.com
> Cc: linux-hardening@vger.kernel.org
> Cc: linux-kbuild@vger.kernel.org
> ---
> lib/Kconfig.ubsan | 1 +
> scripts/Makefile.ubsan | 3 ++-
> scripts/integer-wrap-ignore.scl | 3 +++
> 3 files changed, 6 insertions(+), 1 deletion(-)
> create mode 100644 scripts/integer-wrap-ignore.scl
>
> diff --git a/lib/Kconfig.ubsan b/lib/Kconfig.ubsan
> index 888c2e72c586..4216b3a4ff21 100644
> --- a/lib/Kconfig.ubsan
> +++ b/lib/Kconfig.ubsan
> @@ -125,6 +125,7 @@ config UBSAN_INTEGER_WRAP
> depends on $(cc-option,-fsanitize=unsigned-integer-overflow)
> depends on $(cc-option,-fsanitize=implicit-signed-integer-truncation)
> depends on $(cc-option,-fsanitize=implicit-unsigned-integer-truncation)
> + depends on $(cc-option,-fsanitize-ignorelist=/dev/null)
> help
> This option enables all of the sanitizers involved in integer overflow
> (wrap-around) mitigation: signed-integer-overflow, unsigned-integer-overflow,
> diff --git a/scripts/Makefile.ubsan b/scripts/Makefile.ubsan
> index 233379c193a7..9e35198edbf0 100644
> --- a/scripts/Makefile.ubsan
> +++ b/scripts/Makefile.ubsan
> @@ -19,5 +19,6 @@ ubsan-integer-wrap-cflags-$(CONFIG_UBSAN_INTEGER_WRAP) += \
> -fsanitize=signed-integer-overflow \
> -fsanitize=unsigned-integer-overflow \
> -fsanitize=implicit-signed-integer-truncation \
> - -fsanitize=implicit-unsigned-integer-truncation
> + -fsanitize=implicit-unsigned-integer-truncation \
> + -fsanitize-ignorelist=$(srctree)/scripts/integer-wrap-ignore.scl
> export CFLAGS_UBSAN_INTEGER_WRAP := $(ubsan-integer-wrap-cflags-y)
> diff --git a/scripts/integer-wrap-ignore.scl b/scripts/integer-wrap-ignore.scl
> new file mode 100644
> index 000000000000..431c3053a4a2
> --- /dev/null
> +++ b/scripts/integer-wrap-ignore.scl
> @@ -0,0 +1,3 @@
> +[{unsigned-integer-overflow,signed-integer-overflow,implicit-signed-integer-truncation,implicit-unsigned-integer-truncation}]
> +type:*
> +type:size_t=sanitize
Hi again future travelers, sanitizer special case list support for
overflow/truncation sanitizers as well as the "=sanitize" comes from a
new Clang 20 feature allowing SCL's to specify sanitize categories, see [2].
> --
> 2.34.1
>
>
The plumbing looks correct,
Reviewed-by: Justin Stitt <justinstitt@google.com>
[1]: https://discourse.llvm.org/t/rfc-clang-canonical-wrapping-and-non-wrapping-types/84356
[2]: https://github.com/llvm/llvm-project/pull/107332
Thanks
Justin
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 3/3] ubsan/overflow: Enable ignorelist parsing and add type filter
2025-03-07 4:19 ` [PATCH 3/3] ubsan/overflow: Enable ignorelist parsing and add type filter Kees Cook
2025-03-07 23:33 ` Justin Stitt
@ 2025-03-07 23:39 ` Justin Stitt
1 sibling, 0 replies; 9+ messages in thread
From: Justin Stitt @ 2025-03-07 23:39 UTC (permalink / raw)
To: Kees Cook
Cc: Gustavo A. R. Silva, Marco Elver, Andrey Konovalov,
Andrey Ryabinin, Andrew Morton, Masahiro Yamada,
Nathan Chancellor, Nicolas Schier, kasan-dev, linux-hardening,
linux-kbuild, Miguel Ojeda, Nick Desaulniers, Hao Luo,
Przemek Kitszel, Bill Wendling, Jakub Kicinski, Tony Ambardar,
Alexander Potapenko, Jan Hendrik Farr, Alexander Lobakin,
linux-kernel, llvm
On Thu, Mar 06, 2025 at 08:19:11PM -0800, Kees Cook wrote:
> Limit integer wrap-around mitigation to only the "size_t" type (for
> now). Notably this covers all special functions/builtins that return
> "size_t", like sizeof(). This remains an experimental feature and is
> likely to be replaced with type annotations.
>
> Signed-off-by: Kees Cook <kees@kernel.org>
> ---
> Cc: Justin Stitt <justinstitt@google.com>
> Cc: "Gustavo A. R. Silva" <gustavoars@kernel.org>
> Cc: Marco Elver <elver@google.com>
> Cc: Andrey Konovalov <andreyknvl@gmail.com>
> Cc: Andrey Ryabinin <ryabinin.a.a@gmail.com>
> Cc: Andrew Morton <akpm@linux-foundation.org>
> Cc: Masahiro Yamada <masahiroy@kernel.org>
> Cc: Nathan Chancellor <nathan@kernel.org>
> Cc: Nicolas Schier <nicolas@fjasle.eu>
> Cc: kasan-dev@googlegroups.com
> Cc: linux-hardening@vger.kernel.org
> Cc: linux-kbuild@vger.kernel.org
> ---
> lib/Kconfig.ubsan | 1 +
> scripts/Makefile.ubsan | 3 ++-
> scripts/integer-wrap-ignore.scl | 3 +++
> 3 files changed, 6 insertions(+), 1 deletion(-)
> create mode 100644 scripts/integer-wrap-ignore.scl
>
> diff --git a/lib/Kconfig.ubsan b/lib/Kconfig.ubsan
> index 888c2e72c586..4216b3a4ff21 100644
> --- a/lib/Kconfig.ubsan
> +++ b/lib/Kconfig.ubsan
> @@ -125,6 +125,7 @@ config UBSAN_INTEGER_WRAP
> depends on $(cc-option,-fsanitize=unsigned-integer-overflow)
> depends on $(cc-option,-fsanitize=implicit-signed-integer-truncation)
> depends on $(cc-option,-fsanitize=implicit-unsigned-integer-truncation)
> + depends on $(cc-option,-fsanitize-ignorelist=/dev/null)
> help
> This option enables all of the sanitizers involved in integer overflow
> (wrap-around) mitigation: signed-integer-overflow, unsigned-integer-overflow,
> diff --git a/scripts/Makefile.ubsan b/scripts/Makefile.ubsan
> index 233379c193a7..9e35198edbf0 100644
> --- a/scripts/Makefile.ubsan
> +++ b/scripts/Makefile.ubsan
> @@ -19,5 +19,6 @@ ubsan-integer-wrap-cflags-$(CONFIG_UBSAN_INTEGER_WRAP) += \
> -fsanitize=signed-integer-overflow \
> -fsanitize=unsigned-integer-overflow \
> -fsanitize=implicit-signed-integer-truncation \
> - -fsanitize=implicit-unsigned-integer-truncation
> + -fsanitize=implicit-unsigned-integer-truncation \
> + -fsanitize-ignorelist=$(srctree)/scripts/integer-wrap-ignore.scl
> export CFLAGS_UBSAN_INTEGER_WRAP := $(ubsan-integer-wrap-cflags-y)
> diff --git a/scripts/integer-wrap-ignore.scl b/scripts/integer-wrap-ignore.scl
> new file mode 100644
> index 000000000000..431c3053a4a2
> --- /dev/null
> +++ b/scripts/integer-wrap-ignore.scl
> @@ -0,0 +1,3 @@
> +[{unsigned-integer-overflow,signed-integer-overflow,implicit-signed-integer-truncation,implicit-unsigned-integer-truncation}]
> +type:*
> +type:size_t=sanitize
Forgot to mention this in my intial reply but we have to be careful
with what types are added here. Kees, I know we're on the same page from
offline chats but for others: using sanitizer case lists to discriminate
against types for the purposes of sanitizer instrumentation may not work
properly through various arithmetic conversions. Mainly, implicit
promotions which tend to break this particular approach.
Now, for size_t we got kind of "lucky" because there are no implicit
promotions with size_t, it doesn't get promoted. This is not the case
for other types. This further necessitates the need for canonical
wrapping types backed by in-source annotations/qualification -- coming
soon in Clang.
> --
> 2.34.1
>
Justin
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 1/3] ubsan/overflow: Rework integer overflow sanitizer option to turn on everything
2025-03-07 4:19 ` [PATCH 1/3] ubsan/overflow: Rework integer overflow sanitizer option to turn on everything Kees Cook
@ 2025-03-13 15:29 ` Marco Elver
2025-03-14 0:04 ` Kees Cook
0 siblings, 1 reply; 9+ messages in thread
From: Marco Elver @ 2025-03-13 15:29 UTC (permalink / raw)
To: Kees Cook
Cc: Justin Stitt, Gustavo A. R. Silva, Andrew Morton,
Andrey Konovalov, Andrey Ryabinin, Masahiro Yamada,
Nathan Chancellor, Nicolas Schier, Miguel Ojeda, Nick Desaulniers,
Hao Luo, Przemek Kitszel, linux-hardening, kasan-dev,
linux-kbuild, Bill Wendling, Jakub Kicinski, Tony Ambardar,
Alexander Potapenko, Jan Hendrik Farr, Alexander Lobakin,
linux-kernel, llvm
On Thu, 6 Mar 2025 at 23:19, Kees Cook <kees@kernel.org> wrote:
>
> Since we're going to approach integer overflow mitigation a type at a
> time, we need to enable all of the associated sanitizers, and then opt
> into types one at a time.
>
> Rename the existing "signed wrap" sanitizer to just the entire topic area:
> "integer wrap". Enable the implicit integer truncation sanitizers, with
> required callbacks and tests.
>
> Notably, this requires features (currently) only available in Clang,
> so we can depend on the cc-option tests to determine availability
> instead of doing version tests.
>
> Signed-off-by: Kees Cook <kees@kernel.org>
> ---
> Cc: Justin Stitt <justinstitt@google.com>
> Cc: "Gustavo A. R. Silva" <gustavoars@kernel.org>
> Cc: Andrew Morton <akpm@linux-foundation.org>
> Cc: Marco Elver <elver@google.com>
> Cc: Andrey Konovalov <andreyknvl@gmail.com>
> Cc: Andrey Ryabinin <ryabinin.a.a@gmail.com>
> Cc: Masahiro Yamada <masahiroy@kernel.org>
> Cc: Nathan Chancellor <nathan@kernel.org>
> Cc: Nicolas Schier <nicolas@fjasle.eu>
> Cc: Miguel Ojeda <ojeda@kernel.org>
> Cc: Nick Desaulniers <ndesaulniers@google.com>
> Cc: Hao Luo <haoluo@google.com>
> Cc: Przemek Kitszel <przemyslaw.kitszel@intel.com>
> Cc: linux-hardening@vger.kernel.org
> Cc: kasan-dev@googlegroups.com
> Cc: linux-kbuild@vger.kernel.org
> ---
> include/linux/compiler_types.h | 2 +-
> kernel/configs/hardening.config | 2 +-
> lib/Kconfig.ubsan | 23 +++++++++++------------
> lib/test_ubsan.c | 18 ++++++++++++++----
> lib/ubsan.c | 28 ++++++++++++++++++++++++++--
> lib/ubsan.h | 8 ++++++++
> scripts/Makefile.lib | 4 ++--
> scripts/Makefile.ubsan | 8 ++++++--
> 8 files changed, 69 insertions(+), 24 deletions(-)
>
> diff --git a/include/linux/compiler_types.h b/include/linux/compiler_types.h
> index f59393464ea7..4ad3e900bc3d 100644
> --- a/include/linux/compiler_types.h
> +++ b/include/linux/compiler_types.h
> @@ -360,7 +360,7 @@ struct ftrace_likely_data {
> #endif
>
> /* Do not trap wrapping arithmetic within an annotated function. */
> -#ifdef CONFIG_UBSAN_SIGNED_WRAP
> +#ifdef CONFIG_UBSAN_INTEGER_WRAP
> # define __signed_wrap __attribute__((no_sanitize("signed-integer-overflow")))
> #else
> # define __signed_wrap
> diff --git a/kernel/configs/hardening.config b/kernel/configs/hardening.config
> index 3fabb8f55ef6..dd7c32fb5ac1 100644
> --- a/kernel/configs/hardening.config
> +++ b/kernel/configs/hardening.config
> @@ -46,7 +46,7 @@ CONFIG_UBSAN_BOUNDS=y
> # CONFIG_UBSAN_SHIFT is not set
> # CONFIG_UBSAN_DIV_ZERO is not set
> # CONFIG_UBSAN_UNREACHABLE is not set
> -# CONFIG_UBSAN_SIGNED_WRAP is not set
> +# CONFIG_UBSAN_INTEGER_WRAP is not set
> # CONFIG_UBSAN_BOOL is not set
> # CONFIG_UBSAN_ENUM is not set
> # CONFIG_UBSAN_ALIGNMENT is not set
> diff --git a/lib/Kconfig.ubsan b/lib/Kconfig.ubsan
> index 1d4aa7a83b3a..63e5622010e0 100644
> --- a/lib/Kconfig.ubsan
> +++ b/lib/Kconfig.ubsan
> @@ -116,21 +116,20 @@ config UBSAN_UNREACHABLE
> This option enables -fsanitize=unreachable which checks for control
> flow reaching an expected-to-be-unreachable position.
>
> -config UBSAN_SIGNED_WRAP
> - bool "Perform checking for signed arithmetic wrap-around"
> +config UBSAN_INTEGER_WRAP
> + bool "Perform checking for integer arithmetic wrap-around"
> default UBSAN
> depends on !COMPILE_TEST
> - # The no_sanitize attribute was introduced in GCC with version 8.
> - depends on !CC_IS_GCC || GCC_VERSION >= 80000
> depends on $(cc-option,-fsanitize=signed-integer-overflow)
> - help
> - This option enables -fsanitize=signed-integer-overflow which checks
> - for wrap-around of any arithmetic operations with signed integers.
> - This currently performs nearly no instrumentation due to the
> - kernel's use of -fno-strict-overflow which converts all would-be
> - arithmetic undefined behavior into wrap-around arithmetic. Future
> - sanitizer versions will allow for wrap-around checking (rather than
> - exclusively undefined behavior).
> + depends on $(cc-option,-fsanitize=unsigned-integer-overflow)
> + depends on $(cc-option,-fsanitize=implicit-signed-integer-truncation)
> + depends on $(cc-option,-fsanitize=implicit-unsigned-integer-truncation)
Can these be in 1 cc-option? I know it might look slightly more ugly,
but having 3 different ones will shell out to the compiler 3 times,
which is a little less efficient. At some point it might noticeably
increase the build initialization latency.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 1/3] ubsan/overflow: Rework integer overflow sanitizer option to turn on everything
2025-03-13 15:29 ` Marco Elver
@ 2025-03-14 0:04 ` Kees Cook
0 siblings, 0 replies; 9+ messages in thread
From: Kees Cook @ 2025-03-14 0:04 UTC (permalink / raw)
To: Marco Elver
Cc: Justin Stitt, Gustavo A. R. Silva, Andrew Morton,
Andrey Konovalov, Andrey Ryabinin, Masahiro Yamada,
Nathan Chancellor, Nicolas Schier, Miguel Ojeda, Nick Desaulniers,
Hao Luo, Przemek Kitszel, linux-hardening, kasan-dev,
linux-kbuild, Bill Wendling, Jakub Kicinski, Tony Ambardar,
Alexander Potapenko, Jan Hendrik Farr, Alexander Lobakin,
linux-kernel, llvm
On March 13, 2025 8:29:29 AM PDT, Marco Elver <elver@google.com> wrote:
>On Thu, 6 Mar 2025 at 23:19, Kees Cook <kees@kernel.org> wrote:
>>
>> Since we're going to approach integer overflow mitigation a type at a
>> time, we need to enable all of the associated sanitizers, and then opt
>> into types one at a time.
>>
>> Rename the existing "signed wrap" sanitizer to just the entire topic area:
>> "integer wrap". Enable the implicit integer truncation sanitizers, with
>> required callbacks and tests.
>>
>> Notably, this requires features (currently) only available in Clang,
>> so we can depend on the cc-option tests to determine availability
>> instead of doing version tests.
>>
>> Signed-off-by: Kees Cook <kees@kernel.org>
>> ---
>> Cc: Justin Stitt <justinstitt@google.com>
>> Cc: "Gustavo A. R. Silva" <gustavoars@kernel.org>
>> Cc: Andrew Morton <akpm@linux-foundation.org>
>> Cc: Marco Elver <elver@google.com>
>> Cc: Andrey Konovalov <andreyknvl@gmail.com>
>> Cc: Andrey Ryabinin <ryabinin.a.a@gmail.com>
>> Cc: Masahiro Yamada <masahiroy@kernel.org>
>> Cc: Nathan Chancellor <nathan@kernel.org>
>> Cc: Nicolas Schier <nicolas@fjasle.eu>
>> Cc: Miguel Ojeda <ojeda@kernel.org>
>> Cc: Nick Desaulniers <ndesaulniers@google.com>
>> Cc: Hao Luo <haoluo@google.com>
>> Cc: Przemek Kitszel <przemyslaw.kitszel@intel.com>
>> Cc: linux-hardening@vger.kernel.org
>> Cc: kasan-dev@googlegroups.com
>> Cc: linux-kbuild@vger.kernel.org
>> ---
>> include/linux/compiler_types.h | 2 +-
>> kernel/configs/hardening.config | 2 +-
>> lib/Kconfig.ubsan | 23 +++++++++++------------
>> lib/test_ubsan.c | 18 ++++++++++++++----
>> lib/ubsan.c | 28 ++++++++++++++++++++++++++--
>> lib/ubsan.h | 8 ++++++++
>> scripts/Makefile.lib | 4 ++--
>> scripts/Makefile.ubsan | 8 ++++++--
>> 8 files changed, 69 insertions(+), 24 deletions(-)
>>
>> diff --git a/include/linux/compiler_types.h b/include/linux/compiler_types.h
>> index f59393464ea7..4ad3e900bc3d 100644
>> --- a/include/linux/compiler_types.h
>> +++ b/include/linux/compiler_types.h
>> @@ -360,7 +360,7 @@ struct ftrace_likely_data {
>> #endif
>>
>> /* Do not trap wrapping arithmetic within an annotated function. */
>> -#ifdef CONFIG_UBSAN_SIGNED_WRAP
>> +#ifdef CONFIG_UBSAN_INTEGER_WRAP
>> # define __signed_wrap __attribute__((no_sanitize("signed-integer-overflow")))
>> #else
>> # define __signed_wrap
>> diff --git a/kernel/configs/hardening.config b/kernel/configs/hardening.config
>> index 3fabb8f55ef6..dd7c32fb5ac1 100644
>> --- a/kernel/configs/hardening.config
>> +++ b/kernel/configs/hardening.config
>> @@ -46,7 +46,7 @@ CONFIG_UBSAN_BOUNDS=y
>> # CONFIG_UBSAN_SHIFT is not set
>> # CONFIG_UBSAN_DIV_ZERO is not set
>> # CONFIG_UBSAN_UNREACHABLE is not set
>> -# CONFIG_UBSAN_SIGNED_WRAP is not set
>> +# CONFIG_UBSAN_INTEGER_WRAP is not set
>> # CONFIG_UBSAN_BOOL is not set
>> # CONFIG_UBSAN_ENUM is not set
>> # CONFIG_UBSAN_ALIGNMENT is not set
>> diff --git a/lib/Kconfig.ubsan b/lib/Kconfig.ubsan
>> index 1d4aa7a83b3a..63e5622010e0 100644
>> --- a/lib/Kconfig.ubsan
>> +++ b/lib/Kconfig.ubsan
>> @@ -116,21 +116,20 @@ config UBSAN_UNREACHABLE
>> This option enables -fsanitize=unreachable which checks for control
>> flow reaching an expected-to-be-unreachable position.
>>
>> -config UBSAN_SIGNED_WRAP
>> - bool "Perform checking for signed arithmetic wrap-around"
>> +config UBSAN_INTEGER_WRAP
>> + bool "Perform checking for integer arithmetic wrap-around"
>> default UBSAN
>> depends on !COMPILE_TEST
>> - # The no_sanitize attribute was introduced in GCC with version 8.
>> - depends on !CC_IS_GCC || GCC_VERSION >= 80000
>> depends on $(cc-option,-fsanitize=signed-integer-overflow)
>> - help
>> - This option enables -fsanitize=signed-integer-overflow which checks
>> - for wrap-around of any arithmetic operations with signed integers.
>> - This currently performs nearly no instrumentation due to the
>> - kernel's use of -fno-strict-overflow which converts all would-be
>> - arithmetic undefined behavior into wrap-around arithmetic. Future
>> - sanitizer versions will allow for wrap-around checking (rather than
>> - exclusively undefined behavior).
>> + depends on $(cc-option,-fsanitize=unsigned-integer-overflow)
>> + depends on $(cc-option,-fsanitize=implicit-signed-integer-truncation)
>> + depends on $(cc-option,-fsanitize=implicit-unsigned-integer-truncation)
>
>Can these be in 1 cc-option? I know it might look slightly more ugly,
>but having 3 different ones will shell out to the compiler 3 times,
>which is a little less efficient. At some point it might noticeably
>increase the build initialization latency.
Yeah, good point. I could probably just test the most recently added option, as it implies all the rest, too. I'll send an update!
-Kees
--
Kees Cook
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2025-03-14 0:04 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-03-07 4:19 [PATCH 0/3] ubsan/overflow: Enable pattern exclusions Kees Cook
2025-03-07 4:19 ` [PATCH 1/3] ubsan/overflow: Rework integer overflow sanitizer option to turn on everything Kees Cook
2025-03-13 15:29 ` Marco Elver
2025-03-14 0:04 ` Kees Cook
2025-03-07 4:19 ` [PATCH 2/3] ubsan/overflow: Enable pattern exclusions Kees Cook
2025-03-07 23:12 ` Justin Stitt
2025-03-07 4:19 ` [PATCH 3/3] ubsan/overflow: Enable ignorelist parsing and add type filter Kees Cook
2025-03-07 23:33 ` Justin Stitt
2025-03-07 23:39 ` Justin Stitt
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox