[PATCH v4 0/3] arm64: dynamic shadow call stack support

Sami Tolvanen samitolvanen at google.com
Thu Jul 7 12:35:58 PDT 2022


Hi Ard,

On Fri, Jul 01, 2022 at 05:27:21PM +0200, Ard Biesheuvel wrote:
> Generic kernel images such as Android's GKI usually enable all available
> security features, which are typically implemented in such a way that
> they only take effect if the underlying hardware can support it, but
> don't interfere with correct and efficient operation otherwise.
> 
> For shadow call stack support, which is always supported by the
> hardware, it means it will be enabled even if pointer authentication is
> also supported, and enabled for signing return addresses stored on the
> stack. The additional security provided by shadow call stack is only
> marginal in this case, whereas the performance overhead is not.
> 
> Given that return address signing is based on PACIASP/AUTIASP
> instructions that implicitly operate on the return address register
> (X30) and are not idempotent (i.e., each needs to be emitted exactly
> once before the return address is stored on the ordinary stack and after
> it has been retrieved from it), we can convert these instruction 1:1
> into shadow call stack pushes and pops involving the register X30.
> As this is something that can be done at runtime rather than build time,
> we can do this conditionally based on whether or not return address
> signing is supported on the underlying hardware.
> 
> In order to be able to unwind call stacks that involve return address
> signing, whether or not the return address is currently signed is
> tracked by DWARF CFI directives in the unwinding metadata. This means we
> can use this information to locate all PACIASP/AUTIASP instructions in
> the binary, instead of having to use brute force and go over all
> instructions in the entire program.
> 
> This series implements this approach for Clang, which has recently been
> fixed to emit all these CFI directives correctly. This series is based
> on an older PoC sent out last year [0] that targeted GCC only (due to
> this issue). This v3 targets Clang only, as GCC has its own issues with
> CFI accuracy.
> 
> Changes since v3 [1]:
> - rebase onto arm64/for-next/core

Btw, this no longer seems to apply cleanly to for-next/core. I've found
using git format-patch --base=auto helpful when sending patches against
trees that change more frequently.

> - fix init value of dynamic_scs_enabled static key
> - don't discard .eh_frame sections (to work around a bug in an older
>   Clang version if we are keeping them for dynamic SCS patching,
> - print a diagnostic if dynamic SCS patching is enabled,
> - apply build fix suggested by Sami and add his ack to patch #2

Nevertheless, the patches look good to me, and SCS was correctly enabled
on CPUs without PAC support in my testing. For the series:

Reviewed-by: Sami Tolvanen <samitolvanen at google.com>
Tested-by: Sami Tolvanen <samitolvanen at google.com>

Sami



More information about the linux-arm-kernel mailing list