React à Shell : L’Exploit critique qui a failli mettre le feu à internet

Photo of author
Écrit par Mimie

Mon goût pour la liberté : internet, lectures, culture, et quelques tutos utiles.

⇒ Mon roman

Imaginez cette scène : dans mon terminal, je lance une ancienne version vulnérable de React (la 16.0.6, pour les besoins de la démonstration). Le message s’affiche instantanément : une vulnérabilité critique.

L’application tourne sur localhost:3000. Dans un autre terminal, j’exécute un script Python de preuve de concept (PoC) …et je parviens à exécuter du code à distance sur le serveur. Ce scénario n’est pas un exercice théorique, mais la matérialisation de CVE-2024-55182, une faille critique qui a fait sursauter l’écosystème React et Next.js.

Ces derniers jours, une partie d’internet a paniqué méchamment face à l’annonce d’une vulnérabilité critique CVSS 10.0 dans React, permettant une exécution de code à distance (RCE) non authentifiée via les composants serveur. Soyons clair : je parle ici de 2 CVE liés :

CVE-2024-55182 : La vulnérabilité racine dans les composants serveur React (versions 19.0 à 19.2.0).

CVE-2024-66478 : L’application spécifique de cette vulnérabilité dans le routeur d’application de Next.js.

Selon les experts de Wiz, l’impact est massif : près de 40% des environnements cloud contiendraient des instances React/Next.js vulnérables, et 44% auraient des instances Next.js exposées publiquement à internet.

Au cas où vous l’auriez manqué, une grande partie d’internet s’est mise à courir dans tous les sens comme des poulets sans tête à cause d’une vulnérabilité critique dans React. Ce n’est pas quelque chose que nous avons l’habitude d’avoir sur notre carte de bingo 2025. Il s’agit d’une vulnérabilité d’exécution de code à distance non authentifiée et ils recommandent de mettre à jour immédiatement car il s’agit d’un CVSS 10.0, le plus élevé possible. La vulnérabilité est présente dans les versions 19.0, 19.1.0, 19.1.1 et 19.2.0 de nombreux éléments utilisant le serveur React.

Je tiens à préciser que je ne suis pas un spécialiste du front-end. Je n’utilise pas beaucoup React ou Next.js et, pour être honnête, je ne m’y connais pas beaucoup. Je vais donc m’en remettre aux autres pour cette partie.

Je ne veux pas prendre cela à la légère. Il s’agit d’une vulnérabilité critique de niveau 10.0, une vulnérabilité d’exécution de code à distance pré-authentification dans les composants du serveur React. Donc, une grande partie d’internet pourrait prendre feu. Mes amis de Wiz affirment que près de 40 % des environnements cloud contiennent des instances de Next.js ou React qui sont vulnérables. Si l’on considère uniquement Next.js, le framework lui-même est présent dans près de 70 % des environnements, dont un peu plus de 60 % sont publics et ouverts à Internet. En faisant un rapide calcul, on constate que 44 % de tous les environnements cloud ont des instances Next.js exposées publiquement.

Pour être clair, nous suivons ici 2 vulnérabilités différentes. Celle dont j’ai montré à nouveau l’entrée NVD était React, mais 66478 est spécifique à Next.js. La vulnérabilité provient de l’implémentation React en amont. C’est notre référence 55182, mais cet avis avec 66478 est spécifique à l’utilisation du routeur d’application dans Next.js. Encore une fois, le lien se trouve dans la description de la vidéo.

Parlons de la preuve de concept

J’ai vu certaines des discussions et conversations en ligne qui ont suivi, et beaucoup de gens disent que c’est ça. C’est la véritable explication et la preuve de concept complète de la vulnérabilité RCE de React. C’est la preuve de concept que j’ai présentée au début de la vidéo. Je vais essayer de vous expliquer tout cela, mais je vous prie de bien vouloir prendre ces informations avec des pincettes. Je ne connais pas tous les détails de cette affaire. Prenez donc ces informations pour ce qu’elles sont.

React propose des fonctions serveur, qui sont essentiellement similaires à RPC ou à un appel de procédure à distance via HTTP. Elles récupèrent des données à partir d’autres instances afin de garantir une faible latence ou d’effectuer des requêtes d’authentification pour lesquelles le client ne dispose pas d’informations d’identification. React utilise pour cela le protocole React Flight. Cela aboutit à la sérialisation ou à la désérialisation des valeurs. Tout cela est représenté ou encapsulé sous forme de différents blocs. Et vous pouvez voir ici un peu de logique à cela.

Zéro, en tant que premier index, est défini avec une sorte de chaîne qui ressemble à un signe dollar entre crochets pour représenter une entité, un objet abstrait. Puis, plus loin dans l’entrée suivante ID de un ici, ils ajoutent plus de structure à cet objet en notant qu’il s’agit d’un fruit avec une propriété donnée, le nom d’un fruit, et que la valeur de cette propriété pourrait être quelque chose comme cerise. Et ensuite, ceux-ci sont référencés. Ils finissent par désérialiser les données pour représenter un objet fruit avec un nom donné, cerise.

Bien sûr, cela peut faire beaucoup plus, mais je pense que cela suffit pour comprendre. La vulnérabilité réside finalement dans le fait que cela ne sera pas vérifié ou que React lui-même ne vérifie pas si la clé est définie pour l’objet. Vous pouvez donc récupérer le prototype ou un peu plus de valeurs de champs de métadonnées inhérentes et implicites à cette idée abstraite. Ils utilisent cela lorsqu’ils prennent cet ID ou cet ID de chunk zéro signe dollar un, mais en accédant en fait à une fonction spéciale proto prototype dunder pour pouvoir accéder non pas à cette fonction, mais au constructeur et au constructeur pour accéder à la fonction d’initialisation de cet objet.

Encore une fois, permettez-moi d’ajouter le contexte.

Je ne sais pas si c’est la bonne explication ou la meilleure. Je laisse à nouveau le soin aux experts de répondre à cette question grâce au lien dans la description de la vidéo. Mais quand ils commencent à jouer avec ces éléments, car ils sont tous asynchrones avec des appels await et async, ceux-ci sont alors possibles lorsque vous avez d’autres occasions de faire en sorte que des choses se produisent après le traitement de certaines données, vous pouvez alors essentiellement exécuter cette fonction.

Eh bien, je pense qu’il y a une astuce, car vous ne pouvez pas appeler la fonction aussi facilement, mais vous pouvez récupérer le constructeur de la fonction. Ensuite, vous voudrez éventuellement l’exécuter, mais avec une valeur contrôlée par l’utilisateur, comme ce que vous voulez déclencher et exécuter. Ce n’est toutefois pas aussi facile. Apparemment, je pense qu’il reste d’autres artefacts dans le langage et dans la manière de désérialiser ou de travailler avec les données. Je suppose que slice est une fonction qui gêne.

Je ne vais pas prétendre que je comprends tout ce qui se passe ici, mais ce n’est pas grave. Au final, ils disposent d’une mise en scène suffisante pour créer un objet avec des propriétés vagues que le proto et le prototype sont capables de décorer et de créer un chunk qui pourrait utiliser certaines des fonctionnalités plus natives et naturelles auxquelles nous sommes habitués dans le monde du CTF ou du capture the flag, où nous pouvons exécuter un sous-processus réel et lancer certains processus de commande système. Le processus enfant et l’exécution se synchronisent avec tout ce que vous voulez lancer. Peut-être s’agit-il d’un shell inversé. Peut-être s’agit-il d’un code. Peut-être s’agit-il de la calculatrice comme preuve de concept.

Tout ce travail de désérialisation est effectué avant même que l’action demandée ne soit validée dans certaines des autres fonctions qui font partie du processus ici. Ainsi, le simple fait de définir un en-tête suffit à déclencher la vulnérabilité. Je pense que cela provient des actions du serveur React dans l’une des anciennes représentations ou de la façon dont ils appelaient auparavant de nombreux composants du serveur React.

Tout ce qu’ils finissent par faire pour le correctif, c’est simplement ajouter une petite instruction if ridicule.

  • Suivez-vous le proto ?
  • Connaissez-vous le prototype de tout ce qui se trouve dans le chunk ?
  • Existe-t-il pour vous en tant qu’objet ?

Vous remarquerez qu’ils font des essais avec cela dans Burp Suite. Ils viennent de lancer OBS pour enregistrer cela. Ils ont lancé une application React et Next par défaut, puis ils ont simplement cliqué sur le bouton « Go » dans Burp Suite lorsque celui-ci était réglé sur la cible pour envoyer cette requête. C’est comme un défi amusant NodeJS ou tout autre défi de runtime JavaScript sur serveur que vous verriez dans un capture the flag.

Conclusion : Patchez et corrigez !

Je pense que cela va probablement exploser et aboutir à un scénario de type log4shell. Je suis désolé pour ce traumatisme et ce syndrome de stress post-traumatique.

Je pense que pour tous ceux qui utilisent Vercel, il semble que Big G partage le fait que leur petit garçon va s’en occuper et verrouiller cela. Cela bloquera la variante. Mais corrigez, mettez à jour, patchez, corrigez tout ce que vous pouvez. Faites ce que vous avez à faire.

Le correctif : une simple vérification

La solution déployée par l’équipe React est étonnamment simple dans son principe : ajouter une vérification stricte pendant la désérialisation.

  1. Identifiez et mettez à jour : Vérifiez immédiatement les versions de React (>= 19.2.1) et de Next.js (>= 15.2.4) dans vos projets. Mettez à jour sans délai.
  2. Ne sous-estimez pas l’impact : Même si vous n’utilisez pas les Actions Serveur, la composante vulnérable peut être présente. Le principe de précaution s’applique.
  3. Pour les utilisateurs de Vercel : La plateforme a appliqué des atténuations, mais mettre à jour votre code source reste impératif.
  4. Surveillance : Examinez les logs de vos applications pour détecter toute tentative d’exploitation (requêtes HTTP étranges vers les endpoints d’actions).

Questions fréquentes

Quelles versions de React sont concernées par cette vulnérabilité ?

Les versions concernées sont 19.0, 19.1.0, 19.1.1 et 19.2.0, principalement dans les composants serveur React.

Qu’est-ce que React to Shell ?

C’est une vulnérabilité critique de type RCE (Remote Code Execution) non authentifiée, exploitée via la désérialisation dans les composants serveur React.

Next.js est-il également concerné ?

Oui, Next.js est concerné via le CVE-2024-66478, qui concerne l’utilisation du routeur d’application avec React Server Components.

Comment l’exploit fonctionne-t-il ?

Il exploite une faiblesse dans la désérialisation des chunks React Flight, permettant d’exécuter du code arbitraire côté serveur via des requêtes HTTP spécialement conçues.

Quelle est la solution ?

Mettre à jour immédiatement React, Next.js et tous les composants associés. Le patch consiste à vérifier la présence du prototype dans les chunks désérialisés.

Références

Sources fiables

CVE-2024-55182 Détail

Auteur : National Vulnerability Database (NIST)

La recherche de Wiz découvre une vulnérabilité dans les composants serveur React touchant 40% des environnements cloud

Auteur : Howard Solomon, IDG NS (adapté par Jean Eylian) – Publié le : 4 décembre 2025

Références de mon blog

Advent of Cyber 2025 : 24 défis gratuits pour débuter en cybersécurité

Auteur : Grégory HéniquePublié le : 30 novembre 2025

La cybersécurité dans le domaine du jeu vidéo

Auteur : Des Geeks et des lettresPublié le : 5 septembre 2024

VPN - Explorer Internet librement

Promo spéciale NordVPN : jusqu'à -74%
Sécurise tes connexions et navigue librement en quelques clics.

Laisser un commentaire