Aikido

MECCHA CHAMELEON no puede esconderse del RCE

Escrito por
Robbe Van Roey

En resumen: Hemos detectado otra vulnerabilidad de ejecución remota de código (RCE) diferida en MECCHA CHAMELEON. Al jugar en un mapa creado por un atacante, este puede aprovechar una función expuesta para escribir archivos de forma arbitraria en el sistema de la víctima. Esto puede dar lugar a la ejecución remota de código en el sistema de la víctima tras reiniciarlo. Informamos del problema a los responsables del juego, quienes corrigieron la vulnerabilidad en la actualización 4.0.0. Esta actualización se instala automáticamente antes de iniciar el juego.

Si te gustan los videojuegos, seguro que has oído hablar de MECCHA CHAMELEON. ¡Este juego online de escondite se ha convertido en una auténtica sensación mundial, con 15 millones de copias vendidas en su primer mes!

Como jugador, tienes una tarea muy tonta: encontrar un buen escondite y pintarte de blanco para mimetizarte con el entorno. Después, uno de tus amigos vendrá a buscarte. Ganas si el cazador no te encuentra. ¡Así de sencillo!

Página de inicio de Meccha Chameleon

Los mapas creados por la comunidad son una parte importante de su atractivo. Cualquiera puede crear un nuevo mapa en el que los jugadores puedan esconderse y publicarlo a través del Steam Workshop. Estos nuevos mapas pueden ser una galería de arte, zonas nostálgicas de otros juegos, etc.

Tienda «Meccha Chameleon», con diferentes mapas en los que se puede jugar

Hay una característica concreta que nos llamó la atención: cuando juegas en un servidor, el anfitrión de la sala elige el mapa y, a continuación, se insta a todos los jugadores de esa sala a descargar dicho mapa (¡la pantalla te avisará si aún no lo has descargado y estás retrasando la partida!). Es muy práctico, pero también significa que unirte a una partida puede implicar cargar un mapa creado por alguien a quien no conoces. Queríamos averiguar qué se podía hacer realmente con ese mapa descargado.

En el pasado, MECCHA CHAMELEON ya había sufrido un RCE al cargar el mapa, tal y como se detalla en esta entrada del blog. Ese error concreto ya se ha corregido, pero ¿se han eliminado así todas las vías de acceso al RCE?

¿Qué es realmente un mapa MECCHA CHAMELEON?

Quizá pienses que un mapa no es más que una serie de elementos: modelos del escenario y texturas para que todo tenga el aspecto adecuado. Así es como funciona un mapa en muchos videojuegos, en los que el archivo descargado describe el nivel, mientras que el propio juego controla la lógica.

Los mapas de MECCHA CHAMELEON ofrecen un mayor control que eso. El juego está desarrollado con Unreal Engine 5.6.1, y sus mapas pueden contener Blueprints. Blueprint es el sistema de programación visual de Unreal. Puedes conectar nodos para que ocurra algo cuando un jugador pulse un botón, entre en una zona o, simplemente, cargue el mapa.


https://dev.epicgames.com/documentation/unreal-engine/introduction-to-blueprints-visual-scripting-in-unreal-engine

Por supuesto, un mapa no puede llamar a todas las funciones de Unreal o MECCHA CHAMELEON. Primero hay que exponer una función nativa en Blueprint. Cuando se inicia el mapa, sus gráficos se ejecutan dentro del proceso de MECCHA CHAMELEON. Si un gráfico llama a una función expuesta, el juego lleva a cabo esa acción utilizando la cuenta y los permisos del jugador.

Esto significa que los mapas personalizados constituyen una superficie de ataque interesante:

  • Un anfitrión de sala puede pedir a cualquier otro jugador que descargue y ejecute un mapa.
  • De este modo, ese mapa puede ejecutar gráficos de Blueprint dentro del juego.

Así que empecé a fijarme en las funciones del motor a las que podía acceder.

Buscar funciones que se puedan invocar

Afortunadamente, no tenemos que adivinar qué funciones ofrece Unreal. Podemos abrir un gráfico de Blueprint y hacer clic con el botón derecho en una zona vacía. Entonces, Unreal muestra un menú con los nodos que se pueden añadir a ese gráfico, en el que se pueden realizar búsquedas.

Desde el punto de vista de la seguridad, me interesaban sobre todo las funciones que interactuaban de alguna manera con el sistema operativo. Así que busqué aquellas que contuvieran guardar, exportar, escribir, registro, open, lanzamiento, y cargar. Pasamos de tener una lista enorme de API a una lista más manejable que me permitía examinarla.

Así que, una por una, fui analizando estas funciones hasta que me topé con Finalizar la grabación de salida. Esta opción destacaba porque permitía crear un archivo en el sistema de archivos con una ruta que podía ser absoluta o relativa. Además, almacena la salida de audio, que probablemente podamos controlar de alguna forma.

Escribir archivos en cualquier lugar

Así que, para utilizar el Finalizar la grabación de salida En esta función, el creador del mapa debe iniciar una grabación, reproducir un sonido y, a continuación, detener la grabación. A continuación, indicamos un nombre y una ruta de guardado. La función está documentada con más detalle aquí.

Así que este es un caso claro de «basta con indicar cualquier directorio y cualquier nombre de archivo, y podemos guardar esos archivos en cualquier lugar del sistema», ¿no?

Pues sí. Solo tienes que proporcionar C:/Usuarios/Público/ como ruta del archivo y escribir los archivos allí, o bien puedes indicar una ruta relativa. El directorio predeterminado que se utiliza es C:\Users\<user>\AppData\Local\Chameleon\Saved\BouncedWavFiles, por lo que al indicar una ruta que comience por ../../../../../, podríamos acceder a la carpeta de inicio del usuario sin necesidad de conocer su nombre de usuario.

Así que ahora podríamos escribir archivos en cualquier lugar del sistema de archivos. La forma más sencilla de aprovechar eso para llevar a cabo una ejecución remota de código diferida es escribir un ejecutable en C:\Users\<user>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup. Cada vez que se inicie tu dispositivo, se ejecutarán automáticamente todos los archivos de esta carpeta.

Así que introdujimos este valor como nombre de la grabación:

../../../../Roaming/Microsoft/Windows/Menú de inicio/Programas/Inicio/poc.exe

Y cuando preparamos y pusimos en marcha nuestro mapa, nos dimos cuenta de que...

¿Funcionó, más o menos? Efectivamente, escribimos un archivo en la carpeta de inicio. Pero la extensión .exe no se mantuvo. Unreal Engine añade la extensión .wav al nombre de archivo que le proporcionamos y, por lo tanto, Windows sigue considerando el archivo como un WAV en lugar de como un ejecutable.

Eliminar la extensión .wav

Le di unas vueltas a cómo podríamos sortear esto. Lo que tenemos aquí es un caso clásico en el que dos sistemas diferentes parten de supuestos distintos. Unreal Engine tiene su propia forma de gestionar una ruta y Windows tiene la suya de interpretarla. Solo tenía que encontrar una discrepancia entre ambos.

En el caso de Unreal Engine, es increíblemente sencillo: simplemente detecta una cadena y le añade .wav en este sentido. Windows es un poco más complejo. Windows tiene límites en la longitud máxima de los nombres de archivo y caracteres que no están permitidos en una ruta, como el carácter nulo (U+0000).

Pero, ¿qué ocurre cuando intentamos crear un archivo cuyo nombre contiene un carácter nulo? Pues bien, la mayoría de las veces aparece un error:

Pero no todas las API devuelven un error. De hecho, algunas API de nivel inferior interpretan los bytes nulos como un carácter de fin y descartan todo lo que viene a continuación:

¿Y si intentamos utilizar nuestro mapa malicioso para guardar una grabación en:

POC.exe\u0000IGNORADO

¡Ya vemos que ha funcionado! ¡Ahora podemos guardar archivos con nombres y en ubicaciones cualquiera del sistema de archivos!

Pero sigue habiendo un problema importante. Lo único que hacemos es escribir los bytes de una grabación de audio WAV en un archivo con un .exe extensión. ¡Tenemos que controlar de alguna manera también el contenido de ese archivo para que sea ejecutable!

Aparece un mensaje emergente que dice: «Esta aplicación no se puede ejecutar en tu ordenador».

Bytes maliciosos en una grabación de audio

Ahora teníamos ante nosotros un nuevo reto. Estábamos guardando una grabación de audio real como archivo WAV en una ubicación arbitraria. Pero para que este exploit funcionara, también teníamos que poder controlar lo que se escribía en ese archivo.

Para ello, vamos a utilizar un archivo WAV PCM sin comprimir. WAV es el formato de archivo que contiene algunos metadatos seguidos de los datos de audio. Los archivos WAV pueden almacenar audio en varios formatos, por lo que el .wav La extensión por sí sola no nos indica cómo están codificadas las muestras.

PCM son las siglas de «modulación por impulsos codificados». Con el PCM, cada medición de la onda sonora se almacena directamente como un número. En nuestra prueba de concepto utilizamos PCM de 16 bits, por lo que cada muestra ocupaba exactamente dos bytes. «Sin comprimir» significa que esos números se grabaron sin pasar por un códec como el MP3.

Un archivo WAV PCM sin comprimir está formado por valores de muestras de audio. Si controlamos esos números con precisión, también controlamos los bytes que se utilizan para almacenarlos.

Esto es muy importante porque la compresión de audio habitual intenta conservar la forma en que se percibe un sonido, no los bytes exactos de cada muestra. Por lo tanto, una versión comprimida puede sonar idéntica aunque contenga bytes muy diferentes.

Un archivo WAV simplificado tiene este aspecto:

+-------------------------------+
| Encabezado RIFF/WAVE              |  Creado por Unreal
| Formato, canales, frecuencia de muestreo |
| Tamaño de la sección de datos      |
+-------------------------------+
| Muestra PCM 0                  |  Controlada a través de la onda sonora
| Muestra PCM 1                  |
| Muestra PCM 2                  |
| ...                           |

Unreal controla el encabezado, incluido el RIFF y WAVE identificadores. No podemos modificarlos porque nuestro control sobre el archivo solo comienza en la sección de datos PCM. Eso descarta muchos ejecutables para nuestro exploit. No podemos cargar un archivo normal .exe o .dll, ya que ambos necesitan una cabecera PE válida para ejecutarse.

Por lo tanto, necesitábamos un tipo de archivo cuyo analizador no exigiera encontrar su encabezado en el primer byte. Las aplicaciones HTML de Windows resultaron ser la solución perfecta.

Un Aplicación HTML es un antiguo formato de Windows con el .hta extensión. El archivo se parece mucho a una página web: puede contener HTML, CSS y JScript o VBScript. Windows lo abre con mshta.exe (Microsoft HTML Application Host).

La diferencia importante con respecto a una página web normal radica en el lugar donde se ejecuta ese script. Un archivo HTA se trata como una aplicación de escritorio, en lugar de como una página dentro del entorno aislado del navegador. Su script puede crear objetos COM de Windows, entre ellos WScript.Shell, que puede iniciar otro proceso.

Una versión simplificada de nuestra carga útil de prueba de concepto tiene este aspecto:

[RIFF/WAVE header ...]
<html>
  <head>
    <hta:application />
    <script>
      new ActiveXObject("WScript.Shell").Run("calc.exe");
    </script>
  </head>
</html>

Al abrir este archivo, mshta.exe ignora los metadatos WAV que aparecen al principio y ejecuta el script. A continuación, WScript.Shell abre la calculadora.

El único reto que quedaba era insertar ese código HTML y ese script dentro de las muestras PCM del archivo WAV.

Our payload used 16-bit PCM. Each sample is a 16-bit number stored in little-endian order, meaning the least significant byte is written first. Take the sample value 0x683C: it appears in the WAV as 3C 68, which also happens to be the ASCII text <h.

The same conversion works for a longer string. The text <html> has these ASCII bytes:

3C 68 74 6D 6C 3E

Al agruparlos por pares, obtenemos tres valores de muestra de 16 bits:

Bytes:    3C 68 | 74 6D | 6C 3E
Muestras:  0x683C  0x6D74  0x3E6C

Cuando esas muestras se vuelven a escribir en un archivo WAV «little-endian», reaparecen los bytes originales. En realidad, nos costó mucho trabajo conseguir que funcionara, pero al final logramos crear un archivo WAV auténtico que contenía nuestro hta carga útil.

Un archivo de texto con un montón de símbolos aleatorios, ya que se trata de un archivo WAV

Elaboración del mapa

En ese momento, cada parte funcionaba por separado. Lo que quedaba por hacer era integrarlo todo en un mapa que pudiera ejecutar el ataque completo de una sola vez cuando se cargara el nivel.

Así que nos aferramos a BeginPlay y haz lo siguiente:

  1. Iniciar grabación de salida en una submezcla privada (para evitar interferencias con el audio habitual del juego)
  2. Reproducir sonido en 2D con nuestro PCM sin comprimir ya preparado
  3. Detener la grabación de salida utilizando ../../../../Roaming/Microsoft/Windows/Menú Inicio/Programas/Inicio/poc.exe\u0000IGNORADO como nombre de archivo
Gráfico de Blueprint de Unreal Engine que muestra la cadena de ataque: el evento «BeginPlay» se conecta a la salida «Start Recording», a «Play Sound 2D» y a un nodo «Delay»; a continuación, un nodo de salida «Finish Recording» escribe un archivo WAV en una ruta maliciosa de la carpeta de inicio.

Hemos creado el mapa y lo hemos subido (¡de forma privada!) a Steam.

Mapa de POC, con un meme de Borat como descripción

Y así es como llegamos a este vídeo de prueba de concepto:

Entonces, ¿MECCHA CHAMELEON ya es seguro?

La vulnerabilidad que notificamos ya ha sido corregida y ya no puede ser objeto de explotación. La Detener la grabación de salida La función ya no crea ningún archivo (ni siquiera los archivos previstos).

También hemos revisado todos los mapas de Steam Workshop para comprobar si alguno ya estaba aprovechando este fallo, pero no hemos encontrado ninguno que lo hiciera.

Sin embargo, mientras trabajábamos en esta prueba de concepto, varias personas se pusieron en contacto con nosotros para informarnos de que podría haber otras vulnerabilidades en MECCHA CHAMELEON. No nos facilitaron detalles y nosotros no las hemos comprobado ni verificado.

Por lo tanto, te recomendamos que actúes con precaución y estés atento cuando juegues utilizando mapas personalizados. Te recomendamos que juegues únicamente en los mapas oficiales proporcionados por MECCHA CHAMELEON.

Calendario de divulgación

  • 11 de agosto de 2026: Intenté ponerme en contacto a través de Twitter
  • 12 de agosto de 2026: Intenté ponerme en contacto a través de Discord
  • 13 de agosto de 2026: Intenté ponerme en contacto con el servicio de atención al cliente de Steam y con la dirección de correo electrónico del desarrollador.
  • 17 de agosto de 2026: Pude volver a contactar con ellos a través de Twitter. El desarrollador respondió que solucionaría el problema.
  • 20 de agosto de 2026: Se lanzó MECCHA CHAMELEON 4.0.0 con un parche para esta vulnerabilidad.
Compartir:

https://www.aikido.dev/blog/meccha-chameleon-rce

Escanear en busca de malware

Empieza gratis
4.7/5
¿Cansado de los falsos positivos?

Prueba Aikido como otros 100k.
Empiece ahora
Obtenga un recorrido personalizado

Con la confianza de más de 100k equipos

Reservar ahora
Escanee su aplicación en busca de IDORs y rutas de ataque reales

Con la confianza de más de 100k equipos

Empezar a escanear
Vea cómo el pentesting de IA prueba su aplicación

Con la confianza de más de 100k equipos

Empezar a probar

Asegura tu plataforma ahora

Protege tu código, la nube y el entorno de ejecución en un único sistema central.
Encuentra y corrije vulnerabilidades de forma rápida y automática.

No se requiere tarjeta de crédito | Resultados del escaneo en 32 segundos.