
Analyse des causes profondes et PoC d’atteignabilité pour CVE-2026-64747, un débordement de tampon dans l’extension noyau AppleAVE2. Inclut le protocole filaire IOKit rétro-ingénierié, les calculs de débordement, et un PoC en espace utilisateur pilotant le chemin de configuration.
Analyse de cause racine et preuve de concept d'atteignabilité macOS pour
CVE-2026-64747, un débordement de tampon dans l'extension noyau de l'encodeur
vidéo AppleAVE2 (com.apple.driver.AppleAVE2) corrigé dans macOS 26.6 (kext 905.40.1).
AppleAVE2 — Impact : une application peut être en mesure d'exécuter du code arbitraire avec les privilèges du noyau. Un débordement de tampon dans le calcul de la taille du tampon de travail de l'encodeur a été corrigé grâce à une vérification améliorée des limites.
Ce dépôt documente le protocole filaire IOKit entièrement rétro-ingénieré de
AppleAVE2UserClient (création de session → configuration → traitement par
image), le site exact du débordement (un calculateur de taille de tampon de
travail LRB 32 bits dans le chemin multipasse HEVC 10 bits), ainsi qu'un PoC
espace utilisateur qui ouvre le user client, pilote le chemin de configuration
à travers la pile de validation du noyau et démontre la différence entre les
versions vulnérable (905.36.1) et corrigée (905.40.1).
Niveau (honnête) : atteignabilité + RE complète du protocole + mathématiques de débordement prouvées analytiquement. Pas d'exécution de code, aucun débordement en direct démontré — l'hôte de laboratoire exécute le kext corrigé, et une barrière de capacité matérielle (présente dans les deux versions) rejette les dimensions débordantes avant que le calculateur vulnérable ne s'exécute. Déclencher le débordement nécessite une cible dont la table de capacités admet les dimensions requises (voir FIRE_READY.md §5-6).
| fichier | description |
|---|---|
poc_ave2_reach.c | PoC espace utilisateur IOKit : ouvre AppleAVE2UserClient, crée une session, pilote la configuration avec les structures rétro-ingéniérées. Aucune entitlement requise. |
ave2_wire.h | Le format filaire rétro-ingéniéré : numéros de sélecteurs, tailles de structures et chaque décalage de champ pertinent (largeur/hauteur, encType, vues/couches, chroma, profondeur de bits) |
WIRE_FORMAT.md | Référence du format filaire : disposition de la table de dispatch, particularité PAC, contrats par sélecteur |
FIRE_READY.md | Les mathématiques du débordement (calculateur LRB mode-5), l'entrée exacte pour le déclencher, les preuves d'exécution sur hôte corrigé et les inconnues restantes |
evidence/ | Capture ioreg + journaux du noyau issus des exécutions sur hôte corrigé (progression de la pile de validation) |
clang -O0 -g -arch arm64 -framework IOKit -framework CoreFoundation \
-o poc_ave2_reach poc_ave2_reach.c
./poc_ave2_reach # root non requis ; le service s'ouvre depuis le contexte utilisateur
L'encodeur d'AppleAVE2 calcule la taille d'un tampon de travail LRB (tampon de
référence lookaside) avec une arithmétique 32 bits et sans vérification de
débordement. Dans le chemin multipasse HEVC 10 bits (calculateur invoqué avec
param_2 = 5), des dimensions telles que 64656×8080 (qui passent la limite
w*h ≤ 0x1FFE0000 du pilote) font que la somme des composants atteint
0x80000000 — bit de signe défini. Le calculateur vulnérable renvoie la somme
32 bits brute ; la taille est traitée comme négative en aval, un tampon
DART/IOMMU sous-dimensionné est alloué, et la DMA de l'encodeur écrit au-delà
de celui-ci → corruption du tas du noyau/DART → exécution de code noyau. Le
calculateur corrigé ajoute des vérifications de signe par composant et une
vérification de somme 64 bits et journalise LRB size overflow.
__const de la métaclasse
(lignes de pas 0x18 = {func, inSize<<32, outSize<<32}, avec une
particularité de pointeur PAC).IOServiceOpen doit utiliser type=1 (type=0 → création rejetée).IOConnectCallAsyncStructMethod (le chemin synchrone est
rejeté à la barrière IO_Config:337 avant la validation).À des fins de recherche pédagogique et défensive. Le bug est corrigé dans macOS actuel ; testez uniquement sur du matériel que vous possédez.