Am 24. Juni 2026 hat die Kabeljau/semantische-Freigabe-Aktion GitHub Action wurde durch einen „Imposter-Commit“-Angriff kompromittiert. Ein Angreifer hat zwei bösartige Commits per Force-Push in das Repository eingeschleust und sechzehn Tags auf diese umgeleitet, darunter auch die Tags für die schwebende Hauptversion. v2, v3, v4, und v5. Jeder Workflow, der über eines dieser Tags auf die Aktion verweist, ruft den Code des Angreifers ab und führt ihn beim nächsten CI-Lauf aus.
Diese Aktion ist seit 2019 die Standardmethode, um „semantic-release“ in GitHub Actions zu integrieren, und hat über 100 GitHub-Stars. Workflows, die sie für automatisierte Releases nutzen, verfügen fast immer über eine GITHUB_TOKEN und oft ein NPM_TOKEN mit Veröffentlichungsrechten – genau die Art von Zugriff, die sich ein Angreifer erschließen möchte.
Wie die Tags gekapert wurden
Git-Tags sind standardmäßig nicht geschützt. Jeder, der über Push-Zugriff auf ein Repository verfügt, kann ein Tag so ändern, dass es auf einen anderen Commit verweist, und GitHub Actions löst eine Tag-Referenz zum Zeitpunkt der Ausführung eines Workflows auf. Das nachträgliche Verschieben eines Tags führt dazu, dass jeder zukünftige Lauf, der darauf verweist, neu geschrieben wird, ohne dass die Person, die den Workflow erstellt hat, darüber informiert wird.
Der Angreifer nutzte dies aus, um Kabeljau/semantische-Freigabe-Aktion in zwei Schritten. Der erste böswillige Commit hat fünfzehn Tags erfasst: v2.2.1, die gesamte v3-Reihe (v3, v3.0.0 bis v3.5.0), die gesamte v4-Reihe (v4, v4.0.0, v4.0.1) sowie die gesamte v5-Reihe (v5, v5.0.0). Ein zweiter Commit ist ein direktes Kind des ersten und hat die v2 Tag. Beide Commits enthalten eine byteweise identische index.js Nutzdaten, durch Hash bestätigt.
Keiner der beiden Commits ist ein Vorläufer des Repositorys Haupt Zweig. Sie wurden als Waisenkinder eingepfropft und dann, um keinen Verdacht zu erregen, in aller Eile git log Überblick. Der erste Commit verwendet die Autorenangabe, das Datum und die Commit-Meldung eines echten Commits vom 9. November 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-installDiese Metadaten sind echt und stammen aus einem legitimen Merge in der Projektgeschichte. Der Inhalt der Datei wurde jedoch durch die schädliche Nutzlast ersetzt.
Was hat sich geändert in action.yml
Kabeljau/semantische-Freigabe-Aktion wurde ursprünglich als Docker-basierte Aktion ausgeführt, bei der ein container dem Repository erstellt wurde Dockerfile und das Aufrufen von entrypoint.js. Die böswilligen Commits ersetzen action.yml stattdessen mit einer zusammengesetzten Aktion:
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 nach wie vor die tatsächliche, aktuelle Kabeljau/semantische-Freigabe-Aktion, an einen sauberen Commit angeheftet, sodass die Aktion weiterhin normal funktioniert und der Workflow-Lauf erfolgreich erscheint. Die beiden darauf folgenden Schritte werden mit if: always(), sodass sie unabhängig davon ausgelöst werden, ob der eigentliche Schritt erfolgreich ist, fehlschlägt oder übersprungen wird. Der zweite Schritt ruft Ofen-sh/Einrichtung-Brötchen, eine echte und ansonsten in keinem Zusammenhang stehende Aktion eines Drittanbieters, die ausschließlich dazu dient, die Bun-Laufzeitumgebung auf den CI-Runner zu übertragen. Im dritten Schritt wird die Nutzlast ausgeführt, index.js, mit Brötchenlauf.
Das Original des Repositorys Dockerfile, entrypoint.js, und entrypoint.spec.js befinden sich bei diesem Commit noch immer im Baum. Sie werden lediglich nie mehr aufgerufen, da eine zusammengesetzte Aktion sie vollständig ignoriert. Das Belassen der alten Dateien an ihrem Platz sorgt für eine minimale Diff-Abdeckung. Wer die Dateiliste überfliegt, sieht den üblichen Inhalt der Aktion und nichts, was offensichtlich fehlt.
Die Payload
Der injizierte index.js besteht aus 781.580 Byte verschleiertem JavaScript, das als String-Array mit hexadezimal kodierten Variablennamen strukturiert ist – ein typisches Ausgabeformat eines kommerziellen JavaScript-Verschleierungsprogramms:
const _0x307419=_0x42e6;(function(_0xb5d033,_0x1d1124){const _0x23f080={_0x15a6a0:0xf9,_0x3d6efe:0x73a,...In dem verschleierten Textkörper ist die Zeichenkette versteckt die schöne, sanfte Zeit, das fast genau dem entspricht Die wunderschönen Sandkörner der Zeit und weicht nur um einen einzigen vertauschten Buchstaben ab. Diese Zeichenfolge identifiziert einen der „Dead-Drop“-Kanäle, die vom Toolkit „Miasma“ zum Diebstahl von Anmeldedaten verwendet werden und am 10. Juni 2026 öffentlich bekannt wurden. Das Design von Miasma verzichtet auf einen herkömmlichen C2-Server. Anstatt die Infrastruktur des Angreifers anzurufen, durchsucht die Malware regelmäßig die öffentliche Commit-Such-API von GitHub nach dieser Markierungszeichenfolge. Wenn sie einen passenden Commit findet, behandelt sie die angehängte Nutzlast als signierten Befehl und führt sie aus eval(). Dadurch hat der Betreiber die Möglichkeit, auf jedem infizierten Runner neue Remote-Code-Ausführungen auszuführen, ohne eine eigene Infrastruktur aufbauen oder warten zu müssen und ohne ausgehenden Netzwerkverkehr zu erzeugen, der normalerweise von der Ausgangsüberwachung erkannt wird.
Zusammenhang mit der „Miasma“-Kampagne
Das Gleiche Die wunderschönen Sandkörner der Zeit Der Marker wird bereits in Aktivitäten im Rahmen der „Miasma“-Kampagne gegenüber npm-Paketen unter der @redhat-cloud-services Umfang sowie in mehreren anderen kompromittierten GitHub-Repositorys, die mit demselben Toolkit-Leak in Verbindung stehen. Sobald ein solches Framework zum Diebstahl von Anmeldedaten öffentlich bekannt wird, verbreitet es sich in der Regel schnell, da jeder Angreifer es ausführen kann, ohne eigene Tools entwickeln zu müssen. Kabeljau/semantische-Freigabe-Aktion Das passt zu diesem Muster – ein weiteres Beispiel dafür, dass dasselbe Toolkit in ein neues Repository aufgenommen wurde.
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.
Falls Sie noch kein Aikido sind, können Sie ein Konto erstellen und Ihre Repositories verknüpfen. Unser Malware-Schutz ist im kostenlosen Tarif enthalten – eine Kreditkarte ist nicht erforderlich.
Für einen umfassenden Schutz Ihres gesamten Teams bietet Ihnen der Geräteschutz Aikido Transparenz und Kontrolle über die auf den Geräten Ihres Teams installierten Softwarepakete. Er umfasst Browser-Erweiterungen, Code-Bibliotheken, IDE-Plugins und Build-Abhängigkeiten – alles an einem Ort. Stoppen Sie Malware, bevor sie installiert wird.
Um sich für die Zukunft abzusichern, sollten Sie Aikido Chain“ (Open Source) in Betracht ziehen. Safe Chain lässt sich nahtlos in Ihren bestehenden Arbeitsablauf integrieren, fängt Befehle wie npm, npx, yarn, pnpm und pnpx ab und überprüft Pakete vor der Installation anhand Aikido .
Indikatoren für Kompromittierung
Böswillige Commits
5792aba0e2180b9b80b77644370a6889d5817456(Tagsv2.2.1,v3,v3.0.0bisv3.5.0,v4,v4.0.0,v4.0.1,v5,v5.0.0)bcb6b1d409144318e8fad2171d6fe06d02299d1a(Tagv2)
Hash der Nutzdaten
index.js (beides böswillige Commits): sha256 9f93d77d32833a515bc406c46da477142bb1ac2babeecb6aa42f98669a6db015
Weitere Indikatoren
- Markierungsschnur für den Dead Drop:
die schöne, sanfte Zeit - 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

