
Análisis de causa raíz y prueba de concepto para CVE-2026-64705, un desbordamiento de montículo del kernel en xattr de HFS de macOS. Incluye imagen HFS+ armada, parcheador, analizador y un informe detallado para investigación educativa y defensiva.
Análisis de causa raíz y prueba de concepto para CVE-2026-64705, un desbordamiento de búfer en la extensión del kernel HFS corregido en macOS Sonoma 14.8.7 (HT127117):
HFS — Impacto: una app podría causar una terminación inesperada del sistema o escribir memoria del kernel. Se abordó un desbordamiento de búfer con una verificación de límites mejorada.
El PoC es una imagen de disco HFS+ armada. Montarla y leer un atributo extendido
diseñado lleva al kext de HFS a un bucle bcopy sin límites de 64 bytes
hacia un búfer de montón del kernel de 512 bytes → desbordamiento de montón del
kernel con contenido del disco controlado por el atacante → pánico en builds
vulnerables. Nivel de caída/pánico — no RCE.
adds/b.hs, terminación con conteo cero, y rechazo de total==0 / total>expectedhfs_setxattr: %s has a malformed overflow extent, igual para getxattr.| archivo | qué es |
|---|---|
poc-cve-2026-64705.dmg | Imagen HFS+ armada de 32 MB (archivo disparador + registros xattr diseñados) |
weaponize.py | El parcheador que construyó la imagen — re-deriva cada desplazamiento desde la propia imagen; funciona con cualquier imagen base compatible |
parse_attr.py | Analizador del árbol B de atributos usado para localizar/volcar los registros xattr |
BUILD.md | Receta de build completa desde una imagen base limpia + los deltas hex exactos |
WRITEUP.md | Análisis de causa raíz: diff del kext (14.8.5 vs 14.8.7), bucle vulnerable, mecanismo |
En un sistema anterior al parche (o una VM de sacrificio — esto provoca pánico en el kernel):
hdiutil attach -nobrowse poc-cve-2026-64705.dmg
xattr -l /Volumes/CVE64705/trigger.txt # desbordamiento de montón del kernel -> pánico
En un sistema parcheado la misma imagen se monta correctamente y el disparador es rechazado por el nuevo validador — puedes observar la prueba diferencial en el registro del kernel:
hfs_getxattr: bigattr has a malformed overflow extent
lo que también confirma que el registro diseñado lleva la ejecución exactamente hacia el recorrido parcheado (y anteriormente vulnerable).
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
Para un xattr grande almacenado como kHFSPlusAttrForkData, hfs_getxattr_internal
(y el espejo hfs_setxattr_internal) recorre los 8 descriptores de extensión del
registro de desbordamiento. count_extent_blocks() omite cualquier descriptor cuyo
blockCount exceda el total esperado y devuelve la suma de 32 bits sin comprobación
de acarreo ni de cero. Si cada blockCount excede el total, el conteo vuelve a 0,
blkcnt nunca avanza, y el bucle while (blkcnt < totalblocks) sigue copiando
64 bytes controlados por el atacante por iteración más allá de un búfer de montón
de totalblocks*8 bytes. La variante de envoltura de enteros (blockCounts que suman
más allá de 2^32) es la misma comprobación ausente; el parche 14.8.7 elimina ambas.
Para fines educativos y de investigación defensiva. El bug está parcheado en macOS actual; prueba solo en máquinas que te pertenezcan.