Skip to content

[3.14] gh-139808: Add branch protections for aarch64 in asm_trampoline.S (#130864)#150189

Merged
vstinner merged 1 commit into
python:3.14from
vstinner:aarch64_14
May 21, 2026
Merged

[3.14] gh-139808: Add branch protections for aarch64 in asm_trampoline.S (#130864)#150189
vstinner merged 1 commit into
python:3.14from
vstinner:aarch64_14

Conversation

@vstinner
Copy link
Copy Markdown
Member

@vstinner vstinner commented May 21, 2026

Apply protection against ROP/JOP attacks for aarch64 on asm_trampoline.S.

The BTI flag must be applied in assembler sources for this class of attacks to be mitigated on newer aarch64 processors.

See also:
https://sourceware.org/annobin/annobin.html/Test-branch-protection.html and
https://community.arm.com/arm-community-blogs/b/architectures-and-processors-blog/posts/enabling-pac-and-bti-on-aarch64

The 3.14 backport makes Python/jit_unwind.c changes in Python/perf_jit_trampoline.c.

(cherry picked from commit da8477b)

….S (python#130864)

Apply protection against ROP/JOP attacks for aarch64 on asm_trampoline.S.

The BTI flag must be applied in assembler sources for this class
of attacks to be mitigated on newer aarch64 processors.

See also:
https://sourceware.org/annobin/annobin.html/Test-branch-protection.html
and
https://community.arm.com/arm-community-blogs/b/architectures-and-processors-blog/posts/enabling-pac-and-bti-on-aarch64

The 3.14 backport makes Python/jit_unwind.c changes in
Python/perf_jit_trampoline.c.

Co-authored-by: Victor Stinner <vstinner@python.org>
(cherry picked from commit da8477b)
@vstinner
Copy link
Copy Markdown
Member Author

I tested this change on Fedora 43 AArch64 with commands:

./configure --enable-shared CFLAGS="-mbranch-protection=standard -fplugin=annobin -fstack-protector-strong -fstack-clash-protection -D_FORTIFY_SOURCE=3" LDFLAGS="-Wl,-z,now" EXE_LDFLAGS="-Wl,-pie -Wl,-z,now" --with-lto
make -j24
readelf -n ./python | grep Properties

Output:

readelf: Warning: Gap in build notes detected from 0x40087d to 0x400897
      Properties: AArch64 feature: BTI, PAC, GCS

The BTI and PAC protections are present as expected.

@stratakis
Copy link
Copy Markdown
Contributor

The backport looks good, the relevant sections in perf_jit_trampoline.c are exactly identical with jit_unwind.c from the later branches.

I've also tested the combination with/without frame pointers and with/without -mbranch-protection=standard, when using the protections, the binary has the proper notes and Perf works across all the paths in all the combons, the frame pointer path and the backup dwarf path.

@vstinner vstinner merged commit c863e96 into python:3.14 May 21, 2026
50 checks passed
@vstinner vstinner deleted the aarch64_14 branch May 21, 2026 16:41
@vstinner
Copy link
Copy Markdown
Member Author

I merged the PR.

@stratakis: Thanks for testing all possible cases!

@vstinner vstinner added the needs backport to 3.13 bugs and security fixes label May 21, 2026
@miss-islington-app
Copy link
Copy Markdown

Thanks @vstinner for the PR 🌮🎉.. I'm working now to backport this PR to: 3.13.
🐍🍒⛏🤖

@bedevere-app
Copy link
Copy Markdown

bedevere-app Bot commented May 21, 2026

GH-150194 is a backport of this pull request to the 3.13 branch.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants