Exploit de preuve de concept pour CVE-2025-55182, une RCE critique non authentifiée dans React Server Components. Comprend un exploit Python automatisé, une analyse technique, des règles de détection et une configuration d'environnement de laboratoire pour des tests de sécurité autorisés.
Une preuve de concept exhaustive et une ressource éducative pour CVE-2025-55182, une vulnérabilité critique d'exécution de code à distance affectant les composants serveur React avec un score CVSS de 10.0.
À DES FINS ÉDUCATIVES ET DE TEST AUTORISÉ UNIQUEMENT
Cet outil est fourni à des fins éducatives et de test de sécurité autorisé uniquement. L'accès non autorisé à des systèmes informatiques est illégal en vertu de diverses lois, notamment le Computer Fraud and Abuse Act (CFAA) aux États-Unis et des législations similaires dans le monde entier.
Vous devez :
L'auteur et les contributeurs :
En utilisant cet outil, vous reconnaissez avoir compris et accepté ces conditions.
React2Shell est une vulnérabilité critique découverte en décembre 2025 qui affecte les composants serveur React (RSC) et les frameworks qui les implémentent, en particulier Next.js. La vulnérabilité permet l'exécution de code à distance non authentifiée via une seule requête HTTP spécialement conçue.
Ce dépôt contient :
| Champ | Détails |
|---|---|
| Identifiant CVE | CVE-2025-55182 |
| Score CVSS | 10.0 (Critique) |
| Vecteur d'attaque | Réseau |
| Complexité de l'attaque | Faible |
| Privilèges requis | Aucun |
| Interaction utilisateur | Aucune |
| Impact | Compromission complète du système (RCE) |
| Date de divulgation | Décembre 2025 |
create-next-app sont exploitablesVersions vulnérables :
react-server-dom-webpack : 19.0.0, 19.1.0, 19.1.1, 19.2.0react-server-dom-parcel : 19.0.0, 19.1.0, 19.1.1, 19.2.0react-server-dom-turbopack : 19.0.0, 19.1.0, 19.1.1, 19.2.0Versions corrigées :
Versions vulnérables :
Versions corrigées :
La vulnérabilité existe dans la fonction requireModule au sein de la logique de désérialisation des composants serveur React :
function requireModule(metadata) {
var moduleExports = __webpack_require__(metadata[0]);
return moduleExports[metadata[2]]; // LIGNE VULNÉRABLE - Parcours de la chaîne de prototypes
}
La faille permet aux attaquants de parcourir la chaîne de prototypes de JavaScript via le protocole React Flight, accédant au constructeur Function via des propriétés comme constructor.constructor, permettant l'exécution de code arbitraire.
__proto__ pour créer une structure auto-référentielleconstructor.constructor pour accéder à Function()child_process.execSync()┌─────────────────────────────────────────────────────────────┐
│ L'attaquant envoie multipart/form-data avec en-tête Next-Action │
└──────────────────────┬──────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Le serveur désérialise la charge utile via le protocole React Flight │
└──────────────────────┬──────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Traitement de l'objet bloc factice avec pollution __proto__ │
└──────────────────────┬──────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Le gestionnaire Blob invoque _formData.get(_prefix + id) │
└──────────────────────┬──────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Résout en Function("malicious_code") │
└──────────────────────┬──────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Code arbitraire exécuté avec les privilèges du processus Node.js │
└─────────────────────────────────────────────────────────────┘
requests# Cloner le dépôt
git clone https://github.com/yourusername/react2shell-poc.git
cd react2shell-poc
# Installer les dépendances
pip install -r requirements.txt
# Rendre le script exécutable (Linux/macOS)
chmod +x react2shell.py
requests>=2.31.0
urllib3>=2.0.0
python3 react2shell.py
╔═══════════════════════════════════════════════════════════╗
║ React2Shell (CVE-2025-55182) PoC ║
║ CVSS 10.0 - RCE Critique ║
║ ║
║ Affecté : React 19.0.0, 19.1.0, 19.1.1, 19.2.0 ║
║ Next.js ≥14.3.0-canary.77, 15.x, 16.x ║
║ ║
║ Cerberus Secure - Usage en laboratoire uniquement ║
╚═══════════════════════════════════════════════════════════╝
[?] Entrez les informations de la cible :
Hôte (ex. localhost ou 192.168.1.100) : localhost
Port (ex. 3000) : 3000
[React2Shell]> id
[*] Cible : http://localhost:3000/
[*] Commande : id
[*] Construction de la charge utile d'exploitation...
[*] Envoi de la requête d'exploitation...
[+] Code de statut de la réponse : 200
[*] Analyse de la réponse...
╔═══════════════════════════════════════════════════════════╗
║ SORTIE DE COMMANDE ║
╚═══════════════════════════════════════════════════════════╝
uid=1000(node) gid=1000(node) groups=1000(node)
[React2Shell]> whoami
[React2Shell]> pwd
[React2Shell]> ls -la
[React2Shell]> exit
# Reconnaissance système
[React2Shell]> id
[React2Shell]> whoami
[React2Shell]> uname -a
[React2Shell]> cat /etc/os-release
# Exploration du système de fichiers
[React2Shell]> pwd
[React2Shell]> ls -la
[React2Shell]> cat package.json
# Variables d'environnement (contiennent souvent des secrets)
[React2Shell]> printenv
[React2Shell]> echo $PATH
# Informations réseau
[React2Shell]> ifconfig
[React2Shell]> netstat -tulpn
| Commande | Description |
|---|---|
<toute commande shell> | Exécute une commande sur la cible |
help | Affiche le message d'aide |
exit / quit / q | Quitte l'outil |
Déployez cette règle Snort pour détecter les tentatives d'exploitation :
alert http any any -> $LAN_NETWORK any (
msg:"Tentative potentielle Next.js React2Shell / CVE-2025-55182";
flow:to_server,established;
content:"Next-Action"; http_header; nocase;
content:"multipart/form-data"; http_header; nocase;
pcre:"/Content-Disposition:\s*form-data;\s*name=\"0\"/s";
pcre:"/\"status\"\s*:\s*\"resolved_model\"/s";
pcre:"/\"then\"\s*:\s*\"\$1:__proto__:then\"/s";
classtype:web-application-attack;
sid:6655001;
rev:1;
)
Logique de détection :
Next-Action (spécifique RSC)multipart/form-dataname="0", status: "resolved_model", then: "$1:__proto__:then"Utilisez cette règle OSQuery pour analyser les versions de paquets vulnérables :
{
"queries": {
"detect_react2shell_vulnerable_packages": {
"query": "SELECT name, version, path FROM npm_packages WHERE (name='react-server-dom-parcel' AND (version='19.0.0' OR (version >= '19.1.0' AND version < '19.1.2') OR version='19.2.0')) OR (name='react-server-dom-turbopack' AND (version='19.0.0' OR (version >= '19.1.0' AND version < '19.1.2') OR version='19.2.0')) OR (name='react-server-dom-webpack' AND (version='19.0.0' OR (version >= '19.1.0' AND version < '19.1.2') OR version='19.2.0'));",
"interval": 3600,
"description": "Détecte les versions vulnérables des paquets React Server Components affectés par CVE-2025-55182",
"platform": "linux,windows,macos",
"version": "1.0"
}
}
}
Avantages :
Recherchez ces motifs dans vos logs d'application :
- Requêtes HTTP POST avec en-tête "Next-Action"
- Requêtes multipart/form-data inhabituelles vers la racine de l'application
- Messages d'erreur contenant "NEXT_REDIRECT" avec des valeurs de digest inattendues
- Pic d'erreurs 500 avec des traces de pile liées à React
- Création de processus enfant à partir de Node.js (execSync, spawn, exec)
# Vérifier les versions actuelles
npm list react-server-dom-webpack react-server-dom-parcel react-server-dom-turbopack
# Mettre à jour React vers la version corrigée
npm install [email protected] [email protected]
# Mettre à jour Next.js vers la dernière version corrigée
npm install next@latest
# Vérifier les mises à jour
npm list react react-dom next
# Nettoyer le cache et reconstruire
rm -rf .next node_modules package-lock.json
npm install
npm run build
Bloquer les motifs suspects :
- Requêtes avec en-tête "Next-Action" provenant de sources non fiables
- Données multipart/form-data avec des structures JSON suspectes
- Requêtes correspondant aux motifs de signature d'exploitation
# Exemple de workflow GitHub Actions
name: Scan de sécurité
on: [push, pull_request]
jobs:
dependency-check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Vérifier les paquets React vulnérables
run: |
npm audit --audit-level=critical
npm list react-server-dom-webpack react-server-dom-parcel react-server-dom-turbopack
Configurer des alertes pour :
# Créer une nouvelle application Next.js avec une version vulnérable
npx [email protected] vulnerable-app
cd vulnerable-app
# Installer la version vulnérable de React
npm install [email protected] [email protected]
# Démarrer le serveur de développement
npm run dev
Créer un Dockerfile :
FROM node:18-alpine
WORKDIR /app
# Créer une application Next.js de base
RUN npx [email protected] vulnerable-app --typescript --tailwind --app --no-src-dir
WORKDIR /app/vulnerable-app
# Installer des versions vulnérables de React
RUN npm install [email protected] [email protected]
EXPOSE 3000
CMD ["npm", "run", "dev"]
Construire et exécuter :
docker build -t react2shell-lab .
docker run -p 3000:3000 react2shell-lab
Créer docker-compose.yml :
version: '3.8'
services:
vulnerable-app:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=development
volumes:
- ./app:/app/vulnerable-app
Exécuter :
docker-compose up -d
Tester avec curl :
curl -X POST http://localhost:3000/ \
-H "Next-Action: x" \
-H "Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3Sad" \
--data-binary @exploit_payload.txt
Les contributions sont les bienvenues ! Veuillez suivre ces directives :
git checkout -b feature/amelioration)git commit -am 'Ajouter une nouvelle méthode de détection')git push origin feature/amelioration)Ce projet est sous licence MIT - voir le fichier LICENSE pour plus de détails.
Tinashe
Cerberus Secure est la division cybersécurité d'iConnect SA, spécialisée dans :
Cette vulnérabilité a été divulguée de manière responsable par des chercheurs en sécurité à l'équipe React. Cette PoC est publiée après :
Chronologie :
Rappel : Utilisez cet outil de manière responsable et uniquement sur des systèmes que vous êtes autorisé à tester.
Pour toute question, préoccupation ou problème de sécurité concernant ce dépôt, veuillez ouvrir un ticket ou contacter directement le mainteneur.