Une attaque en cascade de la chaîne d’approvisionnement sur GitHub qui a ciblé Coinbase en mars a maintenant été attribuée à un seul jeton volé dans un flux de travail SpotBugs, ce qui a permis à un acteur menaçant de compromettre plusieurs projets GitHub.

L’outil d’analyse statique populaire SpotBugs a été piraté en novembre 2024, entraînant la compromission de Reviewdog, ce qui a par la suite conduit à l’infection des fichiers tj-actions/changed-files.

L’attaque de la chaîne d’approvisionnement en plusieurs étapes a finalement révélé des secrets dans les référentiels 218, tandis que les dernières découvertes ont montré que les acteurs de la menace tentaient initialement de violer des projets appartenant à l’échange de crypto-monnaie Coinbase.

Le début de l’attaque, qui est resté inconnu jusqu’à présent, a été découvert par les chercheurs de l’unité 42 de Palo Alto Networks qui ont ajouté une mise à jour hier sur leur analyse originale de l’incident.

L’attaque en cascade de la chaîne d’approvisionnement
Nous savons maintenant que l’attaque de la chaîne d’approvisionnement a commencé fin novembre 2024 lorsqu’un responsable de SpotBugs (SPTBHS_MNTNR) a ajouté son Jeton d’accès personnel (PAT) dans un flux de travail CI.

Le 6 décembre 2024, un attaquant a exploité un workflow vulnérable « pull_request_target » pour voler le PAT du responsable via une pull request malveillante à partir d’un compte utilisateur jetable (randolzflow).

Le 11 mars 2025, l’attaquant a utilisé le PAT volé pour inviter un autre utilisateur factice (jurkaofavak) dans SpotBugs, qui a poussé un workflow d’actions GitHub malveillant qui a exfiltré un autre PAT appartenant à un responsable de Reviewdog (RD_MNTNR) qui avait également accès à SpotBugs.

Le PAT volé avait un accès en écriture à « reviewdog / action-setup », permettant à l’attaquant de remplacer la balise v1 par un commit malveillant à partir d’un fork, empoisonnant tous les consommateurs de la v1.

Cela a créé une porte dérobée qui a été exécutée lorsqu’elle était utilisée par « tj-actions/eslint-changed-files », sur laquelle le projet s’appuyait.

À l’aide d’informations d’identification volées, l’attaquant a remplacé les balises git dans le référentiel pour pointer vers un commit malveillant qui viderait les secrets des exécuteurs CI dans les journaux, affectant potentiellement 23 000 référentiels à l’aide de cette action. Cependant, il a été déterminé plus tard que les actions tj malveillantes ne commettaient que des secrets exposés pour 218 référentiels.

Comme révélé lors des enquêtes post-incident, l’attaquant a adapté le commit malveillant à la cible ‘coinbase/agentkit. L’IC de Coinbase a tiré et exécuté la version corrompue le 14 mars 2025.

Diagramme d’attaque de la chaîne d’approvisionnement

Malgré cela, aucun secret de Coinbase n’a été exposé, de sorte que la tentative de l’attaquant d’accéder à l’infrastructure de l’échange a échoué. L’entreprise a rapidement été informée de la tentative de violation et a supprimé le flux de travail.

Maintenant que le tableau complet de l’incident a été brossé, il devient clair que la violation était hautement organisée et méticuleusement planifiée, commençant des mois plus tôt que prévu initialement.

De plus, l’incident met en évidence des problèmes fondamentaux dans la chaîne de confiance entre les référentiels open source, ainsi que des problèmes d’écosystème d’action GitHub tels que la mutabilité des balises et une mauvaise journalisation des audits.

Les projets et les référentiels qui ont utilisé les actions compromises doivent immédiatement faire pivoter tous les secrets.

Les journaux d’actions GitHub, en particulier ceux du 10 au 14 mars 2025, doivent être audités pour détecter les signes d’impression de secrets, en particulier les blobs codés en base64.

Pour atténuer le risque d’attaques similaires à l’avenir, il est recommandé d’épingler les dépendances à l’aide de hachages de validation au lieu de balises, et d’éviter ‘pull_request_target’ sauf si nécessaire.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *