Messages in this thread | | | Date | Fri, 13 Jan 2023 15:53:45 -0800 | From | Kees Cook <> | Subject | Re: [PATCH] x86: Disable kernel stack offset randomization for !TSC |
| |
On Sun, Jan 08, 2023 at 08:55:06PM +0100, Borislav Petkov wrote: > On Sun, Jan 08, 2023 at 07:42:54PM +0000, Maciej W. Rozycki wrote: > > For x86 kernel stack offset randomization uses the RDTSC instruction, > > which causes an invalid opcode exception with hardware that does not > > implement this instruction: > > Out of pure curiosity, what hw is that? > > Also, I guess the fix should be something like this instead: > > --- > diff --git a/arch/x86/include/asm/entry-common.h b/arch/x86/include/asm/entry-common.h > index 117903881fe4..57b372ca6ce7 100644 > --- a/arch/x86/include/asm/entry-common.h > +++ b/arch/x86/include/asm/entry-common.h > @@ -85,7 +85,8 @@ static inline void arch_exit_to_user_mode_prepare(struct pt_regs *regs, > * Therefore, final stack offset entropy will be 5 (x86_64) or > * 6 (ia32) bits. > */ > - choose_random_kstack_offset(rdtsc() & 0xFF); > + if (cpu_feature_enabled(X86_FEATURE_TSC)) > + choose_random_kstack_offset(rdtsc() & 0xFF); > } > #define arch_exit_to_user_mode_prepare arch_exit_to_user_mode_prepare
I think probably the entire feature should just be disabled in early boot, checking for TSC, and then using:
if (!cpu_feature_enabled(X86_FEATURE_TSC)) static_branch_disable(&randomize_kstack_offset);
I'm not sure the best place to put that where it's early but late enough that static branches are working...
-- Kees Cook
| |