ARM64 Control Flow Integrity (BTI & PAC) Simulator
ARMv8.3 / ARMv8.5 Hardware Defense
☀️ 테마 전환
시나리오 1: ARM64 BTI 전방향 제어 흐름 검증
시나리오 2: ARM64 PAC 후방향 반환 주소 보호
시나리오 3: 베이스라인 미적용 취약 환경
시나리오 4: ARM64 vs x86 CET 아키텍처 비교
🛡️ 시나리오 1: ARM64 BTI (Branch Target Identification) 전방향 무결성
간접 분기(BLR x20) 발생 시 CPU는 PSTATE.BTYPE을 0b10으로 설정하고, 타깃 메모리가 Guarded Page(PTE_GP)인지 확인합니다.
타깃의 첫 명령어가 유효한 Landing Pad(bti c 또는 paciasp)이면 정상이지만, 가젯 중간이나 비인가 위치로 점프하면 즉각 Branch Target Exception (ESR_EL1.EC=0x0D / Oops - BTI) 을 발생시킵니다.
Dispatcher (BLR x20)
mov x20, target_addr
blr x20 (Indirect Call)
PSTATE.BTYPE = 0b10
(Awaiting BTI Landing Pad)
ARM64 Hardware BTI Logic
1. Page Table PTE_GP Check
2. Target Insn == BTI / PACIASP?
Status: Ready
Target A: Legit Function (with BTI)
0x...: paciasp / bti c
Landing Pad Valid -> Clears BTYPE
Target B: Gadget Middle (NO BTI)
0x...: str x0, [x1] (Arbitrary)
No Landing Pad -> Oops: BTI Trap!
정상 간접 호출 시뮬레이션 (with paciasp)
공격 시뮬레이션: nobti 가젯으로 임의 분기
초기화
[System Ready] ARM64 BTI simulator ready. Notice dynamic particles tracking the branch instruction fetch.
🔐 시나리오 2: ARM64 PAC (Pointer Authentication Code) 후방향 무결성
함수 프롤로그에서 paciasp 인스트럭션이 LR(Link Register, 반환 주소)의 상위 미사용 비트[63:48]에 비밀 키(APIAKey)와 스택 포인터(SP) 컨텍스트를 혼합한 암호학적 서명(PAC Tag) 을 삽입합니다.
함수 에필로그에서 autiasp 인스트럭션이 서명을 검증하며, 스택 오버플로우로 단 1비트라도 변조되면 복원 시 잘못된 주소(포이즌 비트)가 되어 즉각 Oops - FPAC 예외 를 발생시킵니다.
1. Function Prologue
paciasp (Sign LR with APIAKey)
Signed LR in Register
0x3b2a_ffff_1234_5678
PAC Tag: Bits [54:48] (7-bit)
Tag = QARMA(LR, SP, APIAKey)
2. Kernel Stack Frame
stp x29, x30, [sp, #-16]!
Stored Return Address
[PAC SIGNED] 0x3b2a_...
Stack Overflow Vulnerability
Attacker attempts to overwrite LR
3. Function Epilogue
ldp x29, x30, [sp], #16
autiasp Verification
Awaiting Return...
Stripping PAC & Return
ret instruction resumes caller
1단계: 정상 스택 반환 (PAC 서명 유지)
2단계: 스택 버퍼 오버플로우 (반환 주소 1바이트 변조)
3단계: autiasp 반환 주소 검증 실행
초기화
[System Ready] ARM64 Pointer Authentication simulator ready. Click Step 1 or Step 2.
⚠️ 시나리오 3: 베이스라인 미적용 취약 환경 (BTI & PAC Disabled)
BTI와 PAC가 비활성화된 기본 커널(Without CONFIG_ARM64_BTI_KERNEL / CONFIG_ARM64_PTR_AUTH_KERNEL)에서는:
1. 간접 분기 임의 점프(JOP): 간접 호출 시 타깃 위치에 bti 랜딩 패드가 없어도 CPU가 분기를 그대로 허용하여 커널 내 가젯 실행 성공.
2. 스택 반환 주소 변조(ROP): 스택 오버플로우로 저장된 반환 주소를 덮어쓰면 검증 없이 임의 주소로 리턴(LKDTM CFI_BACKWARD 성공).
JOP 취약점: BTI 미적용
blr x20 -> Jump to gadget middle
PSTATE.BTYPE 검사 미수행 (No Landing Pad Check)
공격 결과: JOP 가젯 체이닝으로 임의 코드 실행 성공
CONFIG_ARM64_BTI_KERNEL=n
ROP 취약점: PAC 미적용
Stack Return Address: 0xffff8000_1234_5678
Attacker Overwrites -> 0xffff8000_deadbeef
공격 결과: autiasp 검증 없이 임의 주소로 리턴 성공!
CONFIG_ARM64_PTR_AUTH_KERNEL=n
[Baseline Evaluation]
CONFIG_ARM64_BTI_KERNEL: DISABLED (PSTATE.BTYPE unchecked, arbitrary indirect jump passes)
CONFIG_ARM64_PTR_AUTH_KERNEL: DISABLED (Plaintext return address on stack, ret redirection succeeds)
LKDTM CFI_BACKWARD: FAIL: stack return address was redirected!
📊 시나리오 4: ARM64 BTI/PAC vs x86 CET 아키텍처 비교 매트릭스
하드웨어 지원 제어 흐름 무결성(CFI) 기술인 ARM64 (BTI & PAC)와 Intel x86 (CET IBT & Shadow Stack)의 비교 분석입니다.
비교 항목
ARM64 (ARMv8.3 / ARMv8.5)
Intel x86 (CET)
전방향 제어 흐름 (Forward Edge)
BTI (Branch Target Identification)
IBT (Indirect Branch Tracking)
전방향 랜딩 패드 명령어
bti c / paciasp
endbr64
후방향 제어 흐름 (Backward Edge)
PAC (Pointer Authentication Code)
Shadow Stack (SHSTK)
후방향 구현 메커니즘
QARMA 암호화 서명을 포인터 상위 비트[54:48]에 저장 (인라인)
하드웨어 격리된 별도의 읽기 전용 섀도 스택 메모리 공간 운용
전용 메모리 필요 여부
불필요 (기존 64비트 포인터 미사용 비트 활용)
필요 (섀도 스택 전용 페이지 할당)
비인가 분기 시 예외
Oops - BTI (Branch Target Exception, EC=0x0D)
#CP (Control Protection Fault, Error code 1)
서명/검증 실패 시 예외
Oops - FPAC (Pointer Auth Fault, EC=0x1C)
#CP (Control Protection Fault, Error code 2)