blob: a41c3950cf99623785dad52161a14203219db115 [file] [log] [blame]
#################
Branch Protection
#################
The Branch Protection is an optional feature that can help with mitigation of
common exploits through undesired branching in code.
The Branch Protection feature leverages the Pointer Authentication and Branch
Target Identification extension (PACBTI) which is optional and available in
Armv8.1-M architecture.
PACBTI is designed to mitigate Return-Oriented Programming (ROP) and
Jump-Oriented Programming (JOP) security exploit attacks.
Pointer authentication
======================
Pointer authentication (PAC) is a technique by which the pointer is "signed".
This signed pointer is generated by the hardware by combining a modifier, a
secret key and the pointer itself through a hardware cryptographic mechanism.
The generated signed pointer is produced at the beginning of a subroutine or
function.
On returning from the subroutine/function another signed pointer is generated
and compared with the previous signed pointer. If they match, then the pointer
(return address) has not been tampered and there are no side-effects.
Otherwise the validating instruction generates a UsageFault exception.
All the above functionality is achieved by introducing specific instructions at
the beginning and at the end of the subroutine/function. This addition is
controlled by compiler options, when supported.
To enable PAC in your platform, TF-M supports the following build options:
- BRANCH_PROTECTION_PACRET
- BRANCH_PROTECTION_PACRET_LEAF
One of the above values can be assigned to ``CONFIG_TFM_BRANCH_PROTECTION_FEAT``
``BRANCH_PROTECTION_PACRET_LEAF`` extends ``BRANCH_PROTECTION_PACRET`` when PAC
is desired also in leaf functions.
Branch target identification
============================
Branch Target Identification (BTI) can mitigate some of the JOP attacks so that
indirect branches can only allow target instructions. Such instructions are also
called landing pads.
In other words, an indirect branch can only "land" where a specific instruction
is present, otherwise the branch has been compromised and a UsageFault exception
is raised.
The above functionality is achieved by introducing specific instructions at the
beginning of executable code.
To enable BTI in your platform, TF-M supports the following build option:
- BRANCH_PROTECTION_BTI
One of the above values can be assigned to ``CONFIG_TFM_BRANCH_PROTECTION_FEAT``
PAC and BTI
===========
It is possible to have some combinations of the PAC and BTI options above.
The allowed values for ``CONFIG_TFM_BRANCH_PROTECTION_FEAT`` are listed below,
but only one option can be used:
* ``BRANCH_PROTECTION_DISABLED`` - PACBTI feature is disabled
* ``BRANCH_PROTECTION_NONE`` - PACBTI instructions are not generated
* ``BRANCH_PROTECTION_STANDARD`` - Enables pointer authentication and branch target identification, leaf functions excluded
* ``BRANCH_PROTECTION_PACRET`` - Enables pointer authentication only, leaf functions excluded
* ``BRANCH_PROTECTION_PACRET_LEAF`` - Enables pointer authentication on all functions, including leaf functions
* ``BRANCH_PROTECTION_BTI`` - Enables branch target identification only
Note that PACBTI is conditional to both architecture support and compiler
support.
The build system performs checks to ensure that support is available and
terminates the build process if the required conditions are not met.
Limitations
===========
Currently PACBTI is supported only for Arm Compiler.
Even though GNUARM supports PACBTI, some features are missing that prevent all
the component integration to successfully work together.
It may be possible in the future to extend support for other compilers.
--------------
For further details on PACBTI features refer to:
`Armv8-M Architecture Reference Manual <https://developer.arm.com/documentation/ddi0553/latest>`_
`Armv8.1-M Pointer Authentication and Branch Target Identification Extension <https://community.arm.com/arm-community-blogs/b/architectures-and-processors-blog/posts/armv8-1-m-pointer-authentication-and-branch-target-identification-extension>`_
--------------
*Copyright (c) 2024, Arm Limited. All rights reserved.*