콘텐츠로 이동

ARMv9 POE (Permission Overlay Extension) 권한 오버레이 격리

1. 개요 및 위협 모델 (Overview & Threat Model)

ARMv9 POE (CONFIG_ARM64_POE, ARMv8.9-A / ARMv9.4-A)는 전통적인 페이지 테이블(Page Table) 기반의 메모리 권한 통제를 혁신하여, 페이지 테이블 수정 및 시스템 콜 호출 없이 CPU 레지스터(POR_EL0) 쓰기만으로 프로세스 내부 메모리 격실(Intra-Process Compartment)의 접근 권한을 1 클럭 사이클 내에 동적으로 전환하는 최신 하드웨어 메모리 권한 오버레이 기술임.

현대 유저스페이스 소프트웨어 및 런타임 환경(브라우저, OpenSSL, 데이터베이스)은 단일 프로세스 메모리 공간 내에 신뢰 수준이 서로 다른 다양한 서드파티 라이브러리와 플러그인을 공존하여 실행함:

  1. 프로세스 내부 횡적 이동(Lateral Movement) 위협:
  2. 공격자가 취약한 서드파티 라이브러리(e.g., 이미지 파서, 네트워크 파서)의 메모리 결함을 악용하여 임의 읽기/쓰기 권한을 확보한 후, 동일 프로세스 힙/스택에 상주하는 마스터 개인키(RSA/AES), 인증 토큰, JIT 실행 버퍼를 직접 탈취하거나 변조하는 위협 존재.
  3. 기존 mprotect(2) 메커니즘의 성능 한계:
  4. 민감 데이터를 보호하기 위해 전통적으로 mprotect() 시스템 콜을 호출하여 메모리를 PROT_NONE과 PROT_READ로 번갈아 전환했으나, 이는 매 호출마다 (1) 커널 모드 전환(Syscall Trap), (2) 페이지 테이블 엔트리(PTE) 갱신, (3) 멀티코어 TLB 무효화(TLB Shootdown, TLBI 명령)를 유발하여 수천~수만 클럭 사이클의 심각한 성능 저하 초래.
  5. 이러한 오버헤드로 인해 실시간 암호 연산이나 찰나의 순간에만 메모리를 여는 세분화된 메모리 격실화(Fine-grained Compartmentalization) 적용이 불가능했음.
  6. ARMv9 POE의 하드웨어 혁신:
  7. 페이지 테이블에는 정적인 '보호 키 인덱스(Protection Key Index, 0~7)'만 할당해 두고, 실제 허용 여부는 CPU 레지스터인 POR_EL0(Permission Overlay Register EL0)에서 판정함.
  8. 권한 잠금/해제 시 시스템 콜 없이 단순 레지스터 쓰기(MSR POR_EL0, Xn) 1회로 완료되어 오버헤드가 사실상 0에 수렴(1 CPU Cycle)함.

2. 방어 아키텍처 및 메커니즘 (Architecture & Mechanism)

1. ARMv9 POE 인터랙티브 아키텍처 시뮬레이터


2. 실생활 비유: 은행 금고의 '전자 중앙 차단 스위치'

ARMv9 POE의 동작 원리는 은행 지점의 물리적 금고문과 지점장 책상의 초고속 전자 차단 스위치와 일치함:

[ 비활성화 상태 (레거시 mprotect 방식) ]
  보안관:   "금고 권한을 잠그려면 본사 승인을 받아(Syscall Trap) 공사 인부를 불러 문을 용접하고(PTE 수정), 모든 경비원 무전기로 공지(TLB Shootdown)해야 함!"
  문제점:   "잠그고 여는 데 너무 오래 걸려 평소에는 금고문을 열어둘 수밖에 없음!" (해커가 언제든 털어감)

[ ARMv9 POE 가동: 평상시 격실 완전 잠금 (POR_EL0[Key 1] = NONE) ]
  보안관:   "책상 위 전자 스위치(`POR_EL0`)를 1초 만에 딸깍 내려 '0(NONE)'으로 설정!"
  공격자:   "취약한 모듈을 통해 금고(Key 1)의 마스터키를 읽으려고 시도!"
  하드웨어: "CPU 메모리 제어기가 POR_EL0 확인! 'Key 1: NONE'! 데이터 버스 즉각 차단!"
  조치:     "하드웨어 오버레이 폴트(`SIGSEGV / SEGV_PKUERR`) 발생! 데이터 노출 원천 차단!"

[ 인가된 트랜잭션 수행 시: 찰나의 해제 및 즉각 재잠금 ]
  암호모듈: "1. 스위치 딸깍 (`MSR POR_EL0`: Key 1 -> RW, 1사이클 소요)"
            "2. 개인키로 트랜잭션 전자 서명 수행"
            "3. 스위치 즉시 복구 (`MSR POR_EL0`: Key 1 -> NONE, 1사이클 소요)"
  보안효과: "공격자가 침투할 수 있는 노출 시간(Exposure Window)을 마이크로초 단위로 극소화!"

3. ARMv9 POE와 x86 MPK/PKU 비교 매트릭스

비교 항목 ARMv9 POE / S1POE (CONFIG_ARM64_POE) x86 MPK / PKU (CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS)
제어 레지스터 POR_EL0 (유저), POR_EL1 (커널) PKRU (유저 전용 레지스터)
권한 표현 방식 4비트 오버레이 니블 (None, Read, RW, Exec, RX 등 세분화) 2비트 차단 비트 (Access Disable, Write Disable)
실행 권한 통제 지원 가능 (POE_PERM_X, 실행 오버레이 제어) 기본 미지원 (W/R 제어 위주, PKU 실행 통제 제약)
가상화 스테이지 2 지원 (S2POE 가상화 하이퍼바이저 오버레이 지원) EPT 기반 확장 필요
레지스터 변경 명령 MSR POR_EL0, Xn (단일 범용 레지스터 쓰기) WRPKRU (전용 비특권 명령)
전환 소요 시간 1 CPU Cycle (제로 시스템 콜) 수 클럭 사이클 (제로 시스템 콜)

3. 커널 설정 및 플래그 분석 (Kernel Configurations)

1. Hardening Kconfig (configs/features/poe.config)

# Linux Kernel Hardening Lab - ARMv9 POE Feature Config
CONFIG_ARM64_POE=y
CONFIG_ARCH_HAS_PKEYS=y
CONFIG_ARCH_USES_HIGH_VMA_FLAGS=y
  • CONFIG_ARM64_POE=y: 커널 레벨 ARMv9.4-A Permission Overlay Extension 및 S1POE 서브시스템 활성화.
  • CONFIG_ARCH_HAS_PKEYS=y: 리눅스 표준 메모리 프로텍션 키(pkey_alloc, pkey_mprotect, pkey_free) 시스템 콜 인터페이스 바인딩.
  • CONFIG_ARCH_USES_HIGH_VMA_FLAGS=y: VMA 상위 비트에 키 인덱스를 인코딩할 수 있도록 아키텍처 플래그 지원.

2. 프로텍션 키 할당 및 VMA 매핑 API

#define _GNU_SOURCE
#include <sys/mman.h>

/* 1. 새로운 하드웨어 도메인 키 할당 */
int pkey = pkey_alloc(0, 0);

/* 2. 대상 메모리 페이지에 키 인덱스 부여 (PTE 매핑) */
pkey_mprotect(secret_vault, 4096, PROT_READ | PROT_WRITE, pkey);

/* 3. 유저스페이스 레지스터 수준에서 즉시 잠금 (Key 1에 NONE 할당) */
/* ARM64 POE의 경우 POR_EL0 레지스터에 비트마스크 적용 */

4. 실습 및 검증 (Hands-on Lab: labs/42-armv9-poe)

1. 실습 환경 구성 요소

  1. 타깃 드라이버 (labs/42-armv9-poe/vuln_poe.c):
  2. 8개의 보호 키(Key 0~7)를 지원하는 POR_EL0 레지스터 에뮬레이션 및 비밀 금고(Vault) 구현.
  3. /proc/vuln_poe (0666) 인터페이스:
    • read_vault: Key 1로 보호된 비밀 금고 데이터 읽기 시도.
    • write_vault <data>: Key 1로 보호된 비밀 금고에 데이터 변조 시도.
    • lock_vault: POR_EL0의 Key 1 권한을 POE_PERM_NONE (0x0)으로 즉시 변경 (1사이클 락다운).
    • unlock_vault: POR_EL0의 Key 1 권한을 POE_PERM_RW (0x3)으로 변경.
    • set_por <key> <perm>: 임의 키에 대한 오버레이 권한 수동 설정.
  4. 공격 PoC 바이너리 (labs/42-armv9-poe/exploit.c):
  5. Stage 1: 무방비 잠금 해제 상태에서 기밀 유출 취약점 확인.
  6. Stage 2: POR_EL0 레지스터 락다운 수행.
  7. Stage 3: 비인가 읽기 시도 시 하드웨어 오버레이 폴트(-EACCES / SEGV_PKUERR) 차단 검증.
  8. Stage 4: 비인가 쓰기 시도 시 메모리 변조 차단 검증.
  9. Stage 5: 정당한 암호화 워커의 초고속 해제 -> 서명 -> 즉각 재잠금 사이클 검증.
  10. 자동화 검증 스크립트 (labs/42-armv9-poe/test.sh):
  11. 아키텍처 및 POE 지원 여부 진단, 드라이버 검증, PoC 구동 및 커널 로그 종합 평가.

2. 단계별 실습 절차

# 1. 대상 가상머신 기동
cd /home/auking45/repos/linux-kernel-hardening-lab
make qemu ARCH=arm64

# 2. CPU POE 지원 플래그 확인
cat /proc/cpuinfo | grep -i poe

# 3. ARMv9 POE 자동화 검증 스위트 실행
/bin/test_armv9_poe

3. 검증 출력 예시

================================================================
   Lab 42: ARMv9 Permission Overlay Extension (POE) Suite       
   Kernel: 6.12.109 on aarch64                                  
================================================================

[*] Step 1: Checking CPU Architecture and POE hardware support...
    Architecture: aarch64

[*] Step 2: Checking target driver at /proc/vuln_poe...
[+] Target driver detected.

[*] Step 3: Querying driver status report...
=== ARMv9 POE (Permission Overlay Extension) Status ===
Kernel POE Support       : CONFIG_ARM64_POE=y
Simulated POR_EL0 Reg    : 0x00000033
Total Access Attempts    : 0
Read Allowed / Blocked   : 0 / 0
Write Allowed / Blocked  : 0 / 0
Protection Domain Key Table (POR_EL0):
  [Key 0] Perm: 0x3 - READ-WRITE (Full Access)
  [Key 1] Perm: 0x3 - READ-WRITE (Full Access) <- [PROTECTED SECRET VAULT]
  [Key 2] Perm: 0x0 - NONE (No Access - Fault on Read/Write)
  [Key 3] Perm: 0x0 - NONE (No Access - Fault on Read/Write)
====================================================

[*] Step 4: Running ARMv9 POE PoC...
===============================================================
   ARMv9 Permission Overlay Extension (POE) Evaluation PoC    
===============================================================

[*] Stage 1: Accessing Secret Vault in Unlocked State (POR_EL0: RW)...
[!] VULNERABLE: Secret vault data exposed! Any untrusted module can read it.

[*] Stage 2: Locking Vault Compartment via POR_EL0 register...
[+] Setting POR_EL0 Key 1 permission to POE_PERM_NONE (0x0)...

[*] Stage 3: Untrusted code attempts to read locked secret vault...
[+] DEFENSE SUCCESS: Hardware overlay trapped read access! (errno=13: Permission denied)
    Memory access halted by CPU POR_EL0 overlay (SEGV_PKUERR)!

[*] Stage 4: Untrusted code attempts to overwrite locked secret vault...
[+] DEFENSE SUCCESS: Hardware overlay trapped write access! (errno=13: Permission denied)
    Write tampering blocked in silicon before modifying memory!

[*] Stage 5: Authorized crypto routine: Fast unlock -> operation -> relock...
[+] Step 5a: Authorized routine unlocks POR_EL0 Key 1 to RW (1 CPU cycle)...
[+] Step 5b: Authorized routine reads secret key and signs transaction...
[+] Transaction signed successfully using private key in vault.
[+] Step 5c: Authorized routine immediately relocks POR_EL0 Key 1 to NONE (1 CPU cycle)...

[*] Final ARMv9 POE Driver Diagnostics Report:
=== ARMv9 POE (Permission Overlay Extension) Status ===
Kernel POE Support       : CONFIG_ARM64_POE=y
Simulated POR_EL0 Reg    : 0x00000003
Total Access Attempts    : 4
Read Allowed / Blocked   : 2 / 1
Write Allowed / Blocked  : 0 / 1
Protection Domain Key Table (POR_EL0):
  [Key 0] Perm: 0x3 - READ-WRITE (Full Access)
  [Key 1] Perm: 0x0 - NONE (No Access - Fault on Read/Write) <- [PROTECTED SECRET VAULT]
====================================================
[+] ARMv9 POE verification completed successfully.

[*] Step 5: Inspecting kernel dmesg for POE events:
[   65.101200] vuln_poe: [ACCESS GRANTED] Read permitted on Key 1 (POR_EL0: R/RW)
[   65.101912] vuln_poe: [LOCKDOWN] Vault compartment (Key 1) locked in POR_EL0 (Perm: NONE)
[   65.102640] vuln_poe: [OVERLAY FAULT] Read denied on Key 1! POR_EL0 perm: 0x0 (-EACCES / SEGV_PKUERR)
[   65.103310] vuln_poe: [OVERLAY FAULT] Write denied on Key 1! POR_EL0 perm: 0x0 (-EACCES / SEGV_PKUERR)
[   65.104012] vuln_poe: [UNLOCKED] Vault compartment (Key 1) unlocked in POR_EL0 (Perm: RW)
[   65.104715] vuln_poe: [ACCESS GRANTED] Read permitted on Key 1 (POR_EL0: R/RW)
[   65.105410] vuln_poe: [LOCKDOWN] Vault compartment (Key 1) locked in POR_EL0 (Perm: NONE)

================================================================
   Lab 42 Test Complete: Verified ARMv9 Permission Overlay Ext  
================================================================

5. 결론 및 보안 점검표 (Checklist)

점검 항목 권장 설정값 보안 보증 내용
하드웨어 POE 지원 CONFIG_ARM64_POE=y ARMv8.9/v9.4+ 하드웨어 권한 오버레이 서브시스템 가동
표준 PKEY 서브시스템 CONFIG_ARCH_HAS_PKEYS=y pkey_alloc, pkey_mprotect 표준 시스템 콜 연동 보장
기밀 자산 격실화 PKEY 분리 할당 비밀키, 암호 토큰, 세션 쿠키를 격리된 전용 키 도메인에 배치
제로 시스콜 락다운 POR_EL0 상시 잠금 평상시 권한을 NONE으로 유지하여 임의 메모리 덤프 차단
최소 노출 윈도우 즉각적 재잠금(Re-lock) 연산 직후 단 1사이클 내에 즉시 도메인을 잠궈 공격 기회 소멸