ARMv8.3 (AArch64) ์์ ์ถ๊ฐ๋ ๋ณด์๊ธฐ๋ฒ์ผ๋ก, Pointer๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์ธ์ฆํ๊ณ ์ ํ๋ ๋ชฉ์ ์ผ๋ก ๋์ ๋์๊ณ , Pointer authentication code (PAC) ๋๋ Pointer authentication (PAuth) ๋ผ๊ณ ๋ ๋ถ๋ฆฌ๊ณ ์๋ค.
Function call/return ์์ ์์ฑ๋๋ ret
instruction์ ์ด์ฉํ Return oriented programming (ROP) ๊ณต๊ฒฉ์ด ์๋ค. ๊ฐ๋ตํ ์ค๋ช
ํ์๋ฉด ret
์ผ๋ก ์ฐ๊ฒฐ๋๋ ๋ช
๋ น์ด๋ฅผ ๋ฐ๋ณต chaining ํ๋ฉด์ ๊ณต๊ฒฉ์๊ฐ ์ํ๋ ๋๋ก ํ๋ก๊ทธ๋๋ฐ ํ๋ ๊ฒ์ธ๋ฐ, ํ๋ก๊ทธ๋จ์ call flow๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ด ๊ฐ๋ฅํ ์ทจ์ฝ์ ์ด๋ค. Jump oriented programming (JOP)๋ ๊ฐ์ ๋ฐฉ์์ด๊ณ , ๋จ์ง br
๋ฑ instruction์ ์ด์ฉํ ๋ฟ์ด๋ค.
PAC๋ ์ด๋ฅผ ๋ฐฉ์ดํ๊ณ ์ pointer address์ ๋ฌด๊ฒฐ์ฑ (integrity)์ ์ฒดํฌ ํด์, ์๋ฌด๋ฐ๋ก๋ call flow๋ฅผ ๋ณ๊ฒฝ ํ ์ ์๊ณ , ํ๋ก๊ทธ๋๋จธ์ ์ํด ์๋๋์ด ์๋ ๊ณณ์ผ๋ก๋ง return/branch ํ ์ ์๊ฒ ๊ฐ์ ํ๊ฒ ๋ค๋ ๊ธฐ์ ์ด๋ค.
pointer address์ Keyed message authentication code (MAC)์ ๋ฃ์!
๊ทธ๋ฆฌ๊ณ Keyed MAC (์ธ์ฆ์ฝ๋)๊ฐ ๋ง์ ๊ฒฝ์ฐ์๋ง pointer address๋ฅผ ์ฌ์ฉํ์!
๊ทธ๋ฆผ์ผ๋ก ๋ณด์๋ฉด, ๋ชจ๋ pointer ๋ง๋ค ์๋์ ๊ฐ์ ์ธ์ฆ์ฝ๋๊ฐ ๋ถ์ด์๋ ์
์ด๋ค.
PAC๋ 64bit ์ฃผ์์ฒด๊ณ์์ ๋์ํ๋๋ฐ, 64bit์์๋ pointer ํํ์ ์์ด ์ฌ์ฉ๋์ง ์๋ top byte๋ฅผ ์ด์ฉํ๊ณ ์๋ค. (MMU ๊ตฌํ์ ๋ฐ๋ผ byte ์๋ ๋ค๋ฆ)
๊ทธ๋ฆผ์์ ์ด์ ๋ชจ์์ด ์ธ์ฆ์ฝ๋๋ฅผ ์์ฑํ๋ Key ์ญํ ์ ํ๋๋ฐ, Key๋ pointer type๊ณผ privileged level์ ๋ฐ๋ผ ์ด 5๊ฐ์ง key๊ฐ ์ฌ์ฉ๋๋ค.
A key๋ user mode, B key๋ kernel mode์์ ์ฌ์ฉ๋๋ค.
๊ทธ๋ฆผ์์ context/tweak์ Keyed MAC์ input์ผ๋ก ์ฌ์ฉ๋๋ฉฐ, output์ entropy๋ฅผ ์ค๋ค. (๊ฐ๋จํ ๋งํด์ PAC ๊ฐ์ ์์ธกํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ ๋ค๋ ๋ป)
PAC๋ฅผ ๋ง๋๋ ์์ ์ ์ฌ์ฉ๋์๋ key์ context/tweak์ ์ด์ฉํ์ง ์์ผ๋ฉด ํด๋น pointer address๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ๊ณต๊ฒฉ์์ ์ํด call flow๊ฐ ๋ค๋ฅธ ์ง์ ์์ ์ค๊ฒ ๋๋ ๊ฒฝ์ฐ์๋ key๋ context/tweak์ด ๋ง์ง ์๊ฒ ๋๋ฏ๋ก ํด๋น return/branch๋ฅผ ํ์ฉํ์ง ์๊ฒ ๋๋ค๋ ๊ฒ์ด ํต์ฌ.
PAC๊ฐ ์ถ๊ฐ๋ ๋ช
๋ น์ด instruction์ ์๋์ ๊ฐ์ ํํ์ด๋ค.
ํํ ๋ณด์ด๋ function prologue, body, epilogue์ pacisp
, autiasp
๊ฐ ์ถ๊ฐ๋ ํํ.
(<
, >
๋ assembler์์๋ ์๋ ํํ์ด์ง๋ง, ๊ฐ๋
์ฑ์ ์ํด ์ถ๊ฐํ์๋ค)
<function prologue>
paciasp ; sign (lr=x30)
stp fp, lr, [sp, #0] ; store lr
<function body>
<function epilogue>
ldp fp, lr, [sp, #0] ; load lr
autiasp ; authentication
ret ; ret
ํฌ๊ฒ Sign/Authentication ๋์์ผ๋ก ๊ตฌ๋ถ๋๋ฉฐ, Sign์ pointer์ PAC๋ฅผ ๋ถ์ด๋ ๊ณผ์ , Authentication์ pointer ์ฌ์ฉ ์์ PAC๋ฅผ ๊ฒ์ฆํ๋ ๊ณผ์ ์ด๋ค.
PAC๋ก ์์ํ๋ ๊ณ์ด์ instruction์, keyed MAC์ ์ฝ์
ํ๋ ์ฉ๋์ด๋ค.
๊ณ์ฐ์ ํ ๋ค ๊ฒฐ๊ณผ๊ฐ์ target pointer address์ top byte์ ์์น์ํค๊ฒ ๋๋ค.
PACIASP
: Instruction key A๋ก lr
์ PAC ๊ณ์ฐ (context = sp
, stack pointer)
PACIA x8, x9
: Instruction key A๋ก x8
์ PAC ๊ณ์ฐ (context = x9
)
PACIAZ x8
: Instruction key A๋ก x8
์ PAC ๊ณ์ฐ (context = 0)
AUT๋ก ์์ํ๋ ๊ณ์ด์ instruction์, pointer address์ ๋ถ์ด์๋ keyed MAC์ ๊ฒ์ฆํ๋ ์ฉ๋์ด๋ค. ๊ฒ์ฆ์ด ๋ง์ ์์๋ PAC๋ฅผ ์ ๊ฑฐํ๊ณ pointer๋ฅผ ์ฌ์ฉํ๊ฒ ๋๊ณ , ๊ฒ์ฆ์ด ํ๋ฆด ์์๋ fault (SError)๋ฅผ ๋ฐ์์ํจ๋ค.
AUTIA x8, x9
: Instruction key A๋ก x8
์ PAC ๊ณ์ฐ, valid pointer๋ ๋ค์ x8
์ ์์น
BLR
, RET
๊ทธ ์ธ ์ถ๊ฐ๋๋ instruction์ AUT
๊ณ์ด์ load๋ return๊ธฐ๋ฅ์ ์ถ๊ฐํ ๊ฒ.
BLRAA x8, x9
: authenticate-and-branch๋ก x8
์ PAC ๊ฒ์ฆ ํ branch
LDRA*
: authentication-and-load
RETA*
: authentication-and-return, LR์ PAC ๊ฒ์ฆ (context = sp
) ํ ret
์ด๋ก ํธ์ ๊ทธ๋ญ์ ๋ญ ์ดํดํ์ผ๋, ๊ฐ ์ค์ ์ ์ฉ์ ํตํด ์ค์ ๊ฐ๋ฐ์๊ฐ ์ด๋ป๊ฒ ์ฌ์ฉํ ์ ์๋์ง ์์๋ณด์๋ค
์ปค๋๊ฐ๋ฐ์๋ผ๋ฉด, upstream์ ์ฌ๋ผ์ ์๋ PAC ๊ด๋ จ config๋ฅผ ์ฐพ์๋ณผ ์ ์๋ค.
CONFIG_ARM64_PTR_AUTH
์ปค๋์์ exec ์์ ์ user application ๋ง๋ค A key๋ฅผ ํ ๋นํ๊ฒ ๋๊ณ , scheduling ๋ ๋๋ง๋ค key๋ user context๋ก ์ ์ผ๋ถ๋ก save/restore ํด ์ฃผ๊ฒ ๋๋ค.
upstream patch: https://lore.kernel.org/lkml/20180503132031.25705-1-mark.rutland@arm.com/
๊ฐ๋ฐ์๊ฐ ์ง์ pac
, aut
์ฝ๋๋ฅผ assembly์ ์ฝ๋ฉํ ์๋ ์๊ฒ ์ง๋ง,
๋ณดํต์ ์ง์ ์ฝ๋ฉ๋ณด๋ค๋ ์ปดํ์ผ๋ฌ์ ๋์์ ๋ฐ์์ผ ํ๋ค.
gcc ํน์ armclang์์๋ ์๋์ ๊ฐ์ ์ปดํ์ผ ์ต์ ์ผ๋ก PAC๋ฅผ ์ง์ํ๊ณ ์๋ค.
-mbranch-protection=pac-ret+leaf+b-key
branch-protection
์ด๋ผ๋ ๋ผ๋ฒจ์ด ํ๋ ์ถ๊ฐ๋์์ผ๋ฉฐ, ์ฌ๊ธฐ์ ์ฌ์ฉ๋ ์ ์๋ ์ต์
์
standard
: ๋ชจ๋ ์ต์
ํฌํจ
pac-ret
: PAC๋ฅผ ์ํ default ์ต์
leaf
: function call stack์ leaf ๋
ธ๋๊น์ง PAC๋ฅผ ์ ์ฉํ๊ฒ ๋ค๋ ์ต์
b-key
: b-key ์ฌ์ฉ ์ต์
android-ndk-r23-beta3 toolchain์์ PAC๋ฅผ ์ง์ํ๊ณ ์๋ค.
android-ndk-r23-beta23/toolchains/llvm/prebuilt/linux-x86_64/bin/
$ aarch64-linux-android31-clang --version
Android (7211189, based on r416183) clang version 12.0.4
clang 12.0.x ์ด์ ๋ฒ์ ์์ด ํ์ธ๋๋ฉด, ์๋ ์ปดํ์ผ ๋ช ๋ น์ ํตํด PAC๋ฅผ ์ ์ฉํ ์ ์๋ค.
$ aarch64-linux-android31-clang -o test test.c -mbranch-protection=pac-ret+leaf
Xcode์์ arm64e ๋น๋๋ฅผ ํตํด PAC๋ฅผ ์ง์ํ๊ณ ์๋ค.
๊ฐ์ด๋๋ ์ฌ๊ธฐ์ ์๊ณ , ptrauth.h๋ฅผ ๋ณด์๋ฉด PAC key๋ ๊ฐ์ข
PAC function๋ค์ ์ ์๋ฅผ ์ฐพ์๋ณผ ์ ์๋ค.
์ ์ปดํ์ผ๋ฌ ์ต์ ์ ์ ์ฉํ ๋ฐ์ด๋๋ฆฌ์ assembler๋ฅผ ๋ฏ์ด๋ณด๋ฉด ์๋์ ๊ฐ์ด ๋์ด ์๋ค.
$ llvm-objdump
0000000000001770 <main>:
1770: 3f 23 03 d5 hint #25
1774: ff 83 00 d1 sub sp, sp, #32
1778: fd 7b 01 a9 stp x29, x30, [sp, #16]
177c: fd 43 00 91 add x29, sp, #16
...
17a8: fd 7b 41 a9 ldp x29, x30, [sp, #16]
17ac: ff 83 00 91 add sp, sp, #32
17b0: bf 23 03 d5 hint #29
17b4: c0 03 5f d6 ret
hint #25
์ hint #29
๋ผ๋ ๋ช
๋ น์ด๊ฐ ์ถ๊ฐ๋์ด ์๋ค!
ํด๋น ๋ช
๋ น์ด๋ ARM architecture reference ์์ ๋์ค๋ opcode ํตํด์ ํด์ํ ์ ์๋๋ฐ, hint #25
๋ pacisp
์ ํด๋น๋๋ค. hint #29
๋ authisp
๊ฐ ๋๋ค.
์ผ๋ฐ์ ์ธ objdump
๋ฅผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์๋ผ๋ฉด, pac
๋ aut
instruction์ด ๋ณด์ด์ง ์์ํ
๋ฐ,
๊ทธ ์ด์ ๋ objdump
์์ opcode ๋ฅผ ํด์ํ๋ ๋ฐฉ์์์ ์์ง PAC๋ฅผ ์ง์ํ์ง ์๊ธฐ ๋๋ฌธ์ด๋ฉฐ
๊ฐ์ ๋ก binutil์ ์
๋ฐ์ดํธ ํ๊ฑฐ๋, llvm ์ฌ๋น๋๋ฅผ ํ๋ค๋ฉด ๋ณผ ์ ์๋ค.
๋๋ถ๋ถ์ ROP/JOP ์ทจ์ฝ์ ์ PAC๋ฅผ ์ ์ฉํ๋ ๊ฒ๋ง์ผ๋ก๋ ์ถฉ๋ถํ ๊ฒ ๊ฐ๋ค.
๊ทธ ๋์ ROP/JOP ๋ฐฉ์ด๊ธฐ๋ฒ์ผ๋ก ๊ฐ๋จํ๊ฒ๋ (=๋ฌด๋ ฅํ๊ฒ๋) ASLR๋ถํฐ code signing, shadow stack, CFI๊น์ง ๋ง์ ๊ธฐ๋ฒ๋ค์ด ์๊ฐ๋์๋๋ฐ PAC๋ ํ๋์จ์ด ์ ์ผ๋ก ์ฑ๋ฅ๋ฌธ์ ๋ฅผ ์ต์ํ ํด์ ROP/JOP๋ฅผ ์๋นํ ๋ง์ ๋ถ๋ถ ๋ฐฉ์ดํ๊ฒ ๋ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค.
๋ค๋ง, ๋ ๊ทธ๋ ๋ฏ PAC๋ฅผ ๋ค์ ์ฐํํ๋ ์ทจ์ฝ์ ๋ค์ด ๋์ค๊ณ ์๋๋ฐ ๋ค์ ํธ์ ์ด์ด์-.