Linus,
Please pull the latest x86/shstk Git tree from:
git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git x86-shstk-2024-05-13
# HEAD: 2883f01ec37dd8668e7222dfdb5980c86fdfe277 x86/shstk: Enable shadow stacks for x32
Enable shadow stacks for x32.
While we normally don't do such feature-enabling on 32-bit
kernels anymore, this change is small, straightforward & tested on
upstream glibc.
Thanks,
Ingo
------------------>
H.J. Lu (1):
x86/shstk: Enable shadow stacks for x32
arch/x86/entry/syscalls/syscall_64.tbl | 2 +-
arch/x86/kernel/shstk.c | 4 ++--
arch/x86/kernel/signal_64.c | 6 ++++++
3 files changed, 9 insertions(+), 3 deletions(-)
diff --git a/arch/x86/entry/syscalls/syscall_64.tbl b/arch/x86/entry/syscalls/syscall_64.tbl
index 7e8d46f4147f..cc78226ffc35 100644
--- a/arch/x86/entry/syscalls/syscall_64.tbl
+++ b/arch/x86/entry/syscalls/syscall_64.tbl
@@ -374,7 +374,7 @@
450 common set_mempolicy_home_node sys_set_mempolicy_home_node
451 common cachestat sys_cachestat
452 common fchmodat2 sys_fchmodat2
-453 64 map_shadow_stack sys_map_shadow_stack
+453 common map_shadow_stack sys_map_shadow_stack
454 common futex_wake sys_futex_wake
455 common futex_wait sys_futex_wait
456 common futex_requeue sys_futex_requeue
diff --git a/arch/x86/kernel/shstk.c b/arch/x86/kernel/shstk.c
index 59e15dd8d0f8..6f1e9883f074 100644
--- a/arch/x86/kernel/shstk.c
+++ b/arch/x86/kernel/shstk.c
@@ -163,8 +163,8 @@ static int shstk_setup(void)
if (features_enabled(ARCH_SHSTK_SHSTK))
return 0;
- /* Also not supported for 32 bit and x32 */
- if (!cpu_feature_enabled(X86_FEATURE_USER_SHSTK) || in_32bit_syscall())
+ /* Also not supported for 32 bit */
+ if (!cpu_feature_enabled(X86_FEATURE_USER_SHSTK) || in_ia32_syscall())
return -EOPNOTSUPP;
size = adjust_shstk_size(0);
diff --git a/arch/x86/kernel/signal_64.c b/arch/x86/kernel/signal_64.c
index 23d8aaf8d9fd..8a94053c5444 100644
--- a/arch/x86/kernel/signal_64.c
+++ b/arch/x86/kernel/signal_64.c
@@ -315,6 +315,9 @@ int x32_setup_rt_frame(struct ksignal *ksig, struct pt_regs *regs)
uc_flags = frame_uc_flags(regs);
+ if (setup_signal_shadow_stack(ksig))
+ return -EFAULT;
+
if (!user_access_begin(frame, sizeof(*frame)))
return -EFAULT;
@@ -377,6 +380,9 @@ COMPAT_SYSCALL_DEFINE0(x32_rt_sigreturn)
if (!restore_sigcontext(regs, &frame->uc.uc_mcontext, uc_flags))
goto badframe;
+ if (restore_signal_shadow_stack())
+ goto badframe;
+
if (compat_restore_altstack(&frame->uc.uc_stack))
goto badframe;
On Mon, 13 May 2024 at 01:13, Ingo Molnar <[email protected]> wrote:
>
> Enable shadow stacks for x32.
>
> While we normally don't do such feature-enabling on 32-bit
> kernels anymore, this change is small, straightforward & tested on
> upstream glibc.
Color me confused.
"feature-enabling on 32-bit kernels"
This is not for 32-bit kernels, as far as I can tell. This is just the
x32 user mode for x86-64 kernels.
Or am I missing something?
I've pulled this, but does anybody actually use x32? I feel like it
was a failed experiment. No?
Linus
The pull request you sent on Mon, 13 May 2024 10:13:34 +0200:
> git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git x86-shstk-2024-05-13
has been merged into torvalds/linux.git:
https://git.kernel.org/torvalds/c/a5131c3fdf2608f1c15f3809e201cf540eb28489
Thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/prtracker.html
On Mon, May 13, 2024 at 07:38:13PM -0700, Linus Torvalds wrote:
> I've pulled this, but does anybody actually use x32? I feel like it
> was a failed experiment. No?
Well, I did ask that at the time:
https://lore.kernel.org/r/20240322164912.GAZf22iBdqdkIFcrsl@fat_crate.local
The answer on another subthread was: "Because it just works?"
--
Regards/Gruss,
Boris.
https://people.kernel.org/tglx/notes-about-netiquette
* Linus Torvalds <[email protected]> wrote:
> On Mon, 13 May 2024 at 01:13, Ingo Molnar <[email protected]> wrote:
> >
> > Enable shadow stacks for x32.
> >
> > While we normally don't do such feature-enabling on 32-bit
> > kernels anymore, this change is small, straightforward & tested on
> > upstream glibc.
>
> Color me confused.
>
> "feature-enabling on 32-bit kernels"
>
> This is not for 32-bit kernels, as far as I can tell. This is just the
> x32 user mode for x86-64 kernels.
>
> Or am I missing something?
Brainfart: feature-enabling for 32-bit user-space ...
> I've pulled this, but does anybody actually use x32? I feel like it
> was a failed experiment. No?
Yeah, so H.J. Lu suggested that shadow-stacks are a natural extension of
our security facilities on OSs where x32 is already enabled:
https://lore.kernel.org/all/CAMe9rOo1ZONFgBkuN_Ni3REBRsedNwj3gNnXj1oxB0bQzuNipA@mail.gmail.com/
H.J: *which* are those OSs? I don't think any major Linux distro enables
x32 anymore - here's Ubuntu and Fedora for example:
kepler:~/tip> grep X32 /boot/config-6.5.0-35-generic
# CONFIG_X86_X32_ABI is not set
kepler:~/s/fedora> grep X32 lib/modules/6.9.0-64.fc41.x86_64/config
# CONFIG_X86_X32_ABI is not set
Another feedback was that the observed lack of x32 kernel regressions
upstream could be because 'it just works':
https://lore.kernel.org/all/CAMe9rOoEQ3jUUXy+Kai9Hg83b+79azmGfu8DBR=A3HSL05kj0A@mail.gmail.com/
.. so at this point I think we should be permissive towards well-tested
patches, barring contrary evidence.
'Contrary evidence' would be for example some x32 regression that wasn't
fixed for a long time while nobody cared, at which point we'd remove x32
instead of fixing something that wasn't working for a long time. I'm not
aware of such a regression yet, BYMMV.
Thanks,
Ingo
On Wed, May 15, 2024 at 10:07:33AM +0200, Ingo Molnar wrote:
> H.J: *which* are those OSs? I don't think any major Linux distro enables
> x32 anymore - here's Ubuntu and Fedora for example:
>
> kepler:~/tip> grep X32 /boot/config-6.5.0-35-generic
> # CONFIG_X86_X32_ABI is not set
>
>
> kepler:~/s/fedora> grep X32 lib/modules/6.9.0-64.fc41.x86_64/config
> # CONFIG_X86_X32_ABI is not set
For what it's worth, Arch Linux just turned it back on at a user's
request:
https://gitlab.archlinux.org/archlinux/packaging/packages/linux/-/commit/b0c9bf78acbdcdf90405c427cf6b751259baee74
https://gitlab.archlinux.org/archlinux/packaging/packages/linux/-/issues/51
Cheers,
Nathan