Vulnérabilité d'exécution de code à distance (RCE) dans React et Next.js
(github.com/vercel)- Une vulnérabilité de sécurité permettant une exécution de code à distance (RCE) a été signalée dans React et Next.js
- Le problème provient du package Next.js ; un attaquant peut provoquer l’exécution de code arbitraire en envoyant une entrée malveillante
- Vercel a rendu publique la vulnérabilité via l’avis de sécurité GitHub (GHSA-9qr9-h5gf-34mp) et a publié une version mise à jour
- Les utilisateurs doivent effectuer une mise à niveau vers la dernière version pour réduire ce risque
- Ce cas rappelle l'importance d'une gestion de la sécurité au niveau du framework
Vue d'ensemble de la vulnérabilité RCE
- Une vulnérabilité permettant l’exécution de code à distance a été découverte dans les environnements Next.js et React
- Il existe un risque qu’un attaquant puisse exécuter du code JavaScript arbitraire côté serveur
- Cette vulnérabilité survient dans le flux de traitement du code interne du package Next.js
- Les détails sur les fonctions ou modules spécifiques touchés n’ont pas été rendus publics
Impact et réponse
- Vercel a officiellement annoncé le problème via l’avis de sécurité GitHub (GHSA-9qr9-h5gf-34mp)
- Cet avis a été publié dans la section des avis de sécurité du dépôt Next.js
- Les versions touchées n’ont pas été précisées, mais une version corrigée a été déployée
- Il est recommandé aux utilisateurs d’effectuer une mise à niveau vers la dernière version stable
Recommandations de sécurité et actions
- Tous les projets utilisant le package Next.js doivent vérifier immédiatement leur version
- La version de Next.js dans
package.jsondoit être maintenue à jour
- La version de Next.js dans
- En dehors de la publication de la version corrigée, Vercel n’a pas mentionné de mesures d'atténuation supplémentaires
- Les détails techniques de la vulnérabilité restent non divulgués, seules des informations limitées ont été fournies pour des raisons de sécurité
Importance
- Cette vulnérabilité illustre le risque d'exécution de code dans un environnement de rendu côté serveur
- Les opérateurs de services basés sur React et Next.js doivent appliquer régulièrement les mises à jour de sécurité
- Une vulnérabilité au niveau du framework peut avoir un impact direct sur la sécurité globale de l’application
1 commentaires
Avis Hacker News
Cette vulnérabilité est un cas où le pire scénario redouté depuis l’introduction de RSC/server actions est devenu réalité
Le serveur désérialisait tel quel une entrée non fiable du client pour retrouver et exécuter un module ainsi qu’un nom d’export
On peut la bloquer avec un correctif sur
hasOwnProperty, mais le problème de fond est qu’on n’avait pas clairement pris conscience que React construisait en réalité une couche RPCLes frameworks RPC traditionnels comme gRPC ou SOAP définissent clairement les frontières via des schémas explicites et des définitions de service, alors que React est plus risqué parce qu’il expose toutes les API visibles par le bundler
Il est probable que des problèmes de sécurité liés à cette conception se reproduisent à l’avenir
Même avec un schéma explicite, cela ne sert à rien si, à la dernière étape, une entrée non fiable peut référencer n’importe quel objet dans l’espace de noms du serveur
Seules les fonctions marquées avec
"use server"sont exposées, et l’équipe React est consciente qu’elle conçoit un système RPCCe type de bug peut tout à fait survenir dans d’autres systèmes RPC également (je contribue à React)
Mais conserver un vieux dépôt privé n’est pas non plus une bonne option
Next n’a pour seul avantage que son build statique
Si cette prise en charge disparaît, il n’y a plus vraiment de raison de l’utiliser
Selon l’avis de sécurité de Facebook/Meta, les versions 19.0.0 à 19.2.0 de React Server Components présentent une vulnérabilité de remote code execution (RCE) pré-authentification
L’annonce du blog officiel de React explique aussi que, du fait de l’architecture permettant au client d’appeler des fonctions serveur, un attaquant peut forger une requête HTTP malveillante et exécuter du code arbitraire sur le serveur
hasOwnProperty, l’attaque passait probablement par une référence à des propriétés de la chaîne de prototypes (__proto__, etc.)Le correctif semble être ce commit
Il semble avoir été squashé avec plusieurs autres changements, ce qui masque les détails
On voit à quatre endroits dans le code un modèle qui limite la liste des fonctions exposées selon une liste blanche
Vercel bloque déjà les modèles de requêtes malveillantes via une protection au niveau de la plateforme
Voir l’annonce
Cloudflare a également réagi de manière préventive avec des règles WAF
Malgré cela, il est fortement recommandé de mettre immédiatement à jour les dépendances Next, React et les autres méta-frameworks
J’ai essayé de reproduire la vulnérabilité à partir du dépôt PoC
react-server-dom-webpackcorrigé, donc le mécanisme ne semble pas complètement exactCe serait bien d’avoir une démo sur un vrai projet Next.js
Au point qu’on en vient à dire « pas de Vercel, pas de RCE » : cet incident met en lumière la corrélation entre environnement d’hébergement et sécurité
Un score CVE de 10.0 est une valeur sidérante pour un projet aussi largement utilisé
Malgré cela, il dépasse les 310 000 téléchargements hebdomadaires
Il est difficile de comprendre pourquoi l’équipe React consacre du temps à des fonctionnalités aussi confuses
On peut se demander ce que cela apporte de mieux que le SSR, et dans quelle mesure les performances s’améliorent réellement
L’expérience développeur s’est dégradée depuis l’introduction des hooks, et au lieu de l’améliorer, on ajoute encore de la complexité
J’aimerais plutôt qu’on permette d’utiliser plus naturellement le flux de contrôle natif de JS dans la logique des composants
Je vois cela comme une couche BFF (Backend for Frontend) composantisée
Chaque fragment d’interface est directement relié à la logique backend correspondante et peut récupérer des données sans appel à
fetchCela facilite l’évolution conjointe du front et du backend, tout en permettant de charger finement uniquement les données nécessaires
Au final, cela permet d’intégrer naturellement une logique serveur dédiée à l’UI dans la structure des composants
Le modèle basé sur compilateur de Svelte ou de React est bien plus simple à manier
Vue, Svelte, Angular, etc. exigent tous un compilateur séparé et une extension de fichier dédiée
En revanche, React/JSX bénéficie déjà d’un traitement de faveur au stade du préprocesseur
Rust a résolu ce genre de problème avec son système de macros — par exemple, Leptos ou Yew prennent en charge JSX ou des templates HTML dans des fichiers
.rsstandardSi JS n’acquiert pas ce type d’extensibilité, le web risque de rester encore longtemps un environnement complexe et inefficace
L’objectif était de réduire la charge côté client, mais on a l’impression que cela aussi a échoué
L’explication détaillée du blog React vaut également le coup d’œil