← ARMv9 해설DUJINLABS.COM

Source deep dive 03 · Realm · RSI · RIPAS · Attestation

ARM Realm·CCA와 Linux RSI 소스 분석

“관리자는 VM을 실행하지만 내용을 읽지 못한다”는 쉬운 설명에서 출발해, Realm guest가 RMM에 요청하는 RSI SMC와 Linux v6.18.37의 실제 초기화·memory-state·attestation 경로를 분석한다.

World
Realm
Guest ABI
RSI 1.0
Granule
4KB
Kernel scope
Guest side

Realm은 host가 운영하지만 열어볼 수 없는 VM이다

일반 VM에서는 host hypervisor가 guest memory를 매핑해 읽을 수 있다. Realm에서는 memory granule의 World 소유권을 GPT가 기록하고 GPC가 모든 접근을 검사한다. host는 vCPU를 스케줄하고 외부 I/O를 제공하지만 protected memory와 Realm register state를 직접 읽거나 바꾸지 못하도록 설계된다.

Host

자원 할당과 scheduling을 담당하지만 보호 data의 신뢰 주체가 아니다.

RMM

Realm 실행 context와 translation을 관리하는 작은 monitor다.

Realm guest

R-EL0/R-EL1에서 application과 kernel을 실행한다.

Root firmware

EL3에서 GPT와 World 전환의 최상위 경계를 관리한다.

RMI는 host용, RSI는 Realm guest용이다

InterfaceCaller → Callee대표 작업
RMIHost KVM/EL2 → RMMRealm·REC·RTT 생성, data granule 위임, vCPU 진입과 exit.
RSIRealm guest → RMMABI version, Realm config, IPA state, attestation, host call.
Host CallRealm guest → RMM → Host공유 device emulation이나 host service 요청.
SMCCCRegister-based SMC calling conventionRMI/RSI function ID와 인수·결과 전달 기반.

두 interface를 한 호출표에 섞으면 “guest kernel이 Realm을 생성한다”는 잘못된 결론이 나온다. 생성은 host의 RMI 영역이고, 생성된 Realm 안의 Linux가 사용하는 것은 RSI다.

Linux v6.18.37에는 Realm guest RSI가 있고 host KVM RME는 없다

로컬 commit 0c503cf3dde2arch/arm64를 전수 검색하면 arch/arm64/kernel/rsi.c, asm/rsi*.h와 memory-encryption hook은 존재한다. 반면 arch/arm64/kvm에는 Realm descriptor를 RMI로 생성하는 host-side RME 구현이 없다.

문서 경계: 아래의 Linux 소스 분석은 Realm 안에서 실행되는 guest kernel 기준이다. RMI Realm 생성 수명주기는 Arm RMM Architecture의 규약으로 설명하며, 이 tree의 host KVM 구현이라고 표시하지 않는다.

Realm guest가 부팅할 때 RSI를 확인한다

실제 초기화 흐름

arm64 boot
→ arm64_rsi_init()
→ rsi_version_matches()
→ SMC_RSI_ABI_VERSION
→ rsi_get_realm_config()
→ arm64_rsi_setup_memory()
→ I/O·memory encryption hook 등록

arm64_rsi_init()은 ABI가 맞는지 확인한 뒤 Realm configuration과 memory 범위를 초기화한다. ABI가 맞지 않으면 일부 기능을 추측해서 켜지 않고 초기화를 중단한다.

is_realm_world()는 kernel이 Realm 환경인지 판단하는 공통 조건으로 I/O와 memory-encryption helper에서 사용된다.

RIPAS는 Realm이 IPA 내용을 어떻게 취급할지 나타낸다

RIPAS의미Guest의 기대
EMPTYRealm RAM으로 받아들여지지 않은 영역공유 또는 비어 있는 상태로 취급한다.
RAMRealm이 보호 RAM으로 받아들인 영역private data와 code를 저장할 수 있다.
DESTROYED이전 내용의 신뢰를 잃은 영역재사용 전에 안전한 초기화와 상태 전환이 필요하다.
DEVdevice 용도 상태해당 RSI/RME version과 device-assignment 계약을 확인한다.

Linux의 arm64_rsi_is_protected()는 4KB granule 경계로 범위를 맞추고 rsi_ipa_state_get() 결과를 검사한다.

Protected와 shared memory 전환은 page-table bit 하나가 아니다

host와 통신하려면 일부 IPA를 unprotected/shared로 바꿔야 한다. guest PTE를 non-secure attribute로 바꾸는 것만으로는 부족하고 RMM에 RIPAS 전환을 요청해야 한다. 순서가 어긋나면 host와 guest가 서로 다른 소유 상태를 믿게 된다.

개념 전환 순서

buffer 사용 중지와 CPU 동기화
→ 필요한 cache·mapping 정리
→ rsi_set_memory_range_shared()
→ shared PTE 설치
→ host에 buffer 위치 전달
→ 반환 시 shared mapping 제거
→ rsi_set_memory_range_protected_safe()
→ 내용 초기화 후 private 사용

rsi_set_addr_range_state()는 RMM이 일부 범위만 처리한 경우 진행 주소를 확인하며 반복한다. 호출 한 번이 전체 범위를 항상 바꾼다고 가정하면 안 된다.

Attestation token은 challenge와 측정값을 연결한다

  1. 검증자가 replay 방지를 위한 challenge를 만든다.
  2. Realm이 challenge를 넣어 SMC_RSI_ATTESTATION_TOKEN_INIT을 호출한다.
  3. token 생성이 비동기라면 RSI_INCOMPLETE가 올 수 있다.
  4. rsi_attestation_token_continue()를 반복해 한 granule씩 token data를 가져온다.
  5. 외부 verifier가 platform token, Realm measurement, challenge와 key binding을 검증한다.

rsi_attestation_token_continue()의 반환 상태와 실제 길이를 반드시 검사한다. token을 받았다는 사실만으로 workload가 안전하다는 뜻은 아니다.

ioremap()도 Realm에서는 PAS를 고려한다

realm_ioremap_hook()은 Realm에서 I/O physical range를 매핑할 때 적절한 protection attribute를 더한다. device register와 일반 protected RAM을 같은 방식으로 매핑하면 GPC fault나 정보 노출이 생길 수 있다.

DMA는 더 어렵다. host가 device를 소유하면 device가 Realm private PA를 직접 읽어서는 안 된다. bounce/shared buffer 또는 RME device assignment와 SMMU 보안 구성이 필요하다.

Linux v6.18.37 실제 소스 지도

파일심볼책임
arch/arm64/kernel/rsi.carm64_rsi_init, arm64_rsi_is_protectedRealm guest 초기화와 memory 검사
asm/rsi_cmds.hrsi_request_version, rsi_set_addr_range_stateSMC wrapper와 진행 상태 처리
asm/rsi_smc.hSMC_RSI_*, RSI_*ABI function ID와 반환값
asm/rsi.his_realm_world, memory helperarm64 내부 공통 interface
asm/pgtable-prot.hPROT_NS_SHAREDshared mapping protection bit
arch/arm64/kvmhost RME 생성 심볼 없음이 tree의 범위 제한

Realm guest에서 확인할 항목

Boot·device·memory 확인

dmesg | grep -Ei 'rsi|realm|cca|attest'
ls -l /sys/bus/platform/devices/ | grep cca
cat /proc/iomem
grep -R . /sys/firmware 2>/dev/null | grep -i realm

환경마다 userspace CCA device driver와 config가 다르다. boot log에 RSI version과 초기화 실패 이유를 남기고 RMM·firmware·guest kernel version을 한 묶음으로 기록한다.

Realm이 막는 것과 막지 않는 것

위협기본 목표남는 책임
악성 hostprivate memory와 register 비밀성·무결성중단, 지연, I/O 거부 같은 availability 공격은 가능.
다른 Realmgranule 소유권으로 상호 격리공유 service와 side channel은 별도 분석.
Shared buffer의도적으로 host와 data 교환TOCTOU, 길이·offset 재검사, secret 복사 금지.
Attestation초기 측정과 platform 증명실행 후 application 취약점이나 정책 오류까지 보장하지 않음.

근거 자료