
"Une seule requête HTTP malveillante peut compromettre l'ensemble de votre serveur." — React Security Team, Dec 2025
Sévérité : CRITIQUE | CVSS v3.1 : 10.0 (Maximum) | Statut : Activement exploité
React2Shell est une vulnérabilité de sécurité critique dans React Server Components (RSC) — une fonctionnalité moderne qui permet à React d'exécuter certaines parties de votre application web sur le serveur au lieu du navigateur.
La faille permet à n'importe quel attaquant sur Internet — sans aucune connexion, aucun accès spécial et aucune connaissance préalable de votre système — d'envoyer une seule requête HTTP malveillante à votre serveur et d'exécuter n'importe quel code qu'il souhaite. Cela signifie qu'il peut voler des données, installer des malwares, verrouiller vos fichiers avec un rançongiciel ou prendre le contrôle total de votre serveur.
Pensez-y comme ceci : votre serveur a une porte qui était censée ne s'ouvrir que pour les visiteurs de confiance, mais il s'avère que n'importe qui peut entrer — juste en frappant d'une manière spécifique.
| Propriété | Valeur |
|---|---|
| Identifiant CVE | CVE-2025-55182 (également appelé React2Shell) |
| Sévérité | Critique — Exécution de code à distance (RCE) |
| Score CVSS v3.1 | 10.0 / 10.0 (maximum possible) |
| Score CVSS v4 | 9.3 / 10.0 |
| Type de faiblesse | CWE-502 — Désérialisation de données non fiables |
| Méthode d'attaque | Requête HTTP POST unique, aucune authentification requise |
| Découvert par | Lachlan Davidson (chercheur en sécurité) |
| Divulgué | 3 décembre 2025 |
| Statut de l'exploit | Exploit public disponible — activement utilisé par les attaquants |
| CVE associé | CVE-2025-66478 (Next.js — doublon confirmé) |
react-server-dom-webpack — versions 19.0.0, 19.1.0, 19.1.1, 19.2.0 react-server-dom-parcel — versions 19.0.0, 19.1.0, 19.1.1, 19.2.0 react-server-dom-turbopack — versions 19.0.0, 19.1.0, 19.1.1, 19.2.0
### Frameworks concernés
| Framework / Outil | Portée concernée |
|----------------------------|----------------------------------------------------|
| **Next.js 15.x – 16.x** | App Router uniquement — Pages Router n'est **PAS** concerné |
| **React Router RSC** | Canal instable / de prévisualisation uniquement |
| **Redwood SDK** | Mode RSC uniquement |
| **Waku** | Toutes les versions avec RSC activé |
| **Expo** | Builds de prévisualisation RSC uniquement |
| **Vite RSC Plugin** | Toutes les intégrations |
| **Parcel RSC Plugin** | Toutes les intégrations |
| **Toute configuration RSC personnalisée** | Tout serveur utilisant la désérialisation Flight RSC |
> ⚠️ **Important :** Vous êtes vulnérable même si vous n'utilisez pas explicitement les Server Actions ou les Server Functions — tant que les composants serveur React sont activés dans votre application.
> ✅ **Non concerné :** Applications utilisant uniquement le Pages Router, ou applications sans React côté serveur du tout.
---
## Pourquoi est-ce si dangereux ?
Trois raisons rendent React2Shell exceptionnellement grave :
1. **Aucune authentification requise.** N'importe qui sur internet peut tenter cette attaque. Pas de compte, pas de jeton, aucun accès préalable nécessaire.
2. **Fonctionne sur les installations par défaut.** Une toute nouvelle application Next.js créée avec `create-next-app` — sans aucune configuration personnalisée — est immédiatement exploitable. Les développeurs n'ont rien à faire de mal pour être vulnérables.
3. **Fiabilité proche de 100 %.** Les chercheurs en sécurité ont confirmé que l'exploit fonctionne presque à chaque fois contre les serveurs non patchés.
---
## Comment fonctionne l'attaque ?
### La cause profonde — En termes simples
Lorsque votre serveur React reçoit des données d'un client, il les traite (désérialise) pour comprendre quoi faire ensuite. Le problème est que React **ne vérifie jamais si ces données sont sûres ou légitimes** — il fait aveuglément confiance à tout ce qui arrive.
Un attaquant exploite cela en envoyant des données spécialement conçues qui détournent le comportement JavaScript interne du serveur, lui permettant finalement d'injecter et d'exécuter son propre code.
### Explication technique
L'exploit utilise une technique appelée **pollution de prototype** :
1. L'attaquant envoie une requête HTTP POST élaborée à n'importe quel point de terminaison RSC (aucune URL spéciale nécessaire).
2. Le parseur du protocole React Flight traite la charge utile sans aucune validation structurelle.
3. La charge utile malveillante pollue `Object.prototype.then` — un objet JavaScript fondamental dont tous les autres objets héritent.
4. Cela donne à l'attaquant accès au constructeur `Function` de JavaScript.
5. L'attaquant utilise le constructeur `Function` pour exécuter du code arbitraire en tant que processus du serveur Node.js.```
Step 1 — Attacker sends crafted HTTP POST
↓
Step 2 — React deserializes payload blindly
↓
Step 3 — Object.prototype.then is hijacked (prototype pollution)
↓
Step 4 — Function constructor is accessed
↓
Step 5 — Attacker's code runs on the server
↓
Step 6 — Attacker has full server control
// This is a simplified version of the vulnerable code path inside React function parseFlightRequest(req) { const flight = req.body;
// ❌ NO validation — the server trusts whatever arrives
const decoded = dangerousDeserialize(flight); // Attack happens here
// If the attacker controls decoded.action → RCE
return executeServerReference(decoded.action);
}
### À quoi ressemble l'attaque```http
POST /?flight=1 HTTP/1.1
Content-Type: text/plain
{
"status": "resolved_model",
"$1:__proto__:then": "node:process.mainModule.require('child_process').execSync('id > /tmp/rce')",
"_formData.get": "$1:constructor:constructor"
}
ENTRÉE:```bash
curl -X POST https://target.com/react?flight=1
-H "Content-Type: text/plain"
--data '["$ACTION_REF","proto","constructor","<attacker_payload>"]'
> 🚫 **Avertissement légal :** N'utilisez pas cet outil contre un système dont vous n'êtes pas propriétaire ou pour lequel vous ne possédez pas une autorisation écrite explicite de test.
---
## Versions corrigées — Mettez à jour maintenant
### Paquets React RSC
| Paquet | Version corrigée |
|------------------------------|------------------------------|
| `react-server-dom-webpack` | 19.0.1, 19.1.2, **19.2.1+** |
| `react-server-dom-parcel` | 19.0.1, 19.1.2, **19.2.1+** |
| `react-server-dom-turbopack` | 19.0.1, 19.1.2, **19.2.1+** |
> 💡 **Recommandation :** Mettez à jour vers la version **19.2.3** pour également corriger les vulnérabilités connexes (CVE-2025-55183, CVE-2025-55184, CVE-2025-67779).
### Next.js
| Votre version | Mettez à jour vers |
|--------------|-------------|
| 13.x / 14.x | **14.2.35** |
| 15.0.x | **15.0.5** |
| 15.1.x | **15.1.9** |
| 15.2.x | **15.2.6** |
| 15.3.x | **15.3.6** |
| 15.4.x | **15.4.8** |
| 15.5.x | **15.5.7** |
| 16.0.x | **16.0.7** |
---
## Comment vous protéger — Étape par étape