
Un exploit de kernel basado en WebKit y jailbreak para PS5
Este repositorio contiene un exploit ROP de WebKit de la vulnerabilidad de use-after-free por condición de carrera en UMTX (CVE-2024-43102) reportada por Synacktiv. Básicamente es un port de la estrategia de exploit de fail0verflow y flatz'. Abusa del UAF para obtener un mapeo de lectura/escritura dentro del stack de un hilo del kernel, y aprovecha lecturas y escrituras en pipes para establecer una primitiva de lectura/escritura arbitraria (no del todo ideal) en el kernel. Esta lectura/escritura se escala luego a una mejor que aprovecha un par de sockets ipv6 y un par de pipes para una lectura/escritura estable que puede pasarse a los payloads de la misma manera que era posible con el anterior exploit de kernel IPV6 para PS5.
La página en sí es una versión reducida y modificada de PS5 Exploit Host de idlesauce, ya que hizo el trabajo de integrar psfree con mi estilo de código usado anteriormente. Este host también es mi elección personal para ejecutar cosas, ya que es muy fluido e integra payloads útiles; con suerte se actualizará para soportar este exploit en un futuro cercano <3.
En última instancia, se lanzará un cargador de payloads que escuchará ELFs de payload en el puerto 9021. Recomiendo el PS5 Payload Dev SDK, ya que debería tener compatibilidad total con este cargador cuando se agreguen los offsets del kernel.
Esta vulnerabilidad afecta al firmware 1.00 hasta el firmware 7.61; sin embargo, los FW >= 3.00 parecen tener mitigaciones adicionales que requieren ajustar el exploit para que funcione. Como estoy principalmente interesado en firmwares más bajos, este exploit no soporta FW >= 3.00 por ahora. Además, la vulnerabilidad de WebKit que encadenamos fue parcheada en 6.00, por lo que se necesitará otro exploit de WebKit que logre lectura/escritura en userland para estos sistemas. De nuevo, como no me centro en firmwares más altos, esto queda incompleto por ahora.
Notas importantes
Los siguientes firmwares están soportados actualmente:
dns.conf para que apunte manuals.playstation.net a la dirección IP de tu PCpython fakedns.py -c dns.confpython host.py0.0.0.0
Para usar el cargador de ELF, ejecuta el exploit hasta que termine. Al finalizar, ejecutará un servidor en el puerto :9021. Conéctate y envía tu ELF a la PS5 a través de TCP y lo ejecutará. Este cargador debería seguir aceptando y ejecutando payloads incluso después de salir del navegador.
Doble free inicial
La estrategia de este exploit proviene en gran parte de fail0verflow y flatz. Consulta el writeup de chris@accessvector para obtener más información sobre la vulnerabilidad. Al explotarla, esencialmente nos da un doble free. Podemos usar esto para superponer el vmobject de un stack del kernel con el de un mapeo mmap para obtener una ventana al stack de un hilo del kernel. Esta capacidad tan poderosa nos permite leer/escribir punteros arbitrarios del kernel en el stack, lo que permite derrotar al ASLR y crear primitivas. Al hilo cuyo stack podemos acceder lo llamaremos hilo víctima.
Obtener lectura/escritura arbitraria
Al crear un pipe y llenar el búfer del pipe en el hilo principal, y luego intentar escribir en él usando el hilo víctima, el hilo víctima se bloqueará esperando que se libere espacio en el búfer. Durante este tiempo, podemos usar nuestra ventana al stack del kernel para cambiar los punteros iovec a punteros del kernel y establecer flags para que se traten como direcciones del kernel. Luego, al leer el pipe en el hilo principal, podemos obtener lectura arbitraria del kernel.
De manera similar, al hacer que el hilo víctima lea en el pipe, se bloqueará esperando datos entrantes. Podemos entonces, nuevamente, sobrescribir los punteros iovec y convertirlos en punteros del kernel, y escribir datos en el hilo principal para obtener escritura arbitraria del kernel.
Mejorando la lectura/escritura arbitraria
En esta etapa, tenemos una lectura/escritura arbitraria sin restricciones reales, pero estamos atados al uso de multihilo y bloqueos para que funcione, lo cual no es ideal. Luego usamos la R/W para iterar la tabla de descriptores de archivo (FD) del proceso y superponer los pktopts de dos sockets IPV6. Podemos entonces crear otra lectura/escritura arbitraria mediante el sockopt IPV6_PKTINFO. Esta primitiva de lectura/escritura tampoco es ideal, ya que está limitada en tamaño y contenido debido a la opción de socket subyacente. Mantenemos este paso principalmente para emular el escenario del exploit IPV6, sobre el cual se construyeron la mayoría de los payloads y demás.
Podemos obtener una mejor lectura/escritura mediante pipes. Al iterar nuevamente la tabla de FD del proceso y modificar los objetos de búfer de pipemap, podemos establecer lectura/escritura. El par de sockets IPV6 se utiliza como mecanismo para controlar el búfer de pipemap.
Corregir/evitar la corrupción
Si dejamos las cosas como están e intentamos cerrar el navegador, el sistema se bloqueará. Esto se debe a que la limpieza del proceso intentará liberar el stack del kernel que ya ha sido liberado. Para evitarlo, hacemos dos cosas:
td_kstack del hilo víctima en la lista de hilos del proceso.En FW < 3.00, este exploit es muy estable. El único punto crítico de fallo es no lograr superponer los vmobjects. En firmwares más altos, esta superposición es más difícil de lograr debido a las supuestas mitigaciones a nivel del asignador de páginas/montón.
Los interesados en contribuir a la investigación/desarrollo de PS5 pueden unirse a un discord que he configurado aquí.