Une opération automatisée et à grande échelle a ciblé des milliers de référentiels GitHub. Elle a été détectée par des chercheurs de SafeDep alors que les attaquants injectaient des milliers de commits malveillants dans des dépôts en se faisant passe pour une opération de maintenance CI/CD de routine. La campagne baptisée Megalodon cherchait à créer des portes dérobées sur GitHub et elle a affecté plus de 5 000 dépôts pendant une durée de 6h. L’attaque a pris la forme d’un commit frauduleux « acac5a9 », ciblant les workflows GitHub Actions. « L’exécution inattendue de workflow_dispatch dans l’onglet Actions pourraient constituer un signe avant-coureur », indique les experts dans un article de blog. Ils recommandent à ceux qui utilisent la fédération OpenID Connect (OIDC) pour leurs déploiements cloud « d’examiner les journaux d’audit cloud pour rechercher des demandes de jetons provenant d’exécutions de workflows inconnues. »

Les commits malveillants ont été observés en train de modifier les workflows GitHub Actions afin d’y inclure des charges utiles bash encodées en base64. Ces charges sont conçues pour voler des secrets exposés lors de l’exécution de l’intégration continue (CI), notamment des identifiants cloud, des clés SSH, des tokens OpenID Connect (OIDC), des secrets de code source et d’autres variables d’environnement. Parmi les projets les plus touchés figuraient le dépôt ioLibrary_Driver de Wiznet, quatre dépôts Tiledesk et quatre dépôts persian-tools, concentrant à eux seuls bien plus de 2 000 commits malveillants. Un article de blog publié ultérieurement par OX Security relève certaines similitudes avec les compromissions généralisées de TeamPCP, en particulier l'utilisation de dates de commit historiques codées en dur. Cette astuce était utilisée dans les opérations liées à TeamPCP pour dissimuler le moment réel de l'activité frauduleuse.

Une attaque automatisée utilisant des clés compromises

Selon les chercheurs de SafeDep, en l'espace d'environ six heures, la campagne Megalodon a déployé 5 718 commits malveillants sur 5 561 dépôts GitHub publics, en exploitant principalement des identifiants compromis pour modifier directement les workflows Actions. La campagne a été détectée alors qu'ils enquêtaient sur un fichier de workflow Actions de Tiledesk dissimulant la charge utile bash encodée en base64. « Les versions 2.18.6 (19 mai) à 2.18.12 (21 mai) contiennent toutes la porte dérobée », ont conclu les chercheurs après une enquête préliminaire. Une comparaison plus approfondie des versions incriminées de Tiledesk avec leurs prédécesseurs légitimes a conduit les chercheurs à un commit malveillant. « Il a été effectué le 18 mai 2026, rédigé par le build-bot <build-system@noreply.dev> avec le message ‘ci: add build optimization step’ », ont-ils déclaré, ajoutant que « le nom de l'auteur et l'adresse de courriel générique noreply imitent les commits CI automatisés. » La modification a été poussée sans pull requets (PR) ni commit de fusion. Les chercheurs pensent qu’elle a été peut-être réalisée à l'aide d'un jeton d'accès personnel Personal Access Token (PAT) ou d'une clé de déploiement compromis. Ils ont signalé que la modification malveillante était toujours active sur la « branche maître » au moment de la publication de cette divulgation.

Outre « build-bot », la campagne s'est également appuyée sur d'autres identités d'auteur falsifiées, dont « auto-ci » et « ci-bot ». La campagne a déployé deux variantes de charge utile. La première, « SysDiag », intégrait des charges utiles bash obfusquées directement dans les workflows, se déclenchant automatiquement à chaque push ou requête pull (PR), tandis que la seconde, « Optimize-Build », suivait une approche par étapes utilisant « workflow_dispatch » pour exécuter le flux malveillant uniquement lorsque cela était nécessaire. Cette dernière, utilisée lors de la compromission de Tiledesk, s’est avérée bruyante sur le plan opérationnel et a laissé des traces détectables. Les deux variantes ciblaient des secrets CI sensibles, notamment des identifiants AWS et GCP, des clés SSH, des configurations Kubernetes, des jetons OIDC GitHub, des secrets de code source et l'historique du shell. Elles ont exfiltré les secrets volés vers une infrastructure contrôlée par les attaquants à l'adresse 216.126.225.129:8443.

SafeDep a partagé une liste d'indicateurs de compromission (IOC), comprenant le domaine C2, la signature de la campagne, les noms et adresses de courriel des auteurs, les messages de commit et les noms des dépôts GitHub compromis, afin de faciliter la détection et le nettoyage.