Un module Node.js téléchargé des millions de fois présente une faille de sécurité qui peut permettre aux attaquants de lancer une attaque par déni de service (DoS) sur un serveur ou d’obtenir un accès complet au shell distant.
Attribué CVE-2020-7699, la vulnérabilité réside dans le « express-fileupload« composant npm, qui a été téléchargé au moins 7,3 millions de fois à partir de npm.
L’estimation est prudente car elle ne prend pas en compte les téléchargements depuis GitHub, les sites miroirs et autres référentiels clonés.
Ce type de vulnérabilité, appelé «Prototype Pollution», se produit généralement dans le code JavaScript (JS) en raison de la nature fondamentale du langage. Parce que JS est un langage basé sur un prototype, chaque objet, fonction et structure de données du langage possède une propriété « Prototype » inhérente qui peut être modifiée via le mutateur « _proto__ ».
La possibilité de modifier le code existant est une fonctionnalité prévue qui permet l’extension facile des objets existants, avec plus de propriétés et de méthodes.
Les attaques de prototypage comme celle-ci exploitent cette « faille de conception » en injectant des les types des objets dans les objets existants pour provoquer des erreurs, conduisant au moins à un déni de service (DoS), sinon à un accès distant au shell.
Exploiter le prototype
L’attaque proprement dite est rendue possible grâce à la fonctionnalité « parseNested » fournie par express-fileupload. Lorsqu’elle est activée, l’option « parseNested » est responsable de « l’aplatissement » des données JSON téléchargées en objets imbriqués.
Posix, le chercheur en sécurité qui a découvert cette faille explique dans un article de blog, « Le module express-fileupload propose plusieurs options pour télécharger et gérer des fichiers dans le [Node.js] application. Parmi eux, l’argument parseNested make aplatir. «
Par conséquent, si nous fournissons {« abc »: true} comme entrée, en interne, il sera utilisé comme {« a »: {« b »: {« c »: true}}} «
Par exemple, si votre application utilisait le module « express-fileupload » pour faciliter les téléchargements de fichiers et que l’option « parseNested » était définie sur « true », cela indiquerait à l’application côté serveur de commencer à aplatir les données reçues en objets JSON imbriqués .
Cette option ‘parseNested’ est illustrée dans l’image ci-dessous.
Lorsqu’une simple charge utile est fournie dans l’en-tête HTTP « Content-Disposition », un attaquant peut fournir une valeur « __proto __. ToString » pour déclencher l’attaque.
Rappelons que le mutateur « _proto__ » peut influencer la propriété « Prototype » de JavaScript héritée par tout Objets et structures JS.
Essentiellement, la requête HTTP affichée ici remplacera et corrompra la méthode intégrée « toString » de chaque objet présent dans votre code.
« Si Object.prototype.toString
peut être pollué, cela provoquera une erreur, et pour chaque demande, exprimer [sic] renvoie toujours 500 erreurs », a déclaré le chercheur.
Exécution de code à distance via reverse shell
Une variante plus sophistiquée de cet exploit décrit par le chercheur permet à un attaquant d’obtenir un shell sur le système vulnérable. Cet exploit, cependant, dépend en grande partie du fait que l’application utilisant une version vulnérable «express-fileupload» était aussi en utilisant le moteur de création de modèles EJS (Modèles JavaScript intégrés).
Supposons que votre application utilise EJS pour analyser les données téléchargées sans contrôles supplémentaires en place. Un attaquant peut alors envoyer une requête HTTP qui écrase l’option « outputFunctionName » d’EJS.
La charge utile illustrée ci-dessus exploite la pollution du prototype dans express-fileupload, et demande à EJS (s’il est utilisé) de lancer un Node.js « processus_enfant. «Ce processus nouvellement lancé engendre en outre un shell inversé sur l’ordinateur de l’attaquant.
Une fois la connexion établie, un attaquant peut désormais exécuter du code arbitraire sur le serveur compromis.
Toutes les installations ne sont pas concernées
Le chercheur, cependant, a dit La gorgée quotidienne blog que la faille pourrait ne pas affecter tous les utilisateurs. Seules les applications avec l’option « parseNested » activée sont vulnérables à cette faille de pollution du prototype.
De plus, pour obtenir un accès complet au shell et une exécution de code à distance, une autre bibliothèque telle que EJS, en conjonction avec le vulnérable express-fileupload, est une condition préalable. Il est à noter cependant qu’EJS n’est pas la seule bibliothèque à pouvoir accéder au shell.
Posix a dit La gorgée quotidienne que les attaques n’ont pas seulement eu un impact sur EJS, «Mon article explique comment obtenir un shell via EJS. [But] car la pollution du prototype peut modifier le flux de divers contextes, le simple ajout de quelques modules référencés peut créer de nombreuses possibilités pour les attaquants. »
Quelques heures après avoir reçu le rapport, le « express-fileupload » a corrigé la vulnérabilité, et les utilisateurs devraient envisager d’obtenir la dernière version corrigée 1.1.9 de npm.