Piratage de Codecov

Piratage de Codecov

TL ;DR : plutôt qu’un résumé, voici l’explication de la gravité du piratage de Codecov :

L’original https://twitter.com/cyb3rops/status/1383311489017139210?s=11

Qui est CodeCov

Codecov est une entreprise proposant un outil d’analyse de la qualité de code (entre autre 😉 ), leur nom venant de « code coverage » ou « couverture de code », c’est-à-dire le taux (pourcentage) de code source exécuté d’un programme donné quand une suite de test est lancée.

Codecov propose un script bash (https://codecov.io/bash) à télécharger puis exécuter, permettant d’intégrer l’outil à son logiciel et usine logicielle (pipeline CI/CD).

Codecov est disponible gratuitement pour un certain nombre de dépôts de code comme GitHub, GitLab, BitBucket… D’ailleurs, il y’a près de 9500 projets open source qui l’utilisent :

https://grep.app/search?current=6&q=https%3A//codecov.io/bash

Dont Kubernetes, alibaba, AWS (s2n-tls l’implémentation TLS d’AWS), ansible, des projets Apache, Ruby, node.js, urllib3 (intégré à énormément de projets Python), nextcloud… mais aussi Adorsys ("Open Banking Gateway", utilisé dans toute l'Europe et  passerelle de payement  PSD2 / Payment Services Directive 2).

Le piratage

Il s'agit d'une « supply chain attack» ou une attaque de la chaine d'approvisionnement, c’est-à-dire la compromission d’un sous-traitant pour compromettre une (des) autre cible.

Le 1er avril, et ce n’est pas une blague, un utilisateur attentif de Codecov a remarqué que le condensat SHA-1 160bits du script était différent de celui fourni sur GitHub, comme quoi, il y’a du bon à être pointilleux et à vérifier les condensats de ce que l’on télécharge 😉.

Il a regardé plus en détail et découvert l’ajout d’une ligne de commande récupérant la liste des dépôts installés (git remote -v) avec les informations d’environnement ($env) et envoyant le tout sur un serveur hébergé aux USA chez DigitalOcean (loué ou piraté lui-même). L’outil étant en général utilisé sur les usines logicielles (continuous integration (CI) environments), l’attaquant a pu récupérer des identifiants et mots de passe de dépôts de code, des jetons d'API, des clefs secrètes…

C’est le script hébergé chez Codecov qui a été modifié (https://codecov.io/bash) aux alentours du 31 janvier 2021 et pas le même script sur le dépôt GitHub, ce qui fait qu’il n’y a pas d’historique de cette modification.

Les attaquants ont donc pu récupérer des informations sensibles pendant 2 mois !

Après avoir été informé de l’attaque, Codecov a retiré le script malveillant mais a attendu près de 2 semaines avant de communiquer largement sur le sujet, laissant 2 semaines de plus aux attaquants pour utiliser les données volées, c’est regrettable, même s’il est compréhensible qu’ils aient priorisé leurs clients.

https://about.codecov.io/security-update/

Que faire ?

La chaîne des dépendances dans le développement fait qu’il est compliqué de savoir si vous avez été piraté.

Il faut donc être capable de savoir :

  1. Si vous utilisez directement ou indirectement Codecov ;
  2. Si vous avez été victime de l’attaque ;
  3. Quels secrets ont été volés afin de les changer.

1. Si vous utilisez…

Afin de savoir si vous utilisez Codecov directement, le plus simple me semble être de rechercher dans vos codes sources… si ce n’est pas dans votre documentation 😉. Un gros « grep -i -a -n https://codecov.io/bash  » devrait être suffisant

Par contre, pour savoir si vous utilisez Codecov indirectement, s’il est utilisé par une dépendance que vous téléchargez à la construction de votre application ou à son installation, il faut… construire ou installer. De ce fait, il faut déployer complètement vos différentes solutions puis y rechercher la présence du script Codecov. Vous pouvez également recherche le script sur les environnements déjà déployés. C’est un travail de longue haleine 😥.

Vous avez également des règles Yara ici : https://github.com/Neo23x0/signature-base/blob/master/yara/mal_codecov_hack.yar

Si vous avez d’autres idées ou techniques, n’hésitez pas à me répondre 👍, je compléterai ici.

2. Si vous avez été victime…

Afin de savoir si vous avez été victime, vous pouvez déjà chercher le script de Codecov et si vous le trouvez, dans sa version malveillante, alors… 😉.

Vous pouvez également regarder dans vos logs proxy, firewal… si l’ip 104.248.94.23 a été contactée. A condition d’avoir ce type de trace 😉.

Vous avez également des règles Yara ici : https://github.com/Neo23x0/signature-base/blob/master/yara/mal_codecov_hack.yar

Si vous avez d’autres idées ou techniques, n’hésitez pas à me répondre 👍, je compléterai ici.

3. Quels secrets…

Pour savoir ce qui a pu être volé, il suffit d’exécuter la commande « git remote -v » sur votre usine logicielle (CI environnement) et vos environnements de déploiement où vous avez trouvé le script malveillant.

Une fois que vous aurez identifié ce qui aurait pu être volé et sur quel environnement, il faudra changer (et révoquer) les jetons d’api, les mots de passe…

A partir de là... il faudra à nouveau enquêter pour voir si ces mots de passe, jetons... ont été utilisés, qu'est ce qui a été accédé, volé... et bon courage pour démêler la pelote des potentielles compromission !

Dans le communiqué de Codecov, j’adore la réponse à une question en particulier sur le FAQ :

Is it safe to use Codecov systems and services?
Yes. Codecov takes the security of its systems and data very seriously and we have implemented numerous safeguards to protect them.

Oui, forcement, ils n’allaient pas dire le contraire 😉 :

Bon courage dans vos recherches.