
Доказательство концепции для CVE-2026-65343 — чтения за пределами буфера в AppleKeyStore, которое раскрывает указатели ядра для обхода KASLR на iOS 26.6. Включает захват дескриптора ACM через DYLD_INTERPOSE и проверку по селекторам AKS.
Компонент: расширение ядра AppleKeyStore — _LibSer_SEPControl_Deserialize
Затронуты: iOS / iPadOS 26.6 (23G71) и более ранние версии
Исправлено в: iOS / iPadOS 26.6.1 (23G83)
Тип: Выход за границы чтения при десериализации управляющих сообщений SEP
Воздействие: Утечка указателей ядра → обход KASLR из песочницы, без каких-либо привилегий (через перехват ACM-дескриптора с помощью DYLD_INTERPOSE)
Обнаружено: Drinor Selmanaj (Sentry), Surya Narayan Kushwaha
(согласно Apple Security Advisory — iOS 26.6.1)
_LibSer_SEPControl_Deserialize в расширении ядра AppleKeyStore публикует пару из буфера сообщений ACM (Credential Manager) в пользовательское пространство через , .
(payload_ptr, declared_length)copyout()declared_length ≤ remainingУказав declared_length = 0x800, драйвер копирует примерно 0x7E8 байт за пределы буфера сообщений ACM в ядре — читая данные из соседних выделений кучи ядра. Эти соседние области содержат указатели ядра (0xfffffff0xxxxxxxx), которые можно использовать для вычисления сдвига KASLR.
; _LibSer_SEPControl_Deserialize (затронутый путь, 26.6 / 23G71)
ldr w2, [acm_msg + declared_length_offset] ; управляемое пользователем значение 0x800
; НЕТ проверки: w2 <= (acm_msg_end - payload_ptr) ← ОТСУТСТВУЕТ
bl copyout ; копирует w2 байт в пользовательское пространство
Прямой вызов IOServiceOpen("AppleKeyStore") блокируется песочницей для sideload-приложений. Однако путь подписи ключей 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-дескриптора и цепочку проверки выхода за границы:
kSecAttrAccessibleAfterFirstUnlock, без биометрии)declared_length = 0x800 по всем 163 селекторам AKSKPTR @+XXXX = 0xfffffff0YYYYYYYYЕсли подпись ключа SE маршрутизируется через XPC secd вместо внутрипроцессного вызова, запасной зонд использует нулевой дескриптор (подтверждает доступность пути выхода за границы; все селекторы не пройдут проверку ACM, но путь VNOP подтверждается).
На iOS 26 __DATA_CONST (который содержит GOT) отображается как доступный только для чтения до выполнения любого внутрипроцессного кода. Записи в GOT во время выполнения (как это делает fishhook) вызывают KERN_PROTECTION_FAILURE → SIGBUS. DYLD_INTERPOSE через __DATA,__interpose работает, потому что dyld обрабатывает таблицу interpose во время загрузки образа, до того как ядро применяет защиту __DATA_CONST.
kSecAttrTokenIDSecureEnclave) — доступен любому sideload-приложению без привилегий# Проект Xcode — подключите Security.framework и 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 в бюллетене безопасности |