Los paquetes de Open source, y específicamente npm, ils sont sans aucun doute impressionnants. Ils rendent les développeurs extrêmement productifs en offrant à chacun de nous une multitude de fonctionnalités existantes en attente d'être utilisées. Si nous devions écrire toutes ces fonctionnalités nous-mêmes, nous aurions du mal à créer une fraction de ce que nous faisons aujourd'hui.
En conséquence, une application Node.js typique consomme aujourd'hui une tonne de packages MNP, souvent des centaines ou des milliers d'entre eux. Cependant, ce que nous oublions souvent, c'est que chacun de ces packages, ainsi que leurs fonctionnalités, résout également les risques de sécurité de Node.js. De nombreux paquets ouvrent de nouveaux ports, augmentant ainsi la surface d'attaque. Environ 76% des magasins Node utilisent des packages vulnérables, dont certains sont extrêmement sévères; et les projets open source deviennent régulièrement obsolètes, négligeant de corriger les failles de sécurité.
Inévitablement, l'utilisation de packages npm Cela vous exposera à des risques de sécurité. Heureusement, vous pouvez vous poser plusieurs questions qui peuvent réduire considérablement votre risque. Cet article décrit ces questions et comment y répondre.
Quels packages est-ce que j'utilise?
Plus vous utilisez de packages, plus le risque d'avoir un package vulnérable ou malveillant parmi eux est grand. Cela est vrai non seulement pour les packages que vous utilisez directement, mais également pour les dépendances indirectes qu'ils utilisent.
Découvrir vos dépendances est aussi simple que de courir npm ls dans le dossier principal de votre application, qui répertorie les packages que vous utilisez. Vous pouvez utiliser l'argument –Prod pour afficher uniquement les dépendances de production (qui affectent le plus votre sécurité) et ajouter -Longue pour une brève description de chaque paquet. Jetez un œil à cet article pour mieux comprendre comment vous pouvez diviser et réduire vos dépendances npm.
~ / proj / node_redis $ npm ls --prod --long [email protected] │ / Users / guypod / localproj / terrain de jeu / node_redis │ Redis client library │ git: //github.com/NodeRedis/node_redis.git │ https://github.com/NodeRedis/node_redis ├── [email protected] │ Implémentation de file d'attente double extrêmement rapide │ git: //github.com/petkaantonov/deque.git │ https : //github.com/petkaantonov/deque ├── [email protected] │ Commandes Redis │ git + https: //github.com/NodeRedis/redis-commands.git │ https://github.com/ NodeRedis / redis-commonds └── [email protected] Javascript Redis protocol (RESP) parser git + https: //github.com/NodeRedis/node-redis-parser.git https://github.com/NodeRedis / node-redis-parser#readme
Un nouveau groupe de gestion d'unités de service, tel que bitHound y VersionEye Ils peuvent également répertorier les dépendances que vous utilisez, ainsi que suivre certaines des informations ci-dessous.
Maintenant que vous savez ce que vous avez, vous pouvez poser quelques questions pour évaluer le risque associé à chaque colis. Voici quelques exemples de questions à poser, pourquoi vous devriez les poser et des suggestions pour obtenir des réponses.
Est-ce que j'utilise toujours ce package?
Au fur et à mesure que le temps passe et que votre code change, vous cesserez probablement d'utiliser certains packages et en ajouterez de nouveaux à la place. Cependant, les développeurs ne suppriment souvent pas un package du projet lorsqu'ils cessent de l'utiliser, car une autre partie du code peut en avoir besoin.
En conséquence, les projets ont tendance à accumuler des dépendances inutilisées. Bien que n'étant pas un problème de sécurité direct, ces dépendances augmentent inutilement la surface d'attaque et ajoutent du fouillis au code. Par exemple, un attaquant peut inciter un paquet à charger un paquet inutilisé avec une vulnérabilité plus grave, augmentant ainsi les dommages potentiels.
La vérification des dépendances inutilisées se fait le plus facilement à l'aide de l'outil depcheck. depcheck scannez votre code comados a besoin y importer, met en corrélation ceux-ci avec les packages installés ou mentionnés dans votre package.json, et fournit un rapport. La commande peut être modifiée de différentes manières à l'aide des invites de commande, ce qui facilite la vérification automatique des compartiments inutilisés.
~ / proj / Hardy $ depcheck Dépendances inutilisées * cucumber * selenium-standalone devDependencies inutilisées * jasmine-node
D'autres développeurs utilisent-ils ce package?
Les packages utilisés par beaucoup sont également surveillés de plus près. La probabilité que quelqu'un ait déjà trouvé et résolu un problème de sécurité en eux est plus élevée que dans un package moins utilisé.
Par exemple, le package comparer sécurisé il a été créé pour prendre en charge la correspondance de chaînes qui n'était pas sensible à une attaque de temps. Cependant, une faille fondamentale dans le package a conduit à obtenir exactement le contraire, en effectuant certaines comparaisons extrêmement sensibles au temps (et incorrectes).
Si vous regardez de plus près, vous verrez que ce package est rarement utilisé, téléchargé seulement 20 fois par jour. S'il s'agissait d'un package plus populaire, il y a de fortes chances que quelqu'un ait trouvé et signalé la panne fonctionnelle auparavant.
Le moyen le plus simple d'évaluer l'utilisation du package est son taux de téléchargement, indiqué dans la section "Statistiques" à partir de la page de package npm. Puedes extraer esas estadísticas automáticamente usando la API de statistiques npm, ou parcourez les statistiques historiques dans npm-stat.com . Alternativement, vous pouvez regarder le nombre de paquets "Personnes à charge" - d'autres packages utilisés aujourd'hui.
Est-ce que j'utilise la dernière version de ce package?
Les bogues, y compris ceux de sécurité, sont constamment trouvés et, espérons-le, corrigés. En outre, il est assez courant de voir les vulnérabilités récemment signalées corrigées uniquement dans la branche principale la plus récente d'un projet.
Par exemple, au début de 2016, une vulnérabilité de Déni de service d'expression régulière (ReDoS) dans le paquet HMAChawk.ReDoS est une vulnérabilité dans laquelle une entrée longue ou soigneusement conçue fait que la comparaison regex prend beaucoup de temps à calculer. Pendant ce temps, le sous-processus de traitement ne traite pas les nouvelles demandes, ce qui permet une attaque par déni de service avec seulement un petit nombre de demandes.
Vulnérabilité faucon rapidement corrigé dans sa dernière version de la version principale, 4.x, mais laissé les anciennes versions sans solution. Plus précisément, il a laissé une vulnérabilité non corrigée dans le demande de package largement utilisé, qui a utilisé [email protected]. Plus tard, l'auteur a accepté la demande d'extraction de Snyk avec une solution pour la succursale 3.x, mais le demander aux utilisateurs Ils ont été exposés pendant un certain temps et le problème existe toujours dans les anciennes branches des versions majeures. Ceci n'est qu'un exemple, mais en règle générale, vos dépendances sont moins susceptibles d'avoir des bogues de sécurité si elles sont sur la dernière version.
Vous pouvez savoir si vous utilisez ou non la dernière version avec la commande npm obsolète. Cette commande prend également en charge le drapeau –Prod pour ignorer les dépendances de développement ainsi que –Json pour simplifier l'automatisation. Vous pouvez aussi utiliser Greenkeeper pour vous informer de manière proactive lorsque vous n'utilisez pas la dernière version.
~ / proj / handlebars.js $ npm obsolète --prod Package Current Wanted Latest Location async 1.5.2 1.5.2 2.0.1 guidons source-map 0.4.4 0.4.4 0.5.6 guidons uglify-js 2.6.2 2.7. 3 2.7.3 guidons yargs 3.32.0 3.32.0 5.0.0 guidons
Quand ce package a-t-il été mis à jour pour la dernière fois?
Créer un projet open source, y compris des packages npm, es divertido. Muchos desarrolladores talentosos crean estos proyectos en su tiempo libre, invirtiendo mucho tiempo y energía en hacerlos buenos. Sin embargo, con el tiempo, la emoción a menudo se desvanece y los cambios en la vida pueden hacer que être difícil encontrar el tiempo necesario.
En conséquence, les packages npm ils deviennent souvent obsolètes, n'ajoutent pas de fonctionnalités et corrigent les bogues lentement, voire pas du tout. Ce n'est pas vraiment génial pour la fonctionnalité, mais c'est particulièrement problématique pour la sécurité. Les erreurs fonctionnelles ne vous gênent généralement que lorsque vous créez quelque chose de nouveau, ce qui laisse une certaine marge de manœuvre pour la rapidité avec laquelle elles sont résolues. La correction des vulnérabilités de sécurité est plus urgente - une fois connues, les attaquants peuvent les exploiter, le temps de les corriger est donc essentiel.