Blitz.js, un framework d’application Web JavaScript, a corrigé une dangereuse vulnérabilité de prototype de pollution qui pourrait conduire à l’exécution de code à distance (RCE) sur les serveurs Node.js.

La pollution prototype est un type de vulnérabilité JavaScript qui permet aux attaquants d’exploiter les règles du langage de programmation pour modifier le comportement d’une application et la compromettre de diverses manières.

Le nouveau bogue, découvert et signalé par des chercheurs de Sonar, a permis aux attaquants de manipuler le code de l’application Blitz.js pour créer un shell inversé et exécuter des commandes arbitraires sur le serveur.

Vulnérabilité prototype dans les dépendances

« Blitz.js est un framework JS à venir qui a gagné du terrain sur GitHub », a déclaré Paul Gerste, chercheur en vulnérabilité chez Sonar. La gorgée quotidienne. « Nous l’avons sélectionné pour aider à sécuriser sa base de code et étudier les vulnérabilités du monde réel. »

Blitz est construit sur Next.js, un framework basé sur React, et ajoute des composants pour en faire une plate-forme de développement Web complète.

PLONGÉES PROFONDES Pollution des prototypes : la vulnérabilité dangereuse et sous-estimée qui affecte les applications JavaScript

L’une des fonctionnalités annoncées de Blitz.js est sa couche « Zero-API », qui permet au client d’invoquer la logique métier côté serveur via des fonctions simples sans avoir à écrire de code API.

Blitz.js effectue un appel RPC au serveur en arrière-plan et renvoie la réponse à l’appel de fonction client.

« Blitz.js ajoute une couche RPC au-dessus de Next.js (entre autres fonctionnalités), et cette couche utilise superjson pour désérialiser les données des requêtes entrantes. La vulnérabilité est entièrement à l’intérieur de superjson », a déclaré Gerste.

En tant que version étendue de JSON, superjson ajoute la prise en charge des dates, des regexes et des dépendances circulaires. La fonctionnalité de dépendance circulaire permet aux spécifications JSON de référencer les noms de propriété, ce qui a causé la vulnérabilité du prototype. Un attaquant pourrait utiliser ces noms de propriété pour modifier le code en cours d’exécution sur le serveur.

RCE sur les serveurs Blitz

Gerste a découvert une chaîne d’exploits qui pourraient être déclenchés par le prototype de vulnérabilité à la pollution et conduire à RCE.

Tout d’abord, une requête JSON polluée est envoyée au serveur, ce qui déclenche le mécanisme de routage de Blitz.js pour charger un fichier JavaScript avec le prototype pollué. Cela permet à l’attaquant d’utiliser l’objet JavaScript malveillant pour exécuter du code arbitraire.

En savoir plus sur les dernières nouvelles de la recherche infosec

Idéalement, un attaquant créerait et exécuterait un fichier sur le serveur. Mais Blitz.js ne prend pas en charge la fonctionnalité de téléchargement. Cependant, il a un script wrapper CLI qui utilise JavaScript frayer() fonction pour lancer un nouveau processus.

L’attaquant pourrait utiliser cette fonction pour lancer un processus CLI et exécuter une commande arbitraire sur le serveur.

Pollution prototype dans Blitz.js

Ce qui rend cette vulnérabilité particulièrement dangereuse, c’est qu’elle peut être déclenchée sans aucune authentification, ce qui signifie que tout utilisateur pouvant accéder à l’application Blitz.js pourra lancer des attaques RCE.

« Un attaquant aurait le même niveau de privilège que l’application vulnérable », a déclaré Gerste. « Ainsi, si l’application s’exécute en tant que root, l’attaquant aurait également des privilèges root. »

Bogue compliqué

Les bogues de pollution prototypes agissent souvent de manière très compliquée. Par exemple, dans le cas de Blitz.js, l’objet wrapper CLI n’était pas vulnérable en soi mais pouvait être abusé par le prototype de bogue de pollution.

« Cette technique d’attaque exploite un modèle de code qui n’est pas une vulnérabilité en soi », a déclaré Gerste. « La pollution prototype peut influencer l’application cible de manière très invasive, et il faudrait beaucoup de travail pour se débarrasser de tout le code qui pourrait être influencé par la pollution prototype. »

Dans sa description du bogue, Gerste donne quelques recommandations générales qui peuvent renforcer les applications JavaScript contre la pollution des prototypes, y compris le gel Objet.prototype ou en utilisant le –disable-proto=supprimer drapeau dans Node.js.

« Je pense que la pollution des prototypes est encore inconnue de nombreux développeurs JavaScript », a déclaré Gerste. « Je ne vois pas les développeurs utiliser très souvent les modèles que nous avons recommandés dans notre article. Avec nos articles de blog, nous essayons d’aider à éduquer les développeurs JavaScript et à partager ces connaissances. »