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

Noah Goldstein goldstein.w.n@gmail.com
Mon Dec 18 17:50:42 GMT 2023


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.


More information about the Libc-alpha mailing list