7 conseils pour éviter de se faire pirater (npm, pnpm & bun)
BBetter Stack
컎íší°/ìíížìšìŽAI/믞ëêž°ì
Transcript
00:00:00Si vous installez des paquets NPM, vous ĂȘtes une cible. Peut-ĂȘtre pas aujourd'hui, peut-ĂȘtre pas cette semaine, mais c'est
00:00:05définitivement en approche. Des centaines de paquets ont été compromis rien que ces derniers mois,
00:00:09et ça ne ralentit pas. Alors, au lieu de m'inquiéter à chaque fois qu'un problÚme survient,
00:00:14j'ai pris le temps de verrouiller ma configuration pour NPM, PNPM et BUN, et il s'avĂšre que la plupart
00:00:18des mesures qui vous auraient sauvés ne prennent qu'environ 30 secondes à mettre en place. Dans cette vidéo,
00:00:23je vais vous présenter les sept changements que j'ai effectués, allant d'une simple ligne de configuration qui
00:00:27Ă©limine l'attaque la plus courante, jusqu'Ă des outils gratuits soumis par les attaquants eux-mĂȘmes
00:00:30qui les dĂ©tecteraient avant mĂȘme que le paquet n'atteigne votre machine. Entrons dans le vif du sujet.
00:00:39La premiĂšre et la plus simple est d'arrĂȘter de tĂ©lĂ©charger de nouveaux paquets. La plupart de ces attaques
00:00:44par la chaßne d'approvisionnement sont détectées en quelques heures, donc si vous n'installez pas les toutes nouvelles versions
00:00:48dÚs leur sortie, vous évitez en fait la plupart de ces attaques. Tous les gestionnaires de paquets
00:00:52Node.js majeurs proposent désormais une forme de contrÎle de l'ùge des versions. Pour NPM, vous réglez cela dans le fichier
00:00:57.npmrc, et c'est défini en jours. Pour PNPM, vous pouvez le définir globalement dans le fichier config.yaml,
00:01:03ou le régler par projet en utilisant le fichier workspace de PNPM, et cette valeur est en fait
00:01:08définie en minutes. Il est également intéressant de noter que depuis PNPM 11, cela est réglé par défaut sur un jour,
00:01:14donc mĂȘme sans configuration, vous bĂ©nĂ©ficiez d'une certaine protection. Pour BUN, cela se rĂšgle dans le
00:01:17fichier bunfig.toml, globalement ou par projet, et cette valeur est définie en secondes.
00:01:23Cela m'Ă©tonne vraiment que pour le mĂȘme paramĂštre, Ă travers trois gestionnaires de paquets,
00:01:27nous nous retrouvions avec trois valeurs différentes, ce qui résume assez bien cet écosystÚme. Une fois ce réglage effectué,
00:01:32si vous installez un paquet comme le react start de TanStack, vous verrez qu'il n'installe pas la
00:01:36version la plus récente, mais celle qui respecte mes critÚres d'ùge de sortie, qui pour moi
00:01:41Ă©tait d'une semaine. Si vous avez besoin de contourner cela, peut-ĂȘtre en raison d'un problĂšme de sĂ©curitĂ©
00:01:45avec le paquet que vous installez et que vous devez installer la derniĂšre version, vous pouvez toujours le faire
00:01:49depuis la ligne de commande. Mais attention aux LLM, car j'ai dĂ©jĂ vu des cas oĂč les LLM
00:01:54utilisent simplement cette commande pour contourner la restriction et installer quand mĂȘme les derniĂšres versions. Gardez aussi Ă l'esprit
00:01:59que NPX et BUNX ne respectent pas ce paramÚtre, ils installent toujours la version la plus récente,
00:02:03et il y a une PR ouverte sur BUN pour corriger cela. Tant que nous sommes dans les réglages, allons-y
00:02:07et désactivons les scripts d'installation pour NPM. PNPM et BUN ont déjà ce comportement par défaut,
00:02:12il n'y a donc rien Ă configurer. Si vous ne le saviez pas, lors de l'installation d'un paquet, celui-ci
00:02:16est autorisé à exécuter son propre code juste aprÚs avoir été installé. Cela a été prévu pour des cas
00:02:20d'utilisation légitimes comme la compilation de code natif ou le téléchargement d'un binaire, mais le problÚme est que presque chaque
00:02:26attaque par la chaßne d'approvisionnement a utilisé cette méthode pour exécuter du code malveillant sur votre machine juste aprÚs l'installation.
00:02:30Si vous trouvez un paquet qui a un besoin légitime de l'un de ces scripts, vous pouvez toujours l'activer
00:02:34explicitement. Dans PNPM, lorsque vous installez un paquet avec des scripts post-installation, il vous en informera,
00:02:39comme pour esbuild ici, et vous pouvez alors exĂ©cuter âpnpm approved buildsâ pour choisir ceux Ă autoriser,
00:02:44ce qui dĂ©finit la configuration âworkspace allow buildsâ de PNPM. Vous pouvez aussi simplement utiliser le
00:02:48drapeau âallow buildâ sur la commande d'installation pour faire la mĂȘme chose. Pour BUN, comme je l'ai dit, il
00:02:52arrĂȘte aussi ces scripts d'installation par dĂ©faut, mais il faut savoir qu'il possĂšde une liste organisĂ©e de
00:02:56paquets autorisés à exécuter ces scripts, ce qui inclut ceux que j'ai installés comme
00:03:00esbuild. Vous pouvez refuser cela en ajoutant des dépendances de confiance dans votre package.json,
00:03:04ainsi, seuls les paquets que vous autorisez explicitement pourront exécuter des scripts post-installation.
00:03:09Il est également indiqué que si vous définissez le tableau comme vide, cela devrait outrepasser la liste par défaut
00:03:12aussi, mais cela ne semble pas fonctionner pour moi, et il semble s'agir d'un bug que j'ai trouvé sur GitHub
00:03:17également. La solution de contournement actuelle est de mettre une valeur dans cette liste, et ainsi la liste par défaut
00:03:21est ignorĂ©e. Avec BUN, vous pouvez aussi exĂ©cuter âbun pm untrustedâ pour voir quels paquets veulent exĂ©cuter
00:03:26des scripts mais ne sont pas encore approuvĂ©s, puis vous pouvez exĂ©cuter âbun pm trustâ pour en autoriser un, ou simplement l'ajouter
00:03:30au tableau des dĂ©pendances de confiance. Vous pouvez aussi dĂ©sactiver totalement les scripts dans BUN en rĂ©glant les âinstall scriptsâ sur
00:03:35false dans votre config globale BUN. Pour NPM, c'est un peu plus difficile. HonnĂȘtement, n'utilisez simplement pas
00:03:40NPM, utilisez PNPM. Mais si vous devez vraiment utiliser NPM pour une raison quelconque, vous pouvez obtenir un comportement
00:03:45similaire de liste d'autorisation en utilisant le paquet âLavamote's allow scriptsâ. Ainsi, c'est juste une liste
00:03:50d'autorisation dans votre package.json également. Le troisiÚme conseil est de bloquer les dépendances basées sur git. Avec NPM, une dépendance peut
00:03:55en fait ĂȘtre dĂ©clarĂ©e comme une URL git, ce qui contourne le registre, et peut mĂȘme embarquer son propre .npmrc qui
00:04:01réactive les scripts de cycle de vie. C'est en fait l'une des astuces utilisées dans la récente attaque NPM
00:04:05qui a touchĂ© TanStack. Vous pouvez arrĂȘter cela en rĂ©glant âallow gitâ sur none dans votre config NPM,
00:04:10ce qui les bloque entiĂšrement, et l'autre option est de rĂ©gler cela sur ârootâ, ce qui autorise les dĂ©pendances
00:04:15basĂ©es sur git Ă ĂȘtre installĂ©es, mais seulement si elles sont dĂ©clarĂ©es dans votre package.json racine, donc probablement
00:04:19explicitement dĂ©finies par vous. Pour PNPM, cette option est âblock exotic sub-dependenciesâ. Quand ceci est rĂ©glĂ© sur true,
00:04:25seules les dépendances directes, celles que vous avez listées dans votre package.json racine, peuvent utiliser des sources
00:04:29exotiques comme des repos git ou des URLs directes. Cette option n'existe pas encore dans Bun, mais il y a une
00:04:35PR ouverte pour l'ajouter, donc nous la verrons peut-ĂȘtre bientĂŽt. En bonus pour terminer les conseils impliquant des changements
00:04:40de configuration, PNPM possĂšde un rĂ©glage de politique de confiance, que nous pouvons rĂ©gler sur âno downgradeâ, ce qui signifie
00:04:45que PNPM échouera si le niveau de confiance d'un paquet a diminué par rapport à sa version précédente. Donc si un
00:04:50paquet était précédemment publié par un éditeur de confiance, mais qu'il n'a maintenant que de la provenance ou
00:04:55aucune preuve de confiance, l'installation échouera. Cela devrait aider à attraper ces attaques qui trouvent des moyens de
00:05:00contourner les processus de publication habituels. Le conseil numéro quatre est probablement le plus puissant, qui est
00:05:04d'utiliser un outil qui examine les paquets que vous installez et peut les auditer avant qu'ils
00:05:08ne touchent jamais votre machine. Pour cela, nous avons deux outils puissants et totalement gratuits. Le premier est
00:05:14MPQ. Vous pouvez le configurer en créant un alias pour vos commandes NPM, PNPM ou Bun normales,
00:05:18afin que chaque fois que vous lancez une installation, il vérifie quelques éléments. Il scannera les vulnérabilités connues
00:05:23contre la base de données de Snyk, et signalera tout paquet ayant moins de 22 jours d'existence. Il
00:05:28dĂ©tectera le typosquatting, oĂč quelqu'un a publiĂ© un paquet comme âexpressâ avec deux âsâ, espĂ©rant
00:05:32que vous ferez une erreur de frappe et installerez celui-ci par erreur. Il vérifiera la signature du registre et
00:05:37la provenance de la construction. Il vous avertira lorsqu'un paquet a des scripts de pré et post-installation, et en plus de tout cela,
00:05:41il vérifie des choses basiques comme le nombre de téléchargements, s'il y a un readme, une licence, une URL de dépÎt,
00:05:46et quel est l'email du mainteneur, et si ce domaine est mĂȘme encore enregistrĂ©. Il fait tout cela
00:05:51et vous donne ensuite un rapport interactif sur vos paquets, oĂč vous pouvez encore dĂ©cider si vous
00:05:55voulez l'installer. Le second est Socket Firewall. C'est en fait celui que j'utilise,
00:05:59et encore une fois, vous faites un alias de ceci pour tous vos gestionnaires de paquets habituels, et celui-ci prend
00:06:03aussi en charge des choses en dehors de JavaScript, comme Python et Rust. Similaire Ă MPQ, quand vous lancez une installation avec
00:06:08lui, il vérifiera Socket et bloquera tout paquet malveillant confirmé par un humain, et il vous avertira aussi
00:06:12de toute menace dĂ©tectĂ©e par IA, qui sont celles qui n'ont pas encore Ă©tĂ© examinĂ©es par un humain. Pour ĂȘtre honnĂȘte,
00:06:16j'ai principalement choisi Socket Firewall car c'est celui dont j'ai entendu parler en premier, mais je fais aussi confiance Ă Socket car ils ont
00:06:21attrapĂ© beaucoup de paquets malveillants rĂ©cents, et les attaquants ont mĂȘme fait une interview oĂč ils ont dit
00:06:25que Socket dĂ©tectera le malware avant mĂȘme que le paquet n'atteigne votre machine, ce qui est une assez bonne
00:06:30publicité pour eux, et j'aime aussi le fait qu'il prenne en charge plus que juste JavaScript avec UV pip et cargo.
00:06:35Si vous installez l'un ou l'autre, vous voudrez vous assurer que vous videz le cache de votre gestionnaire de paquets
00:06:38juste pour vous assurer que chaque paquet installé est vérifié par le pare-feu. Le conseil 5 concerne vos
00:06:42fichiers de verrouillage. Vos fichiers de verrouillage sont lĂ oĂč rĂ©side l'URL de tĂ©lĂ©chargement rĂ©elle pour chaque paquet, et le
00:06:47problÚme est que pratiquement personne ne révise ses fichiers de verrouillage dans une PR. Donc si quelqu'un ouvre une PR contre votre
00:06:51repo, il peut tranquillement éditer une URL résolue pour pointer vers un paquet qu'il contrÎle, et aussi définir le
00:06:56hash d'intégrité correspondant pour que rien n'ait l'air suspect. Maintenant, la prochaine fois que vous lancez une installation, vous tirez
00:07:01le code depuis le serveur de l'attaquant. Bonne nouvelle cependant, si vous utilisez PNPM, vous n'ĂȘtes pas vulnĂ©rable
00:07:05Ă cela. Il ne garde pas ces sources de table qui peuvent ĂȘtre Ă©changĂ©es, et il n'installera pas non plus
00:07:09quoi que ce soit qui est dans le fichier de verrouillage, mais pas réellement déclaré dans votre package.json. Je n'ai pas pu trouver d'
00:07:14information concrĂšte sur Bun cependant, donc cela pourrait encore ĂȘtre vulnĂ©rable Ă ceci. La solution si vous n'
00:07:18utilisez pas PNPM est d'utiliser un outil appelé lockfileLint. Vous installez ceci comme une dépendance de dev, et il valide
00:07:23votre fichier de verrouillage, vérifiant que chaque paquet est résolu depuis un hÎte de confiance, comme le registre NPM. Il vérifie
00:07:28que les URLs résolues correspondent réellement au nom du paquet, et il vérifie aussi que les hashs d'intégrité sont réels
00:07:32Ă©galement. S'il suspecte que quelque chose a Ă©tĂ© altĂ©rĂ©, il fera Ă©chouer l'installation. Le conseil 6 est d'arrĂȘter
00:07:37d'utiliser NPM install en CI et en production, et plutĂŽt d'utiliser âclean installâ. La commande pour cela dans NPM est
00:07:42juste ânpm ciâ, et pour Bun et PNPM, vous ajoutez en fait le drapeau âfrozen lockfileâ, mais ils ont aussi des commandes
00:07:47CI comme un alias qui font la mĂȘme chose. PNPM utilise en fait ceci par dĂ©faut s'il dĂ©tecte qu'il
00:07:52tourne dans un environnement CI. La commande âclean installâ installe exactement ce qui est dans le fichier de verrouillage,
00:07:57rien d'autre, et si le fichier de verrouillage et le package.json ne sont pas d'accord, il s'arrĂȘte juste et lance une erreur,
00:08:01au lieu de deviner et d'installer quand mĂȘme. Donc ceci devrait empĂȘcher un attaquant de glisser une
00:08:05version échangée. Rien de tout cela ne fonctionne cependant si vous ne committez pas votre fichier de verrouillage en premier
00:08:09lieu, donc assurez-vous que c'est dans le contrĂŽle de version et pas dans votre gitignore, et j'admettrai quand je
00:08:13ai commencé à apprendre à coder enfant, je pensais en fait qu'on était censé ignorer ceux-ci, donc je suis content
00:08:17d'avoir appris à les committer. Donc ces six conseils étaient surtout de la configuration et de l'outillage, mais il y a aussi des
00:08:21habitudes que vous pouvez adopter pour vous aider Ă Ă©viter les attaques. La premiĂšre est d'arrĂȘter de mettre Ă jour aveuglĂ©ment
00:08:25tout. Vous avez peut-ĂȘtre dĂ©jĂ lancĂ© ânpm updateâ ou les autres versions de cette commande auparavant, et simplement
00:08:30mis à jour chaque dépendance vers sa derniÚre version d'un seul coup, mais c'est le genre de comportement exact que ces
00:08:35attaquants espÚrent, donc passez réellement à travers ces mises à niveau et demandez-vous pourquoi vous avez besoin de
00:08:39la mettre Ă niveau. La deuxiĂšme habitude est de devenir de plus en plus pertinente, utilisez simplement moins de paquets. Chaque
00:08:43dépendance que vous ajoutez est une surface d'attaque supplémentaire, et la plupart de ces attaques se propagent à travers les dépendances
00:08:48d'une dépendance, donc ça vaut vraiment la peine de se demander pourquoi vous avez besoin de cette bibliothÚque. Quelques exemples courants que je vois de
00:08:53ceci sont des choses comme Lodash pour des fonctions qui peuvent ĂȘtre faites avec un petit extrait de code, ou Axios quand
00:08:58fetch peut faire la mĂȘme chose. La raison pour laquelle je dis que cela devient de plus en plus pertinent est qu'Ă l'Ăšre du codage
00:09:03agentique, il est assez facile d'amener l'IA à écrire quelques fonctions pour vous au lieu d'utiliser une dépendance.
00:09:08La troisiÚme habitude est d'épingler les dépendances à une version exacte, donc une mise à niveau est toujours un choix
00:09:12délibéré, mais sachez que cela ne verrouille en fait que les paquets que vous choisissez dans votre package.json,
00:09:17et les dépendances de vos dépendances peuvent encore utiliser leurs propres plages, ce qui est exactement pourquoi ce
00:09:21délai du conseil 1 compte. Tous ces éléments combinés devraient vous donner une certaine tranquillité d'esprit sur le fait que vous n'allez pas
00:09:25accidentellement installer un paquet compromis. Ils ne sont pas invincibles, mais ils sont bien meilleurs que
00:09:29rien. Le conseil ultime est juste de tout exécuter dans un conteneur de développement durci, mais j'ai toujours trouvé
00:09:34que c'était un peu fastidieux, donc je finis par retomber sur le développement local. Si vous connaissez un autre moyen
00:09:38de vous protĂ©ger contre ce genre d'attaque, faites-le moi savoir dans les commentaires ci-dessous, pendant que vous y ĂȘtes
00:09:42abonnez-vous, et comme toujours on se voit dans la prochaine.
Community Posts
No posts yet. Be the first to write about this video!
Write about this video