Valentin LEROUGE

Blog

CVE-2025-66478 et React2Shell : comprendre la faille critique React/Next.js

Synthese de la vulnerabilite critique React Server Components (React2Shell) impactant React et Next.js, avec impact et remediation.

06 Dec 2025Valentin Lerouge3 min de lecture
#cybersecurite#react#nextjs#cve

React et Next.js, deux piliers de l'ecosysteme JavaScript, ont ete touches par une vulnerabilite critique notee 10.0 au CVSS. Cette faille, connue sous le nom de React2Shell (CVE-2025-55182), a egalement ete referencee cote Next.js via la CVE-2025-66478 (doublon). Elle permet une execution de code a distance a partir d'une requete non authentifiee.

Contexte : React, RSC et Next.js

React est une bibliotheque JavaScript open source creee par Meta, largement utilisee pour construire des interfaces web. Avec les React Server Components (RSC), une partie du rendu peut etre executee directement sur le serveur.

Next.js est un framework base sur React qui facilite le rendu hybride (SSR, SSG, RSC). Son adoption massive explique l'ampleur de l'impact lorsqu'une faille touche la chaine RSC.

Qui est vulnerabile ?

La faille touche React 19.0.0 a 19.2.0 avec les packages suivants :

  • react-server-dom-parcel
  • react-server-dom-turbopack
  • react-server-dom-webpack

Cote Next.js, les versions affectees incluent :

  • 15.x
  • 16.x
  • 14.3.0-canary.77 et suivantes

Frameworks/bundlers utilisant RSC vulnerables :

  • react-router
  • waku
  • parcel/rsc
  • vitejs/plugin-rsc
  • rwsdk

Analyse de la vulnerabilite (resume)

L'origine vient d'une deserialisation insuffisamment filtree. Une requete POST peut fournir une charge utile dont le champ id est splitte par #, puis resolu via requireModule. L'acces a moduleExports[metadata[2]] parcourt la prototype chain, ce qui permet d'atteindre des fonctions internes.

Exemple de payload simplifiee :

{ "id": "fs#constructor", "bound": [] }

Ce qui revient a appeler :

__webpack_require__('fs')['constructor']

Une fois le module resolu, le bound passe en argument peut declencher une execution de code (RCE) via vm, child_process, ou, en variante, via fs.

Exemple de requete exploitable

POST /formaction HTTP/1.1
Content-Type: multipart/form-data; boundary=----Boundary

------Boundary
Content-Disposition: form-data; name="$ACTION_REF_0"

------Boundary
Content-Disposition: form-data; name="$ACTION_0:0"

{payload}
------Boundary--
  • $ACTION_REF_0 declenche le parsing metadata
  • $ACTION_0:0 contient le JSON avec id et bound

Impact

Une faille RCE non authentifiee dans un framework aussi repandu que React/Next.js a un impact majeur : acces serveur, exfiltration de donnees, ou compromission persistante.

Comment detecter une tentative d'exploitation

Inspectez les logs pour :

  • champs $ACTION_REF_ et $ACTION_ID_
  • presence de #constructor, #__proto__ ou #prototype
  • references aux modules vm, child_process, process

Remediation

Mettre a jour immediatement :

  • Next.js : 15.0.5, 15.1.9, 15.2.6, 15.3.6, 15.4.8, 15.5.7, 16.0.7 ou revenir a une version canary < 14.3
  • React : 19.0.1, 19.1.2, 19.2.1

Mesures additionnelles :

  • Ajouter des regles WAF pour bloquer : #constructor, #__proto__, #prototype, vm#runInThisContext, vm#runInNewContext, child_process#execSync