
Análisis de causa raíz y PoC de alcanzabilidad para CVE-2026-64747, un desbordamiento de búfer en la extensión de kernel AppleAVE2. Incluye el protocolo de cable IOKit invertido, las matemáticas del desbordamiento y un PoC en espacio de usuario que impulsa la ruta de configuración.
Análisis de causa raíz y prueba de concepto de alcanzabilidad para macOS de
CVE-2026-64747, un desbordamiento de búfer en la extensión de kernel del codificador de video AppleAVE2 (com.apple.driver.AppleAVE2) corregido en macOS 26.6 (kext 905.40.1).
AppleAVE2 — Impacto: una app podría ejecutar código arbitrario con privilegios de kernel. Se abordó un desbordamiento de búfer en el cálculo del tamaño del búfer de trabajo del codificador con una verificación de límites mejorada.
Este repositorio documenta el protocolo de cable IOKit completamente invertido de
AppleAVE2UserClient (crear sesión → configurar → procesar por fotograma), el
sitio exacto del desbordamiento (una calculadora de tamaño de búfer de trabajo LRB de 32 bits en la ruta
multipaso HEVC de 10 bits), y un PoC de espacio de usuario que abre el cliente de usuario, impulsa
la ruta de configuración a través de la pila de validación del kernel y demuestra la
diferencia entre las compilaciones vulnerables (905.36.1) y corregidas (905.40.1).
Nivel (honesto): alcanzabilidad + RE completa del protocolo + matemática de desbordamiento analíticamente probada. No es RCE, no se demuestra desbordamiento en vivo — el host del laboratorio ejecuta el kext corregido, y una compuerta de capacidad de hardware (presente en ambas compilaciones) rechaza las dimensiones de desbordamiento antes de que se ejecute la calculadora vulnerable. Disparar el desbordamiento requiere un objetivo cuya tabla de capacidades admita las dimensiones requeridas (ver FIRE_READY.md §5-6).
| archivo | qué |
|---|---|
poc_ave2_reach.c | PoC de espacio de usuario IOKit: abre AppleAVE2UserClient, crea una sesión, impulsa la configuración con las estructuras invertidas. No se necesitan entitlements. |
ave2_wire.h | El formato de cable invertido: números de selector, tamaños de estructura y cada desplazamiento de campo que importa (ancho/alto, encType, vistas/capas, croma, profundidad de bits) |
WIRE_FORMAT.md | Referencia del formato de cable: diseño de la tabla de despacho, peculiaridad PAC, contratos por selector |
FIRE_READY.md | La matemática del desbordamiento (calculadora LRB modo-5), la entrada exacta para dispararlo, evidencia de ejecución en host parcheado y las incógnitas restantes |
evidence/ | Captura de ioreg + registros del kernel de las ejecuciones en host parcheado (progresión de la pila de validación) |
clang -O0 -g -arch arm64 -framework IOKit -framework CoreFoundation \
-o poc_ave2_reach poc_ave2_reach.c
./poc_ave2_reach # no se requiere root; el servicio se abre desde el contexto de usuario
El codificador de AppleAVE2 calcula un tamaño de búfer de trabajo LRB (búfer de referencia de búsqueda lateral)
con aritmética de 32 bits y sin verificación de desbordamiento. En la ruta
multipaso HEVC de 10 bits (calculadora invocada con param_2 = 5), dimensiones como
64656×8080 (que pasan el límite w*h ≤ 0x1FFE0000 del controlador) hacen que la
suma de componentes sea 0x80000000 — bit de signo establecido. La calculadora vulnerable devuelve
la suma de 32 bits sin procesar; el tamaño se trata como negativo aguas abajo, se
asigna un búfer DART/IOMMU de tamaño insuficiente y el DMA del codificador escribe más allá
de él → corrupción de heap/DART del kernel → ejecución de código en kernel. La calculadora
corregida añade verificaciones de signo por componente y una verificación de suma de 64 bits y registra
LRB size overflow.
__const de la metaclase (filas de
stride 0x18 = {func, inSize<<32, outSize<<32}, con una peculiaridad de puntero PAC).IOServiceOpen debe usar type=1 (type=0 → creación rechazada).IOConnectCallAsyncStructMethod (la ruta síncrona se rechaza en la
compuerta IO_Config:337 antes de la validación).Para fines educativos y de investigación defensiva. El error está parcheado en macOS actual; prueba solo en hardware que poseas.