Skip to content

Commit fe6fb29

Browse files
committed
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
1 parent dcc714a commit fe6fb29

File tree

2 files changed

+35
-0
lines changed

2 files changed

+35
-0
lines changed

Python/asm_trampoline.S

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,18 @@ _Py_trampoline_func_start:
2020
#if defined(__aarch64__) && defined(__AARCH64EL__) && !defined(__ILP32__)
2121
// ARM64 little endian, 64bit ABI
2222
// generate with aarch64-linux-gnu-gcc 12.1
23+
#if defined(__ARM_FEATURE_PAC_DEFAULT) && (__ARM_FEATURE_PAC_DEFAULT & 1) == 1 || \
24+
defined(__ARM_FEATURE_BTI_DEFAULT) && __ARM_FEATURE_BTI_DEFAULT == 1
25+
hint 25
26+
#endif
2327
stp x29, x30, [sp, -16]!
2428
mov x29, sp
2529
blr x3
2630
ldp x29, x30, [sp], 16
31+
#if defined(__ARM_FEATURE_PAC_DEFAULT) && (__ARM_FEATURE_PAC_DEFAULT & 1) == 1 || \
32+
defined(__ARM_FEATURE_BTI_DEFAULT) && __ARM_FEATURE_BTI_DEFAULT == 1
33+
hint 29
34+
#endif
2735
ret
2836
#endif
2937
#ifdef __riscv
@@ -55,3 +63,22 @@ _Py_trampoline_func_end:
5563
.align 8
5664
4:
5765
#endif // __x86_64__
66+
#if defined(__aarch64__) && defined(__AARCH64EL__) && !defined(__ILP32__)
67+
#if defined(__ARM_FEATURE_BTI_DEFAULT) && __ARM_FEATURE_BTI_DEFAULT == 1 || \
68+
defined(__ARM_FEATURE_PAC_DEFAULT) && (__ARM_FEATURE_PAC_DEFAULT & 1) == 1
69+
.pushsection .note.gnu.property, "a"
70+
.align 3
71+
.word 2f - 1f
72+
.word 4f - 3f
73+
.word 5 /* NT_GNU_PROPERTY_TYPE_0 */
74+
1: .asciz "GNU"
75+
76+
2: .align 3
77+
3: .word 0xc0000000 /* type: GNU_PROPERTY_AARCH64_FEATURE_1_AND */
78+
.word 6f - 5f /* size */
79+
5: .word 3 /* value: GNU_PROPERTY_AARCH64_FEATURE_1_BTI */
80+
81+
6: .align 3
82+
4: .popsection
83+
#endif
84+
#endif

Python/perf_jit_trampoline.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -483,13 +483,21 @@ elf_init_ehframe(ELFObjectContext* ctx)
483483
/* Extra registers saved for JIT-compiled code. */
484484
#elif defined(__aarch64__) && defined(__AARCH64EL__) && !defined(__ILP32__)
485485
DWRF_U8(DWRF_CFA_advance_loc | 1);
486+
#if defined(__ARM_FEATURE_PAC_DEFAULT) && (__ARM_FEATURE_PAC_DEFAULT & 1) == 1 || \
487+
defined(__ARM_FEATURE_BTI_DEFAULT) && __ARM_FEATURE_BTI_DEFAULT == 1
488+
DWRF_U8(DWRF_CFA_advance_loc | 1);
489+
#endif
486490
DWRF_U8(DWRF_CFA_def_cfa_offset); DWRF_UV(16);
487491
DWRF_U8(DWRF_CFA_offset | 29); DWRF_UV(2);
488492
DWRF_U8(DWRF_CFA_offset | 30); DWRF_UV(1);
489493
DWRF_U8(DWRF_CFA_advance_loc | 3);
490494
DWRF_U8(DWRF_CFA_offset | -(64 - 29));
491495
DWRF_U8(DWRF_CFA_offset | -(64 - 30));
492496
DWRF_U8(DWRF_CFA_def_cfa_offset);
497+
#if defined(__ARM_FEATURE_PAC_DEFAULT) && (__ARM_FEATURE_PAC_DEFAULT & 1) == 1 || \
498+
defined(__ARM_FEATURE_BTI_DEFAULT) && __ARM_FEATURE_BTI_DEFAULT == 1
499+
DWRF_U8(DWRF_CFA_advance_loc | 1);
500+
#endif
493501
DWRF_UV(0);
494502
#else
495503
# error "Unsupported target architecture"

0 commit comments

Comments
 (0)