Aikido

Mini Shai-Hulud zielt auf SAP npm Packages mit einem Bun-basierten Secret Stealer ab

Verfasst von
Raphael Silva

Eine neue npm Supply-Chain-Kompromittierung zielt auf das SAP-Entwickelnde-Ökosystem ab.

Die betroffenen Pakete, die wir bisher verfolgen, sind:

  • @cap-js/sqlite - v2.2.2
  • @cap-js/postgres - v2.2.2
  • @cap-js/db-service - v2.10.1
  • mbt@1.2.48

Das Muster ist bekannt, aber auch etwas anders: ein vertrauenswürdiges Paket erhält einen neuen preinstall Hook, der Hook führt eine neue setup.mjs Datei, und dieser Loader lädt die Bun JavaScript Runtime herunter, um einen großen, obfuskierten Payload namens execution.js.

Der Payload ist ein 11,7 MB großer Credential Stealer und ein Propagations-Framework. Er sammelt lokale Entwickelnde-Credentials, GitHub- und npm-Tokens, GitHub Actions Secrets und Cloud Secrets von AWS, Azure, GCP und Kubernetes. Anschließend exfiltriert er verschlüsselte Ergebnisse über öffentliche GitHub-Repositories.

Die Malware benennt diese Repositories mit einer fest codierten Beschreibung:

Ein Mini Shai-Hulud ist aufgetaucht

Was geschah

Die kompromittierten Pakete nutzen die npm Lifecycle Execution. Nach dem, was wir bisher gesehen haben, package.json wurde geändert, um Folgendes hinzuzufügen:

"scripts": {
    "preinstall": "node setup.mjs"
}

Das bedeutet, der bösartige Code läuft automatisch während npm install, bevor die Installation überhaupt abgeschlossen ist.

Das bösartige Paket fügt zwei Dateien hinzu:

  • setup.mjs
  • execution.js

Der normale Paketcode sieht immer noch aus wie das legitime SAP-Paket. Im @cap-js/sqlite@2.2.2 Beispiel stimmen die gewöhnlichen Dateien sauber @cap-js/sqlite@2.2.1 Byte für Byte überein. Der Kompromiss besteht aus dem Installations-Hook plus den hinzugefügten Payload-Dateien.

Wahrscheinlicher Einstiegspunkt

Ein öffentlicher Hinweis weist auf eine wahrscheinliche Ursache hin: ein npm-Token, das Pull-Request-Builds über CircleCI zugänglich gemacht wurde.

Das stimmt mit dem überein, was wir in SAP/cloud-mta-build-tool. Am 29. April wurde ein kurzlebiger Entwurfs-PR mit dem Titel feat: CI-Beschleunigung geöffnet von gruposbftechrecruiter/harkonnen-navigator-149. Der PR wurde innerhalb weniger Minuten geschlossen und der Branch wurde später per Force-Push aktualisiert, wodurch der aktuelle GitHub-Diff leer blieb.

CircleCI behielt den wichtigen Teil bei. Ein PR-Build am pull/1223 checkte den Commit aus a959014aa7b7fc37a9b5730c951776e7db2920a6, der einen Bun-Loader unter bin/config.mjs, eine verschleierte Payload unter bin/mbt.jshinzufügte und den Testbefehl änderte zu:

node ./bin/config.mjs && node ./bin/mbt

Dieser Test lief in einem PR-Job, bei dem CircleCI redigierte Projekt-Secrets auflistete, einschließlich CLOUD_MTA_BOT_NPM_TOKEN, CLOUD_MTA_BOT_GITHUB_TOKEN, CircleCI OIDC-Tokens, Docker Hub-Anmeldeinformationen, Cloud Foundry-Anmeldeinformationen und andere releasebezogene Variablen.

Die Logs zeigten auch Octokit-Warnungen für POST https://api.github.com/user/repos, was dem GitHub-Exfiltrationsverhalten der Malware entspricht.

Dies macht den CircleCI PR-Build zur stärksten Spur für den anfänglichen Diebstahl der Anmeldeinformationen.

Wie die Malware ausgeführt wird

Die erste Stufe, setup.mjs, ist ein Bun-Bootstrapper. Er prüft das Betriebssystem und die Architektur, lädt Bun 1.3.13 bei Bedarf von GitHub herunter, extrahiert die Binärdatei und verwendet Bun, um execution.js.

const BUN_VERSION = '1.3.13';
const ENTRY_SCRIPT = 'execution.js';
const url = `https://github.com/oven-sh/bun/releases/download/bun-v${BUN_VERSION}/${asset}.zip`;
execFileSync(binPath, [entryScriptPath], { stdio: 'inherit', cwd: SCRIPT_DIR });

Die zweite Stufe, execution.js, ist eine einzelne große, verschleierte Payload. Sie verwendet eine benutzerdefinierte String-Scrambling-Schicht, die als ctf-scramble-v2bezeichnet wird, prüft, ob sie in CI läuft, beendet sich bei russischen Gebietsschema-Einstellungen und daemonisiert sich auf Nicht-CI-Maschinen.

Was es stiehlt

Die Payload ist darauf ausgelegt, sowohl Entwickelnden-Laptops als auch CI/CD-Runner anzugreifen.

Es versucht zu sammeln:

  • GitHub-Tokens, einschließlich der Ausgabe von gh auth token
  • npm-Tokens aus .npmrc
  • Umgebungsvariablen
  • GitHub Actions Secrets
  • AWS STS-Identität, Secrets Manager Secrets und SSM-Parameter
  • Azure-Abonnements, Key Vault-Namen und Key Vault Secret-Werte
  • GCP-Projektidentität und Secret Manager-Werte
  • Kubernetes Service-Account-Tokens
  • Claude-Konfiguration, MCP-Konfiguration, GCP-Token-Datenbanken, Azure-Token-Caches, Signal-Konfiguration, Electrum-Wallets und VPN-Konfigurationsdateien

Der GitHub Actions-Pfad ist besonders besorgniserregend. Die Payload enthält einen eingebetteten Python-Helfer, der sucht /proc nach dem Runner.Worker Prozess, liest dessen Speicher und extrahiert maskierte Secret-Strukturen aus dem Runner.

GitHub Exfiltration- und Propagations-Keyword

Die Malware nutzt GitHub als ihren Exfiltrationskanal.

Das neue Propagations-Keyword lautet:

OhNoWhatsGoingOnWithGitHub

Die Malware durchsucht GitHub-Commits nach dieser Zeichenfolge und verwendet übereinstimmende Commit-Nachrichten als Token-Dead-Drop. Commit-Nachrichten, die übereinstimmen mit OhNoWhatsGoingOnWithGitHub:<base64> werden in GitHub-Tokens dekodiert und auf Repository-Zugriff überprüft.

Wenn die Malware ein Repository erstellen kann, verwendet sie zufällige Dune-thematische Namen, setzt die Repository-Beschreibung auf:

Ein Mini Shai-Hulud ist aufgetaucht

und schreibt verschlüsselte Ergebnisdateien unter:

results/results-<timestamp>-<counter>.json

Die Daten werden vor dem Commit mit AES-256-GCM komprimiert und verschlüsselt, wobei der AES-Schlüssel durch einen eingebetteten RSA-Public-Key gewrappt wird.

Propagationslogik

Die Payload enthält Logik zur Verbreitung über Entwickelnde- und Release-Workflows.

In den analysierten Samples prüft die Malware auf GitHub Actions-Release-Automatisierung im Zusammenhang mit cap-js/cds-dbs. Wenn sie einen Release-Workflow in diesem Repository-Kontext erkennt, kann sie einen Paket-Tarball modifizieren, indem sie:

  • die aktuelle Payload in execution.js
  • schreibt setup.mjs
  • Einstellung scripts.preinstall = "node setup.mjs"
  • Erhöhen der Patch-Version
  • Neupacken des Tarballs

Es versucht auch, gestohlene GitHub Actions-Tokens zu verwenden, um Dateien in Repositories zu pushen:

  • .vscode/tasks.json
  • .vscode/setup.mjs
  • .claude/execution.js
  • .claude/setup.mjs
  • .claude/settings.json

Diese Commits verwenden:

chore: Abhängigkeiten aktualisieren

mit dem Autor:

claude <claude@users.noreply.github.com>

SAP als Ziel

Die Zielpakete sind in normalen SAP-Entwicklungs-Workflows eingebettet. @cap-js/sqlite, @cap-js/postgres, und @cap-js/db-service sind Teil des SAP CAP Datenbank-Ökosystems, während mbt wird im Kontext von SAP Cloud MTA Build-Workflows verwendet.

Das macht diese Kampagne klein in der Paketanzahl, aber potenziell hochwirksam. Diese Pakete werden wahrscheinlich auf Entwickelnden-Maschinen und CI-Runnern ausgeführt, die Zugriff auf GitHub, npm, Cloud-Anmeldeinformationen und Enterprise-Deployment-Secrets haben.

Erkennung und Minderung

Durchsuchen Sie Lockfiles, Paket-Caches, CI-Logs, interne Registries, Artefakt-Stores und Entwickelnden-Maschinen nach:

  • @cap-js/sqlite - v2.2.2
  • @cap-js/postgres - v2.2.2
  • @cap-js/db-service - v2.10.1
  • mbt@1.2.48
  • setup.mjs
  • execution.js
  • preinstall laufende Skripte node setup.mjs
  • Bun 1.3.13 Downloads während der Paketinstallation

GitHub durchsuchen nach:

  • Commit-Suchergebnisse für OhNoWhatsGoingOnWithGitHub: https://github.com/search?q=OhNoWhatsGoingOnWithGitHub&type=commits
  • Repositories mit Beschreibung Ein Mini Shai-Hulud ist aufgetaucht
  • Commits, die enthalten OhNoWhatsGoingOnWithGitHub
  • Commits mit dem Titel chore: Abhängigkeiten aktualisieren
  • Commits von claude <claude@users.noreply.github.com>
  • unerwartet .claude/ oder .vscode/setup.mjs Dateien
  • results/results-*.json Dateien in neu erstellten öffentlichen Repositories

Wurde ein betroffenes Paket installiert, sind Secrets zu rotieren. Beschränken Sie die Rotation nicht auf npm-Tokens. Die Payload zielt auf GitHub, npm, Cloud-Anbieter, Kubernetes, CI-Secrets und lokale Entwickelnde-Tools ab.

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-Benutzer sind, können Sie ein Konto erstellen und Ihre Repos verbinden. Unsere Malware-Abdeckung ist im kostenlosen Plan enthalten, keine Kreditkarte erforderlich.

Für eine umfassendere Abdeckung Ihres gesamten Teams bietet Aikidos Endpoint Protection Ihnen 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, indem es npm-, npx-, yarn-, pnpm- und pnpx-Befehle abfängt und Pakete vor der Installation gegen Aikido Intel prüft.

Kompromittierungsindikatoren

Betroffene Pakete:

  • @cap-js/sqlite - v2.2.2
  • @cap-js/postgres - v2.2.2
  • @cap-js/db-service - v2.10.1
  • mbt@1.2.48

Hashes aus der analysierten @cap-js/sqlite@2.2.2 Probe:

  • setup.mjs: 4066781fa830224c8bbcc3aa005a396657f9c8f9016f9a64ad44a9d7f5f45e34
  • execution.js: 6f933d00b7d05678eb43c90963a80b8947c4ae6830182f89df31da9f568fea95
  • eingebetteter GitHub Runner Memory Dumper: 29ac906c8bd801dfe1cb39596197df49f80fff2270b3e7fbab52278c24e4f1a7

Strings und Marker:

  • Ein Mini Shai-Hulud ist aufgetaucht
  • OhNoWhatsGoingOnWithGitHub (Propagations-Keyword / GitHub Commit Dead-Drop Marker)
  • ctf-scramble-v2
  • tmp.987654321.lock
  • chore: Abhängigkeiten aktualisieren
  • claude@users.noreply.github.com

URLs und Endpunkte:

  • hxxps://github[.]com/oven-sh/bun/releases/download/bun-v1.3.13/
  • hxxps://api.github[.]com/search/commits?q=OhNoWhatsGoingOnWithGitHub&sort=author-date&order=desc&per_page=50
  • hxxp://169.254.169.254
  • hxxp://169.254.170.2
  • hxxp://[fd00:ec2::254]

Teilen:

https://www.aikido.dev/blog/mini-shai-hulud-has-appeared

4.7/5
Falschpositive Ergebnisse leid?

Probieren Sie Aikido, wie 100.000 andere.
Jetzt starten
Erhalten Sie eine personalisierte Führung

Von über 100.000 Teams vertraut

Jetzt buchen
Scannen Sie Ihre App nach IDORs und realen Angriffspfaden

Von über 100.000 Teams vertraut

Scan starten
Erfahren Sie, wie KI-Penetrationstests Ihre App testen

Von über 100.000 Teams vertraut

Testen starten

Sicherheit jetzt implementieren

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.