La scène du hack Nintendo continue d'explorer de nouvelles pistes. Un projet baptisé CivSwitch propose une chaîne d'outils basée sur une vulnérabilité XSS présente dans la version Nintendo Switch de Civilization VII. L'objectif est de permettre l'exécution de code JavaScript sur la console, puis de mettre en place un déclencheur persistant permettant de relancer automatiquement un payloads au démarrage du jeu. Le projet se distingue par son fonctionnement : il combine un exploit déclenché depuis le chat multijoueur, un microcontrôleur USB et un mécanisme d'installation reposant sur les données de sauvegarde du jeu.

Une compatibilité annoncée avec les firmwares récents
D'après les informations fournies par le développeur, CivSwitch prend en charge les consoles Nintendo Switch 1 et Switch 2 sous les firmwares 20.x.x et supérieurs, jusqu'à la version 23.0.1. Les configurations suivantes ont notamment été testées :
- Switch 1 sous firmware 22.5.0
- Switch 2 sous firmware 20.4.0
- Switch 2 sous firmware 23.0.1
Attention toutefois : cette compatibilité concerne la chaîne d'exploitation CivSwitch et ne signifie pas que les consoles disposent d'un jailbreak complet. Il s'agit d'une méthode d'exécution de code JavaScript qui ouvre la voie à d'autres payloads. Autre restriction importante : seule la version 1.0.0 de Civilization VII, distribuée sur cartouche physique, est actuellement prise en charge. Les autres versions du jeu ne sont donc pas annoncées comme compatibles.
Un exploit XSS déclenché depuis le chat multijoueur
CivSwitch exploite une faille de type XSS (Cross-Site Scripting) dans l'interface de chat du jeu. Cette vulnérabilité permet d'injecter du code JavaScript dans un contexte où celui-ci peut être exécuté. Le déclenchement passe par le menu multijoueur de Civilization VII. L'utilisateur doit accéder à la section dédiée au jeu sans fil, créer un salon et ouvrir le chat. Un périphérique basé sur un microcontrôleur Raspberry Pi Pico envoie ensuite automatiquement le contenu nécessaire dans le champ de discussion. Le script transmis représente environ 87 lignes et nécessite approximativement 15 minutes de saisie automatisée. Une fois l'opération terminée, un Remote JS Loader est lancé sur la console et ouvre un service TCP sur le port 9026.
Ce service permet ensuite d'envoyer des fichiers JavaScript depuis un ordinateur, sans devoir recommencer toute la procédure d'injection à chaque fois que l'on souhaite transmettre une nouveau payload.
PicoSwitch et installer-creator : les deux composants de CivSwitch
Le projet est organisé autour de deux composants principaux.
PicoSwitch : le firmware chargé de l'injection
PicoSwitch est un firmware destiné aux microcontrôleurs Raspberry Pi Pico équipés d'une puce RP2040 ou RP2350. Il se comporte comme un clavier USB et reproduit automatiquement la saisie du code dans le chat du jeu. Le firmware contient également un outil de compression et de transformation du JavaScript afin de produire un payload adapté aux contraintes du champ de discussion. Le processus repose notamment sur la minification du code, la compression Deflate Raw et le découpage du contenu en plusieurs fragments utilisant une structure HTML de type img/onerror.
installer-creator : l'installation du déclencheur persistant
Le second composant permet de préparer un installateur à partir d'un payload javacript personnalisé.
Son objectif est d'écrire un déclencheur nommé XSTRIG.Civ7Save dans les données de sauvegarde du jeu. Ce mécanisme permet ensuite de relancer le paylaod depuis le menu de chargement des parties. L'installation initiale nécessite un ordinateur connecté au même réseau que la console. Le script prévu à cet effet transfère un modèle de sauvegarde, intègre le payload compressé et écrit le déclencheur dans les données du jeu. Le projet précise également que le contenu du dossier save:/saves/Single/ est effacé pendant cette opération. Il est donc important de prendre en compte ce comportement avant d'utiliser l'installateur.
Un déclenchement possible après chaque démarrage
L'une des particularités de CivSwitch est la possibilité de rendre le lancement de le payload persistant au niveau du jeu. Après l'installation du déclencheur, la procédure annoncée devient plus simple : il suffit de démarrer Civilization VII, puis de passer par le menu de chargement des parties pour déclencher l'exécution du code enregistré dans les données de sauvegarde. Si le payload installée correspond au Remote JS Loader, le service TCP sur le port 9026 peut être disponible dès cette étape. Le développeur indique également que le service peut rester accessible après une mise en veille puis un réveil de la console.
Cette persistance reste toutefois liée au mécanisme mis en place dans les sauvegardes de Civilization VII. Elle ne doit pas être confondue avec un exploit système permanent indépendant du jeu.
Un outil destiné à expérimenter avec des payloads JavaScript
CivSwitch ne se limite pas au lancement de son propre chargeur. Le projet prévoit également un script Python, send_js.py, capable de transmettre un fichier JavaScript au Remote JS Loader actif. Cela permet aux développeurs de tester différents payloads sans devoir modifier le firmware du microcontrôleur à chaque expérimentation. Le code source comprend les éléments nécessaires à la compilation du firmware PicoSwitch, ainsi que les scripts permettant de préparer et d'envoyer les payloads. Le développeur crédite notamment les travaux du projet Netflix-N-Hack pour certaines parties du cœur JavaScript de l'exploit, ainsi que le projet Pico-Switch-Controller pour la base du firmware destiné au firmware.
Alors ?
Avec CivSwitch, Civilization VII devient un nouveau terrain d'expérimentation pour la scène homebrew Nintendo. Le projet associe une injection XSS, un périphérique USB programmable et un déclencheur basé sur les sauvegardes pour proposer une chaîne d'exécution JavaScript annoncée comme compatible avec plusieurs firmwares récents de Switch 1 et Switch 2.
Il faut néanmoins garder à l'esprit les limites actuelles : la version 1.0.0 sur cartouche physique est indispensable, et l'exécution de JavaScript ne constitue pas, à elle seule, un jailbreak complet de la console.
La suite dépendra notamment des possibilités offertes par le Remote JS Loader et des payloads que les développeurs pourront exploiter à partir de cette première étape.
Source : CivSwitch 1.0












