
Avis et analyse de CVE-2025-55182 (React2Shell), RCE par désérialisation RSC Flight, avec décomposition de la cause racine, déroulement de l'attaque, diff du correctif et règles de détection Sigma/Suricata/WAF.
Date de dernière vérification : 2026-11-04 (KST). Chaque valeur chiffrée ne provient que des sources citées dans les References ci-dessous ; lorsque les valeurs diffèrent entre les sources, toutes sont indiquées.
Function et d'exécuter du JavaScript arbitraire.react-server-dom-webpack / -parcel / -turbopack 19.0.0, 19.1.0, 19.1.1, 19.2.0 et les frameworks qui les utilisent — notamment Next.js 15.x / 16.x App Router. Même sans définir directement de Server Function, il suffit de prendre en charge RSC pour être affecté.| Élément | Contenu |
|---|---|
| ID CVE | CVE-2025-55182 (React) / CVE-2025-66478 pour Next.js a été rejeté comme doublon (Rejected) |
| Alias | React2Shell |
| Date de publication | 2025-12-03 (avis de l'équipe React, correctif déployé le même jour) |
| Découvreur | Lachlan Davidson (signalé le 2025-11-29 via le Meta Bug Bounty) |
| Produits/versions affectés | react-server-dom-webpack, react-server-dom-parcel, react-server-dom-turbopack 19.0.0, 19.1.0, 19.1.1, 19.2.0 / Next.js canary 14.3.0-canary.77 et supérieur, 15.x, 16.x (App Router) |
| Versions corrigées | Correctif RCE : React 19.0.1 / 19.1.2 / 19.2.1, Next.js 15.0.5 / 15.1.9 / 15.2.6 / 15.3.6 / 15.4.8 / 15.5.7 / 16.0.7 Versions finales recommandées (incluant les vulnérabilités ultérieures) : React 19.0.3 / 19.1.4 / 19.2.3 (voir « Vulnérabilités ultérieures » ci-dessous) |
| CVSS v3.1 | 10.0 Critique — CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H |
| CVSS v4.0 | Non confirmé auprès des sources primaires à la date de rédaction de ce document |
| CWE | CWE-502 Deserialization of Untrusted Data (Vercel GHSA-9qr9-h5gf-34mp, GitLab Advisory DB). CWE non renseigné dans l'entrée CISA KEV |
| Exploitation réelle | Exploitation confirmée. Inscription au CISA KEV le 2025-12-05, échéance d'action pour les agences fédérales le 2025-12-12, utilisation dans des campagnes de rançongiciels : Known. AWS a observé des tentatives d'exploitation dans les heures suivant la publication |
| Composant | Versions affectées | Versions corrigées |
|---|---|---|
react-server-dom-webpack / -parcel / -turbopack | 19.0.0 | 19.0.1 (19.0.3 recommandé) |
| 〃 | 19.1.0, 19.1.1 | 19.1.2 (19.1.4 recommandé) |
| 〃 | 19.2.0 | 19.2.1 (19.2.3 recommandé) |
| Next.js 15.x (App Router) | 15.0 ~ avant correctif 15.5 | 15.0.5 / 15.1.9 / 15.2.6 / 15.3.6 / 15.4.8 / 15.5.7 |
| Next.js 16.x (App Router) | antérieur à 16.0.7 | 16.0.7 |
| Next.js canary | 14.3.0-canary.77 et supérieur | 15.6.0-canary.58 / 16.1.0-canary.12 (les utilisateurs de 14.3 canary doivent rétrograder vers 14.x stable) |
| Autres outils d'intégration RSC | React Router (unstable RSC API), Waku, plugin RSC Parcel, plugin RSC Vite (@vitejs/plugin-rsc), RedwoodSDK, Expo, etc. | Dernière version de chaque outil + react-server-dom-* corrigé |
Non affecté : applications React purement côté client sans serveur, Next.js 13.x / 14.x stable, applications Pages Router, déploiements sur Edge Runtime.
Après le correctif de React2Shell, des recherches supplémentaires sur RSC ont conduit à la divulgation successive de vulnérabilités qui ne sont pas des RCE. Le RCE lui-même a été corrigé dans 19.0.1 / 19.1.2 / 19.2.1, mais pour bloquer également les vulnérabilités ci-dessous, la dernière version est nécessaire.
| CVE | Type | CVSS v3.1 | Publication | Version corrigée |
|---|---|---|---|---|
| CVE-2025-55184 | Déni de service (DoS) | 7.5 | 2025-12-11 | 19.0.2 / 19.1.3 / 19.2.2 (incomplet) |
| CVE-2025-55183 | Exposition du code source | 5.3 | 2025-12-11 | 19.0.2 / 19.1.3 / 19.2.2 |
| CVE-2025-67779 | DoS dû à un correctif incomplet de CVE-2025-55184 | 7.5 | 2025-12-12 | 19.0.3 / 19.1.4 / 19.2.3 |
Certains articles d'éditeurs de sécurité (par exemple la mise à jour de Zscaler) indiquent que « le correctif initial de CVE-2025-55182 était incomplet ». Cependant, selon les avis de React et de GitLab, ce qui était incomplet concerne le correctif du DoS (CVE-2025-55184), et nous n'avons pas pu confirmer de source primaire indiquant que le correctif de la RCE avait été contourné. Dans un cas comme dans l'autre, la mesure recommandée est d'utiliser au minimum 19.0.3 / 19.1.4 / 19.2.3.
| Date | Événement |
|---|---|
| 2025-11-29 | Signalement par Lachlan Davidson via le Meta Bug Bounty |
| 2025-11-30 | Confirmation par les chercheurs en sécurité de Meta, début des correctifs avec l'équipe React |
| 2025-12-03 | Publication de l'avis et du correctif React (19.0.1 / 19.1.2 / 19.2.1) et de l'avis Next.js (CVE-2025-66478). Les fournisseurs cloud et WAF, prévenus à l'avance, déploient des règles de protection |
| 2025-12-03 ~ 04 | AWS observe, dans les heures suivant la publication, des tentatives d'exploitation par des groupes liés à la Chine (Earth Lamia, Jackpot Panda). Zscaler observe plus de 4 100 tentatives d'exploitation durant les 2 premières heures |
| 2025-12-05 | Ajout au catalogue CISA KEV (échéance 12-12). Microsoft détecte à partir de ce jour une activité d'exploitation réelle |
| 2025-12-11 | Publication des vulnérabilités ultérieures CVE-2025-55184 / 55183 |
| 2025-12-12 | Publication de CVE-2025-67779 (correctif incomplet), déploiement de 19.0.3 / 19.1.4 / 19.2.3 |
| 2025-12-15 | Publication par Microsoft de l'analyse post-exploitation et du guide de chasse |
RSC échange les données entre client et serveur via un protocole de sérialisation propre appelé Flight. Lorsqu'un client appelle une Server Function, le navigateur envoie les arguments dans une requête POST multipart/form-data, et chaque champ de formulaire devient un chunk numéroté.
$<id> référence la valeur d'un autre chunk, $@<id> référence l'objet chunk lui-même, $B<id> désigne un traitement Blob.then(). En JavaScript, await appelle then() lorsqu'il rencontre un thenable, et si le résultat est lui-même un thenable, il continue à l'appeler récursivement.getOutlinedModel()Le gestionnaire de réponse Flight côté serveur (packages/react-server/src/ReactFlightReplyServer.js), dans getOutlinedModel(), découpe une référence de la forme $<id>:<prop1>:<prop2> selon le séparateur :, puis suit les propriétés du chunk cible dans l'ordre chunk[prop1][prop2].