
Analisi delle cause profonde e PoC di raggiungibilità per CVE-2026-64747, un buffer overflow nell'estensione del kernel AppleAVE2. Include il protocollo wire IOKit ricostruito tramite reverse engineering, la matematica dell'overflow e un PoC in userspace che pilota il percorso di configurazione.
Analisi della causa principale e proof-of-concept di raggiungibilità per macOS
per CVE-2026-64747, un buffer overflow nell'estensione kernel dell'encoder video
AppleAVE2 (com.apple.driver.AppleAVE2) corretto in macOS 26.6 (kext 905.40.1).
AppleAVE2 — Impatto: un'app potrebbe essere in grado di eseguire codice arbitrario con privilegi kernel. Un buffer overflow nel calcolo della dimensione del work-buffer dell'encoder è stato risolto con un controllo dei limiti migliorato.
Questo repository documenta il protocollo wire IOKit completamente reverse-engineered di
AppleAVE2UserClient (crea sessione → configura → processo per-frame), il
punto esatto dell'overflow (un calcolatore della dimensione del work-buffer LRB a 32 bit nel
percorso multipass HEVC 10-bit), e un PoC in userspace che apre lo user client, guida
il percorso di configurazione attraverso lo stack di validazione del kernel e dimostra la
differenza tra le build vulnerabile (905.36.1) e corretta (905.40.1).
Livello (onesto): raggiungibilità + RE completo del protocollo + matematica dell'overflow analiticamente provata. Non RCE, nessun overflow dal vivo dimostrato — l'host di laboratorio esegue il kext corretto, e un gate di capacità hardware (presente in entrambe le build) respinge le dimensioni che causano l'overflow prima che il calcolatore vulnerabile venga eseguito. Per innescare l'overflow serve un target la cui tabella di capacità ammetta le dimensioni richieste (vedi FIRE_READY.md §5-6).
| file | cosa |
|---|---|
poc_ave2_reach.c | PoC IOKit in userspace: apre AppleAVE2UserClient, crea una sessione, guida la configurazione con le struct reverse-engineered. Nessuna entitlement richiesta. |
ave2_wire.h | Il formato wire reverse-engineered: numeri di selettore, dimensioni delle struct e ogni offset di campo rilevante (larghezza/altezza, encType, views/layers, crominanza, profondità di bit) |
WIRE_FORMAT.md | Riferimento del formato wire: layout della dispatch table, peculiarità PAC, contratti per selettore |
FIRE_READY.md | La matematica dell'overflow (calcolatore LRB mode-5), l'input esatto per innescarlo, prove di esecuzione su host con patch e le incognite rimanenti |
evidence/ | Cattura ioreg + log del kernel dalle esecuzioni sull'host con patch (progressione dello stack di validazione) |
clang -O0 -g -arch arm64 -framework IOKit -framework CoreFoundation \
-o poc_ave2_reach poc_ave2_reach.c
./poc_ave2_reach # root non richiesto; il servizio si apre dal contesto utente
L'encoder di AppleAVE2 calcola la dimensione del work-buffer LRB (lookaside reference buffer)
con aritmetica a 32 bit e nessun controllo di overflow. Nel percorso multipass HEVC 10-bit
(calcolatore invocato con param_2 = 5), dimensioni come 64656×8080 (che superano il
clamp w*h ≤ 0x1FFE0000 del driver) fanno sì che la somma dei componenti sia
0x80000000 — bit di segno impostato. Il calcolatore vulnerabile restituisce
la somma a 32 bit nuda; la dimensione viene trattata come negativa a valle, viene
allocato un buffer DART/IOMMU sottodimensionato e la DMA dell'encoder scrive oltre
i suoi limiti → corruzione heap/DART del kernel → esecuzione di codice nel kernel. Il calcolatore
corretto aggiunge controlli del segno per componente e un controllo della somma a 64 bit e registra
LRB size overflow.
__const della metaclasse (righe di
stride 0x18 = {func, inSize<<32, outSize<<32}, con una peculiarità del puntatore PAC).IOServiceOpen deve usare type=1 (type=0 → creazione respinta).IOConnectCallAsyncStructMethod (il percorso sincrono viene respinto al
gate IO_Config:337 prima della validazione).Per scopi di ricerca educativa e difensiva. Il bug è corretto nel macOS attuale; testa solo su hardware di tua proprietà.