
Analisi delle cause profonde e proof-of-concept per CVE-2026-64705, un overflow dell'heap del kernel macOS HFS xattr. Include un'immagine HFS+ armata, un patcher, un parser e un'analisi dettagliata per ricerca educativa e difensiva.
Analisi della causa principale e proof-of-concept per CVE-2026-64705, un buffer overflow nell'estensione del kernel HFS corretto in macOS Sonoma 14.8.7 (HT127117):
HFS — Impatto: un'app potrebbe causare una terminazione imprevista del sistema o scrivere memoria del kernel. Un buffer overflow è stato risolto con un controllo dei limiti migliorato.
Il PoC è un'immagine disco HFS+ armata. Montarla e leggere un attributo esteso
appositamente creato spinge il kext HFS in un ciclo bcopy illimitato di 64 byte
in un buffer heap del kernel di 512 byte → overflow dell'heap del kernel con
contenuto su disco controllato dall'attaccante → panic sulle build vulnerabili. Livello crash/panic —
non RCE.
adds/b.hs, terminazione a conteggio zero e rifiuto di total==0 / total>expectedhfs_setxattr: %s ha un extent di overflow malformato, idem per getxattr.| file | cosa |
|---|---|
poc-cve-2026-64705.dmg | Immagine HFS+ armata da 32 MB (file trigger + record xattr creati ad hoc) |
weaponize.py | Il patcher che ha costruito l'immagine — deriva nuovamente ogni offset dall'immagine stessa; funziona su qualsiasi immagine base compatibile |
parse_attr.py | Parser dell'albero B degli attributi usato per localizzare/scaricare i record xattr |
BUILD.md | Ricetta di build completa da un'immagine base pulita + i delta hex esatti |
WRITEUP.md | Analisi della causa principale: diff del kext (14.8.5 vs 14.8.7), ciclo vulnerabile, meccanismo |
Su un sistema pre-fix (o una VM sacrificabile — questo causa il panic del kernel):
hdiutil attach -nobrowse poc-cve-2026-64705.dmg
xattr -l /Volumes/CVE64705/trigger.txt # overflow dell'heap del kernel -> panic
Su un sistema corretto la stessa immagine viene montata senza problemi e il trigger viene rifiutato dal nuovo validatore — puoi osservare la prova differenziale nel log del kernel:
hfs_getxattr: bigattr ha un extent di overflow malformato
che conferma anche che il record creato ad hoc porta l'esecuzione esattamente nel percorso corretto (e precedentemente vulnerabile).
hdiutil create -fs HFS+ -size 32m -volname CVE64705 base.dmg
hdiutil attach -nobrowse base.dmg
echo trigger > /Volumes/CVE64705/trigger.txt
xattr -w bigattr "$(head -c 8192 /dev/zero | base64)" /Volumes/CVE64705/trigger.txt
hdiutil detach /Volumes/CVE64705
python3 weaponize.py # -> poc-cve-2026-64705.dmg
Per un xattr di grandi dimensioni archiviato come kHFSPlusAttrForkData, hfs_getxattr_internal
(e il corrispondente hfs_setxattr_internal) attraversa gli 8 descrittori di extent del
record di overflow. count_extent_blocks() salta qualsiasi descrittore il cui
blockCount supera il totale previsto e restituisce la somma a 32 bit senza
controllo di riporto o zero. Se ogni blockCount supera il totale, il conteggio
torna 0, blkcnt non avanza mai e il ciclo while (blkcnt < totalblocks)
continua a copiare 64 byte controllati dall'attaccante per iterazione oltre un
buffer heap di totalblocks*8 byte. La variante con wrap di interi (blockCount che
sommano oltre 2^32) è lo stesso controllo mancante; la patch 14.8.7 elimina entrambi.
A scopo educativo e di ricerca difensiva. Il bug è corretto nell'attuale macOS; testa solo su macchine di tua proprietà.