On Mon, May 27, 2024 at 1:15 PM Mark Hatle via lists.openembedded.org <mark.hatle=kernel.crashing....@lists.openembedded.org> wrote: > > I just realized that somehow I entered the wrong CVE in the body of the patch > itself. > > This IS CVE-2024-0151, but somehow I entered CVE-2023-4039 is the patch body. > > Steve can you fix this as part of the merge, or do you want me to send a V2 > or a > follow on to fix this?
I'll fix it! Steve > --Mark > > On 5/24/24 3:12 PM, Mark Hatle via lists.openembedded.org wrote: > > Fix for insufficient argument checking in Secure state Entry functions > > in software using Cortex-M Security Extensions (CMSE), that has been > > compiled using toolchains that implement 'Arm v8-M Security Extensions > > Requirements on Development Tools' prior to version 1.4, allows an > > attacker to pass values to Secure state that are out of range for types > > smaller than 32-bits. Out of range values might lead to incorrect > > operations in secure state. > > > > Signed-off-by: Mark Hatle <mark.ha...@amd.com> > > --- > > meta/recipes-devtools/gcc/gcc-13.2.inc | 1 + > > .../gcc/gcc/CVE-2024-0151.patch | 315 ++++++++++++++++++ > > 2 files changed, 316 insertions(+) > > create mode 100644 meta/recipes-devtools/gcc/gcc/CVE-2024-0151.patch > > > > diff --git a/meta/recipes-devtools/gcc/gcc-13.2.inc > > b/meta/recipes-devtools/gcc/gcc-13.2.inc > > index 603377a49a..abf177822b 100644 > > --- a/meta/recipes-devtools/gcc/gcc-13.2.inc > > +++ b/meta/recipes-devtools/gcc/gcc-13.2.inc > > @@ -68,6 +68,7 @@ SRC_URI = "${BASEURI} \ > > file://CVE-2023-4039.patch \ > > file://0026-aarch64-Fix-loose-ldpstp-check-PR111411.patch \ > > file://0027-Fix-gcc-vect-module-testcases.patch \ > > + file://CVE-2024-0151.patch \ > > " > > SRC_URI[sha256sum] = > > "e275e76442a6067341a27f04c5c6b83d8613144004c0413528863dc6b5c743da" > > > > diff --git a/meta/recipes-devtools/gcc/gcc/CVE-2024-0151.patch > > b/meta/recipes-devtools/gcc/gcc/CVE-2024-0151.patch > > new file mode 100644 > > index 0000000000..01d55b5cdb > > --- /dev/null > > +++ b/meta/recipes-devtools/gcc/gcc/CVE-2024-0151.patch > > @@ -0,0 +1,315 @@ > > +arm: Zero/Sign extends for CMSE security > > + > > +This patch makes the following changes: > > + > > +1) When calling a secure function from non-secure code then any arguments > > + smaller than 32-bits that are passed in registers are zero- or > > sign-extended. > > +2) After a non-secure function returns into secure code then any return > > value > > + smaller than 32-bits that is passed in a register is zero- or > > sign-extended. > > + > > +This patch addresses the following CVE-2024-0151. > > + > > +gcc/ChangeLog: > > + PR target/114837 > > + * config/arm/arm.cc (cmse_nonsecure_call_inline_register_clear): > > + Add zero/sign extend. > > + (arm_expand_prologue): Add zero/sign extend. > > + > > +gcc/testsuite/ChangeLog: > > + > > + * gcc.target/arm/cmse/extend-param.c: New test. > > + * gcc.target/arm/cmse/extend-return.c: New test. > > + > > +CVE: CVE-2023-4039 > > +Upstream-Status: Backport > > [https://gcc.gnu.org/pipermail/gcc-patches/2024-April/649973.html] > > +Signed-off-by: Mark Hatle <mark.ha...@amd.com> > > + > > +diff --git a/gcc/config/arm/arm.cc b/gcc/config/arm/arm.cc > > +index > > 0217abc218d60956ce727e6d008d46b9176dddc5..ea0c963a4d67ecd70e1571624e84dfe46d757df9 > > 100644 > > +--- a/gcc/config/arm/arm.cc > > ++++ b/gcc/config/arm/arm.cc > > +@@ -19210,6 +19210,30 @@ cmse_nonsecure_call_inline_register_clear (void) > > + end_sequence (); > > + emit_insn_before (seq, insn); > > + > > ++ /* The AAPCS requires the callee to widen integral types narrower > > ++ than 32 bits to the full width of the register; but when handling > > ++ calls to non-secure space, we cannot trust the callee to have > > ++ correctly done so. So forcibly re-widen the result here. */ > > ++ tree ret_type = TREE_TYPE (fntype); > > ++ if ((TREE_CODE (ret_type) == INTEGER_TYPE > > ++ || TREE_CODE (ret_type) == ENUMERAL_TYPE > > ++ || TREE_CODE (ret_type) == BOOLEAN_TYPE) > > ++ && known_lt (GET_MODE_SIZE (TYPE_MODE (ret_type)), 4)) > > ++ { > > ++ machine_mode ret_mode = TYPE_MODE (ret_type); > > ++ rtx extend; > > ++ if (TYPE_UNSIGNED (ret_type)) > > ++ extend = gen_rtx_ZERO_EXTEND (SImode, > > ++ gen_rtx_REG (ret_mode, > > R0_REGNUM)); > > ++ else > > ++ extend = gen_rtx_SIGN_EXTEND (SImode, > > ++ gen_rtx_REG (ret_mode, > > R0_REGNUM)); > > ++ emit_insn_after (gen_rtx_SET (gen_rtx_REG (SImode, R0_REGNUM), > > ++ extend), insn); > > ++ > > ++ } > > ++ > > ++ > > + if (TARGET_HAVE_FPCXT_CMSE) > > + { > > + rtx_insn *last, *pop_insn, *after = insn; > > +@@ -23652,6 +23676,51 @@ arm_expand_prologue (void) > > + > > + ip_rtx = gen_rtx_REG (SImode, IP_REGNUM); > > + > > ++ /* The AAPCS requires the callee to widen integral types narrower > > ++ than 32 bits to the full width of the register; but when handling > > ++ calls to non-secure space, we cannot trust the callee to have > > ++ correctly done so. So forcibly re-widen the result here. */ > > ++ if (IS_CMSE_ENTRY (func_type)) > > ++ { > > ++ function_args_iterator args_iter; > > ++ CUMULATIVE_ARGS args_so_far_v; > > ++ cumulative_args_t args_so_far; > > ++ bool first_param = true; > > ++ tree arg_type; > > ++ tree fndecl = current_function_decl; > > ++ tree fntype = TREE_TYPE (fndecl); > > ++ arm_init_cumulative_args (&args_so_far_v, fntype, NULL_RTX, fndecl); > > ++ args_so_far = pack_cumulative_args (&args_so_far_v); > > ++ FOREACH_FUNCTION_ARGS (fntype, arg_type, args_iter) > > ++ { > > ++ rtx arg_rtx; > > ++ > > ++ if (VOID_TYPE_P (arg_type)) > > ++ break; > > ++ > > ++ function_arg_info arg (arg_type, /*named=*/true); > > ++ if (!first_param) > > ++ /* We should advance after processing the argument and pass > > ++ the argument we're advancing past. */ > > ++ arm_function_arg_advance (args_so_far, arg); > > ++ first_param = false; > > ++ arg_rtx = arm_function_arg (args_so_far, arg); > > ++ gcc_assert (REG_P (arg_rtx)); > > ++ if ((TREE_CODE (arg_type) == INTEGER_TYPE > > ++ || TREE_CODE (arg_type) == ENUMERAL_TYPE > > ++ || TREE_CODE (arg_type) == BOOLEAN_TYPE) > > ++ && known_lt (GET_MODE_SIZE (GET_MODE (arg_rtx)), 4)) > > ++ { > > ++ if (TYPE_UNSIGNED (arg_type)) > > ++ emit_set_insn (gen_rtx_REG (SImode, REGNO (arg_rtx)), > > ++ gen_rtx_ZERO_EXTEND (SImode, arg_rtx)); > > ++ else > > ++ emit_set_insn (gen_rtx_REG (SImode, REGNO (arg_rtx)), > > ++ gen_rtx_SIGN_EXTEND (SImode, arg_rtx)); > > ++ } > > ++ } > > ++ } > > ++ > > + if (IS_STACKALIGN (func_type)) > > + { > > + rtx r0, r1; > > +diff --git a/gcc/testsuite/gcc.target/arm/cmse/extend-param.c > > b/gcc/testsuite/gcc.target/arm/cmse/extend-param.c > > +new file mode 100644 > > +index > > 0000000000000000000000000000000000000000..01fac7862385f871f3ecc246ede95eea180be025 > > +--- /dev/null > > ++++ b/gcc/testsuite/gcc.target/arm/cmse/extend-param.c > > +@@ -0,0 +1,96 @@ > > ++/* { dg-do compile } */ > > ++/* { dg-options "-mcmse" } */ > > ++/* { dg-final { check-function-bodies "**" "" "" } } */ > > ++ > > ++#include <arm_cmse.h> > > ++#include <stdbool.h> > > ++ > > ++#define ARRAY_SIZE (256) > > ++char array[ARRAY_SIZE]; > > ++ > > ++enum offset > > ++{ > > ++ zero = 0, > > ++ one = 1, > > ++ two = 2 > > ++}; > > ++ > > ++/* > > ++**__acle_se_unsignSecureFunc: > > ++** ... > > ++** uxtb r0, r0 > > ++** ... > > ++*/ > > ++__attribute__((cmse_nonsecure_entry)) char unsignSecureFunc (unsigned > > char index) { > > ++ if (index >= ARRAY_SIZE) > > ++ return 0; > > ++ return array[index]; > > ++} > > ++ > > ++/* > > ++**__acle_se_signSecureFunc: > > ++** ... > > ++** sxtb r0, r0 > > ++** ... > > ++*/ > > ++__attribute__((cmse_nonsecure_entry)) char signSecureFunc (signed char > > index) { > > ++ if (index >= ARRAY_SIZE) > > ++ return 0; > > ++ return array[index]; > > ++} > > ++ > > ++/* > > ++**__acle_se_shortUnsignSecureFunc: > > ++** ... > > ++** uxth r0, r0 > > ++** ... > > ++*/ > > ++__attribute__((cmse_nonsecure_entry)) char shortUnsignSecureFunc > > (unsigned short index) { > > ++ if (index >= ARRAY_SIZE) > > ++ return 0; > > ++ return array[index]; > > ++} > > ++ > > ++/* > > ++**__acle_se_shortSignSecureFunc: > > ++** ... > > ++** sxth r0, r0 > > ++** ... > > ++*/ > > ++__attribute__((cmse_nonsecure_entry)) char shortSignSecureFunc (signed > > short index) { > > ++ if (index >= ARRAY_SIZE) > > ++ return 0; > > ++ return array[index]; > > ++} > > ++ > > ++/* > > ++**__acle_se_enumSecureFunc: > > ++** ... > > ++** uxtb r0, r0 > > ++** ... > > ++*/ > > ++__attribute__((cmse_nonsecure_entry)) char enumSecureFunc (enum offset > > index) { > > ++ > > ++ // Compiler may optimize away bounds check as value is an unsigned char. > > ++ > > ++ // According to AAPCS caller will zero extend to ensure value is < 256. > > ++ > > ++ if (index >= ARRAY_SIZE) > > ++ return 0; > > ++ return array[index]; > > ++ > > ++} > > ++ > > ++/* > > ++**__acle_se_boolSecureFunc: > > ++** ... > > ++** uxtb r0, r0 > > ++** ... > > ++*/ > > ++__attribute__((cmse_nonsecure_entry)) char boolSecureFunc (bool index) { > > ++ > > ++ if (index >= ARRAY_SIZE) > > ++ return 0; > > ++ return array[index]; > > ++ > > ++} > > +\ No newline at end of file > > +diff --git a/gcc/testsuite/gcc.target/arm/cmse/extend-return.c > > b/gcc/testsuite/gcc.target/arm/cmse/extend-return.c > > +new file mode 100644 > > +index > > 0000000000000000000000000000000000000000..cf731ed33df7e6dc101320c1970016f01b14c59a > > +--- /dev/null > > ++++ b/gcc/testsuite/gcc.target/arm/cmse/extend-return.c > > +@@ -0,0 +1,92 @@ > > ++/* { dg-do compile } */ > > ++/* { dg-options "-mcmse" } */ > > ++/* { dg-final { check-function-bodies "**" "" "" } } */ > > ++ > > ++#include <arm_cmse.h> > > ++#include <stdbool.h> > > ++ > > ++enum offset > > ++{ > > ++ zero = 0, > > ++ one = 1, > > ++ two = 2 > > ++}; > > ++ > > ++typedef unsigned char __attribute__ ((cmse_nonsecure_call)) > > ns_unsign_foo_t (void); > > ++typedef signed char __attribute__ ((cmse_nonsecure_call)) ns_sign_foo_t > > (void); > > ++typedef unsigned short __attribute__ ((cmse_nonsecure_call)) > > ns_short_unsign_foo_t (void); > > ++typedef signed short __attribute__ ((cmse_nonsecure_call)) > > ns_short_sign_foo_t (void); > > ++typedef enum offset __attribute__ ((cmse_nonsecure_call)) ns_enum_foo_t > > (void); > > ++typedef bool __attribute__ ((cmse_nonsecure_call)) ns_bool_foo_t (void); > > ++ > > ++/* > > ++**unsignNonsecure0: > > ++** ... > > ++** bl __gnu_cmse_nonsecure_call > > ++** uxtb r0, r0 > > ++** ... > > ++*/ > > ++unsigned char unsignNonsecure0 (ns_unsign_foo_t * ns_foo_p) > > ++{ > > ++ return ns_foo_p (); > > ++} > > ++ > > ++/* > > ++**signNonsecure0: > > ++** ... > > ++** bl __gnu_cmse_nonsecure_call > > ++** sxtb r0, r0 > > ++** ... > > ++*/ > > ++signed char signNonsecure0 (ns_sign_foo_t * ns_foo_p) > > ++{ > > ++ return ns_foo_p (); > > ++} > > ++ > > ++/* > > ++**shortUnsignNonsecure0: > > ++** ... > > ++** bl __gnu_cmse_nonsecure_call > > ++** uxth r0, r0 > > ++** ... > > ++*/ > > ++unsigned short shortUnsignNonsecure0 (ns_short_unsign_foo_t * ns_foo_p) > > ++{ > > ++ return ns_foo_p (); > > ++} > > ++ > > ++/* > > ++**shortSignNonsecure0: > > ++** ... > > ++** bl __gnu_cmse_nonsecure_call > > ++** sxth r0, r0 > > ++** ... > > ++*/ > > ++signed short shortSignNonsecure0 (ns_short_sign_foo_t * ns_foo_p) > > ++{ > > ++ return ns_foo_p (); > > ++} > > ++ > > ++/* > > ++**enumNonsecure0: > > ++** ... > > ++** bl __gnu_cmse_nonsecure_call > > ++** uxtb r0, r0 > > ++** ... > > ++*/ > > ++unsigned char __attribute__((noipa)) enumNonsecure0 (ns_enum_foo_t * > > ns_foo_p) > > ++{ > > ++ return ns_foo_p (); > > ++} > > ++ > > ++/* > > ++**boolNonsecure0: > > ++** ... > > ++** bl __gnu_cmse_nonsecure_call > > ++** uxtb r0, r0 > > ++** ... > > ++*/ > > ++unsigned char boolNonsecure0 (ns_bool_foo_t * ns_foo_p) > > ++{ > > ++ return ns_foo_p (); > > ++} > > +\ No newline at end of file > > > > > > > > > > > > >
-=-=-=-=-=-=-=-=-=-=-=- Links: You receive all messages sent to this group. View/Reply Online (#199972): https://lists.openembedded.org/g/openembedded-core/message/199972 Mute This Topic: https://lists.openembedded.org/mt/106288402/21656 Group Owner: openembedded-core+ow...@lists.openembedded.org Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-