Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
ENLBufferPwn — Información y PoC sobre la vulnerabilidad ENLBufferPwn | Kitploit
Herramientas/GitHubGitHub/pablomk7/enlbufferpwn
Seguridad de Sistemas EmbebidosAnálisis de VulnerabilidadesExplotaciónAprendizaje y EducaciónExplotación de Binarios
GitHubpablomk7/enlbufferpwn

ENLBufferPwn

Información y PoC sobre la vulnerabilidad ENLBufferPwn

Ver Repositorio
298113hace 3 añosRevisado por Kitploit

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

ENLBufferPwn (CVE-2022-47949)

CVE:CVE-2022-47949
CVSS v3.1:9.8/10 (Crítico)
Autores:PabloMK7, Rambo6Glaz, Fishguy6564
Reportado:8 de agosto de 2021 (Mario Kart 7)
14 de abril de 2022 (para los juegos de WiiU y Switch afectados)
Divulgado:22 de diciembre de 2022

Tabla de contenidos

  • Descripción
  • Detalles de la vulnerabilidad
  • ENLBufferPwn en Mario Kart 7 (3DS)
    • Detalles técnicos
  • ENLBufferPwn en Mario Kart 8
  • Créditos
  • Licencia

Descripción

ENLBufferPwn es una vulnerabilidad en el código de red común de varios juegos propios de Nintendo, presente desde la Nintendo 3DS, que permite a un atacante ejecutar código de forma remota en la consola de la víctima con solo jugar una partida en línea con ella (ejecución remota de código). Fue descubierta por varias personas de forma independiente durante 2021 y reportada a Nintendo durante 2021 y 2022. Desde el reporte inicial, Nintendo ha parcheado la vulnerabilidad en muchos de los juegos afectados. La información de este repositorio ha sido divulgada de forma segura después de obtener el permiso de Nintendo.

La vulnerabilidad ha obtenido una puntuación de 9.8/10 (Crítico) en la calculadora CVSS 3.1.

Esta es una lista de juegos que se sabe que han tenido la vulnerabilidad en algún momento (todos los juegos de Switch y 3DS enumerados han recibido actualizaciones que parchean la vulnerabilidad, por lo que ya no están afectados):

  • Mario Kart 7 (corregido en v1.2)
  • Mario Kart 8 (corregido en v4.2.0)
  • Mario Kart 8 Deluxe (corregido en v2.1.0)
  • Animal Crossing: New Horizons (corregido en v2.0.6)
  • ARMS (corregido en v5.4.1)
  • Splatoon (corregido en v2.12.1)
  • Splatoon 2 (corregido en v5.5.1)
  • Splatoon 3 (corregido a finales de 2022, versión exacta desconocida)
  • Super Mario Maker 2 (corregido en v3.0.2)
  • Nintendo Switch Sports (corregido a finales de 2022, versión exacta desconocida)
  • Probablemente más...

Detalles de la vulnerabilidad

La vulnerabilidad ENLBufferPwn explota un desbordamiento de búfer en la clase C++ NetworkBuffer presente en la librería de red enl (Net en Mario Kart 7), utilizada por muchos juegos propios de Nintendo. Esta clase contiene dos métodos, Add y Set, que rellenan un búfer de red con datos procedentes de otros jugadores. Sin embargo, ninguno de esos métodos comprueba que los datos de entrada quepan realmente en el búfer de red. Dado que los datos de entrada son controlables, se puede provocar un desbordamiento de búfer en una consola remota con solo tener una sesión de juego en línea con el atacante. Si se hace correctamente, es posible que la víctima ni siquiera note que se ha activado una vulnerabilidad en su consola. Las consecuencias de este desbordamiento de búfer varían según el juego, desde simples modificaciones inofensivas de la memoria del juego (como abrir y cerrar repetidamente el menú de inicio en la 3DS) hasta acciones más graves, como tomar el control total de la consola, tal y como se muestra a continuación.

El resto del informe se centrará en Mario Kart 7, ya que, debido a la falta de medidas de seguridad (ASLR, por ejemplo) de la 3DS, es el caso más grave de la vulnerabilidad. Sin embargo, podría ser posible evadir el ASLR en los juegos de Switch secuestrando el NetworkBuffer utilizado para enviar datos de vuelta al atacante (y haciendo que filtre punteros al montón y al código).

ENLBufferPwn en Mario Kart 7 (3DS)

El siguiente vídeo muestra un caso grave de la vulnerabilidad en Mario Kart 7, donde una consola controlada por un atacante (lado izquierdo) toma el control total de una consola sin modificar (lado derecho). La única interacción realizada por el usuario es unirse a una sesión de juego en línea con el atacante, en este caso, usando la función de "comunidades" (nótese que se utilizó una "comunidad" para probar la vulnerabilidad de forma segura y aislada, sin afectar a otros usuarios que jugaban en lobbies públicos). La toma de control se realiza copiando un payload ROP a la consola remota y ejecutándolo después. Este payload ROP utiliza otras vulnerabilidades del sistema operativo para escalar privilegios y obtener el control total. En el vídeo, se obliga a la consola remota a ejecutar un instalador de CFW (SafeB9SInstaller). Usando las mismas técnicas, teóricamente sería posible robar información de cuentas/tarjetas de crédito o realizar grabaciones de audio/vídeo no autorizadas usando el micrófono/cámaras integrados de la consola.

ENLBufferPwn - Demostración de Mario Kart 7 - Youtube

Detalles técnicos

Como se ha indicado anteriormente, la vulnerabilidad proviene de un descuido en dos métodos de la clase NetworkBuffer. Aquí se muestra una implementación de la clase y los métodos en C++:

root@kitploit:~
class NetworkBuffer
{
public:
    u8	bufferType;
    u8* dataPtr;
    u32 dataSize;
    u32 currentSize;

    void Set(u8* newData, u32 newDataSize);
    void Add(u8* newData, u32 newDataSize);
}

void NetworkBuffer::Set(u8* newData, u32 newDataSize)
{
    memcpy(this->dataPtr, newData, newDataSize);
    this->currentSize = newDataSize;
}

void NetworkBuffer::Add(u8* newData, u32 newDataSize)
{
    memcpy(this->dataPtr + this->currentSize, newData, newDataSize);
    this->currentSize += newDataSize;
}

Como puede ver, ni Set ni Add comprueban que el newDataSize entrante quepa en el tamaño del búfer (dataSize). Dado que esta clase NetworkBuffer se utiliza como contenedor genérico para intercambiar datos entre jugadores en línea, el contenido de newData y el valor de newDataSize pueden ser controlados por un atacante, y se puede realizar un desbordamiento de búfer.

Otro detalle de la librería de red es que es asíncrona, de modo que los juegos pueden realizar otras operaciones mientras los datos se van rellenando en el búfer. Para lograrlo, se utiliza una técnica de doble búfer. De esta forma, el juego puede acceder a los datos ya recibidos en un NetworkBuffer al mismo tiempo que se reciben nuevos datos. Después de que se rellena el segundo NetworkBuffer, los búferes se intercambian y el ciclo se repite.

Para este PoC, se explotará el doble NetworkBuffer utilizado para recibir datos Mii (bufferType = 9). Debido al orden de asignación del montón, resulta que el objeto NetworkBuffer y su contenido están colocados uno junto al otro. Además, ambos búferes del doble búfer son contiguos en memoria. El siguiente diagrama representa cómo queda la memoria después de la asignación del búfer:

Representación del doble NetworBuffer de datos Mii en el montón del juego

De ahora en adelante, el búfer en la parte superior de la imagen se referenciará como Buffer0, mientras que el de la parte inferior será Buffer1. Con este conocimiento, un atacante puede provocar el desbordamiento de búfer en Buffer0 para sobrescribir los atributos de Buffer1, incluido su miembro dataPtr. Dado que los juegos de 3DS no implementan ASLR, todas las ubicaciones de memoria de la consola remota son conocidas, por lo que dataPtr puede apuntar a una ubicación arbitraria. Una vez que el juego intercambia los búferes, los nuevos datos se copiarán en la ubicación arbitraria. Realizando los siguientes pasos, se puede copiar un payload de cualquier tamaño a la consola remota:

  1. Construya un payload especialmente diseñado y envíelo en Buffer0. Provocará un desbordamiento en la consola remota sobrescribiendo dataPtr de Buffer1.
  2. Rellene el contenido de Buffer1 con datos arbitrarios. Se copiarán en la dirección arbitraria a la que apunta dataPtr de Buffer1 de la consola remota.
  3. Aumente la dirección y el tamaño arbitrarios y comience de nuevo desde el paso 1.

A continuación se muestra una animación del funcionamiento normal del juego, seguida de la realización de los pasos descritos anteriormente.

Animación del funcionamiento normal de los dobles búferes, seguido de la operación de la vulnerabilidad

Este repositorio contiene un PoC que explota esta vulnerabilidad para realizar las siguientes operaciones, dependiendo de las banderas del compilador:

  • Enviar un valor de 4 bytes que se escribe en la dirección de estado de la aplicación de la consola remota, forzándola a cerrarse y volver al menú de inicio.
  • Enviar un payload ROP que se almacena en la memoria de la consola remota. Una vez enviado el ROP, la pila se sobrescribe para que el juego lo ejecute (el payload ROP en sí no se proporciona en el PoC).

Tenga en cuenta que este PoC no implementa ningún tipo de detección de pérdida de paquetes, ya que las comunicaciones entre consolas se realizan mediante UDP. Para obtener los mejores resultados, se debería implementar el manejo de la pérdida de paquetes en el código del PoC o colocar las consolas en la misma red para reducir las probabilidades de que se pierdan paquetes.

También se proporciona una posible corrección para la clase NetworkBuffer vulnerable.

ENLBufferPwn en Mario Kart 8

La vulnerabilidad también está presente en las versiones de WiiU y Switch de Mario Kart 8, pero solo se ha demostrado en la versión de WiiU del juego.

  • El POC requiere una versión antigua de NintendoClients que implemente las comunicaciones PIA
  • Puede consultar este informe de hackerone para obtener información adicional: https://hackerone.com/reports/1541273
  • En el futuro se añadirá aquí un análisis más detallado

Créditos

Aunque esta vulnerabilidad fue descubierta por múltiples usuarios de forma independiente, muchos de ellos decidieron mantener privada la información sobre la vulnerabilidad. Sin embargo, las siguientes personas son responsables de haber divulgado la vulnerabilidad a Nintendo de forma segura:

  • PabloMK7 (GitHub, Twitter)
  • Rambo6Glaz (GitHub)
  • Fishguy6564 (GitHub, Twitter)

Licencia

CC0
En la medida de lo posible según la ley, PabloMK7, Rambo6Glaz y Fishguy6564 han renunciado a todos los derechos de autor y derechos conexos o afines sobre ENLBufferPwn. Este trabajo se publica desde: España.

Descargar herramienta