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-Redirect