https://github.com/atrosinenko commented:

I have tested this patch on Linux with `aarch64-linux-pauthtest` triple and 
custom-built sysroot, here are the results.

In my setup, the tests pass on the following modified branch: 
https://github.com/atrosinenko/llvm-project/commits/pointer-authenticated-unwinding-fix1/.
 It is based on 
https://github.com/kovdan01/llvm-project/commits/pointer-authenticated-unwinding-fix0/
 with the following changes:
* Currently, several parts of the patch are only enabled on Apple targets. For 
testing purposes, I unconditionally enabled parts of this patch guarded by 
`defined(__APPLE__)`.
* It turned out that `__has_feature(ptrauth_qualifier)` does not work in 
mainline, so I replaced it with `__has_feature(ptrauth_intrinsics)`. I expect 
the correct solution proposed by @kovdan01 (replacing with 
`__has_extension(ptrauth_qualifier)`) to behave identically.
* The change to `compiler-rt/lib/profile/InstrProfilingValue.c` seems to be 
unrelated to libunwind
* The most meaningful change is updating signing schemas is several places - 
see inline comments. Additionally, I had to update a few other places that I 
cannot add inline comments to
  - in `Registers_arm64::getRegister` and `Registers_arm64::setRegister`, 
replace direct references to `_registers.__pc` with calls to `getIP()` and 
`setIP()`, correspondingly
  - disable the existing pauth-related logic in `DwarfInstructions<A, 
R>::stepWithDwarf`

The fact I'm worried about is whether implicit signing and authentication on 
accesses to `__ptrauth`-qualified fields may introduce signing or 
authentication oracles usable by an attacker, since many values stored to these 
fields are initially non-signed. This is possibly mitigated by the fact that 
all these fields use address diversity with distinct integer discriminators 
and/or the original values are taken from read-only memory. On the other hand, 
discriminator computation, auth / sign intrinsic and load / store to memory are 
currently three separate operations when accessing a `__ptrauth`-qualified 
field, thus spilling of intermediate values to the stack is possible. 
Furthermore, even if the non-signed value originates from a read-only memory, 
this is not expressed in LLVM IR terms, thus the optimization pipeline may 
transform sensitive instruction sequences in an unsafe way.

https://github.com/llvm/llvm-project/pull/143230
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to