Aikido

MECCHA CHAMELEON ne peut pas échapper au RCE

Écrit par
Robbe Van Roey

En bref : nous avons découvert une nouvelle vulnérabilité RCE différée dans MECCHA CHAMELEON. Lorsqu’un joueur évolue sur une carte créée par un attaquant, ce dernier peut exploiter une fonction exposée pour écrire arbitrairement des fichiers sur le système de la victime. Cela peut conduire à l’exécution de code à distance sur le système de la victime après un redémarrage. Nous avons signalé le problème aux responsables du jeu, qui ont corrigé la vulnérabilité dans la mise à jour 4.0.0. Cette mise à jour s’installe automatiquement avant le lancement du jeu.

Si vous êtes un joueur, vous avez sans doute déjà entendu parler de MECCHA CHAMELEON. Ce jeu de cache-cache en ligne est devenu un véritable phénomène mondial, avec 15 millions d'exemplaires vendus dès le premier mois!

En tant que joueur, tu as une mission très bête : trouver une bonne cachette et te peindre en blanc pour te fondre dans le décor. Ensuite, l'un de tes amis viendra te traquer. Tu gagnes si le chasseur ne parvient pas à te trouver. C'est aussi simple que ça !

Page d'accueil de Meccha Chameleon

Les cartes créées par la communauté constituent un attrait majeur du jeu. N'importe qui peut créer une nouvelle carte dans laquelle les joueurs pourront se cacher, puis la publier via le Steam Workshop. Ces nouvelles cartes peuvent prendre la forme d'une galerie d'art, de lieux nostalgiques issus d'autres jeux, etc.

La boutique Meccha Chameleon, proposant différentes cartes jouables

Une fonctionnalité en particulier a retenu notre attention : lorsque vous jouez sur un serveur, l’hôte du lobby choisit la carte, puis tous les joueurs de ce lobby sont invités à la télécharger (un message s’affiche à l’écran si vous ne l’avez pas encore téléchargée et que vous ralentissez la partie !). C’est très pratique, mais cela signifie aussi que rejoindre une partie peut impliquer de charger une carte créée par quelqu’un que vous n’avez jamais rencontré. Nous avons voulu savoir ce que cette carte téléchargée était réellement autorisée à faire.

Par le passé, MECCHA CHAMELEON avait déjà été victime d'une attaque RCE lors du chargement de la carte, comme expliqué en détail dans cet article de blog. Ce bug spécifique a depuis été corrigé, mais cela a-t-il éliminé toutes les failles permettant une attaque RCE ?

Qu'est-ce qu'une carte MECCHA CHAMELEON, au juste ?

On pourrait penser qu'une carte se résume à un ensemble d'éléments graphiques : des modèles pour les décors et des textures pour que le tout ait un aspect réaliste. C'est ainsi que fonctionne une carte dans de nombreux jeux, où le fichier téléchargé décrit le niveau, tandis que le jeu lui-même gère la logique.

Les cartes de MECCHA CHAMELEON offrent davantage de possibilités de personnalisation. Le jeu est développé avec Unreal Engine 5.6.1, et ses cartes peuvent intégrer des Blueprints. Blueprint est le système de programmation visuelle d'Unreal. Vous pouvez relier des nœuds pour déclencher une action lorsqu'un joueur appuie sur un bouton, pénètre dans une zone ou simplement charge la carte.


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

Bien sûr, une carte ne peut pas appeler toutes les fonctions d’Unreal ou de MECCHA CHAMELEON. Une fonction native doit d’abord être exposée dans Blueprint. Lorsque la carte démarre, ses graphes s’exécutent au sein du processus MECCHA CHAMELEON. Si un graphe appelle une fonction exposée, le jeu effectue cette action en utilisant le compte et les autorisations du joueur.

Cela signifie que les cartes personnalisées constituent une surface d'attaque intéressante :

  • Un animateur de salon peut inviter tous les autres joueurs à télécharger et à lancer une carte.
  • Cette carte permet ensuite d'exécuter des graphes Blueprint au sein du jeu.

J'ai donc commencé à m'intéresser aux fonctions du moteur auxquelles j'avais accès.

Recherche de fonctions appelables

Heureusement, nous n’avons pas à deviner quelles fonctions Unreal met à disposition. Il suffit d’ouvrir un graphe Blueprint et de cliquer avec le bouton droit sur une zone vide. Unreal affiche alors un menu permettant de rechercher les nœuds pouvant être ajoutés à ce graphe.

Du point de vue de la sécurité, je m'intéressais surtout aux fonctions qui interagissaient d'une manière ou d'une autre avec le système d'exploitation. J'ai donc recherché celles qui contenaient enregistrer, exportation, écrire, enregistrement, open, lancement, et load. Nous sommes passés d'une liste interminable d'API à une liste plus gérable que j'ai pu examiner.

J'ai donc examiné ces fonctions une à une jusqu'à ce que je tombe sur Terminer l'enregistrement de la sortie. Celui-ci s'est démarqué car il permettait de créer un fichier sur le système de fichiers avec un chemin d'accès pouvant être absolu ou relatif. Il stocke également la sortie audio, que nous pourrons probablement contrôler d'une manière ou d'une autre.

Écrire des fichiers n'importe où

Pour utiliser le Terminer l'enregistrement de la sortie Dans cette fonction, un créateur de carte doit lancer un enregistrement, lire un son, puis arrêter l'enregistrement. Il faut ensuite indiquer un nom et un chemin d'accès pour l'enregistrement. La fonction est documentée plus en détail ici.

Il s'agit donc clairement d'un cas où « il suffit d'indiquer n'importe quel répertoire et n'importe quel nom de fichier pour que nous puissions enregistrer ces fichiers n'importe où sur le système », n'est-ce pas ?

Eh bien oui. Il suffit de fournir C:/Utilisateurs/Public/ en indiquant le chemin d'accès au dossier pour y enregistrer les fichiers, ou en spécifiant un chemin relatif. Le répertoire utilisé par défaut est C:\Users\<user>\AppData\Local\Chameleon\Saved\BouncedWavFiles, donc en indiquant un chemin commençant par ../../../../../, nous pourrions accéder au dossier personnel de l'utilisateur sans avoir besoin de connaître son nom d'utilisateur.

Nous pouvons donc désormais écrire des fichiers n'importe où sur le système de fichiers. Le moyen le plus simple d'exploiter cette faille pour parvenir à une exécution de code à distance différée consiste à écrire un fichier exécutable dans C:\Users\<user>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup. À chaque démarrage de votre appareil, tous les fichiers contenus dans ce dossier seront automatiquement exécutés.

Nous avons donc utilisé cette valeur comme nom d'enregistrement :

../../../../Roaming/Microsoft/Windows/Menu Démarrer/Programmes/Démarrage/poc.exe

Et lorsque nous avons finalisé et mis en œuvre notre carte, nous avons remarqué que...

Ça a marché, en quelque sorte ? Nous avons bel et bien créé un fichier dans le dossier de démarrage. Mais l'extension .exe n'a pas été conservée. Unreal Engine ajoute l'extension .wav au nom de fichier que nous lui fournissons, et Windows continue donc de considérer ce fichier comme un fichier WAV plutôt que comme un exécutable.

Supprimer l'extension .wav

J'ai un peu réfléchi à la manière dont on pourrait contourner ce problème. Nous sommes ici face à un cas classique où deux systèmes différents partent d'hypothèses différentes. Unreal Engine a sa propre façon de gérer un chemin d'accès et Windows a la sienne pour l'interpréter. Il me suffisait de trouver une divergence entre les deux.

Avec Unreal Engine, c'est incroyablement simple : il détecte simplement une chaîne de caractères et y ajoute .wav à ce sujet. Sous Windows, c'est un peu plus complexe. Windows impose des limites sur la longueur maximale des noms de fichiers et interdit certains caractères dans les chemins d'accès, comme le caractère nul (U+0000).

Mais que se passe-t-il lorsque l'on essaie de créer un fichier dont le nom contient un caractère nul ? Eh bien, la plupart du temps, on obtient une erreur :

Mais toutes les API ne génèrent pas d'erreur. Certaines API de bas niveau interprètent en effet les octets nuls comme un caractère de fin et ignorent tout ce qui suit :

Et si on essayait d'utiliser notre carte malveillante pour enregistrer un fichier à l'adresse suivante :

POC.exe\u0000IGNORÉ

On voit bien que ça a marché ! On peut désormais enregistrer des fichiers avec des noms de notre choix à n'importe quel emplacement du système de fichiers !

Mais un problème majeur subsiste. Nous nous contentons d'écrire les octets d'un enregistrement audio au format WAV dans un fichier à l'aide d'un .exe extension. Il faut également trouver un moyen de modifier le contenu de ce fichier pour le rendre exécutable !

Une fenêtre contextuelle indique : « Cette application ne peut pas s'exécuter sur votre PC. »

Octets malveillants dans un enregistrement audio

Un nouveau défi se présentait désormais à nous. Nous enregistrions un véritable enregistrement audio sous forme de fichier WAV à un emplacement quelconque. Mais pour que cet exploit fonctionne, nous devions également pouvoir contrôler le contenu de ce fichier.

Pour ce faire, nous allons utiliser un fichier WAV PCM non compressé. Le format WAV est un conteneur de fichiers qui contient des métadonnées suivies de données audio. Les fichiers WAV peuvent stocker de l'audio dans plusieurs formats, donc le .wav L'extension à elle seule ne nous indique pas comment les échantillons sont encodés.

PCM signifie « Pulse-Code Modulation » (modulation par impulsions codées). Avec le PCM, chaque mesure de l'onde sonore est enregistrée directement sous forme de nombre. Notre démonstration de faisabilité utilisait le PCM 16 bits ; chaque échantillon occupait donc exactement deux octets. « Non compressé » signifie que ces nombres ont été enregistrés sans passer par un codec tel que le MP3.

Un fichier WAV PCM non compressé est constitué de valeurs d'échantillons audio. En contrôlant ces nombres avec précision, on contrôle également les octets utilisés pour les stocker.

C'est très important, car la compression audio classique vise à préserver la façon dont un son est perçu, et non les octets exacts de chaque échantillon. Ainsi, une version compressée peut sembler identique à l'oreille tout en contenant des octets très différents.

Voici à quoi ressemble un fichier WAV simplifié :

+-------------------------------+
| En-tête RIFF/WAVE              |  Créé par Unreal
| Format, canaux, fréquence d'échantillonnage |
| Taille de section de données      |
+-------------------------------+
| Échantillon PCM 0                  |  Contrôlé par l’onde sonore
| Échantillon PCM 1                  |
| Échantillon PCM 2                  |
| ...                           |

Unreal gère l'en-tête, y compris le RIFF et WAVE identifiants. Nous ne pouvons pas les modifier, car notre contrôle du fichier ne commence qu’à partir de la section contenant les données PCM. Cela exclut donc un grand nombre d’exécutables pour notre exploit. Nous ne pouvons pas télécharger un fichier normal .exe ou .dll, car les deux ont besoin d'un en-tête PE valide pour s'exécuter.

Nous avions donc besoin d'un type de fichier dont l'analyseur ne s'obstinait pas à rechercher son en-tête dès le premier octet. Les applications HTML de Windows se sont avérées être la solution idéale.

Un Application HTML est un ancien format Windows avec le .hta extension. Ce fichier ressemble beaucoup à une page Web : il peut contenir du code HTML, du CSS et soit du JScript, soit du VBScript. Windows l'ouvre avec mshta.exe (Hôte d'applications HTML Microsoft).

La différence majeure par rapport à une page Web classique réside dans l'endroit où ce script s'exécute. Un fichier HTA est traité comme une application de bureau plutôt que comme une page au sein du bac à sable du navigateur. Son script peut créer des objets COM Windows, notamment WScript.Shell, ce qui peut lancer un autre processus.

Voici à quoi ressemble une version simplifiée de notre charge utile de démonstration de faisabilité :

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

Lorsque ce fichier est ouvert, mshta.exe ignore les métadonnées WAV situées en début de fichier et exécute le script. Ensuite, WScript.Shell lance l'application « Calculatrice ».

Il restait encore à intégrer ce code HTML et ce script dans les échantillons PCM du fichier 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

En les regroupant par paires, on obtient trois valeurs d'échantillonnage de 16 bits :

Octets :    3C 68 | 74 6D | 6C 3E
Exemples:  0x683C  0x6D74  0x3E6C

Lorsque ces échantillons sont réécrits dans un fichier WAV « little-endian », les octets d'origine réapparaissent. En réalité, il a fallu pas mal de tâtonnements pour y parvenir, mais nous avons finalement réussi à créer un véritable fichier WAV contenant notre hta charge utile.

Un fichier texte contenant de nombreux caractères aléatoires, puisqu'il s'agit d'un fichier WAV

Assembler la carte

À ce stade, chaque élément fonctionnait de manière autonome. Il ne restait plus qu’à intégrer le tout dans une carte capable d’exécuter l’attaque complète d’un seul coup dès le chargement du niveau.

Nous joignons donc à Commencer à jouer et procédez comme suit :

  1. Lancer l'enregistrement de la sortie sur un sous-mixage privé (pour éviter les interférences avec le son habituel du jeu)
  2. PlaySound2D avec notre fichier PCM non compressé préparé
  3. Arrêter l'enregistrement de la sortie en utilisant ../../../../Roaming/Microsoft/Windows/Menu Démarrer/Programmes/Démarrage/poc.exe\u0000IGNORÉ comme nom de fichier
Graphique Blueprint d'Unreal Engine illustrant la chaîne d'attaque : l'événement « BeginPlay » est relié aux nœuds « Start Recording Output », « Play Sound 2D » et « Delay », puis un nœud « Finish Recording Output » enregistre un fichier WAV dans un chemin d'accès malveillant du dossier de démarrage.

Nous avons créé la carte et l'avons mise en ligne (en privé !) sur Steam.

Carte POC, avec un mème de Borat en description

Et c'est ainsi que nous en sommes arrivés à cette vidéo de démonstration :

Alors, est-ce que MECCHA CHAMELEON est désormais sécurisé ?

La vulnérabilité que nous avons signalée a été corrigée et ne peut plus être exploitée. La Arrêter l'enregistrement de la sortie Cette fonction ne crée plus aucun fichier (même ceux qui sont prévus).

Nous avons également passé en revue toutes les cartes du Steam Workshop pour vérifier si certaines exploitaient déjà cette faille, mais nous n'en avons trouvé aucune.

Toutefois, alors que nous travaillions sur cette démonstration de faisabilité (PoC), plusieurs personnes nous ont contactés pour nous signaler l'existence éventuelle d'autres vulnérabilités dans MECCHA CHAMELEON. Elles n'ont pas fourni de détails et ces informations n'ont pas été vérifiées ni confirmées par nos soins.

Nous vous invitons donc à faire preuve de prudence et de vigilance lorsque vous jouez à ce jeu en utilisant des cartes personnalisées. Nous vous recommandons de ne jouer que sur les cartes officielles fournies par MECCHA CHAMELEON.

Calendrier de publication des informations

  • 11 août 2026 : J'ai essayé de prendre contact via Twitter
  • 12 août 2026 : J'ai essayé de prendre contact via Discord
  • 13 août 2026 : J'ai tenté de contacter le service client de Steam et l'adresse e-mail du développeur.
  • 17 août 2026 : J'ai réussi à les contacter à nouveau via Twitter. Le développeur m'a répondu qu'il allait corriger le problème.
  • 20 août 2026 : MECCHA CHAMELEON 4.0.0 a été publié avec un correctif pour cette vulnérabilité
Partager :

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

Analyser les malwares

Commencer gratuitement
4,7/5
Fatigué des faux positifs ?
Essayez Aikido, comme 100 000 autres.
Commencez maintenant
Obtenez une démonstration personnalisée

Approuvé par plus de 100 000 équipes

Réserver maintenant
Analysez votre application à la recherche d'IDORs et de chemins d'attaque réels

Approuvé par plus de 100 000 équipes

Démarrer l'analyse
Découvrez comment le pentest IA teste votre application

Approuvé par plus de 100 000 équipes

Démarrer les tests

Sécurisez votre environnement dès maintenant.

Sécurisez votre code, votre cloud et votre environnement d’exécution dans un système centralisé unique.
Détectez et corrigez les vulnérabilités rapidement et automatiquement.

Aucune carte de crédit requise | Résultats en 32 secondes.