
Prueba de concepto para una escritura fuera de límites en vfs_attr_pack_internal (getattrlist) de XNU en iOS 26.6, que demuestra la corrupción del montículo del kernel y notas de explotación para la falsificación de punteros PAC.
getattrlist en vfs_attr_pack_internalComponente: XNU VFS — vfs_attr_pack_internal (syscall getattrlist)
Afecta: iOS / iPadOS 26.6 (23G71) y anteriores
Corregido en: iOS / iPadOS 26.6.1 (23G83)
Tipo: Escritura fuera de límites en el búfer del llamador
Impacto: Corrupción del heap del kernel; desde el contexto del kernel (después de lectura/escritura del kernel), permite escribir un puntero firmado con PAC en un búfer controlado por el atacante
Descubierto por un investigador anónimo
(según Apple Security Advisory — iOS 26.6.1)
vfs_attr_pack_internal itera sobre el mapa de bits de atributos solicitado y escribe cada atributo secuencialmente en el búfer del llamador. comprueba si el desplazamiento de salida actual ha superado antes de escribir el atributo en la ranura 51 ().
bufsizeSETXATTR_SLOTPara un archivo con un nombre de 16 caracteres, la salida completa de atributos válidos es de 0x1a4 (420) bytes. La ranura 51 comienza en el desplazamiento 0x198 (408 bytes). Cuando el llamador proporciona un búfer más pequeño que 0x198 + 8, el kernel escribe 8 bytes más allá del final del búfer:
; vfs_attr_pack_internal (ruta afectada, 26.6 / 23G71)
; escritura en la ranura 51 — sin comprobación de límites antes del almacenamiento
str x_attr_data, [buf + 0x198] ; OOB si bufsize < 0x198 + 8
Las máscaras de atributos válidas verificadas mediante sonda en el dispositivo (getattrlist en un nombre de archivo de 16 caracteres, iOS 26.6):
| Campo | Máscara |
|---|---|
commonattr | 0xffe7ffff (los bits 19, 20 no son válidos en este kernel) |
fileattr | 0x0000363f |
forkattr | 0xffffe003 |
Con estas máscaras en un nombre de archivo de 16 caracteres, la salida total = 0x1a4 bytes. La escritura fuera de límites ocurre en la ranura 51 (buf+0x198) siempre que bufsize < 0x1a0.
En iOS 26, el aislamiento de KHEAP_TEMP impide que la escritura fuera de límites corrompa directamente asignaciones adyacentes del heap de manera útil desde el espacio de usuario. El error se clasifica como solo heap del kernel en esta investigación:
vfs_attr_pack_internal desde un punto de llamada controlado.En la cadena de jailbreak de iOS 26.6, este error se utiliza en la etapa final para escribir un puntero forjado con PACIA en una asignación del kernel adyacente al búfer del llamador.
poc_getattrlist_oob.c demuestra el límite fuera de límites con tres llamadas:
| Llamada | Tamaño del búfer | Resultado esperado |
|---|---|---|
| 1 | 64 bytes | El kernel escribe 0x1a4 bytes → fuera de límites en buf+0x198 (344 B más allá del final) |
| 2 | 0x198 bytes | La escritura fuera de límites comienza exactamente al final del búfer |
| 3 | 0x1a4 bytes | Tamaño válido exacto → éxito limpio |
El PoC crea un nombre de archivo de 16 caracteres (/var/root/aaaaaaaaaaaaaaaa) como objetivo de prueba, ejecuta las tres llamadas getattrlist() e imprime los códigos de retorno. Un registro de pánico del kernel (si se activa) mostrará una falla en buf+0x198.
/var/root/ (para crear el archivo de prueba de 16 caracteres; la ruta se puede ajustar a cualquier ubicación escribible)# Binario C independiente — no se necesitan frameworks
clang -arch arm64 -o poc poc/poc_getattrlist_oob.c
# Para el dispositivo:
clang -arch arm64 -isysroot $(xcrun --sdk iphoneos --show-sdk-path) \
-o poc poc/poc_getattrlist_oob.c
codesign -s "Apple Development" poc
| Fecha | Evento |
|---|---|
| 2026-08-17 | iOS 26.6.1 lanzado con la corrección |
| 2026-08-17 | Créditos de Apple publicados en el aviso de seguridad |