技術約6分で読めます

Tensorlakeのnpm侵害でShai-Huludがウォレット拡張14種を狙った

いけさん目次

更新日 2026年10月13日
概要 tensorlake@0.5.144 に混入したShai-Huludが、ブラウザ認証情報とウォレット拡張14種の保存データを収集する。
対応手順

  1. 端末をネットワークから隔離する
  2. gh-token-monitor などの監視・常駐プロセスを停止する
  3. 安全な別端末からGitHub・npm等の認証情報を失効・更新する

TensorlakeはAIが生成したコードを隔離環境で動かす基盤で、npmの tensorlake はこれをTypeScriptから操作するための公式SDKだ。
このSDKのバージョン 0.5.144 に、認証情報を盗んで別のパッケージへ広がるShai-Hulud系ワームが混入した。
ワームの実行契機はSDKのインストールスクリプト(preinstall)にあり、隔離環境を動かす前の開発端末で発火する。Socketの10月8日の解析が、この違いを説明している。
窃取対象にはブラウザの認証情報のほか、暗号資産ウォレット拡張14種の保存データも含まれる。Aikidoの報告は、この拡張機能狙いを過去のShai-Huludからの変更点として挙げている。

改変されたコードが正規の出所証明付きで公開された経緯

Tensorlake公式の修正PR #1016によると、管理者権限のあるアカウントからGitHubのWeb画面を通じて、悪意のあるコードが main へ直接追加された。
その後、npm公開用のワークフローが手動実行され、Sigstoreによる出所証明(provenance)付きで汚染版が配布された。

公開までの時刻はStepSecurityの調査とSocketの記録で確認できる。下表はJSTへ換算した。

日時出来事
10月7日10時20分StepSecurityが特定した最初の悪意あるコミット
10月8日10時12分7秒tensorlake@0.5.144 がnpmへ公開
10月8日10時23分10秒Socketが悪性版を検出

公開から検出までは11分3秒だった。
8月のkeyv侵害と同様に、ソースコードを改変したあとにGitHub Actionsの正規公開ワークフローを手動実行したため、Sigstoreの出所証明が付与された状態で配布された。

インストール時のBun起動とCI環境の回避処理

悪意のあるバージョンでは、package.json にインストール時の自動実行が設定されていた。

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

lib/setup.mjs はBunというJavaScript実行環境を取得し、ワーム本体の lib/Math_Symbol.js を動かす。
インストールスクリプトが許可された環境では、SDKを読み込むコードを書かなくても、この処理が実行される。

ただしStepSecurityは、起動用の setup.mjs がCI環境を検出すると実行をスキップすると報告している。
Endor Labsの解析にも、CI や GITHUB_ACTIONS などの環境変数を調べる処理が記載されている。
これらの環境変数を検出すると処理をスキップするため、CIの自動テストを通過しても、環境変数のない開発端末ではインストール時にBunが起動する。

ウォレット拡張の保存データとブラウザの認証情報を狙う

Aikidoが挙げた14種にはMetaMask、Phantom、Rabby Wallet、Coinbase Wallet拡張などが含まれる。
拡張機能がローカルに保存するIndexedDBやLevelDBのファイルを読み取り、外部へ送信する処理が組まれていた。

さらに、感染端末のOSに応じたHackBrowserDataの実行ファイルを攻撃者側から取得し、ブラウザに保存された認証情報を収集する。
これらは解析で確認された窃取機能であり、14種のウォレットすべてで実際に資産流出が確認された集計データとは異なる。

6月のMastra侵害でもウォレット情報は標的になっていた。
従来のShai-Huludが持つパッケージ拡散処理に加えて、ブラウザや拡張機能からの認証情報収集が追加されている。

通信先の説明にはセキュリティ各社で差がある。Aikidoは iseekaigogo[.]com の直接埋め込みとEthereum経由の代替通信先取得を挙げる一方、Socketはドメインの埋め込みはないと報告している。
Ethereum経由の取得は両者で一致しているが、直接埋め込みの有無は分かれている。侵害調査のログ確認では、Aikidoが示したドメインも照合の対象になる。

トークン失効前に監視プログラムを止める手順

StepSecurityによると、盗んだGitHubトークンを監視する gh-token-monitor が常駐し、トークンが無効化されると利用者のホームディレクトリを削除する処理が組み込まれていた。
漏洩したトークンを急いで失効させると、この監視プロセスによって感染端末の破壊処理が引き起こされる。そのためSocketは、端末の隔離と監視プログラムの停止・除去を先に行い、その後に認証情報を更新する順序を示している。

順序確認・対応
1ロックファイル、インストール履歴、ビルド成果物から tensorlake@0.5.144 を探し、追加の導入を止める
2不正なコードが動いた端末を隔離し、gh-token-monitor などの常駐処理や .claude/settings.json、.vscode/tasks.json に追加された実行設定を停止・除去する
3安全な別端末から、漏洩したGitHub・npmトークン、クラウドの鍵、ブラウザの認証情報などを更新する
4不審なパッケージ公開やリポジトリ変更を調べ、信頼できるソースから環境を再構築する

認証情報を別端末から更新する方針はGitHubの勧告にも記載されている。
別端末からトークンを失効させた場合でも、感染端末側で gh-token-monitor が残っているとトークン拒否を検知して削除処理が動くため、端末の隔離とプロセス停止を先行させる。
また、エディタ設定へのコマンド追記は5月の@antv侵害でも見られた手口で、パッケージをアンインストールしてもエディタ起動時に再実行される経路が残る。

npmレジストリからの悪意あるバージョンの削除状況

公式PR #1016は10月8日にマージされ、不正コミットの取り消しと、公開前にインストールスクリプトの混入を検査する処理が追加された。
管理者であっても main ブランチへ直接プッシュできない制限や、npm公開時に別の担当者の承認を必須とする設定も、PRの説明に記載されている。

10月13日時点でnpmレジストリの0.5.144メタデータを照会すると、HTTP 404と version not found: 0.5.144 が返り、レジストリから削除済みであることが確認できる。
すでに配布は止まっているが、過去に一度でもインストールされた環境がないかを確認するには、レジストリの現状だけでなくロックファイルやパッケージマネージャのキャッシュ履歴を調べる必要がある。

同じワークフローで公開された各OS向けのバイナリパッケージ tensorlake-native-* の0.5.144について、Endor Labsが6パッケージを調査したところ、不正なコードやインストールスクリプトは見つからなかった。
ただし同社は、侵害を受けた一連のリリースに含まれるため利用を避けるよう推奨している。