Skip to content
This repository was archived by the owner on Nov 8, 2023. It is now read-only.

Commit ef40d28

Browse files
committed
randomize_kstack: Remove non-functional per-arch entropy filtering
An unintended consequence of commit 9c573cd ("randomize_kstack: Improve entropy diffusion") was that the per-architecture entropy size filtering reduced how many bits were being added to the mix, rather than how many bits were being used during the offsetting. All architectures fell back to the existing default of 0x3FF (10 bits), which will consume at most 1KiB of stack space. It seems that this is working just fine, so let's avoid the confusion and update everything to use the default. The prior intent of the per-architecture limits were: arm64: capped at 0x1FF (9 bits), 5 bits effective powerpc: uncapped (10 bits), 6 or 7 bits effective riscv: uncapped (10 bits), 6 bits effective x86: capped at 0xFF (8 bits), 5 (x86_64) or 6 (ia32) bits effective s390: capped at 0xFF (8 bits), undocumented effective entropy Current discussion has led to just dropping the original per-architecture filters. The additional entropy appears to be safe for arm64, x86, and s390. Quoting Arnd, "There is no point pretending that 15.75KB is somehow safe to use while 15.00KB is not." Co-developed-by: Yuntao Liu <liuyuntao12@huawei.com> Signed-off-by: Yuntao Liu <liuyuntao12@huawei.com> Fixes: 9c573cd ("randomize_kstack: Improve entropy diffusion") Link: https://lore.kernel.org/r/20240617133721.377540-1-liuyuntao12@huawei.com Reviewed-by: Arnd Bergmann <arnd@arndb.de> Acked-by: Mark Rutland <mark.rutland@arm.com> Acked-by: Heiko Carstens <hca@linux.ibm.com> # s390 Link: https://lore.kernel.org/r/20240619214711.work.953-kees@kernel.org Signed-off-by: Kees Cook <kees@kernel.org>
1 parent 2003e48 commit ef40d28

File tree

3 files changed

+14
-19
lines changed

3 files changed

+14
-19
lines changed

arch/arm64/kernel/syscall.c

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -53,17 +53,15 @@ static void invoke_syscall(struct pt_regs *regs, unsigned int scno,
5353
syscall_set_return_value(current, regs, 0, ret);
5454

5555
/*
56-
* Ultimately, this value will get limited by KSTACK_OFFSET_MAX(),
57-
* but not enough for arm64 stack utilization comfort. To keep
58-
* reasonable stack head room, reduce the maximum offset to 9 bits.
56+
* This value will get limited by KSTACK_OFFSET_MAX(), which is 10
57+
* bits. The actual entropy will be further reduced by the compiler
58+
* when applying stack alignment constraints: the AAPCS mandates a
59+
* 16-byte aligned SP at function boundaries, which will remove the
60+
* 4 low bits from any entropy chosen here.
5961
*
60-
* The actual entropy will be further reduced by the compiler when
61-
* applying stack alignment constraints: the AAPCS mandates a
62-
* 16-byte (i.e. 4-bit) aligned SP at function boundaries.
63-
*
64-
* The resulting 5 bits of entropy is seen in SP[8:4].
62+
* The resulting 6 bits of entropy is seen in SP[9:4].
6563
*/
66-
choose_random_kstack_offset(get_random_u16() & 0x1FF);
64+
choose_random_kstack_offset(get_random_u16());
6765
}
6866

6967
static inline bool has_syscall_work(unsigned long flags)

arch/s390/include/asm/entry-common.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ static __always_inline void arch_exit_to_user_mode(void)
5454
static inline void arch_exit_to_user_mode_prepare(struct pt_regs *regs,
5555
unsigned long ti_work)
5656
{
57-
choose_random_kstack_offset(get_tod_clock_fast() & 0xff);
57+
choose_random_kstack_offset(get_tod_clock_fast());
5858
}
5959

6060
#define arch_exit_to_user_mode_prepare arch_exit_to_user_mode_prepare

arch/x86/include/asm/entry-common.h

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -73,19 +73,16 @@ static inline void arch_exit_to_user_mode_prepare(struct pt_regs *regs,
7373
#endif
7474

7575
/*
76-
* Ultimately, this value will get limited by KSTACK_OFFSET_MAX(),
77-
* but not enough for x86 stack utilization comfort. To keep
78-
* reasonable stack head room, reduce the maximum offset to 8 bits.
79-
*
80-
* The actual entropy will be further reduced by the compiler when
81-
* applying stack alignment constraints (see cc_stack_align4/8 in
76+
* This value will get limited by KSTACK_OFFSET_MAX(), which is 10
77+
* bits. The actual entropy will be further reduced by the compiler
78+
* when applying stack alignment constraints (see cc_stack_align4/8 in
8279
* arch/x86/Makefile), which will remove the 3 (x86_64) or 2 (ia32)
8380
* low bits from any entropy chosen here.
8481
*
85-
* Therefore, final stack offset entropy will be 5 (x86_64) or
86-
* 6 (ia32) bits.
82+
* Therefore, final stack offset entropy will be 7 (x86_64) or
83+
* 8 (ia32) bits.
8784
*/
88-
choose_random_kstack_offset(rdtsc() & 0xFF);
85+
choose_random_kstack_offset(rdtsc());
8986
}
9087
#define arch_exit_to_user_mode_prepare arch_exit_to_user_mode_prepare
9188

0 commit comments

Comments
 (0)