Skip to main content

Exécution de code arbitraire dans Grunt

Écrit par
Blog illustrations vul profile feature

21 septembre 2020

0 minutes de lecture

Bienvenue dans le profil mensuel des vulnérabilités de Snyk. Dans cette série, Snyk revient sur les vulnérabilités découvertes par notreéquipe de recherche en sécuritéou qui lui ont été signalées. Nous sélectionnons une vulnérabilité notable du mois écoulé et racontons l’histoire de sa découverte, de son analyse et de sa divulgation. Nous mettons en lumière les chercheurs, les développeurs et les utilisateurs qui contribuent à identifier et à corriger les vulnérabilités dans l’ensemble de la communauté open source.

Ce mois-ci, nous nous intéressons à une vulnérabilité permettant l’exécution de code arbitraire, découverte dans le célèbre package JavaScript Grunt.


Vulnérabilité : exécution de code arbitraire dans js-grunt

CVE attribué : CVE-2020-7729

Analyste Snyk : George Gkitsas

Découverte par : l’équipe de recherche de Snyk

L’équipe de recherche de Snyk a découvert et divulgué une vulnérabilité permettant l’exécution de code arbitraire dans le célèbre package JavaScript Grunt.

Dans le cadre de ses efforts continus pour contribuer à la sécurisation des logiciels open source, l’équipe identifie les pratiques de codage non sécurisées susceptibles d’entraîner des vulnérabilités. Une fois certains schémas repérés, elle peut créer des règles que des outils tels que les linters peuvent utiliser pour analyser des packages populaires et déterminer s’ils présentent ces vulnérabilités.

La vulnérabilité permettant l’exécution de code arbitraire dans le package Grunt a été identifiée de cette manière. Examinons de plus près les détails de cette vulnérabilité, la façon dont elle a été découverte et la collaboration entre l’équipe de recherche et le responsable du package pour veiller à sa correction.

Examen détaillé de la vulnérabilité permettant l’exécution de code arbitraire

George Gkitsas travaillait à la création de nouvelles règles de linting pour détecter les vulnérabilités dans l’écosystème JavaScript. Il cherchait notamment à repérer les packages qui utilisent la fonction vulnérable load() du package js-yaml pour analyser un document yaml à partir d’une chaîne de caractères. Une version plus récente et non vulnérable de cette méthode, appelée safeLoad(), est recommandée pour analyser ces chaînes.

George a expérimenté une règle de linting permettant d’identifier ce schéma dans les packages JavaScript. En examinant les résultats et en modifiant la règle, il a pu réduire le nombre de faux positifs à un niveau acceptable. La règle a ainsi pu être intégrée aux processus automatisés que Snyk exécute régulièrement pour détecter les packages potentiellement vulnérables dans l’écosystème open source.

Snyk sélectionne régulièrement les 1 000 packages les plus populaires en fonction du nombre total de téléchargements et les analyse pour détecter différents signes de vulnérabilités. Dans ce cas, le package Grunt a été signalé comme vulnérable en raison de l’utilisation de la fonction load(). Cependant, repérer un package à l’aide d’un linter automatisé ne suffit évidemment pas.

L’étape suivante consiste à examiner le résultat et à confirmer que le code est réellement vulnérable, et que la détection n’est pas un faux positif. George a pu examiner rapidement le code signalé et confirmer qu’il était effectivement vulnérable. Mais l’équipe de recherche ne s’arrête pas là. Il est également important de vérifier que la vulnérabilité se trouve dans du code accessible, et qu’elle peut donc être exploitée. Un code vulnérable qui ne peut pas être exploité concrètement représente un risque bien moindre. George a donc créé rapidement une preuve de concept et confirmé que le code était bien vulnérable.

Extrait de code montrant une fonction JavaScript qui lit et analyse un fichier YAML avec grunt.util.warn et une gestion des erreurs.

Confirmation : CVE-2020-7729

Après avoir confirmé que le code vulnérable pouvait effectivement être exploité, George a attribué le CVE-2020-7729 pour documenter la vulnérabilité, puis a contacté le responsable du package par e-mail. Celui-ci a répondu en moins d’une heure, indiquant qu’il souhaitait comprendre les détails de la découverte de Snyk. Il a demandé des informations supplémentaires, puis a confirmé qu’il s’agissait bien d’une vulnérabilité.

Toutefois, un élément rendait cette situation particulière par rapport aux autres vulnérabilités généralement découvertes : le package Grunt est un outil de développement. Il s’agit d’un exécuteur de tâches qui aide les développeurs à automatiser les tâches répétitives de leur processus de développement. L’équipe de recherche devait donc déterminer s’il existait un scénario dans lequel quelqu’un pourrait réellement exploiter le code dans le cadre d’une attaque. Après avoir étudié les différentes façons dont les développeurs utilisent Grunt, George a pu confirmer avec le responsable du package qu’il existait un vecteur d’attaque exploitable.

En moins d’une semaine, le responsable a publié un correctif pour le package Grunt. La version 1.3.0 a été publiée sur GitHub le 17 août 2020. Le nouveau code permet au développeur de choisir entre l’ancienne méthode load() et la méthode safeLoad(), en fonction du contexte et des fonctionnalités nécessaires.

La version mise à jour étant désormais disponible, Snyk a publié le CVE et l’a ajouté à la Snyk Vulnerability Database. Plus de 2 000 projets suivis par Snyk ont été identifiés comme vulnérables et leurs propriétaires ont été informés.

Diff de code montrant les modifications apportées à une fonction JavaScript qui lit des fichiers YAML et analyse leur contenu.

L’engagement de Snyk en faveur de la sécurité

En définitive, la découverte et la divulgation de cette vulnérabilité montrent comment les efforts de l’équipe de recherche de Snyk contribuent à détecter plus rapidement et plus efficacement les problèmes de sécurité dans les packages open source. Les chercheurs ont pu identifier et confirmer non seulement la vulnérabilité et la possibilité de l’exploiter, mais aussi un vecteur d’attaque plausible démontrant le risque réel qu’elle représentait. Cela s’inscrit dans l’engagement de Snyk à donner aux développeurs les moyens de rester en sécurité tout en tirant parti de l’open source dans leurs développements.

Lancez-vous dans les compétitions Capture The Flag

Apprenez à résoudre des défis Capture The Flag en regardant à la demande notre atelier virtuel d’initiation.