linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
From: Anders Roxell <anders.roxell@linaro.org>
To: Mark Brown <broonie@kernel.org>
Cc: Catalin Marinas <catalin.marinas@arm.com>,
	Will Deacon <will@kernel.org>, Jonathan Corbet <corbet@lwn.net>,
	Andrew Morton <akpm@linux-foundation.org>,
	Marc Zyngier <maz@kernel.org>,
	Oliver Upton <oliver.upton@linux.dev>,
	James Morse <james.morse@arm.com>,
	Suzuki K Poulose <suzuki.poulose@arm.com>,
	Arnd Bergmann <arnd@arndb.de>, Oleg Nesterov <oleg@redhat.com>,
	Eric Biederman <ebiederm@xmission.com>,
	Shuah Khan <shuah@kernel.org>,
	"Rick P. Edgecombe" <rick.p.edgecombe@intel.com>,
	Deepak Gupta <debug@rivosinc.com>,
	Ard Biesheuvel <ardb@kernel.org>,
	Szabolcs Nagy <Szabolcs.Nagy@arm.com>,
	Kees Cook <kees@kernel.org>, "H.J. Lu" <hjl.tools@gmail.com>,
	Paul Walmsley <paul.walmsley@sifive.com>,
	Palmer Dabbelt <palmer@dabbelt.com>,
	Albert Ou <aou@eecs.berkeley.edu>,
	Florian Weimer <fweimer@redhat.com>,
	Christian Brauner <brauner@kernel.org>,
	Thiago Jung Bauermann <thiago.bauermann@linaro.org>,
	Ross Burton <ross.burton@arm.com>,
	linux-arm-kernel@lists.infradead.org, linux-doc@vger.kernel.org,
	kvmarm@lists.linux.dev, linux-fsdevel@vger.kernel.org,
	linux-arch@vger.kernel.org, linux-mm@kvack.org,
	linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-riscv@lists.infradead.org
Subject: Re: [PATCH v10 00/40] arm64/gcs: Provide support for GCS in userspace
Date: Fri, 2 Aug 2024 18:03:27 +0200	[thread overview]
Message-ID: <20240802160326.GA36502@mutt> (raw)
In-Reply-To: <20240801-arm64-gcs-v10-0-699e2bd2190b@kernel.org>

On 2024-08-01 13:06, Mark Brown wrote:
> The arm64 Guarded Control Stack (GCS) feature provides support for
> hardware protected stacks of return addresses, intended to provide
> hardening against return oriented programming (ROP) attacks and to make
> it easier to gather call stacks for applications such as profiling.
> 
> When GCS is active a secondary stack called the Guarded Control Stack is
> maintained, protected with a memory attribute which means that it can
> only be written with specific GCS operations.  The current GCS pointer
> can not be directly written to by userspace.  When a BL is executed the
> value stored in LR is also pushed onto the GCS, and when a RET is
> executed the top of the GCS is popped and compared to LR with a fault
> being raised if the values do not match.  GCS operations may only be
> performed on GCS pages, a data abort is generated if they are not.
> 
> The combination of hardware enforcement and lack of extra instructions
> in the function entry and exit paths should result in something which
> has less overhead and is more difficult to attack than a purely software
> implementation like clang's shadow stacks.
> 
> This series implements support for use of GCS by userspace, along with
> support for use of GCS within KVM guests.  It does not enable use of GCS
> by either EL1 or EL2, this will be implemented separately.  Executables
> are started without GCS and must use a prctl() to enable it, it is
> expected that this will be done very early in application execution by
> the dynamic linker or other startup code.  For dynamic linking this will
> be done by checking that everything in the executable is marked as GCS
> compatible.
> 
> x86 has an equivalent feature called shadow stacks, this series depends
> on the x86 patches for generic memory management support for the new
> guarded/shadow stack page type and shares APIs as much as possible.  As
> there has been extensive discussion with the wider community around the
> ABI for shadow stacks I have as far as practical kept implementation
> decisions close to those for x86, anticipating that review would lead to
> similar conclusions in the absence of strong reasoning for divergence.
> 
> The main divergence I am concious of is that x86 allows shadow stack to
> be enabled and disabled repeatedly, freeing the shadow stack for the
> thread whenever disabled, while this implementation keeps the GCS
> allocated after disable but refuses to reenable it.  This is to avoid
> races with things actively walking the GCS during a disable, we do
> anticipate that some systems will wish to disable GCS at runtime but are
> not aware of any demand for subsequently reenabling it.
> 
> x86 uses an arch_prctl() to manage enable and disable, since only x86
> and S/390 use arch_prctl() a generic prctl() was proposed[1] as part of a
> patch set for the equivalent RISC-V Zicfiss feature which I initially
> adopted fairly directly but following review feedback has been revised
> quite a bit.
> 
> We currently maintain the x86 pattern of implicitly allocating a shadow
> stack for threads started with shadow stack enabled, there has been some
> discussion of removing this support and requiring the use of clone3()
> with explicit allocation of shadow stacks instead.  I have no strong
> feelings either way, implicit allocation is not really consistent with
> anything else we do and creates the potential for errors around thread
> exit but on the other hand it is existing ABI on x86 and minimises the
> changes needed in userspace code.
> 
> glibc and bionic changes using this ABI have been implemented and
> tested.  Headless Android systems have been validated and Ross Burton
> has used this code has been used to bring up a Yocto system with GCS
> enabed as standard, a test implementation of V8 support has also been
> done.
> 
> There is an open issue with support for CRIU, on x86 this required the
> ability to set the GCS mode via ptrace.  This series supports
> configuring mode bits other than enable/disable via ptrace but it needs
> to be confirmed if this is sufficient.
> 
> The series depends on support for shadow stacks in clone3(), that series
> includes the addition of ARCH_HAS_USER_SHADOW_STACK.
> 
>    https://lore.kernel.org/r/20240731-clone3-shadow-stack-v7-0-a9532eebfb1d@kernel.org
> 

Verified this patchset on a FVP.

Tested-by: Linux Kernel Functional Testing <lkft@linaro.org>


Cheers,
Anders


  parent reply	other threads:[~2024-08-02 16:04 UTC|newest]

Thread overview: 110+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-08-01 12:06 [PATCH v10 00/40] arm64/gcs: Provide support for GCS in userspace Mark Brown
2024-08-01 12:06 ` [PATCH v10 01/40] arm64/mm: Restructure arch_validate_flags() for extensibility Mark Brown
2024-08-15 10:39   ` Catalin Marinas
2024-08-01 12:06 ` [PATCH v10 02/40] prctl: arch-agnostic prctl for shadow stack Mark Brown
2024-08-15 10:42   ` Catalin Marinas
2024-08-01 12:06 ` [PATCH v10 03/40] mman: Add map_shadow_stack() flags Mark Brown
2024-08-15 15:45   ` Catalin Marinas
2024-08-01 12:06 ` [PATCH v10 04/40] arm64: Document boot requirements for Guarded Control Stacks Mark Brown
2024-08-15 17:00   ` Catalin Marinas
2024-08-15 18:14     ` Mark Brown
2024-08-01 12:06 ` [PATCH v10 05/40] arm64/gcs: Document the ABI " Mark Brown
2024-08-16 11:09   ` Catalin Marinas
2024-08-16 12:02     ` Mark Brown
2024-08-01 12:06 ` [PATCH v10 06/40] arm64/sysreg: Add definitions for architected GCS caps Mark Brown
2024-08-16 11:10   ` Catalin Marinas
2024-08-01 12:06 ` [PATCH v10 07/40] arm64/gcs: Add manual encodings of GCS instructions Mark Brown
2024-08-16 11:10   ` Catalin Marinas
2024-08-01 12:06 ` [PATCH v10 08/40] arm64/gcs: Provide put_user_gcs() Mark Brown
2024-08-16 11:12   ` Catalin Marinas
2024-08-01 12:06 ` [PATCH v10 09/40] arm64/gcs: Provide basic EL2 setup to allow GCS usage at EL0 and EL1 Mark Brown
2024-08-16 11:13   ` Catalin Marinas
2024-08-01 12:06 ` [PATCH v10 10/40] arm64/cpufeature: Runtime detection of Guarded Control Stack (GCS) Mark Brown
2024-08-16 11:15   ` Catalin Marinas
2024-08-01 12:06 ` [PATCH v10 11/40] arm64/mm: Allocate PIE slots for EL0 guarded control stack Mark Brown
2024-08-16 14:16   ` Catalin Marinas
2024-08-01 12:06 ` [PATCH v10 12/40] mm: Define VM_SHADOW_STACK for arm64 when we support GCS Mark Brown
2024-08-15 15:20   ` Edgecombe, Rick P
2024-08-15 15:26     ` Mark Brown
2024-08-15 16:39       ` Mark Brown
2024-08-15 17:53         ` Edgecombe, Rick P
2024-08-15 18:19           ` Mark Brown
2024-08-16 13:59             ` Edgecombe, Rick P
2024-08-19  9:07   ` Catalin Marinas
2024-08-01 12:06 ` [PATCH v10 13/40] arm64/mm: Map pages for guarded control stack Mark Brown
2024-08-19  9:10   ` Catalin Marinas
2024-08-19 16:33     ` Mark Brown
2024-08-20 14:59       ` Catalin Marinas
2024-08-20 15:28         ` Mark Brown
2024-08-20 17:30           ` Catalin Marinas
2024-08-01 12:06 ` [PATCH v10 14/40] KVM: arm64: Manage GCS access and registers for guests Mark Brown
2024-08-16 14:15   ` Marc Zyngier
2024-08-16 14:40     ` Mark Brown
2024-08-16 14:52       ` Marc Zyngier
2024-08-01 12:06 ` [PATCH v10 15/40] arm64/idreg: Add overrride for GCS Mark Brown
2024-08-19  9:10   ` Catalin Marinas
2024-08-01 12:06 ` [PATCH v10 16/40] arm64/hwcap: Add hwcap " Mark Brown
2024-08-19  9:12   ` Catalin Marinas
2024-08-01 12:06 ` [PATCH v10 17/40] arm64/traps: Handle GCS exceptions Mark Brown
2024-08-19  9:12   ` Catalin Marinas
2024-08-01 12:06 ` [PATCH v10 18/40] arm64/mm: Handle GCS data aborts Mark Brown
2024-08-19  9:17   ` Catalin Marinas
2024-08-19 15:14     ` Mark Brown
2024-08-01 12:06 ` [PATCH v10 19/40] arm64/gcs: Context switch GCS state for EL0 Mark Brown
2024-08-19 11:46   ` Catalin Marinas
2024-08-19 15:44     ` Mark Brown
2024-08-20 17:07       ` Catalin Marinas
2024-08-20 17:56       ` Mark Brown
2024-08-21  8:50         ` Catalin Marinas
2024-08-21 12:48           ` Mark Brown
2024-08-01 12:06 ` [PATCH v10 20/40] arm64/gcs: Ensure that new threads have a GCS Mark Brown
2024-08-19 12:04   ` Catalin Marinas
2024-08-19 15:57     ` Mark Brown
2024-08-20 17:28       ` Catalin Marinas
2024-08-01 12:06 ` [PATCH v10 21/40] arm64/gcs: Implement shadow stack prctl() interface Mark Brown
2024-08-21 12:54   ` Catalin Marinas
2024-08-21 13:41     ` Mark Brown
2024-08-01 12:06 ` [PATCH v10 22/40] arm64/mm: Implement map_shadow_stack() Mark Brown
2024-08-21 15:36   ` Catalin Marinas
2024-08-01 12:06 ` [PATCH v10 23/40] arm64/signal: Set up and restore the GCS context for signal handlers Mark Brown
2024-08-14 14:51   ` Dave Martin
2024-08-14 16:00     ` Mark Brown
2024-08-15 13:37       ` Dave Martin
2024-08-15 14:45         ` Mark Brown
2024-08-15 15:11           ` Dave Martin
2024-08-15 15:29             ` Mark Brown
2024-08-15 16:31               ` Dave Martin
2024-08-21 17:28   ` Catalin Marinas
2024-08-21 18:03     ` Mark Brown
2024-08-21 18:18       ` Catalin Marinas
2024-08-01 12:06 ` [PATCH v10 24/40] arm64/signal: Expose GCS state in signal frames Mark Brown
2024-08-14 15:09   ` Dave Martin
2024-08-14 16:21     ` Mark Brown
2024-08-15 14:01       ` Dave Martin
2024-08-15 15:05         ` Mark Brown
2024-08-15 15:33           ` Dave Martin
2024-08-15 15:46             ` Mark Brown
2024-08-15 16:40               ` Dave Martin
2024-08-21 17:40   ` Catalin Marinas
2024-08-01 12:06 ` [PATCH v10 25/40] arm64/ptrace: Expose GCS via ptrace and core files Mark Brown
2024-08-21 17:57   ` Catalin Marinas
2024-08-21 18:27     ` Mark Brown
2024-08-21 18:41       ` Mark Brown
2024-08-01 12:06 ` [PATCH v10 26/40] arm64: Add Kconfig for Guarded Control Stack (GCS) Mark Brown
2024-08-21 17:58   ` Catalin Marinas
2024-08-01 12:06 ` [PATCH v10 27/40] kselftest/arm64: Verify the GCS hwcap Mark Brown
2024-08-01 12:06 ` [PATCH v10 28/40] kselftest: Provide shadow stack enable helpers for arm64 Mark Brown
2024-08-01 12:06 ` [PATCH v10 29/40] selftests/clone3: Enable arm64 shadow stack testing Mark Brown
2024-08-01 12:06 ` [PATCH v10 30/40] kselftest/arm64: Add GCS as a detected feature in the signal tests Mark Brown
2024-08-01 12:06 ` [PATCH v10 31/40] kselftest/arm64: Add framework support for GCS to signal handling tests Mark Brown
2024-08-01 12:06 ` [PATCH v10 32/40] kselftest/arm64: Allow signals tests to specify an expected si_code Mark Brown
2024-08-01 12:07 ` [PATCH v10 33/40] kselftest/arm64: Always run signals tests with GCS enabled Mark Brown
2024-08-01 12:07 ` [PATCH v10 34/40] kselftest/arm64: Add very basic GCS test program Mark Brown
2024-08-01 12:07 ` [PATCH v10 35/40] kselftest/arm64: Add a GCS test program built with the system libc Mark Brown
2024-08-01 12:07 ` [PATCH v10 36/40] kselftest/arm64: Add test coverage for GCS mode locking Mark Brown
2024-08-01 12:07 ` [PATCH v10 37/40] kselftest/arm64: Add GCS signal tests Mark Brown
2024-08-01 12:07 ` [PATCH v10 38/40] kselftest/arm64: Add a GCS stress test Mark Brown
2024-08-01 12:07 ` [PATCH v10 39/40] kselftest/arm64: Enable GCS for the FP stress tests Mark Brown
2024-08-01 12:07 ` [PATCH v10 40/40] KVM: selftests: arm64: Add GCS registers to get-reg-list Mark Brown
2024-08-02 16:03 ` Anders Roxell [this message]
2024-08-16 14:06 ` [PATCH v10 00/40] arm64/gcs: Provide support for GCS in userspace Marc Zyngier

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20240802160326.GA36502@mutt \
    --to=anders.roxell@linaro.org \
    --cc=Szabolcs.Nagy@arm.com \
    --cc=akpm@linux-foundation.org \
    --cc=aou@eecs.berkeley.edu \
    --cc=ardb@kernel.org \
    --cc=arnd@arndb.de \
    --cc=brauner@kernel.org \
    --cc=broonie@kernel.org \
    --cc=catalin.marinas@arm.com \
    --cc=corbet@lwn.net \
    --cc=debug@rivosinc.com \
    --cc=ebiederm@xmission.com \
    --cc=fweimer@redhat.com \
    --cc=hjl.tools@gmail.com \
    --cc=james.morse@arm.com \
    --cc=kees@kernel.org \
    --cc=kvmarm@lists.linux.dev \
    --cc=linux-arch@vger.kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-kselftest@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=linux-riscv@lists.infradead.org \
    --cc=maz@kernel.org \
    --cc=oleg@redhat.com \
    --cc=oliver.upton@linux.dev \
    --cc=palmer@dabbelt.com \
    --cc=paul.walmsley@sifive.com \
    --cc=rick.p.edgecombe@intel.com \
    --cc=ross.burton@arm.com \
    --cc=shuah@kernel.org \
    --cc=suzuki.poulose@arm.com \
    --cc=thiago.bauermann@linaro.org \
    --cc=will@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).