-
-
Notifications
You must be signed in to change notification settings - Fork 34.6k
gh-139808: Add branch protections for aarch64 in asm_trampoline.S #130864
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
Show all changes
4 commits
Select commit
Hold shift + click to select a range
acae86e
Apply protection against ROP/JOP attacks for aarch64 on asm_trampoline.S
stratakis e2219a1
Fix DWARF CFI to account for aarch64 PAC/BTI instructions
stratakis c8eca8e
Add GCS flag to aarch64 GNU property notes
stratakis ca0a356
Add NEWS entry
vstinner File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
2 changes: 2 additions & 0 deletions
2
Misc/NEWS.d/next/Core_and_Builtins/2026-05-12-16-47-23.gh-issue-139808.iIs7_E.rst
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,2 @@ | ||
| Add branch protections for AArch64 (BTI/PAC) in assembly code used by | ||
| :option:`-X perf_jit <-X>` (Linux perf profiler integration). |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,56 @@ | ||
| #ifndef ASM_TRAMPOLINE_AARCH_64_H_ | ||
| #define ASM_TRAMPOLINE_AARCH_64_H_ | ||
|
|
||
| /* | ||
| * References: | ||
| * - https://developer.arm.com/documentation/101028/0012/5--Feature-test-macros | ||
| * - https://github.com/ARM-software/abi-aa/blob/main/aaelf64/aaelf64.rst | ||
| */ | ||
|
|
||
| #if defined(__ARM_FEATURE_BTI_DEFAULT) && __ARM_FEATURE_BTI_DEFAULT == 1 | ||
| #define BTI_J hint 36 /* bti j: for jumps, IE br instructions */ | ||
| #define BTI_C hint 34 /* bti c: for calls, IE bl instructions */ | ||
| #define GNU_PROPERTY_AARCH64_BTI 1 /* bit 0 GNU Notes is for BTI support */ | ||
| #else | ||
| #define BTI_J | ||
| #define BTI_C | ||
| #define GNU_PROPERTY_AARCH64_BTI 0 | ||
| #endif | ||
|
|
||
| #if defined(__ARM_FEATURE_PAC_DEFAULT) | ||
| #if __ARM_FEATURE_PAC_DEFAULT & 1 | ||
| #define SIGN_LR hint 25 /* paciasp: sign with the A key */ | ||
| #define VERIFY_LR hint 29 /* autiasp: verify with the A key */ | ||
| #elif __ARM_FEATURE_PAC_DEFAULT & 2 | ||
| #define SIGN_LR hint 27 /* pacibsp: sign with the b key */ | ||
| #define VERIFY_LR hint 31 /* autibsp: verify with the b key */ | ||
| #endif | ||
| #define GNU_PROPERTY_AARCH64_POINTER_AUTH 2 /* bit 1 GNU Notes is for PAC support */ | ||
| #else | ||
| #define SIGN_LR BTI_C | ||
| #define VERIFY_LR | ||
| #define GNU_PROPERTY_AARCH64_POINTER_AUTH 0 | ||
| #endif | ||
|
|
||
| #if defined(__ARM_FEATURE_GCS_DEFAULT) && __ARM_FEATURE_GCS_DEFAULT == 1 | ||
| #define GNU_PROPERTY_AARCH64_GCS 4 /* bit 2 GNU Notes is for GCS support */ | ||
| #else | ||
| #define GNU_PROPERTY_AARCH64_GCS 0 | ||
| #endif | ||
|
|
||
| /* Add the BTI, PAC and GCS support to GNU Notes section */ | ||
| #if GNU_PROPERTY_AARCH64_BTI != 0 || GNU_PROPERTY_AARCH64_POINTER_AUTH != 0 || GNU_PROPERTY_AARCH64_GCS != 0 | ||
| .pushsection .note.gnu.property, "a"; /* Start a new allocatable section */ | ||
| .balign 8; /* align it on a byte boundry */ | ||
| .long 4; /* size of "GNU\0" */ | ||
| .long 0x10; /* size of descriptor */ | ||
| .long 0x5; /* NT_GNU_PROPERTY_TYPE_0 */ | ||
| .asciz "GNU"; | ||
| .long 0xc0000000; /* GNU_PROPERTY_AARCH64_FEATURE_1_AND */ | ||
| .long 4; /* Four bytes of data */ | ||
| .long (GNU_PROPERTY_AARCH64_BTI|GNU_PROPERTY_AARCH64_POINTER_AUTH|GNU_PROPERTY_AARCH64_GCS); /* BTI, PAC or GCS is enabled */ | ||
| .long 0; /* padding for 8 byte alignment */ | ||
| .popsection; /* end the section */ | ||
| #endif | ||
|
|
||
| #endif | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This LGTM, still need to test, but just a few comments:
Don't let my comments derail this, they can always be done in follow ups IMHO.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The only OS that still has glibc < 2.31 is for RHEL8. While the buildbots do not compile python >= 3.12 on RHEL8, still someone trying to compile Python 3.13 and higher there won't have it compiled. Granted RHEL8 doesn't enable mbranch-protection by default, I'd rather have at least till RHEL8 goes out of support the old way for delaring pac and bti.
Regarding the if else conditions, while they can be simplified, the assembly code maps nicely somewhat 1on1 with the C code generating dwarf unwinding info for the non-frame pointer case, simplifying them there would make the visual comparisons a tad more cumbersome.