-
Notifications
You must be signed in to change notification settings - Fork 12.6k
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
Normalize ptrauth handling in sanitizer runtime #100483
Conversation
1. Include ptrauth.h if ptrauth_intrinsics language feature is specified (per ptrauth spec, this is what enables ptrauh.h usage) 2. For PAC-RET fallback implement two changes: - Switch to macro, so we can ignore key argument - Ensure the unsigned value is erased from LR, so the possibility of gadget reuse is reduced. Fixes #100467
@sylvestre will you please double check if this fixes the issue you're seeing? |
@llvm/pr-subscribers-compiler-rt-sanitizer Author: Anton Korobeynikov (asl) Changes
Fixes #100467 Full diff: https://github.com/llvm/llvm-project/pull/100483.diff 1 Files Affected:
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_ptrauth.h b/compiler-rt/lib/sanitizer_common/sanitizer_ptrauth.h
index 5200354694851..d228dd33cf938 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_ptrauth.h
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_ptrauth.h
@@ -9,24 +9,26 @@
#ifndef SANITIZER_PTRAUTH_H
#define SANITIZER_PTRAUTH_H
-#if __has_feature(ptrauth_calls)
+#if __has_feature(ptrauth_intrinsics)
#include <ptrauth.h>
#elif defined(__ARM_FEATURE_PAC_DEFAULT) && !defined(__APPLE__)
-inline unsigned long ptrauth_strip(void* __value, unsigned int __key) {
- // On the stack the link register is protected with Pointer
- // Authentication Code when compiled with -mbranch-protection.
- // Let's stripping the PAC unconditionally because xpaclri is in
- // the NOP space so will do nothing when it is not enabled or not available.
- unsigned long ret;
- asm volatile(
- "mov x30, %1\n\t"
- "hint #7\n\t" // xpaclri
- "mov %0, x30\n\t"
- : "=r"(ret)
- : "r"(__value)
- : "x30");
- return ret;
-}
+// On the stack the link register is protected with Pointer
+// Authentication Code when compiled with -mbranch-protection.
+// Let's stripping the PAC unconditionally because xpaclri is in
+// the NOP space so will do nothing when it is not enabled or not available.
+#define ptrauth_strip(__value, __key) \
+ ({ \
+ unsigned long ret; \
+ asm volatile( \
+ "mov x30, %1\n\t" \
+ "hint #7\n\t" \
+ "mov %0, x30\n\t" \
+ "mov x30, xzr\n\t" \
+ : "=r"(ret) \
+ : "r"(__value) \
+ : "x30"); \
+ ret; \
+ })
#define ptrauth_auth_data(__value, __old_key, __old_data) __value
#define ptrauth_string_discriminator(__string) ((int)0)
#else
|
✅ With the latest revision this PR passed the C/C++ code formatter. |
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.
LGTM
60e4dd8
to
1661d58
Compare
1661d58
to
778a0e3
Compare
/cherry-pick cc4f989 |
1. Include `ptrauth.h` if `ptrauth_intrinsics` language feature is specified (per ptrauth spec, this is what enables `ptrauh.h` usage and functions like `ptrauth_strip`) 2. For PAC-RET fallback implement two changes: 1. Switch to macro, so we can ignore key argument 2. Ensure the unsigned value is erased from LR, so the possibility of gadget reuse is reduced. Fixes llvm#100467 (cherry picked from commit cc4f989)
/pull-request #100634 |
With the fix, this is still broken due to invalid pointer conversion:
|
Oh. Thanks for noticing this! I believe we fixed this issue... But apparently, not final version of patch was submitted. So, to double check, the final version has Apparently, there are no buildbots that cover this configuration... |
With llvm#100483, if the inline asm version of `ptrauth_strip` is used instead of the builtin, the inline asm implementation will return an unsigned long, causing an incompatible pointer conversion issue.
A quick search shows that the preference seems to be to cast the result of |
1. Include `ptrauth.h` if `ptrauth_intrinsics` language feature is specified (per ptrauth spec, this is what enables `ptrauh.h` usage and functions like `ptrauth_strip`) 2. For PAC-RET fallback implement two changes: 1. Switch to macro, so we can ignore key argument 2. Ensure the unsigned value is erased from LR, so the possibility of gadget reuse is reduced. Fixes llvm#100467 (cherry picked from commit cc4f989)
ptrauth.h
ifptrauth_intrinsics
language feature is specified (per ptrauth spec, this is what enablesptrauh.h
usage and functions likeptrauth_strip
)Fixes #100467