TanStack et bien d'autres paquets affectés : analyse et examen approfondi
MMaximilian SchwarzmĂŒller
컎íší°/ìíížìšìŽêČœì ëŽì€AI/믞ëêž°ì
Transcript
00:00:00Nous subissons une autre attaque majeure de la chaĂźne d'approvisionnement en ce moment mĂȘme,â
00:00:06et elle s'est propagĂ©e de NPM Ă l'Ă©cosystĂšme Python, donc Ă©vitez d'installer tout paquetâ
00:00:12NPM ou Python pour l'instant. Assurez-vous que votre systĂšme est bien sĂ©curisĂ©. J'ai une vidĂ©oâ
00:00:19Ă ce sujet, je partagerai le lien ci-dessous et j'y reviendrai aussi dans cette vidĂ©o, mais d'abordâ
00:00:23je veux vous donner des dĂ©tails sur ce qui est touchĂ© et comment savoir si vous l'ĂȘtes. Tout a commencĂ© avecâ
00:00:30les paquets TanStack : TanStack query, TanStack router, TanStack start, etc. Hier, le 11 mai,â
00:00:36en un temps trĂšs court, plusieurs paquets malveillants, ou en fait tous les paquets TanStack,â
00:00:43ont Ă©tĂ© publiĂ©s dans des versions malveillantes. L'attaque a Ă©tĂ© contenue en 20 minutes.â
00:00:50Finalement, elle a Ă©tĂ© dĂ©tectĂ©e et stoppĂ©e rapidement, mais tous ces paquets malveillants ont Ă©tĂ© publiĂ©sâ
00:00:57durant ce court laps de temps. Ensuite, la propagation s'est poursuivie et elle continue encore.â
00:01:03Elle a touchĂ© les paquets Mistral qui n'ont que quatre utilisateurs, mais ils ont quand mĂȘme Ă©tĂ©â
00:01:09affectĂ©s car ce malware agit comme un ver : il vole des donnĂ©es et des identifiants, potentiellementâ
00:01:16les vĂŽtres s'il est installĂ© sur votre systĂšme. Je reviendrai sur comment savoir si vous ĂȘtes touchĂ©â
00:01:20dans un instant, mais il a continuĂ© Ă se propager Ă d'autres paquets NPM car c'est son but,â
00:01:26et mĂȘme dans l'Ă©cosystĂšme Python en ce moment mĂȘme. Cela ne date que de quelques heures,â
00:01:32deux heures au moment oĂč j'enregistre ceci. Maintenant, comment savoir si vous ĂȘtes touchĂ© ?â
00:01:39Si vous avez installĂ© un paquet TanStack hier soir, dans mon cas sur le fuseau horaire allemand,â
00:01:45vous devez vous considĂ©rer comme affectĂ©. Si vous l'avez installĂ© vers cette heure-lĂ , gardez Ă l'espritâ
00:01:54que c'est en UTC, donc convertissez-le selon votre zone. Dans ce cas, vous ĂȘtes probablement touchĂ©.â
00:02:00Mais comme cela se propage aux paquets Mistral et Ă bien d'autres paquets JavaScript,â
00:02:06trop nombreux pour ĂȘtre listĂ©s ici, vous devez considĂ©rer votre machine comme compromise.â
00:02:13Je partagerai les liens vers ces publications pour que vous puissiez voir la liste complĂšteâ
00:02:18de tous les paquets concernĂ©s au fur et Ă mesure. Mais comme indiquĂ©, c'est encore en cours,â
00:02:22donc n'installez rien pour l'instant. Il existe aussi des indicateurs de compromission.â
00:02:31Cherchez certaines empreintes de fichiers, des hashes SHA, pour le routeur dans un fichier JS.â
00:02:38Si vous avez un moyen de surveiller les requĂȘtes rĂ©seau effectuĂ©es sur votre machine,â
00:02:42cherchez du trafic sortant vers cette URL. Ce serait un indicateur clairâ
00:02:48que des donnĂ©es ont Ă©tĂ© exfiltrĂ©es de votre systĂšme. Que signifie concrĂštement une compromission ?â
00:02:55Ce malware fait deux choses principales. D'abord, il rĂ©colte des donnĂ©es. Il chercheâ
00:03:03des jetons NPM, GitHub, des identifiants AWS et d'autres secrets. Il scanne votre systĂšmeâ
00:03:12aux endroits habituels oĂč sont stockĂ©s les secrets, les collecte et les envoieâ
00:03:18Ă l'URL que je vous ai montrĂ©e. Il vole donc ces secrets. Mais il ne s'arrĂȘte pas lĂ .â
00:03:26Comme je l'ai dit, il agit comme un ver et utilise les jetons GitHub volĂ©s.â
00:03:33Il s'en sert avec les jetons NPM pour publier d'autres paquets compromis. Si vous maintenezâ
00:03:40un autre paquet, ou si un workflow CI/CD s'est exĂ©cutĂ© durant cette pĂ©riode etâ
00:03:46dĂ©pendait de paquets TanStack, alors dans ce workflow, les paquets TanStack compromisâ
00:03:53ont Ă©tĂ© rĂ©cupĂ©rĂ©s. Le code malveillant a pu s'y exĂ©cuter. Et dans ce workflow,â
00:04:00mĂȘme si ce n'est pas sur votre machine, il a pu voler des identifiantsâ
00:04:06pour publier une version malveillante du paquet que votre workflow CI/CDâ
00:04:14essayait de construire. C'est ainsi qu'il se propage. Il agit vraiment comme un ver.â
00:04:20Il utilise les jetons volĂ©s pour infecter plus de paquets. C'est ainsi que cela a atteintâ
00:04:26vers Mistral, d'autres paquets JavaScript, et mĂȘme l'Ă©cosystĂšme Python. Et nous en
00:04:32Et Ă ma connaissance, cela continue de s'Ă©tendre. Alors, comment s'en protĂ©ger ?â
00:04:39J'ai créé une vidĂ©o Ă ce sujet sur mon autre chaĂźne, AkataMind. Le lien sera en description.â
00:04:44Pour faire court, vous devez vous assurer de ne pas exĂ©cuter votre code ou dĂ©velopperâ
00:04:51directement sur votre machine hĂŽte, mais plutĂŽt dans une machine virtuelle ou un conteneur dev.â
00:04:57Ne stockez pas de secrets en clair sur votre machine. Pour AWS,â
00:05:03par exemple, privilĂ©giez le Single Sign-On plutĂŽt que de stocker des identifiants IAM,â
00:05:10et utilisez des techniques similaires pour vos autres services. De plus,â
00:05:16envisagez d'utiliser des services comme Infisical ou Doppler pour stocker vos secretsâ
00:05:25dans le cloud et non sur votre disque dur ou dans des fichiers .env.â
00:05:30J'en parle dans l'autre vidĂ©o. Utilisez aussi des gestionnaires de paquetsâ
00:05:38qui permettent de configurer un Ăąge minimum de publication, comme le permet Bun.â
00:05:44Dans le fichier bunfig.toml, vous pouvez dĂ©finir un Ăąge minimum de sortie pour garantirâ
00:05:49que 'bun install' n'installe que des paquets vieux d'au moins X secondes ou jours.â
00:05:56pnpm a une fonction similaire, tout comme les derniĂšres versions de npm.â
00:06:02Encore une fois, j'ai couvert cela ailleurs. Si vous utilisez Bun ou une bonne config npm,â
00:06:09Bun bloque par dĂ©faut l'exĂ©cution des scripts post-install,â
00:06:15c'est-Ă -dire les scripts de cycle de vie des paquets que vous installez.â
00:06:21C'est un autre mĂ©canisme de sĂ©curitĂ© car ce malware s'appuie souventâ
00:06:28sur l'exĂ©cution de tels scripts. Utiliser un gestionnaire de paquets sĂ©curisĂ©,â
00:06:36isoler votre code dans une VM et ne pas stocker de secrets en clair :â
00:06:41voilĂ ce qu'il faut faire, surtout maintenant que ces attaques deviennent plus sĂ©rieuses.â
00:06:46Nous allons voir comment celle-ci a fonctionnĂ© car c'est trĂšs intĂ©ressant.â
00:06:52Malheureusement, elles sont de plus en plus frĂ©quentes. Je fais une vidĂ©o par mois lĂ -dessus,â
00:06:58voire plus, car je pense qu'elles sont plus faciles Ă rĂ©aliser dĂ©sormais.â
00:07:04Ă l'Ăšre de l'IA, il est plus simple d'analyser les paquets ou les dĂ©pendances ciblĂ©es,â
00:07:12d'Ă©tudier leur code source ou leur configuration CI/CD pour trouver des failles.â
00:07:22C'est ce qui s'est passĂ© pour TanStack. Ce n'est pas la machine d'un mainteneurâ
00:07:28qui a Ă©tĂ© touchĂ©e, mais le workflow CI/CD de TanStack. J'y reviendrai.â
00:07:34L'IA facilite la recherche de vulnĂ©rabilitĂ©s et l'Ă©criture de code, mĂȘme malveillant.â
00:07:40En parallĂšle, nous vivons une explosion logicielle : on Ă©crit plus de code que jamais.â
00:07:45Il y a donc plus de cibles, dont beaucoup nĂ©gligent la sĂ©curitĂ©,â
00:07:51ce qui rend ces attaques d'autant plus attractives. Comment tout cela a commencĂ© ?â
00:07:57C'est fascinant. Ce n'est pas une approche inĂ©dite, mais elle est trĂšs Ă©laborĂ©e.â
00:08:03L'Ă©quipe TanStack a publiĂ© un rapport d'incident expliquant le dĂ©roulement de l'attaque.â
00:08:09Je mettrai le lien, mais je vais vous en faire le rĂ©sumĂ© ici.â
00:08:15En rĂ©sumĂ©, cette attaque a reposĂ© sur trois Ă©tapes clĂ©s que je vais dĂ©tailler.â
00:08:22D'abord, un schĂ©ma de 'pull request pwn request'. Je vais expliquer ce que c'est.â
00:08:30Ensuite, l'empoisonnement du cache GitHub Actions via les limites de confiance des forks,â
00:08:38et l'extraction en mĂ©moire d'un jeton OIDC. Qu'est-ce que tout cela signifie ?â
00:08:45Vous pouvez lire l'article pour les dĂ©tails, mais voici l'essentiel. Commençons parâ
00:08:50la 'pull request pwn request'. Pour comprendre, il faut savoir que GitHub Actionsâ
00:08:58est la solution CI/CD de GitHub. J'ai d'ailleurs un cours complet Ă ce sujetâ
00:09:05si vous voulez apprendre Ă configurer GitHub Actions pour vos tĂąches d'automatisation,â
00:09:10publier vos paquets ou vos sites web. Comme tout outil CI/CD,â
00:09:16il repose sur des Ă©vĂ©nements qui dĂ©clenchent des workflows automatisĂ©s.â
00:09:24Par exemple, dĂ©ployer votre site automatiquement quand vous poussez sur la branche principale.â
00:09:29Le 'push' est l'un de ces Ă©vĂ©nements. Vous pouvez dĂ©finir des tĂąches spĂ©cifiques :â
00:09:34installer des dĂ©pendances, compiler le projet, le mettre en ligne.â
00:09:40Un autre dĂ©clencheur est 'pull_request_target'. Il s'activeâ
00:09:44lorsqu'une pull request est ouverte sur votre dĂ©pĂŽt. Cela signifieâ
00:09:49que n'importe qui peut forker votre dĂ©pĂŽt, y faire des modifications et ouvrirâ
00:09:56une pull request, ce qui dĂ©clenchera ce workflow. Ăa a l'air dangereux ? Ăa l'est,â
00:10:05et c'est le point de dĂ©part de l'attaque. Il existe aussi le dĂ©clencheur 'pull_request'.â
00:10:14Ce dernier exĂ©cute le workflow dans le contexte du dĂ©pĂŽt forkĂ©. Ainsi,â
00:10:19tout ce qui est malveillant reste confinĂ© au fork, pas au dĂ©pĂŽt de base.â
00:10:25En revanche, 'pull_request_target' s'exĂ©cute dans le contexte du dĂ©pĂŽt de base.â
00:10:31C'est lĂ que rĂ©side le danger. Dans le cas de TanStack, l'attaquant a inclusâ
00:10:38le code malveillant du ver dans son fork, puis a ouvert une pull request.â
00:10:45Cela a dĂ©clenchĂ© 'pull_request_target' sur un exĂ©cuteur GitHub Actions,â
00:10:52tournant dans le contexte du dĂ©pĂŽt principal. Cela ne donne pas un accĂšs directâ
00:10:58au code source de base pour le modifier, mais cela signifie que le cache utilisĂ©â
00:11:04Et c'est ce qui s'est passé ici pour l'attaque TanStack : dans cette pull request,
00:11:10au sein de ce fork, l'attaquant a inclus le code malveillant, le code du ver, le malware dans le dépÎt TanStack,
00:11:20plus précisément dans son fork. Ensuite, l'attaquant a ouvert la pull request,
00:11:26ce qui a déclenché l'exécution de pull_request_target. Et comme mentionné, cela lance
00:11:33un runner GitHub Actions, qui s'exécute alors dans le contexte du dépÎt de base. Qu'est-ce que cela signifie ?
00:11:40Cela ne signifie pas que l'attaquant accĂšde au code de base ou peut y fusionner le code malveillant,
00:11:46mais cela signifie, par exemple, que le cache utilisé à cet endroit
00:11:53sera partagé avec les exécutions ultérieures de GitHub Actions issues du dépÎt de base,
00:12:00potentiellement via des hooks ou des déclencheurs totalement différents comme le push.
00:12:05L'étape suivante a été l'empoisonnement du cache. Mais qu'est-ce que cela signifie ? Eh bien,
00:12:11l'attaquant a ajouté du code à son fork pour s'assurer que lorsque l'action GitHub
00:12:17s'exécutait via le déclencheur pull_request_target, elle lancerait une commande, la commande hash files,
00:12:23qui est supportée par GitHub Actions, pour stocker quelque chose dans le cache. Maintenant,
00:12:28quel est l'intĂ©rĂȘt de ce cache ? L'idĂ©e derriĂšre le cache GitHub Actions est simplement d'accĂ©lĂ©rer
00:12:33a volĂ© un jeton NPM Ă©phĂ©mĂšre (OIDC) pour publier une version infectĂ©e de TanStack.â
00:12:39NPM propose une fonction de 'trusted publishing' censĂ©e ĂȘtre plus sĂ»re.â
00:12:46Normalement, on peut utiliser un jeton de compte, mais s'il est volĂ©, c'est fini.â
00:12:52Avec la publication de confiance, on doit passer par un fournisseur comme GitHub Actions.â
00:12:56Un jeton Ă durĂ©e de vie trĂšs courte est alors gĂ©nĂ©rĂ© pour signer la nouvelle version.â
00:13:00Mais si le code qui s'exĂ©cute dans le workflow est dĂ©jĂ compromis,â
00:13:06il a accĂšs Ă ce jeton tout neuf. C'est ce qui s'est passĂ© : le malwareâ
00:13:12a utilisĂ© ce jeton pour publier la version malveillante sur NPM. Fait intĂ©ressant,â
00:13:18l'attaque a partiellement Ă©chouĂ© car le workflow GitHub Actions s'est interrompuâ
00:13:24comme celles du dĂ©clencheur push, partagent le mĂȘme contexte et le mĂȘme cache. Et c'est
00:13:31Si le code avait Ă©tĂ© valide, le workflow se serait terminĂ© normalementâ
00:13:39et la version compromise aurait paru parfaitement authentique.â
00:13:46L'attaquant n'avait plus qu'à attendre qu'un flux de travail GitHub Actions normal s'exécute pour les paquets TanStack.
00:13:53Lorsqu'un mainteneur poussait du code, cette autre exécution de GitHub Actions réutilisait
00:14:01le mĂȘme cache configurĂ© prĂ©cĂ©demment par l'exĂ©cution malveillante, et rĂ©cupĂ©rait alors
00:14:08le cache empoisonné préparé, qui incluait le code malveillant. C'est ainsi que ce code
00:14:13est passé du fork vers l'exécution normale de GitHub Actions lors d'un push standard par un mainteneur
00:14:21qui n'avait pas été affecté par un quelconque code malveillant. Le cache a servi de véhicule de transport
00:14:28entre ces deux exécutions de GitHub Actions au final. Puis, dans une troisiÚme étape, une fois que
00:14:35Ce n'est pas fini, et toutes les futures attaques ne seront pas dĂ©tectĂ©es aussi vite.â
00:14:44La surface d'attaque grandit : plus de code, plus de cibles potentielles,â
00:14:54et l'IA qui aide les attaquants. Si vous le pouvez, n'installez rien pour le moment,â
00:15:00vérifiez vos configurations et consultez les liens ci-dessous pour plus de détails.
00:15:04Il existe grosso modo deux façons de publier un paquet sur NPM, on pourrait dire. La premiÚre consiste à créer un
00:15:11jeton avec votre compte NPM et Ă l'utiliser pour publier de nouvelles versions de votre paquet. Le problĂšme,
00:15:19c'est que si ce jeton est volé, n'importe qui peut publier une nouvelle version de ce paquet. Pour renforcer la
00:15:26sĂ©curitĂ©, il existe ce processus de publication de confiance oĂč NPM dit : non, vous ne pouvez pas publier de paquets depuis
00:15:33votre machine, vous devez passer par l'un de ces fournisseurs de confiance, GitHub Actions étant l'un d'entre
00:15:37eux, et il existe une intégration de publication de confiance pour GitHub Actions que vous pouvez configurer. Ensuite,
00:15:44dans le cadre de ce processus de publication de confiance, un jeton de publication à courte durée de vie sera récupéré
00:15:50ou demandé. Et ensuite, ce jeton à courte durée de vie sera utilisé pour signer cette nouvelle version
00:15:57du paquet en cours de publication. En théorie, l'idée est que le jeton est difficile à voler parce
00:16:03qu'il n'est sur la machine d'aucun mainteneur. Et de plus, il est de courte durĂ©e. MĂȘme s'il Ă©tait volĂ©,
00:16:08il n'est pas actif trÚs longtemps. Le problÚme, bien sûr, est simplement que si le code qui s'exécute dans le workflow
00:16:15CI/CD qui demande ce jeton de confiance a été infecté, alors ce code
00:16:21malveillant a accÚs à ce tout nouveau jeton de publication de confiance à courte durée de vie. Et c'est ce qui s'est passé
00:16:27ici. Ce code malveillant a donc abusé de ce jeton ou a utilisé ce jeton pour publier ensuite une nouvelle version
00:16:36du paquet TanStack. Maintenant, assez curieusement, cette attaque a un peu échoué parce qu'elle a bien
00:16:44obtenu ce jeton de confiance et l'a utilisé pour contacter l'API NPM afin de publier une nouvelle version
00:16:52du paquet TanStack qui incluait ce ver, qui incluait le code malveillant. Mais elle s'est en fait
00:16:58retrouvée dans un workflow GitHub Actions qui n'a pas pu se terminer parce qu'il y avait un problÚme dans
00:17:06le code qui avait été poussé vers le CI/CD. Si les attaquants avaient fait attention à lancer leur
00:17:12attaque Ă un moment oĂč un code valide Ă©tait poussĂ©, alors bien sĂ»r ce workflow se serait
00:17:19terminé et ils n'auraient pas eu besoin de publier un paquet malveillant manuellement en contactant
00:17:26l'API NPM, mais ils auraient pu injecter le code malveillant dans ce workflow,
00:17:32le laisser se terminer avec succÚs, et une version compromise de TanStack aurait alors été
00:17:38publiée tout en paraissant tout à fait valide, puisqu'il s'agissait d'un push normal par un mainteneur et que le workflow
00:17:45s'était terminé avec succÚs. La façon dont cette attaque a fonctionné, parce que ce workflow ne s'est pas terminé avec succÚs,
00:17:51a rendu un peu plus facile la détection de ce qui se passait par un contributeur externe, au final,
00:18:00parce qu'on pouvait voir qu'une nouvelle version des paquets TanStack avait Ă©tĂ© publiĂ©e alors mĂȘme que le
00:18:05workflow GitHub Actions avait Ă©chouĂ©, donc aucune nouvelle version n'aurait dĂ» ĂȘtre publiĂ©e. On pouvait donc voir une
00:18:12incohérence, ce qui a facilité la détection de cette attaque, et c'est en partie là que les
00:18:19mainteneurs de TanStack et nous tous avons eu de la chance. C'est néanmoins une attaque assez élaborée comme vous pouvez
00:18:26probablement le dire, qui a fonctionnĂ© sans compromettre la machine de qui que ce soit, et mĂȘme si elle a Ă©tĂ© stoppĂ©e
00:18:32rapidement, elle a fait de sérieux dégùts car, comme je l'ai mentionné, elle se propage encore, et c'était un long
00:18:41épisode sur tout cela, je sais, mais je veux vraiment insister sur le fait que vous devez travailler à sécuriser
00:18:49votre systÚme, comme je l'ai partagé plus tÎt et dans cette vidéo. Vous voulez vous assurer de réduire le
00:18:56risque d'ĂȘtre affectĂ©. Cette attaque a Ă©tĂ© stoppĂ©e rapidement, et pourtant elle continue de se propager,
00:19:05ce n'est donc pas encore fini, et il est possible que toutes les attaques ne soient pas détectées aussi rapidement
00:19:11Ă l'avenir. Ils ont eu un peu de chance ici, il aurait pu ĂȘtre plus difficile de dĂ©tecter cette
00:19:18attaque, et les dĂ©gĂąts auraient alors pu ĂȘtre encore plus importants ; mais ils sont dĂ©jĂ consĂ©quents ici et
00:19:24ce n'est pas fini. Nous verrons d'autres attaques de ce type, j'en suis sûr, car comme je l'ai dit, la surface
00:19:31d'attaque s'agrandit et devient plus intéressante. Il y a plus de gens qui écrivent du code, beaucoup de gens
00:19:36qui ne savent pas ce qu'ils font, et l'IA aide Ă mener de telles attaques. VoilĂ donc ce qui se
00:19:42passe en ce moment. Si vous ne le devez pas, n'installez peut-ĂȘtre rien, vĂ©rifiez bien votre configuration, et vous
00:19:48trouverez tous les liens ci-dessous si vous voulez approfondir, si vous voulez voir la liste complĂšte des paquets
00:19:51affectés, et ainsi de suite.
Community Posts
No posts yet. Be the first to write about this video!
Write about this video