Documentación y código de prueba de concepto para CVE-2022-24125 y CVE-2022-24126.
Se ha lanzado una nueva actualización del juego, la 1.15.1, para Dark Souls III el 25/08/2022, junto con la restauración de los servicios en línea. Esta actualización corrigió tanto CVE-2022-24125 como CVE-2022-24126, junto con una amplia variedad de otras posibles vulnerabilidades de seguridad presentes en la red P2P del juego (lecturas/escrituras fuera de límites). Además, se han corregido todos los exploits conocidos que permitían corromper la partida de otros jugadores. Muchos trucos menores comunes (p. ej., "cuchillo de maldición") que se podían encontrar a menudo durante el multijugador en línea también han sido parcheados.
Este repositorio contiene código de prueba de concepto y documentación para el exploit RCE más reciente que afecta a los juegos de FROM SOFTWARE, CVE-2022-24126. Aunque teóricamente es posible en otros juegos, la atención se centra en Dark Souls III, ya que es el juego en el que he realizado mi investigación. Por ahora solo existe código de prueba de concepto para Dark Souls III; se ha confirmado que la vulnerabilidad está presente en:
El código vulnerable también está presente en Sekiro (crédito: LukeYui), aunque no hay forma de activarlo. La presencia en Demon's Souls no se ha confirmado, pero es muy probable. Si bien la prueba de red cerrada se vio afectada por esto, la versión final de Elden Ring no lo está. De hecho, una enorme lista de fallos de red, lecturas/escrituras fuera de límites y exploits que permitían a los jugadores modificar los datos del juego de sus pares, presentes en Dark Souls III, han sido parcheados en Elden Ring. Felicitaciones a por recopilar esta lista y a FROM SOFTWARE por actuar con rapidez. Me alegra decir que
Contrariamente a la creencia popular, esto NO es un exploit de red peer-to-peer. Está relacionado con el servidor de emparejamiento y, por lo tanto, es mucho más grave, ya que no necesitas participar en ninguna actividad multijugador para ser vulnerable debido a otra vulnerabilidad del servidor de emparejamiento (CVE-2022-24125).
Con un promedio de unos 20.000 jugadores concurrentes en los meses anteriores al cierre de los servidores, era claramente un problema que necesitaba una solución inmediata, especialmente ante la posibilidad de que estuviera en Elden Ring. Dado que FROM SOFTWARE no había actuado después de más de 40 días desde mi informe inicial con vídeos de prueba de concepto y documentación detallada del exploit (en la que se basa gran parte de este readme), decidí demostrar la existencia del exploit públicamente de manera benigna, con la esperanza de atraer la atención para que los desarrolladores lo abordaran, y funcionó.
Consulta aquí para más detalles sobre estos 3 gadgets. Si para algún otro juego este método de llamada virtual no es un enfoque factible, la redirección de código arbitrario aún puede usarse para preparar un exploit ROP más tradicional.
Para ejecutar el código de prueba de concepto, primero debes tener un servidor al que conectarte. Si bien los servidores oficiales se han deshabilitado debido al exploit, puedes configurar uno privado usando ds3os. ds3os está diseñado para imitar el comportamiento del servidor comercial lo más fielmente posible, pero ya se han implementado parches de seguridad en este proyecto para corregir este exploit. Sin embargo, aún puedes configurar un entorno de pruebas compilando el proyecto tú mismo con las constantes SEND_MESSAGE_TO_PLAYERS_SANITY_CHECKS y NRSSR_SANITY_CHECKS establecidas en false en BuildConfig.h. Esto imita el comportamiento inseguro del servidor comercial. Sigue las instrucciones proporcionadas por ds3os para iniciar el juego y conectarte a tu servidor.
Una vez hecho esto y con tu juego conectado a los servidores, compila el código PoC e inicia el ejecutable Injector.exe. Inyectará una DLL que contiene el código del exploit en el proceso de Dark Souls III. Luego, esta DLL usará la función del juego que envía mensajes FRPG al servidor para entregar el exploit a tu propio cliente.
La función 140ca5010 comprueba los tamaños de las entradas, pero 140ca4fa0 es para entradas de tamaño variable y no realiza comprobaciones de validez en el campo de tamaño (Bug #1). Para lograr el exploit de redirección de código arbitrario descrito anteriormente, necesitamos establecerlo en 14F3B0. Esto causará una lectura fuera de límites de aproximadamente 1.3MiB, pero la página de memoria debería ser lo suficientemente grande para evitar violaciones de acceso.
140ca56b0Esta función es llamada por la anterior con nrssr_data como argumento. Crea el objeto DLMemoryInputStream en la pila, que luego se pasa como argumento al analizador NRSSR.
141955f50: ParseNRSessionSeachResultEl analizador de NRSessionSearchResult. Verifica la firma y los números de versión de NRSSR (14196a0f0), analiza la lista de propiedades (14196a260), el nombre del anfitrión (14195603a) y algo más de información (consulta rce.h)
14195603aBucle en la función anterior que copia de forma insegura el nombre del anfitrión (Bug #2). Aquí hay algunas direcciones que pueden ayudar a seguir lo que está sucediendo durante el desbordamiento del búfer:
14F128DLMemoryInputStream: 14F3A0DLMemoryInputStream después de la sobrescritura: 1439e8b30DLMemoryInputStream utilizado por el DLInputStreamReader: 0x181439e8b48MOV RCX,qword ptr [RCX + 0x8]
MOV RAX,qword ptr [RCX]
JMP qword ptr [RAX + 0x40]
Donde terminamos después de la primera redirección de código causada por la vftable del flujo de memoria sobrescrita. Aquí es donde comienza la cadena de redirecciones de llamadas virtuales.
Para Dark Souls III Ver. 1.15. El tamaño máximo teórico de la carga útil depende del diseño de la pila y, por lo tanto, variará según el juego y la versión. ↩