PoC для CVE-2026-65343 — чтение за пределами буфера (OOB read) в ядре AppleKeyStore на iOS 26.6, которое утекает указатели ядра для обхода KASLR из песочницы приложения через перехват ACM-дескриптора с помощью DYLD_INTERPOSE.
Компонент: расширение ядра AppleKeyStore — _LibSer_SEPControl_Deserialize
Затронуто: iOS / iPadOS 26.6 (23G71) и более ранние
Исправлено в: iOS / iPadOS 26.6.1 (23G83)
Тип: Out-of-Bounds чтение при десериализации управляющего сообщения SEP
Воздействие: Утечка указателя ядра → обход KASLR из процесса, работающего в песочнице без прав (через захват ACM-дескриптора с помощью DYLD_INTERPOSE)
Обнаружено: Drinor Selmanaj (Sentry), Surya Narayan Kushwaha
(согласно Apple Security Advisory — iOS 26.6.1)
_LibSer_SEPControl_Deserialize в расширении ядра AppleKeyStore публикует пару (payload_ptr, declared_length) из буфера сообщения ACM (Credential Manager) в пользовательское пространство через , .
copyout()declared_length ≤ remainingПередав declared_length = 0x800, драйвер копирует примерно 0x7E8 байт за пределами буфера сообщения ACM в ядре — считывая данные из соседних выделенных областей кучи ядра. Эти соседние области содержат указатели ядра (0xfffffff0xxxxxxxx), которые можно использовать для вычисления смещения KASLR.
; _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") блокируется песочницей для приложений, установленных не из App Store. Однако путь подписи ключа Secure Enclave в Security.framework вызывает IOConnectCallMethod внутри процесса с настоящим дескриптором сессии ACM.
PoC использует хук __DATA,__interpose (который выполняется во время загрузки dyld, до того как __DATA_CONST становится доступным только для чтения — fishhook блокируется на iOS 26 защитой DATA_CONST):
SecKeyCreateRandomKey(kSecAttrTokenIDSecureEnclave) → SecKeyCreateSignature() → внутрипроцессный вызов IOConnectCallMethod срабатывает с настоящим ACM-дескриптором(conn, handle[16])declared_length = 0x800 по всем 163 селекторам AKS0xfffffff0xxxxxxxx → вычислить смещение KASLRpoc_aks_oob.m реализует полную цепочку захвата ACM-дескриптора и OOB-зондирования:
kSecAttrAccessibleAfterFirstUnlock, без биометрии)declared_length = 0x800 по всем 163 селекторам AKSKPTR @+XXXX = 0xfffffff0YYYYYYYYЕсли подпись ключа SE направляется через XPC secd, а не внутри процесса, резервное зондирование использует нулевой дескриптор (подтверждает достижимость OOB-пути; все селекторы не пройдут проверку ACM, но путь VNOP подтверждён).
На iOS 26 __DATA_CONST (содержащий GOT) отображается только для чтения до запуска любого внутрипроцессного кода. Записи в GOT во время выполнения (как используется в fishhook) вызывают KERN_PROTECTION_FAILURE → SIGBUS. DYLD_INTERPOSE через __DATA,__interpose работает, потому что dyld обрабатывает таблицу interpose во время загрузки образа, до того как ядро применяет защиту __DATA_CONST.
kSecAttrTokenIDSecureEnclave) — доступен любому приложению, установленному не из App Store, без прав# 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 опубликовала благодарности в бюллетене безопасности |