L'avis de sécurité de décembre 2025 de l'équipe React marque un changement de paradigme dans la sécurité des applications web. Alors que l'industrie adopte rapidement le Server-Side Rendering (SSR) via React Server Components (RSC), la surface d'attaque a migré du DOM du client vers la frontière de sérialisation du serveur. CVE-2025-55184 n'est pas un banal bogue d'épuisement des ressources ; il s'agit d'un système sophistiqué de contrôle de l'utilisation des ressources. Complexité algorithmique Déni de service en ciblant l'architecture fondamentale de la boucle d'événements de Node.js. En exploitant la désérialisation récursive des promesses au sein de la boucle d'événements de Node js. Protocole de volun attaquant non authentifié peut induire Affaiblissement de la file d'attente des micro-tâchesLe processus du serveur est ainsi rendu comateux tout en gardant les ports TCP ouverts. Ce guide définitif dissèque la vulnérabilité au niveau des fils, explore le mécanisme de récursion "Ouroboros" et démontre comment Penligent s'appuie sur le fuzzing différentiel piloté par l'IA pour valider cette faille sans perturber la disponibilité de la production.

L'architecture d'un crash : RSC, vol et boucle d'événements
Pour apprécier pleinement la gravité de CVE-2025-55184, nous devons d'abord déconstruire la couche de communication propriétaire qui alimente Next.js App Router et React 19 : le protocole Protocole de vol.
Le protocole de vol Format du fil de fer
Contrairement à REST ou GraphQL, qui renvoient généralement du JSON statique, RSC utilise un format de flux hybride basé sur des lignes, conçu pour résoudre les arborescences de composants de manière incrémentielle.
Un flux typique de réponses à un vol se présente comme suit :
HTTP
1:I{"id":134,"chunks":["app/page.js"],"name":"default"} 2:{"title":"Welcome","content":"$@1"} 3:{"$":"$@2"}
- Ligne 1: Importe un module (composant client).
- Ligne 2: Définit un objet JSON référençant le chunk 1.
- Ligne 3: Définit une référence au chunk 2.
La caractéristique fatale : La sérialisation asynchrone
React permet aux développeurs de transmettre des promesses du serveur au client. Lorsque le sérialiseur rencontre une promesse en attente, il émet un espace réservé. Le désérialiseur (à l'extrémité réceptrice, qui peut également être un serveur dans les architectures à plusieurs niveaux) est programmé pour attendre que ces promesses soient résolues.
Cette exigence nécessite une Stratégie de résolution récursive: Si la promesse A se résout en promesse B, le désérialiseur doit s'abonner à la promesse B. C'est dans cette récursion que réside la vulnérabilité.
Node.js Internals : Starvation de la file d'attente des microtâches
Pourquoi cet exploit est-il si dévastateur par rapport à une while(true) boucle ? La réponse se trouve dans la planification des tâches du moteur V8.
- Macrotâches: Minuteries (
setTimeout), les rappels d'E/S,setImmediate. - Microtâches: Promesse callbacks (
.alors,.capture),process.nextTick.
Le mécanicien de la famine :
La boucle d'événements Node.js fonctionne selon une règle de priorité stricte : La file d'attente des microtâches doit être complètement vidée avant que la boucle d'événements puisse passer à la phase suivante.
Dans le cadre d'un exploit CVE-2025-55184, l'attaquant envoie une charge utile dans laquelle une promesse se résout en elle-même (ou en une chaîne renvoyant à elle-même).
- Le désérialiseur planifie un
.then()pour gérer la résolution. - Le callback s'exécute, constate la récursivité et planifie autre
.then(). - Ce qui est essentiel, c'est que cela se produise de manière synchrone concernant le traitement de la file d'attente. La longueur de la file d'attente n'atteint jamais zéro.
- Impact: Les rappels d'E/S réseau (qui traitent les nouvelles demandes), les sondes du bilan de santé et les signaux du système d'exploitation sont bloqués en permanence. Le processus est vivant (le PID existe), les ports sont ouverts (SYN-ACK fonctionne au niveau du système d'exploitation), mais l'application est en état de mort cérébrale.
Rétro-ingénierie de l'exploit
La charge utile "Ouroboros
La vulnérabilité existe dans react-server-dom-webpack (et ses variantes pour Parcel/Turbopack). La version non corrigée valeur du processus n'a pas de limitation de profondeur ou de détection de cycle pour les types de référence.
Un attaquant peut exploiter cette situation en construisant une Graphique cyclique dirigé (GDC) dans la charge utile du vol.
Code d'exploitation conceptuel (niveau du protocole)
Si le codage binaire est complexe, la structure logique du vecteur d'attaque est élégamment simple :
JavaScript
`// Une représentation JSON de la structure de vol malveillante // Cible : Next.js App Router Endpoint (POST /)
{"id" : "root", "chunks" : [], "value" : { // Nous définissons un objet Promise manuellement en utilisant la syntaxe Flight "$" : "$Promise", "status" : "fulfilled", "value" : { // La valeur de cette promesse résolue est... ELLE-MÊME. "$" : "$@root" } } }`
Lorsque le serveur analyse ceci :
- Il voit une promesse accomplie.
- Il déballe la valeur.
- Il voit une référence à l'objet racine (qui est la promesse).
- Il planifie une micro-tâche pour déballer à nouveau l'objet racine.
- GOTO 1.
Cette boucle se déroule entièrement en mémoire, contournant ainsi les WAF traditionnels qui recherchent des signatures d'injection SQL ou des corps de requête volumineux. La charge utile est souvent inférieure à 1 Ko.
La saga de la "correction incomplète" (CVE-2025-67779)
Il est essentiel de noter que le correctif initial pour cette vulnérabilité a été contourné en quelques jours. Le premier correctif tentait de suivre la profondeur de la récursion, mais ne tenait pas compte de certaines variations de la structure imbriquée (par exemple, l'enroulement du cycle à l'intérieur d'une structure de type Carte ou Set (jeu de mots)). Cela a conduit à la mise en place d'un système de gestion de l'information. CVE-2025-67779. Par conséquent, une simple "mise à jour" ne suffit pas ; il faut s'assurer que l'on se trouve sur le site de l définitif versions corrigées (React 19.0.3+ / Next.js 15.0.6+).
Le partenaire silencieux : CVE-2025-55183 (exposition du code source)
Tandis que 55184 détruit la disponibilité, CVE-2025-55183 détruit la confidentialité. Cette vulnérabilité complémentaire a été divulguée simultanément.
Le mécanisme de fuite :
Les actions serveur sont des fonctions internes. Cependant, si un attaquant demande une action serveur par ID en tant que valeur (au lieu de l'invoquer), le sérialiseur vulnérable la traite comme un objet de données. Ce faisant, il sérialise le corps de la fonction compilée sous la forme d'une chaîne de caractères.
Impact:
- Extraction logique: Les attaquants peuvent lire la logique de validation de votre backend (
if (!user.isAdmin) ...). - Le grattage secret: Les clés d'API codées en dur ou les points de terminaison internes sont révélés.
- Découverte de l'API de l'ombre: Les actions de serveur inutilisées ou cachées deviennent des cibles d'attaque visibles.
Vérification avancée : L'approche pénligente
Dans un environnement où les enjeux sont importants, "essayer de faire planter le serveur" pour prouver une vulnérabilité n'est pas professionnel et est dangereux. Penligent utilise des systèmes d'intelligence artificielle Exploitation sûre pour vérifier ces CVE sans interruption de service.
Stratégie 1 : Sondage par récursion limitée (DoS sûr)
Au lieu d'une boucle infinie, l'agent Penligent AI construit un payload avec un Profondeur de récursion finie ($N=5000$).
- La sonde: Une chaîne de promesses récursive qui se termine après 5000 itérations.
- Analyse heuristique:
- Vulnérable: Le serveur traite la chaîne. Penligent détecte un Dérive de latence (par exemple, temps de réponse = ligne de base + 200 ms) et un pic transitoire dans l'utilisation du tas.
- Rattaché: Le nouveau mécanisme de sécurité de React 19 provoque immédiatement une erreur de type "Cyclic Reference". La réponse est quasi instantanée (500 Internal Server Error).
- Conclusion: Si la latence est corrélée à la profondeur ($T \propto N$), la vulnérabilité est confirmée sans interrompre le processus.
Stratégie 2 : Fuzzing différentiel pour les fuites de source (CVE-2025-55183)
Détecter la vulnérabilité de l'exposition du code source :
- Prise d'empreintes digitales: Penligent identifie les ID d'action de serveur disponibles à partir de paquets légitimes côté client.
- Injection réfléchissante: L'agent envoie des demandes de vol modifiées en essayant de "faire écho" à ces ID en tant que propriétés de données.
- Correspondance de motifs IA: Le flux de réponses est analysé. Si l'IA détecte des signatures de fonctions JavaScript (par exemple,
fonction asynchrone $...,var _0x...) dans la réponse JSON, il signale une erreur de type Fuite d'informations critiques.

Plan d'action de l'ingénieur et mesures correctives
La fenêtre d'exploitation est grande ouverte. Des robots automatisés recherchent déjà les instances Next.js 15.0.x exposées.
1. La matrice de mise à niveau (application stricte)
Vous devez vous assurer que votre arbre de dépendance se résout vers les versions sûres. Ne vous fiez pas aux carets semver (^) seul ; vérifiez votre pnpm-lock.yaml ou package-lock.json.
| Paquet | Gamme vulnérable | Version sûre (minimum) |
|---|---|---|
| react-server-dom-webpack | < 19.0.3 | 19.0.3 |
| Next.js | 15.0.0 – 15.0.5 | 15.0.6+ (ou 14.2.34+ pour la v14) |
2. Résolution des dépendances - dérogations
Parce que react-server-dom-webpack est souvent une dépendance imbriquée, vous devez forcer la résolution en package.json afin d'éviter que d'anciennes versions ne se faufilent :
JSON
// package.json { "pnpm" : { "overrides" : { "react-server-dom-webpack" : "19.0.3", "react-server-dom-turbopack": "19.0.3" } } }
3. Validation continue
La sécurité n'est pas une solution ponctuelle. Il faut utiliser Penligent pour surveiller en permanence votre déploiement. Au fur et à mesure que de nouveaux contournements (comme celui observé dans CVE-2025-67779) apparaissent, les modèles d'IA de Penligent sont mis à jour pour tester ces variations, garantissant ainsi que votre périmètre reste impénétrable contre les attaques logiques évolutives.
Références et liens d'autorité:
- Avis de sécurité React : Déni de service et exposition du code source
- Mise à jour de sécurité officielle de Next.js (décembre 2025)
- Node.js Docs : La boucle d'événements, les minuteries et process.nextTick()
- NIST NVD - CVE-2025-55184 Detail


