Ce ne sont pas les packages npm que vous cherchez
DeveloperSteve Coochin
4 mai 2022
0 minutes de lectureAu fil des ans, en tant que développeur, j’ai conçu et déployé de nombreuses applications dans le cadre de projets menés par des agences numériques, de projets personnels, de startups et de missions en freelance. Avec des délais serrés, les attentes des clients et les dates de livraison à respecter, la sécurité n’était généralement pas une priorité lorsque j’installais un package open source avec npm. Cela m’amenait souvent à retravailler et à nettoyer des déploiements qui avaient laissé entrer des vulnérabilités connues, ce qui allongeait encore les délais et décevait les clients.
Plus tôt cette année, plus de 500 packages malveillants ont été publiés dans l’écosystème npm pour semer la confusion des dépendances au sein des applications. Ces packages injectaient directement du code et des fonctionnalités indésirables, ou introduisaient du code malveillant via l’injection d’une bibliothèque open source directe ou dépendante.
À l’image des premiers films Star Wars, ces packages malveillants tentaient de s’infiltrer dans nos applications à coups de truc Jedi. Face à la multiplication de ces incidents, il est important de prendre le temps et les précautions nécessaires pour protéger nos déploiements.
Voyons comment mieux protéger vos applications contre l’injection de dépendances.
Faites preuve de diligence
Il est toujours important de comprendre ce qu’utilise votre application à chaque étape du développement. Environ 80 % des vulnérabilités de l’écosystème npm proviennent de chemins vulnérables dans les dépendances. C’est pourquoi la diligence est essentielle. Pour garantir la sécurité, nous devons comprendre comment les packages open source que nous choisissons ont été créés et quel soutien les accompagne.
Pour cela, vous pouvez examiner les fonctionnalités de la bibliothèque sur la page npm du package ou dans le dépôt Git. Vous pourrez ainsi connaître le nombre de versions publiées, évaluer le niveau de prise en charge et voir les dépendances requises par le package.

Une autre méthode pratique consiste à utiliser Snyk Advisor, qui fournit des informations utiles sur l’état du package et les types de vulnérabilités détectées au fil du temps.
L’un des grands avantages de la page Snyk Advisor est qu’elle donne une vue d’ensemble du projet, avec notamment un score de santé fondé sur la communauté, la popularité, la sécurité et la maintenance.

Cette page présente également des graphiques temporels utiles, qui illustrent des statistiques de popularité comme le nombre de téléchargements par semaine, le nombre de commits apportés par la communauté et celui des problèmes encore ouverts. Ces données permettent d’évaluer l’activité de la communauté ainsi que l’adoption au sein de l’écosystème.

Ces deux graphiques montrent à quelle vitesse la communauté pourrait se mobiliser pour corriger les problèmes de sécurité qui apparaissent dans le projet.
Créer des arbres de dépendances
Un seul npm install peut ajouter des centaines de bibliothèques à votre application Node. Electron, par exemple, compte trois dépendances principales, dont certaines ont elles-mêmes des dépendances qui seront automatiquement ajoutées à une application basée sur Electron.
Les arbres de dépendances aident à repérer les packages ajoutés par l’intermédiaire d’une bibliothèque ou d’une dépendance. Plus important encore, ils facilitent la création d’une SBOM (nomenclature logicielle) en identifiant les composants utilisés dans votre application.
Il existe plusieurs façons de générer un arbre de dépendances, par exemple :
Utiliser un outil de cartographie visuelle
Les outils de cartographie visuelle sont pratiques pour générer des cartes des dépendances, car ils affichent visuellement tous les composants open source utilisés par votre application.
J’ai notamment utilisé npmgraph.an, un outil qui génère une vue en 2D de l’arbre des dépendances à partir d’une seule bibliothèque npm. Une fois l’arbre créé, vous pouvez cliquer sur les nœuds représentant les dépendances pour afficher plus d’informations dans un panneau à gauche.

Utiliser npm en ligne de commande
J’apprécie la polyvalence de npm : il permet aussi bien d’installer une bibliothèque globale comme Snyk CLI que de générer la liste des bibliothèques et des dépendances.
Pour générer un arbre, accédez au répertoire racine d’un projet contenant un fichier manifeste et saisissez npm list. La commande affiche une liste textuelle de toutes les bibliothèques de premier niveau utilisées par une application basée sur npm. Pour obtenir davantage d’informations sur un package spécifique, vous pouvez aussi saisir npm list [package].

Toutefois, la commande précédente n’affiche pas les dépendances imbriquées. Pour les afficher, nous devons utiliser l’option --depth. Par exemple, en exécutant npm list --depth=5 dans le répertoire racine d’un projet npm, vous obtiendrez un arbre plus détaillé.

Vous pouvez également définir la profondeur pour un package en particulier avec npm list [package] --depth=5. L’un des inconvénients de cette méthode de tri des packages est qu’il peut être difficile de s’y retrouver. Il est facile de se perdre dans l’arbre, surtout lorsque les cartes de dépendances sont volumineuses.
Utiliser Snyk Open Source
Cette méthode combine la vue arborescente en ligne de commande et la cartographie visuelle, avec en plus la détection des vulnérabilités.
Pour commencer, créez un compte Snyk gratuit et connectez-vous. Reliez ensuite à Snyk le dépôt dans lequel votre application est stockée, puis lancez une analyse. Pour cela, cliquez sur le bouton Add Project et sélectionnez le dépôt de votre choix.

Suivez les étapes de connexion du dépôt et autorisez Snyk à y accéder.
Conseil pratique : Sur la plupart des plateformes, l’analyse fonctionne que le dépôt soit public ou privé.
Une fois la connexion établie, recherchez et sélectionnez le dépôt de l’application pour laquelle vous souhaitez générer un arbre. Cliquez ensuite sur le bouton Add selected repositories en haut à droite pour lancer l’analyse.

Une fois l’analyse terminée, vous verrez une vue agrégée des résultats. Développez le niveau supérieur à l’aide de la flèche déroulante pour afficher le détail de chaque élément détecté par l’analyse.

Pour cet exercice, nous recherchons quelques éléments dans le manifeste de package npm package.json. Cliquez sur la ligne package.json pour développer la liste et afficher les chemins vulnérables détectés dans certaines bibliothèques, des informations supplémentaires sur les correctifs recommandés, et bien plus encore.

C’est ici que la magie Jedi opère vraiment. Cliquez sur l’onglet Dependencies pour afficher la liste des dépendances du projet. Cliquez sur l’icône de l’arborescence en haut à droite pour voir des informations comme les relations entre les bibliothèques et l’emplacement des vulnérabilités détectées.

Vous disposez maintenant d’un arbre interactif des bibliothèques et des dépendances qui vous montre où commencent les chemins vulnérables.
Le principal avantage de la génération d’un arbre de dépendances avec Snyk, ce sont les analyses continues : elles vous alertent sur les nouvelles vulnérabilités et suggèrent des mesures correctives, comme des mises à niveau de version ou des correctifs personnalisés. Vous pouvez même configurer la création automatique de pull requests dans votre dépôt pour corriger encore plus rapidement les vulnérabilités détectées.
Que la source (ouverte) soit avec vous
Examiner régulièrement vos composants open source est essentiel pour préserver la sécurité de vos applications. Les arbres de dépendances sont un excellent point de départ pour comprendre ce que vous utilisez, mais il est également essentiel d’analyser régulièrement votre application à l’aide d’un outil d’analyse de la composition logicielle (SCA), comme Snyk Open Source.
Lancez-vous dans les compétitions Capture The Flag
Apprenez à résoudre des défis de capture du drapeau en regardant à la demande notre atelier virtuel d’initiation.



