Recherche de thèse de master sur CVE-2025-55182 (React2Shell). Framework d'exploitation modulaire avec 6 scénarios d'attaque (RCE, exfiltration, défacement), shell inverse interactif, et un laboratoire vulnérable complet pour étudier la pollution de prototype et la désérialisation non sécurisée dans les composants serveur React.
Désérialisation de données non fiables + Pollution du prototype dans les composants serveur React
Exécution de code à distance sans authentification via les actions serveur Next.js
Versions concernées : React 19.0.0 - 19.2.0 · Correctif : React 19.0.1 / 19.1.2 / 19.2.1 (3 décembre 2025)
Démonstration de l'exploit avancé – commandes RCE basiques, shell interactif et multiples vecteurs d'attaque contre une application Next.js vulnérable
Ce dépôt contient mes recherches de mémoire de master sur CVE-2025-55182, une vulnérabilité critique (CVSS v3.1 : 10.0) d'exécution de code à distance dans les composants serveur React.
La vulnérabilité provient d'un mécanisme de désérialisation non sécurisé dans le protocole React Flight. Lors du traitement des actions serveur, Next.js désérialise les charges utiles multipart entrants sans validation appropriée. Un attaquant peut fabriquer une charge utile malveillante qui pollue la chaîne de prototypes et injecte du JavaScript arbitraire, exécuté sur le serveur via le constructeur Function (puis via child_process.execSync()).
Note concernant CVE-2025-66478 : Vercel a émis un CVE parallèle pour suivre l'impact spécifique à Next.js de cette même vulnérabilité. Comme Next.js regroupe React de manière internalisée, de nombreux scanners de dépendances ne le détectent pas automatiquement comme vulnérable. La base de données nationale américaine des vulnérabilités (NVD) a officiellement rejeté CVE-2025-66478 comme un doublon de CVE-2025-55182, bien qu'elle continue d'être référencée dans l'avis de sécurité de Vercel.
Vulnérabilités consécutives : L'équipe React a ensuite divulgué deux problèmes supplémentaires présents dans les premières versions de correctif (19.0.1, 19.1.2, 19.2.1) : CVE-2025-55184 (Déni de service, CVSS 7.5) et CVE-2025-55183 (Exposition de code source, CVSS 5.3). Les utilisateurs doivent mettre à niveau vers 19.0.2, 19.1.3 ou 19.2.2 pour corriger les trois.
| Aspect | Description |
|---|---|
| Quatre modules d'attaque | Supprimer des projets, défigurer le site web, voler les variables d'environnement, arrêter les serveurs |
| Shell interactif | Shell persistant avec commandes spéciales et capacités de restauration |
| Exfiltration stable | Lecture ligne par ligne pour contourner les limitations de taille des en-têtes HTTP |
| Script de restauration | Restauration sécurisée du laboratoire après les attaques |
| Documentation académique | Cause racine, décomposition de la charge utile et chronologie de la vulnérabilité |
CVE-2025-55182/
├── README.md # Ce fichier
├── LICENSE # Licence MIT
│
├── exploit/
│ ├── exploit-explanation.md # Documentation d'utilisation de l'exploit
│ └── react2shell.py # Exploit principal — 4 modules d'attaque + shell interactif
│
├── vulnerable-app/ # Application Next.js vulnérable
│ ├── README.md # Crédits originaux de vulnapp
│ ├── package.json # React 19.0.0 (vulnérable)
│ ├── app/ # Code source de l'application
│ ├── curl_id.sh # Script d'exploit original (par zack0x01)
│ └── scripts/
│ └── restore.sh # Script de restauration (ma contribution)
│
└── docs/
├── screenshots/ # Démonstrations d'exploitation
│ ├── 01-app-initial.png
│ ├── 02-rce-basic.png
│ ├── 03-interactive-shell.png
│ ├── 04-no-payload.png
│ ├── 05-delete-result.png
│ ├── 06-deface.png
│ ├── 07-shutdown-servers.png
│ ├── 08-restore-from-script.png
│ └── 09-restore-from-interactive-shell.png
│
└── analysis/
├── 01-root-cause.md # Analyse de la cause racine de la vulnérabilité
├── 02-payload-breakdown.md # Structure de la charge utile et flux d'exécution
└── 03-timeline.md # Chronologie du CVE
vulnerable-app/)cd vulnerable-app
npm install --legacy-peer-deps
npm run dev
# Application disponible sur http://localhost:3000
cd ../exploit
# Vérifier si la cible est vulnérable
python3 react2shell.py -u http://localhost:3000 --check
# Exécuter une commande unique
python3 react2shell.py -u http://localhost:3000 -c "whoami"
# Mode shell interactif
python3 react2shell.py -u http://localhost:3000 -i
| Module | Commande | Description | Impact |
|---|---|---|---|
| Supprimer les projets | --delete-projects | Supprime tous les projets du tableau de bord | Destruction de données |
| Défigurer | --deface "message" | Remplace la page principale | Défiguration |
| Voler l'environnement | --steal-env | Vole les variables d'environnement | Exfiltration |
| Arrêter les serveurs | --shutdown-servers | Arrête tous les serveurs | Déni de service |
Les composants serveur React utilisent un mécanisme de sérialisation/désérialisation personnalisé (le protocole "Flight") pour envoyer les données des composants du serveur au client. Lors du traitement des actions serveur, le serveur désérialise les charges utiles entrantes sans validation appropriée.
Le défaut fondamental est une confiance comportementale : le désérialiseur vérifie typeof obj.then === 'function' pour identifier les promesses, sans vérifier que la propriété appartient directement à l'objet. Cela permet à un attaquant d'empoisonner Object.prototype.then, faisant apparaître chaque objet simple comme un "thenable".
Un attaquant peut fabriquer une charge utile malveillante qui :
__proto__:thenFunction via $1:constructor:constructornew Function(_prefix)process.mainModule.require('child_process').execSync()X-Action-RedirectUser-mode (non authentifié)
│
├─ POST / (point de terminaison d'action serveur Next.js)
│ ├─ En-têtes : Next-Action: x
│ └─ Corps multipart avec JSON malveillant
│
└─ Le désérialiseur React Flight traite la charge utile
└─ Pollution du prototype via __proto__:then
└─ Constructeur Function atteint via $1:constructor:constructor
└─ new Function(_prefix) exécute le JavaScript de l'attaquant
└─ execSync() exécute la commande système
└─ Sortie intégrée dans l'erreur NEXT_REDIRECT
└─ NextJS convertit en en-tête X-Action-Redirect
La vulnérabilité affecte toute application Next.js utilisant le Routeur d'application avec composants serveur React — la configuration par défaut depuis Next.js 14. Les actions serveur définies explicitement ne sont pas requises ; la simple présence des packages RSC concernés est suffisante.
Cette vulnérabilité permet à un attaquant non authentifié de :
1. [ATTAQUANT] Envoie un POST multipart façonné à n'importe quel point de terminaison d'action serveur
2. [SERVEUR] Le désérialiseur React traite le JSON malveillant
3. [SERVEUR] La pollution du prototype empoisonne Object.prototype.then
4. [SERVEUR] L'objet simple est traité comme un thenable ; le constructeur Function est atteint
5. [SERVEUR] new Function(_prefix) exécute le JavaScript arbitraire de l'attaquant
6. [SERVEUR] execSync() exécute la commande système ; la sortie est capturée
7. [SERVEUR] La sortie est intégrée dans le digest d'erreur NEXT_REDIRECT
8. [SERVEUR] Next.js renvoie un en-tête X-Action-Redirect avec la sortie encodée en URL
9. [ATTAQUANT] Extrait et décode le résultat de la commande de l'en-tête
Tous les tests ont été effectués sur une VM VirtualBox isolée exécutant Kali Linux 2026.1 avec Next.js 15.0.0 et React 19.0.0, sans exposition réseau.
| Module d'attaque | Résultat | Notes |
|---|---|---|
| Exécution de commande | ✅ RCE confirmée | whoami, id, uname -a fonctionnent de manière fiable |
| Suppression de projets | ✅ Tableau de bord modifié | Projets supprimés, structure React préservée |
| Défiguration | ✅ Site web défiguré | Message personnalisé affiché |
| Vol d'environnement | ✅ Variables d'environnement extraites | Sauvegardées dans stolen_env.txt |
| Arrêt des serveurs | ✅ Tous les serveurs affichés comme arrêtés | Interface mise à jour, React fonctionnel |
| Shell interactif | ✅ Shell persistant | Commandes spéciales disponibles |
| Restauration | ✅ État d'origine restauré | Via le script restore.sh |
Déterminisme : Contrairement aux exploits probabilistes (ex. heap spray), CVE-2025-55182 est complètement déterministe — toute requête HTTP POST correctement formatée produit une RCE avec une probabilité de 1 sur tout système non patché exécutant React 19.0.0–19.2.0 avec les composants serveur React activés.
| Document | Description |
|---|---|
| Analyse de la cause racine | Défaut de désérialisation et pollution du prototype dans React Flight |
| Décomposition de la charge utile | Analyse ligne par ligne de la structure JSON malveillante |
| Chronologie du CVE | Découverte, divulgation et chronologie des correctifs |
Cette recherche fait partie de ma mémoire de master en cybersécurité (UCAM — Campus Internacional de Ciberseguridad), analysant des vulnérabilités N-Day dans plusieurs environnements.
Ce CVE représente le vecteur framework JavaScript moderne au sein de la mémoire, démontrant :
Mots-clés : RCE · Pollution de prototype · Désérialisation · React · Next.js · Actions serveur · CVE-2025-55182
Annais Molina (devianntsec) — Chercheuse en sécurité | Master en cybersécurité (UCAM)
Licence MIT — voir le fichier LICENSE
Ce dépôt est fourni à des fins éducatives et de recherche en sécurité uniquement, dans le cadre d'un mémoire de master académique. Tous les tests ont été effectués sur des machines virtuelles isolées sans exposition réseau. Utilisez-le uniquement sur des systèmes que vous possédez ou pour lesquels vous avez une autorisation écrite explicite de tester. Toute utilisation non autorisée contre des systèmes est illégale et peut entraîner des poursuites pénales.