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 LukeYui por recopilar esta lista y a FROM SOFTWARE por actuar con rapidez. Me alegra decir que Elden Ring es, indiscutiblemente, el título de FROM SOFTWARE más seguro en cuanto al alcance del daño que los hackers pueden infligir.
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ó.
La comprobación inadecuada de límites en un búfer de pila y en el campo de tamaño de datos durante el análisis de los datos de emparejamiento de NRSessionSearchResult permite a un atacante ejecutar código arbitrario. El desbordamiento de pila permite sobrescribir los dos bytes inferiores de vftable_ptr del objeto DLMemoryInputStream utilizado internamente por el lector de flujo, redirigiendo la ejecución a código vecino cuidadosamente elegido. La explotación inteligente de la estructura del objeto DLMemoryInputStream y de su campo de tamaño de datos permite entonces lograr la redirección de código arbitrario, con RCX apuntando a la dirección de nuestro paquete. A partir de ahí, se puede usar una serie de redirecciones de código mediante llamadas virtuales con diferentes desplazamientos (que ahora saltarán a las direcciones que escribimos en el búfer del paquete) para lograr la ejecución de código arbitrario.
Los vectores de distribución son lo que hace que este RCE en particular sea especialmente grave (más allá de ser ya un RCE). El exploit se transmite a través de solicitudes push de emparejamiento que contienen información de NRSessionSearchResult. Esto significa que el atacante puede apuntar a cualquiera que se una a su sesión en línea. En particular, para DS3:
PushRequestSummonSign)PushRequestAllowBreakInTarget)PushRequestVisit)PushRequestAcceptQuickMatch)Esto ya es bastante malo, pero el verdadero potencial se desbloquea con la solicitud RequestSendMessageToPlayers:
message RequestSendMessageToPlayers {
repeated uint32 player_ids = 1;
required bytes push_message = 2;
}
El anfitrión usa esta solicitud para enviar directamente el mensaje push PushRequestAllowBreakInTarget a los invasores, de modo que puedan obtener las coordenadas de aparición y unirse a su sesión P2P. Eso es todo. Esa es la única forma en que el juego usa esta solicitud.
No puedo enfatizar lo horriblemente inseguro que es esto. Cualquier jugador puede básicamente hacerse pasar por el servidor de emparejamiento. Al usar esta solicitud para enviar el exploit a través de un PushRequestVisit, cualquier jugador en línea puede ser atacado de forma remota siempre que se conozca su ID de jugador. El atacante también puede enviar el exploit a toda la base de jugadores en línea muy rápidamente enviando múltiples solicitudes, cada una conteniendo una gran porción de posibles IDs de jugador.
Si bien el RCE no se traslada exactamente a todos los juegos, la idea central del exploit, que le da al atacante redirección de código arbitrario, es la misma. Si esto se puede lograr, es muy probable que se pueda encontrar una cadena de llamadas virtuales o una cadena ROP específica del juego. Este "primer paso" utiliza las siguientes vulnerabilidades: