Aikido

Action GitHub compromise codfish/semantic-release-action dérobe les secrets CI/CD

Écrit par
Hunter Schwartz

Le 24 juin 2026, l' codfish/semantic-release-action GitHub Action a été compromise par une attaque de commit imposteur. Un attaquant a forcé l'envoi de deux commits malveillants dans le dépôt et a redirigé seize tags vers ceux-ci, y compris les tags de version majeure flottants v2, v3, v4, et v5. Tout workflow référençant l'action par l'un de ces tags tirera et exécutera le code de l'attaquant lors de sa prochaine exécution CI.

Cette action est la manière standard d'intégrer semantic-release dans GitHub Actions depuis 2019 et compte plus de 100 étoiles GitHub. Les workflows qui l'utilisent pour des releases automatisées détiennent presque toujours un GITHUB_TOKEN NPM_TOKEN et fréquemment un

Comment les tags ont été détournés

Les tags Git ne sont pas protégés par défaut. Toute personne ayant un accès push à un dépôt peut forcer un tag à pointer vers un commit différent, et GitHub Actions résout une référence de tag au moment où un workflow s'exécute. Déplacer un tag réécrit rétroactivement chaque exécution future qui le référence, sans aucun signal pour la personne qui a écrit le workflow.

L'attaquant a utilisé cela contre codfish/semantic-release-action en deux étapes. Le premier commit malveillant a récupéré quinze tags : v2.2.1, toute la ligne v3 (v3, v3.0.0 par v3.5.0), toute la ligne v4 (v4, v4.0.0, v4.0.1), et l'intégralité de la ligne v5 (v5, v5.0.0). Un second commit est un enfant direct du premier et a pris le v2 tag. Les deux commits livrent une charge utile (payload) identique au byte près, index.js confirmée par le hachage.

Aucun des deux commits n'est un ancêtre de la branche principal du dépôt. Ils ont été greffés comme des orphelins, puis maquillés pour éviter les soupçons lors d'un rapide git log examen. Le premier commit réutilise l'identité de l'auteur, la date et le message de commit d'un vrai commit du 9 novembre 2023 :

commit 5792aba0e2180b9b80b77644370a6889d5817456
Author: Chris O'Donnell <1666298+codfish@users.noreply.github.com>
Date:   Thu Nov 9 16:49:48 2023 +0000

    Merge pull request #195 from codfish/force-install

Ces métadonnées sont réelles, tirées d'un merge légitime dans l'historique du projet. Cependant, le contenu des fichiers a été remplacé par la charge utile malveillante.

Ce qui a changé dans action.yml

codfish/semantic-release-action s'exécutait à l'origine comme une action basée sur Docker, construisant un conteneur à partir du Dockerfile du dépôt et invoquant entrypoint.js. Les commits malveillants remplacent action.yml par une action composite à la place :

runs:
  using: composite
  steps:
    - uses: "codfish/semantic-release-action@8f9a58f2acdc190c356f79159b5de2548cdb63cd"
      with:
        branches: "${{ inputs.branches }}"
        # ...remaining inputs passed through unchanged
    - uses: "oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6"
      if: always()
    - name: Cleanup Action
      if: always()
      shell: bash
      run: bun run $GITHUB_ACTION_PATH/index.js

La première étape appelle toujours le vrai codfish/semantic-release-actionactuel, épinglé à un commit propre, de sorte que l'action continue de fonctionner normalement et qu'une exécution de workflow semble réussie. Les deux étapes suivantes s'exécutent avec if: always(), de sorte qu'elles se déclenchent que l'étape légitime réussisse, échoue ou soit ignorée. La deuxième étape intègre oven-sh/setup-bun, une action tierce réelle et par ailleurs sans rapport, uniquement pour obtenir le runtime Bun sur le runner CI. La troisième étape exécute la charge utile, index.js, avec bun run.

L'original du dépôt Dockerfile, entrypoint.js, et entrypoint.spec.js restent dans l'arborescence à ce commit. Ils ne sont tout simplement plus jamais invoqués, car une action composite les ignore entièrement. Laisser les anciens fichiers en place constitue une couverture de diff minimale. Quiconque parcourant une liste de fichiers voit le contenu habituel de l'action et rien d'évidemment manquant.

La charge utile

Le contenu injecté index.js est de 781 580 octets de JavaScript obfusqué, structuré comme un tableau de chaînes avec des noms de variables codés en hexadécimal, le style de sortie d'un obfuscateur JavaScript commercial typique :

const _0x307419=_0x42e6;(function(_0xb5d033,_0x1d1124){const _0x23f080={_0x15a6a0:0xf9,_0x3d6efe:0x73a,...

Enfouie dans le corps obfusqué se trouve la chaîne thebeautifulsnadsoftime, une correspondance quasi parfaite avec TheBeautifulSandsOfTime et décalée d'une seule lettre transposée. Cette chaîne identifie l'un des canaux de dépôt mort utilisés par le toolkit de vol d'identifiants Miasma, divulgué publiquement le 10 juin 2026. La conception de Miasma évite un serveur C2 traditionnel. Au lieu de se connecter à l'infrastructure de l'attaquant, le malware recherche périodiquement cette chaîne de marqueur dans l'API de recherche de commits publics de GitHub. Lorsqu'il trouve un commit correspondant, il traite la charge utile attachée comme une commande signée et l'exécute via eval(). Cela donne à l'opérateur un moyen de livrer une nouvelle exécution de code à distance à chaque runner infecté sans avoir à déployer ou maintenir leur propre infrastructure, et sans générer le trafic réseau sortant que la surveillance des flux de sortie signale habituellement.

Connexion à la campagne Miasma

Le même TheBeautifulSandsOfTime marqueur apparaît déjà dans l'activité de la campagne Miasma contre les packages npm sous le @redhat-cloud-services scope, et dans plusieurs autres dépôts GitHub compromis liés à la même fuite du toolkit. Une fois qu'un framework de vol d'identifiants comme celui-ci devient public, il a tendance à se propager rapidement, car tout opérateur peut l'exécuter sans écrire ses propres outils. codfish/semantic-release-action correspond à ce schéma, une autre instance du même toolkit atteignant un nouveau dépôt.

Comment Aikido détecte cela

Si vous êtes un utilisateur Aikido, vérifiez votre flux central et filtrez les problèmes de logiciels malveillants. Cela apparaîtra comme un problème critique 100/100. Aikido effectue des rescans nocturnes, mais nous vous recommandons de déclencher un rescan manuel dès maintenant.

Si vous n'êtes pas encore un utilisateur d'Aikido, vous pouvez créer un compte et connecter vos dépôts. Notre couverture anti-malware est incluse dans le plan gratuit, aucune carte de crédit requise.

Pour une couverture plus large pour toute votre équipe, Device Protection d'Aikido vous offre une visibilité et un contrôle sur les packages logiciels installés sur les appareils de votre équipe. Il couvre les extensions de navigateur, les bibliothèques de code, les plugins d'IDE et les dépendances de build, le tout en un seul endroit. Arrêtez les malwares avant qu'ils ne soient installés.

Pour une protection future, envisagez Aikido Safe Chain (open source). Safe Chain s'intègre à votre workflow existant, en interceptant les commandes npm, npx, yarn, pnpm et pnpx et en vérifiant les packages par rapport à Aikido Intel avant l'installation.

Indicateurs de compromission

Commits malveillants

  • 5792aba0e2180b9b80b77644370a6889d5817456 (tags v2.2.1, v3, v3.0.0 par v3.5.0, v4, v4.0.0, v4.0.1, v5, v5.0.0)
  • bcb6b1d409144318e8fad2171d6fe06d02299d1a (tag v2)

Hash de la charge utile

index.js (les deux commits malveillants) : sha256 9f93d77d32833a515bc406c46da477142bb1ac2babeecb6aa42f98669a6db015

Autres indicateurs

  • Chaîne de marqueur de point de chute : thebeautifulsnadsoftime
  • Bun runtime intégré via oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6

Tags affectés

  • codfish/semantic-release-action@v2
  • codfish/semantic-release-action@v2.2.1
  • codfish/semantic-release-action@v3 par v3.5.0
  • codfish/semantic-release-action@v4, v4.0.0, v4.0.1
  • codfish/semantic-release-action@v5, v5.0.0

Confirmé propre

  • codfish/semantic-release-action@v1.0.0 par v1.10.0
  • codfish/semantic-release-action@v2.0.0
Partager :

https://www.aikido.dev/blog/compromised-github-action-codfish-steals-secrets

Analyser les malwares

Commencer gratuitement
4,7/5
Fatigué des faux positifs ?
Essayez Aikido, comme 100 000 autres.
Commencez maintenant
Obtenez une démonstration personnalisée

Approuvé par plus de 100 000 équipes

Réserver maintenant
Analysez votre application à la recherche d'IDORs et de chemins d'attaque réels

Approuvé par plus de 100 000 équipes

Démarrer l'analyse
Découvrez comment le pentest IA teste votre application

Approuvé par plus de 100 000 équipes

Démarrer les tests

Sécurisez votre environnement dès maintenant.

Sécurisez votre code, votre cloud et votre environnement d’exécution dans un système centralisé unique.
Détectez et corrigez les vulnérabilités rapidement et automatiquement.

Aucune carte de crédit requise | Résultats en 32 secondes.