PS5 3.xx / 4.xx Kernel Exploit
Resumen
Este repositorio contiene una implementación experimental de ROP en WebKit de un exploit de kernel para PS5 basado en el Use-After-Free (UAF) de IPV6 de TheFlow, que fue reportado en HackerOne. La estrategia del exploit se basa en gran parte en el PoC de TheFlow para BSD/PS4, con algunos cambios para adaptarse al molesto diseño de memoria de la PS5 (consulte la sección Notas de investigación para obtener más información). Establece una primitiva de lectura arbitraria / escritura (semi-arbitraria). Este exploit y sus capacidades tienen muchas limitaciones y, como tal, está pensado principalmente para que los desarrolladores jueguen con él e hagan ingeniería inversa en algunas partes del sistema.
Con las últimas mejoras de estabilidad, la fiabilidad ronda el 80%. Este documento contendrá información de investigación sobre la PS5, y este exploit seguirá desarrollándose y mejorándose con el tiempo.
Los interesados en contribuir a la investigación/desarrollo de PS5 pueden unirse a un discord que he creado aquí.
El exploit ahora debería ser compatible con los siguientes firmwares:
- 3.00
- 3.10
- 3.20
- 3.21
- 4.00
- 4.02
- 4.03
- 4.50
- 4.51
Incluido actualmente
- Obtiene lectura/escritura arbitraria y puede ejecutar un servidor RPC básico para lecturas/escrituras (o un servidor de volcado para lecturas grandes) (debe editar su propia dirección/puerto en el archivo del exploit en las líneas 673-677).
- Habilita el menú de ajustes de depuración (nota: tendrá que salir completamente de los ajustes y volver a entrar para verlo).
- Obtiene privilegios de root.
Limitaciones
- Este exploit logra lectura/escritura, pero no ejecución de código. Esto se debe a que actualmente no podemos volcar el código del kernel para obtener gadgets, ya que las páginas .text del kernel están marcadas como memoria de solo ejecución (XOM). ¡Intentar leer punteros .text del kernel provocará un panic!
- Como se indica arriba + el hipervisor (HV) que impone la protección de escritura del kernel, este exploit tampoco puede instalar parches ni hooks en el espacio del kernel, lo que significa que no hay código relacionado con homebrew por el momento.
- La integridad de flujo de control (CFI) de grano fino basada en Clang está presente y se aplica.
- La prevención de acceso/ejecución en modo supervisor (SMAP/SMEP) no se puede desactivar debido al HV.
- La primitiva de escritura está algo restringida, ya que los bytes 0x10-0x14 deben ser cero (o una interfaz de red válida).
- Aunque debido a trabajos más recientes que usan pipes, ahora es posible una lectura/escritura arbitraria completa.
Cómo usar
- Configure fakedns a través de
dns.conf para que apunte manuals.playstation.net a la dirección IP de su PC.
- Ejecute fake dns:
python fakedns.py -c dns.conf
- Ejecute el servidor HTTPS:
python host.py
- Vaya a la configuración avanzada de red de la PS5 y establezca el DNS primario en la dirección IP de su PC y deje el secundario en
0.0.0.0
- A veces el manual aún no carga y es necesario reiniciar, no estoy seguro de por qué, es realmente extraño.
- Vaya al manual de usuario en la configuración y acepte el aviso de certificado no confiable, ejecútelo.
- Opcional: ejecute los scripts del servidor rpc/dump (nota: la dirección/puerto debe sustituirse en forma binaria en exploit.js).
Trabajo futuro
Uso del cargador ELF
Para usar el cargador ELF, ejecute el exploit hasta que termine. Al finalizar, ejecutará un servidor en el puerto :9020. Conéctese y envíe su ELF a la PS5 a través de ese puerto y lo ejecutará. Suponiendo que el ELF no bloquee el navegador, puede seguir ejecutando ELFs indefinidamente.
Etapas del exploit
Este exploit funciona en 5 etapas y, en su mayor parte, sigue la misma estrategia de exploit que el PoC de theflow.
- Desencadenar el UAF inicial en
ip6_pktopts y conseguir que dos sockets apunten al mismo pktopts / se superpongan (socket maestro <-> socket de spray superpuesto)
- Liberar el
pktopts en el socket maestro y falsificarlo con un spray de ip6_rthdr que contenga una superposición de tclass etiquetada.
- Paso de fuga de información. Usar la superposición
pktopts/rthdr para filtrar un kqueue del slab 0x200 y pktopts del slab 0x100.
- Paso de lectura/escritura arbitraria. Falsificar
pktopts de nuevo y encontrar el socket superpuesto para usar IPV6_RTHDR como primitiva de lectura/escritura.
- Paso de limpieza + parche. Aumentar el refcount de los sockets corruptos para una salida limpia del navegador + parchear datos para habilitar el menú de depuración y parchear ucreds para uid0.
- Ejecutar el servidor del cargador ELF que aceptará y cargará/ejecutará ELFs. Actualmente en WIP, no admite reubicaciones por el momento.
Notas de estabilidad
La estabilidad de este exploit es de aproximadamente 30% 80-90%, y tiene dos posibles puntos de fallo. En orden de probabilidad descendente observada:
- La etapa 1 no logra reclamar el UAF, lo que causa un bloqueo inmediato o una corrupción latente que provoca el bloqueo.
- La etapa 4 no logra encontrar un socket víctima.
Notas de investigación
Según varias pruebas y volcados con la primitiva de lectura, parece que la PS5 ha vuelto al tamaño de página de 0x1000 en comparación con el 0x4000 de la PS4.
- Después de más investigación, el tamaño de página sigue siendo 0x4000, pero debido a algunos cambios alucinantes en el asignador, diferentes slabs se pueden asignar en la misma página virtual.
- También parece que en PS5 las páginas adyacentes rara vez pertenecen al mismo slab, ya que obtendrá datos muy diferentes en páginas adyacentes. El diseño de la memoria parece más disperso.
- A menudo, cuando la PS5 sufre un panic (al menos en el contexto de webkit), habrá una salida de audio horrible, ya que el búfer de audio se corrompe de alguna manera.
- A veces esta corrupción de audio persiste hasta el siguiente arranque, no estoy seguro de por qué.
- Al igual que la PS4, la PS5 requerirá que se presione manualmente el botón de encendido dos veces en la consola para reiniciar después de un panic.
- Es normal que la PS5 tarde una cantidad absurda de tiempo en reiniciarse después de un panic si está aislada de Internet (desafortunadamente). Espere que el arranque tarde de 3 a 4 minutos.
Colaboradores / Agradecimientos especiales
- Andy Nguyen / theflow0 - Vulnerabilidad y estrategia de exploit
- ChendoChap - Varias ayudas con pruebas e investigación
- Znullptr - Investigación/Ingeniería inversa
- sleirsgoevy - Investigación/Ingeniería inversa + ideas de estrategia de exploit
- bigboss - Investigación/Ingeniería inversa
- flatz - Investigación/Ingeniería inversa + ayuda con parches
- zecoxao - Investigación/Ingeniería inversa
- SocracticBliss - Investigación/Ingeniería inversa
- laureeeeeee - Conocimientos de sistemas de bajo nivel y asistencia
Agradecimientos a los probadores