
CVE-2026-65343에 대한 PoC로, iOS 26.6에서 AppleKeyStore 커널 OOB 읽기를 통해 샌드박스된 앱에서 DYLD_INTERPOSE ACM 핸들 캡처를 이용해 KASLR을 무력화하기 위해 커널 포인터를 유출하는 취약점입니다.
구성 요소: AppleKeyStore 커널 확장 — _LibSer_SEPControl_Deserialize
영향 대상: iOS / iPadOS 26.6 (23G71) 및 이전 버전
수정 버전: iOS / iPadOS 26.6.1 (23G83)
유형: SEP 제어 메시지 역직렬화에서의 범위를 벗어난 읽기
영향: 커널 포인터 유출 → 샌드박스 내, 엔타이틀먼트 없는 프로세스로부터의 KASLR 무력화 (DYLD_INTERPOSE ACM 핸들 캡처 경유)
발견: Drinor Selmanaj (Sentry), Surya Narayan Kushwaha
(Apple 보안 권고 — iOS 26.6.1 참조)
AppleKeyStore 커널 확장의 _LibSer_SEPControl_Deserialize는 ACM(Credential Manager) 메시지 버퍼로부터 (payload_ptr, declared_length) 쌍을 copyout()을 통해 사용자 공간에 게시하면서, declared_length ≤ remaining을 검증하지 않습니다.
declared_length = 0x800을 제공함으로써, 드라이버는 커널 ACM 메시지 버퍼의 끝을 넘어 약 0x7E8 바이트를 복사하여 인접한 커널 힙 할당 영역을 읽습니다. 이 인접 영역에는 KASLR 슬라이드를 계산하는 데 사용할 수 있는 커널 포인터(0xfffffff0xxxxxxxx)가 포함되어 있습니다.
; _LibSer_SEPControl_Deserialize (affected path, 26.6 / 23G71)
ldr w2, [acm_msg + declared_length_offset] ; user-controlled 0x800
; NO check: w2 <= (acm_msg_end - payload_ptr) ← MISSING
bl copyout ; copies w2 bytes to userspace
사이드로드된 앱에서는 샌드박스가 직접적인 IOServiceOpen("AppleKeyStore")를 차단합니다. 그러나 Security.framework의 Secure Enclave 키 서명 경로는 실제 ACM 세션 핸들을 사용하여 프로세스 내에서 IOConnectCallMethod를 호출합니다.
PoC는 __DATA,__interpose 훅을 사용합니다(이는 dyld 로드 시점에 실행되며, __DATA_CONST가 읽기 전용으로 설정되기 전에 실행됩니다 — fishhook은 iOS 26에서 DATA_CONST 보호로 인해 차단됩니다):
SecKeyCreateRandomKey(kSecAttrTokenIDSecureEnclave) → SecKeyCreateSignature() → 프로세스 내 IOConnectCallMethod가 실제 ACM 핸들로 실행됩니다(conn, handle[16])을 캡처합니다declared_length = 0x800으로 재생합니다0xfffffff0xxxxxxxx 커널 포인터를 스캔합니다 → KASLR 슬라이드를 계산합니다poc_aks_oob.m은 전체 ACM 핸들 캡처 및 OOB 프로브 체인을 구현합니다:
kSecAttrAccessibleAfterFirstUnlock, 생체 인증 없음)declared_length = 0x800으로 재생합니다KPTR @+XXXX = 0xfffffff0YYYYYYYY에서 발견된 커널 포인터를 출력합니다SE 키 서명이 프로세스 내 대신 secd XPC를 통해 라우팅되는 경우, 폴백 프로브는 제로 핸들을 사용합니다(OOB 경로 도달 가능성을 확인하며, 모든 셀렉터는 ACM 검증에 실패하지만 VNOP 경로는 확인됩니다).
iOS 26에서 __DATA_CONST(GOT를 포함)는 프로세스 내 코드가 실행되기 전에 읽기 전용으로 매핑됩니다. 런타임 GOT 쓰기(fishhook에서 사용하는 방식)는 KERN_PROTECTION_FAILURE → SIGBUS를 트리거합니다. __DATA,__interpose를 통한 DYLD_INTERPOSE는 dyld가 이미지 로드 시점에, 커널이 __DATA_CONST 보호를 적용하기 전에 interpose 테이블을 처리하기 때문에 작동합니다.
kSecAttrTokenIDSecureEnclave) — 엔타이틀먼트 없이 모든 사이드로드된 앱에서 사용 가능# Xcode project — link Security.framework and Foundation.framework
clang -arch arm64 \
-isysroot $(xcrun --sdk iphoneos --show-sdk-path) \
-framework Security -framework Foundation \
-o poc poc/poc_aks_oob.m
codesign -s "Apple Development" --entitlements ent.plist poc
최소 엔타이틀먼트(ent.plist):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"><dict>
<key>keychain-access-groups</key>
<array><string>$(AppIdentifierPrefix)com.research.poc65343</string></array>
</dict></plist>
| 날짜 | 이벤트 |
|---|---|
| 2026-08-17 | 수정 사항이 포함된 iOS 26.6.1 출시 |
| 2026-08-17 | 보안 권고에 Apple 크레딧 게시 |