[PATCH v2 00/16] x86/cet: Update CET kernel interface

Noah Goldstein goldstein.w.n@gmail.com
Tue Dec 19 00:07:36 GMT 2023


On Mon, Dec 18, 2023 at 1:10 PM H.J. Lu <hjl.tools@gmail.com> wrote:
>
> On Mon, Dec 18, 2023 at 9:50 AM Noah Goldstein <goldstein.w.n@gmail.com> wrote:
> >
> > On Sat, Dec 16, 2023 at 10:53 AM H.J. Lu <hjl.tools@gmail.com> wrote:
> > >
> > > Changes in v2:
> > >
> > > 1. Add add extra 20 stack frames in shadow stack for signal handlers
> > > when allocating shadow stack for ucontexts.
> > > 2. Remove the "x86: Check PT_GNU_PROPERTY early" patch which has been
> > > checked into master branch.
> > >
> > >
> > > Linux kernel 6.6 added SHSTK support for x86-64.  This patch set updates
> > > CET kernel interface to Linux kernel 6.6.  The main difference from the
> > > current glibc assumption is that SHSTK is enabled by glibc, instead of
> > > kernel.  Glibc enables SHSTK after verifying that the application and
> > > all dependency libraries are CET enabled.  SHSTK can only be enabled in a
> > > function which will never return.  Otherwise, shadow stack will underflow
> > > at the function return.
> > >
> > > Not all CET enabled applications and libraries have been properly tested
> > > in CET enabled environments.  Some CET enabled applications or libraries
> > > will crash or misbehave when CET is enabled.  Don't set CET active by
> > > default so that all applications and libraries will run normally regardless
> > > of whether CET is active or not.  Shadow stack can be enabled by
> > >
> > > $ export GLIBC_TUNABLES=glibc.cpu.hwcaps=SHSTK
> > >
> > > at run-time if shadow stack can be enabled by kernel.
> > >
> > > Since only x86-64 is supported, i386 shadow stack codes are unchanged
> > > and CET shouldn't be enabled for i386.
> > >
> > > NB: This change can be reverted if it is OK to enable CET by default for
> > > all applications and libraries.
> > >
> > > Tested on Intel Tiger Lake under Linux kernel 6.6.7.
> > >
> > > H.J. Lu (16):
> > >   x86/cet: Check user_shstk in /proc/cpuinfo
> > >   x86/cet: Update tst-cet-vfork-1
> > >   x86/cet: Don't assume that SHSTK implies IBT
> > >   x86/cet: Check legacy shadow stack applications
> > >   x86/cet: Check CPU_FEATURE_ACTIVE when CET is disabled
> > >   x86/cet: Add tests for GLIBC_TUNABLES=glibc.cpu.hwcaps=-SHSTK
> > >   x86/cet: Check legacy shadow stack code in .init_array section
> > >   x86/cet: Check CPU_FEATURE_ACTIVE in permissive mode
> > >   x86: Modularize sysdeps/x86/dl-cet.c
> > >   x86/cet: Sync with Linux kernel 6.6 shadow stack interface
> > >   elf: Always provide _dl_get_dl_main_map in libc.a
> > >   x86/cet: Enable shadow stack during startup
> > >   x86/cet: Check feature_1 in TCB for active IBT and SHSTK
> > >   x86/cet: Don't disable CET if not single threaded
> > >   x86/cet: Don't set CET active by default
> > >   x86/cet: Run some CET tests with shadow stack
> > >
> > >  elf/dl-support.c                              |   2 -
> > >  sysdeps/generic/ldsodefs.h                    |   8 +-
> > >  sysdeps/unix/sysv/linux/x86/Makefile          |   1 +
> > >  .../sysv/linux/x86/allocate-shadow-stack.c    |  62 +++
> > >  .../sysv/linux/x86/allocate-shadow-stack.h    |  27 +
> > >  sysdeps/unix/sysv/linux/x86/bits/mman.h       |   5 +
> > >  sysdeps/unix/sysv/linux/x86/dl-cet.h          |  39 +-
> > >  .../unix/sysv/linux/x86/include/asm/prctl.h   |  37 +-
> > >  .../sysv/linux/x86/tst-cet-setcontext-1.c     |  17 +-
> > >  sysdeps/unix/sysv/linux/x86/tst-cet-vfork-1.c |  43 +-
> > >  .../unix/sysv/linux/x86_64/__start_context.S  |  38 +-
> > >  sysdeps/unix/sysv/linux/x86_64/dl-cet.h       |  47 ++
> > >  sysdeps/unix/sysv/linux/x86_64/getcontext.S   |  30 +-
> > >  sysdeps/unix/sysv/linux/x86_64/makecontext.c  |  29 +-
> > >  sysdeps/unix/sysv/linux/x86_64/swapcontext.S  |  22 +-
> > >  sysdeps/x86/Makefile                          |  87 +++-
> > >  sysdeps/x86/bits/platform/x86.h               |   8 +
> > >  sysdeps/x86/cpu-features-offsets.sym          |   1 +
> > >  sysdeps/x86/cpu-features.c                    |  48 +-
> > >  sysdeps/x86/cpu-tunables.c                    |  17 +-
> > >  sysdeps/x86/dl-cet.c                          | 462 +++++++++++-------
> > >  sysdeps/x86/get-cpuid-feature-leaf.c          |  13 +-
> > >  sysdeps/x86/include/cpu-features.h            |   3 +
> > >  sysdeps/x86/libc-start.h                      |  54 +-
> > >  sysdeps/x86/sys/platform/x86.h                |  17 +
> > >  sysdeps/x86/tst-cet-legacy-10.c               |   6 +-
> > >  sysdeps/x86/tst-cet-legacy-10a-static.c       |   2 +
> > >  sysdeps/x86/tst-cet-legacy-10a.c              |   2 +
> > >  sysdeps/x86/tst-cet-legacy-4.c                |   5 +
> > >  sysdeps/x86/tst-cet-legacy-8.c                |  15 +-
> > >  sysdeps/x86/tst-cpu-features-cpuinfo.c        |   2 +-
> > >  sysdeps/x86/tst-shstk-legacy-1-extra.S        |  35 ++
> > >  sysdeps/x86/tst-shstk-legacy-1a-static.c      |   1 +
> > >  sysdeps/x86/tst-shstk-legacy-1a.c             |  32 ++
> > >  sysdeps/x86/tst-shstk-legacy-1b-static.c      |   1 +
> > >  sysdeps/x86/tst-shstk-legacy-1b.c             |  38 ++
> > >  sysdeps/x86/tst-shstk-legacy-1c-static.c      |   1 +
> > >  sysdeps/x86/tst-shstk-legacy-1c.c             |  20 +
> > >  sysdeps/x86/tst-shstk-legacy-1d-static.c      |   1 +
> > >  .../tst-shstk-legacy-1d.c}                    |  45 +-
> > >  sysdeps/x86/tst-shstk-legacy-1e-static.c      |   1 +
> > >  sysdeps/x86/tst-shstk-legacy-1e-static.sh     |  33 ++
> > >  sysdeps/x86/tst-shstk-legacy-1e.c             |  53 ++
> > >  sysdeps/x86/tst-shstk-legacy-1e.sh            |  35 ++
> > >  sysdeps/x86/tst-shstk-legacy-1f.c             |  29 ++
> > >  sysdeps/x86/tst-shstk-legacy-1g.c             |  35 ++
> > >  sysdeps/x86/tst-shstk-legacy-1g.sh            |  35 ++
> > >  sysdeps/x86/tst-shstk-legacy-mod-1.c          |  28 ++
> > >  sysdeps/x86_64/dl-machine.h                   |  12 +-
> > >  sysdeps/x86_64/nptl/tls.h                     |   2 +-
> > >  50 files changed, 1169 insertions(+), 417 deletions(-)
> > >  create mode 100644 sysdeps/unix/sysv/linux/x86/allocate-shadow-stack.c
> > >  create mode 100644 sysdeps/unix/sysv/linux/x86/allocate-shadow-stack.h
> > >  create mode 100644 sysdeps/unix/sysv/linux/x86_64/dl-cet.h
> > >  create mode 100644 sysdeps/x86/tst-cet-legacy-10a-static.c
> > >  create mode 100644 sysdeps/x86/tst-cet-legacy-10a.c
> > >  create mode 100644 sysdeps/x86/tst-shstk-legacy-1-extra.S
> > >  create mode 100644 sysdeps/x86/tst-shstk-legacy-1a-static.c
> > >  create mode 100644 sysdeps/x86/tst-shstk-legacy-1a.c
> > >  create mode 100644 sysdeps/x86/tst-shstk-legacy-1b-static.c
> > >  create mode 100644 sysdeps/x86/tst-shstk-legacy-1b.c
> > >  create mode 100644 sysdeps/x86/tst-shstk-legacy-1c-static.c
> > >  create mode 100644 sysdeps/x86/tst-shstk-legacy-1c.c
> > >  create mode 100644 sysdeps/x86/tst-shstk-legacy-1d-static.c
> > >  rename sysdeps/{unix/sysv/linux/x86/cpu-features.c => x86/tst-shstk-legacy-1d.c} (53%)
> > >  create mode 100644 sysdeps/x86/tst-shstk-legacy-1e-static.c
> > >  create mode 100755 sysdeps/x86/tst-shstk-legacy-1e-static.sh
> > >  create mode 100644 sysdeps/x86/tst-shstk-legacy-1e.c
> > >  create mode 100755 sysdeps/x86/tst-shstk-legacy-1e.sh
> > >  create mode 100644 sysdeps/x86/tst-shstk-legacy-1f.c
> > >  create mode 100644 sysdeps/x86/tst-shstk-legacy-1g.c
> > >  create mode 100755 sysdeps/x86/tst-shstk-legacy-1g.sh
> > >  create mode 100644 sysdeps/x86/tst-shstk-legacy-mod-1.c
> > >
> > > --
> > > 2.43.0
> > >
> >
> > The series no longer cleanly applies since you committed
> > ```
> > commit 442983319ba70de801fc856e8dd4748fba8f7f1b (HEAD -> master,
> > origin/master, origin/HEAD)
> > Author: H.J. Lu <hjl.tools@gmail.com>
> > Date:   Sat Dec 16 08:53:12 2023 -0800
> >
> >     x86/cet: Don't assume that SHSTK implies IBT
> >
> > ```
> >
> > needs a rebase.
>
> Here is the rebased patch set:
>
> https://gitlab.com/x86-glibc/glibc/-/commits/users/hjl/cet/v11b/master?ref_type=heads
>
> There are no code changes.  Any comments on the rest of the patches?
>
> Thanks.
>
> --
> H.J.

When I try to apply:
```
Applying: x86/cet: Check user_shstk in /proc/cpuinfo
error: patch failed: sysdeps/x86/tst-cpu-features-cpuinfo.c:246
error: sysdeps/x86/tst-cpu-features-cpuinfo.c: patch does not apply
Patch failed at 0001 x86/cet: Check user_shstk in /proc/cpuinfo
hint: Use 'git am --show-current-patch=diff' to see the failed patch
When you have resolved this problem, run "git am --continue".
If you prefer to skip this patch, run "git am --skip" instead.
To restore the original branch and stop patching, run "git am --abort".

```


More information about the Libc-alpha mailing list