
Prueba de concepto para una omisión del diversificador de PAC corregida en el manejador de setxattr de tmpfs en iOS 26.6, que demuestra la accesibilidad de la ruta de firma vulnerable desde el espacio de usuario.
Componente: XNU VFS — default_setxattr_doubleagent (VNOP de tmpfs)
Afecta: iOS / iPadOS 26.6 (23G71) y anteriores
Corregido en: iOS / iPadOS 26.6.1 (23G83)
Tipo: Diversificador PAC fijo en el firmado de punteros del manejador de xattr
Impacto: Control del PC desde contexto del kernel; escalada completa de privilegios cuando se combina con una primitiva de escritura en el kernel
Descubierto por: Bhaswanth Chigurupati, Billy Jheng Bing Jhong, Pan Zhenpeng (@Peterpan0927) de STAR Labs SG Pte. Ltd.
(según Apple Security Advisory — iOS 26.6.1)
default_setxattr_doubleagent, el manejador VNOP de xattr para el sistema de archivos tmpfs, firma el puntero de función del manejador de xattr usando un diversificador PAC fijo, constante en tiempo de compilación: #0x307a.
; Kernel XNU — default_setxattr_doubleagent (descompilado)
handler_ptr = vnode_operations[VNOP_SETXATTR_SLOT]; // leído de la tabla vnop
signed_ptr = PACDA(handler_ptr, 0x307a); // firma con diversificador FIJO
... llamada AUTDA(signed_ptr, 0x307a) → BLR // autentica y salta
Debido a que el diversificador es fijo y públicamente conocido, un atacante con una primitiva de escritura en el kernel puede:
forged = PACIA(shellcode_addr, 0x307a)forged en la ranura correspondiente de la tabla vnode_operations del vnode objetivo.setxattr() en cualquier archivo del montaje tmpfs → el kernel ejecuta shellcode_addr.En la cadena de escalada de privilegios del kernel de iOS 26.6:
CVE-2026-64788 (UAF en IOGPUFamily) → primitiva de lectura/escritura en el kernel
CVE-2026-65330 (este fallo) → control del PC → root (uid=0)
La primitiva sign_ptr (PACIA con diversificador #0x307a) se implementa en el POC del jailbreak usando ensamblador ARM64e en línea. La primitiva de lectura/escritura en el kernel se usa para:
v_op del vnode objetivo.vnode_operations[VNOP_SETXATTR_SLOT].setxattr("/tmp/trigger", ...).El PoC independiente (poc_pac_bypass.c) ejercita la ruta VNOP vulnerable:
/var/root/poc65330_testsetxattr() con XATTR_NAME="com.apple.poc.cve65330.test" → alcanza default_setxattr_doubleagentremovexattr() para alcanzar la ruta de limpiezaEl PoC no forja un puntero PAC ni sobrescribe datos del kernel — solo demuestra que la ruta vulnerable de firmado con #0x307a es alcanzable desde el espacio de usuario mediante una llamada normal al syscall setxattr().
/var/root/ (la llamada a setxattr en sí es alcanzable desde cualquier proceso — la ruta del archivo puede ajustarse a una ubicación escribible desde el sandbox)# Binario C independiente (sin necesidad de frameworks)
clang -arch arm64 -o poc poc/poc_pac_bypass.c
# Para dispositivo (con firmado):
clang -arch arm64 -isysroot $(xcrun --sdk iphoneos --show-sdk-path) \
-o poc poc/poc_pac_bypass.c
codesign -s "Apple Development" poc
El diversificador fijo 0x307a se verificó a partir del desensamblado del kernelcache 26.6 (23G71):
; default_setxattr_doubleagent + 0x?? (aproximado)
MOVZ x1, #0x307a ; constante del diversificador
PACDA x0, x1 ; firma el puntero del manejador
El correspondiente AUTDA x0, x1 en el punto de llamada usa la misma constante, confirmando que cualquier puntero forjado con PACIA y diversificador 0x307a se autentica correctamente.
| Fecha | Evento |
|---|---|
| 2026-08-17 | iOS 26.6.1 publicado con la corrección |
| 2026-08-17 | Créditos de Apple publicados en el aviso de seguridad |