要点
影響バージョン
- npmパッケージ
tensorlakeの 0.5.144 が悪意ある版。週次ダウンロード約1.2万、GitHubスター1000超のSDK(Socket、The Hacker News)。 - GitHubリポジトリ
tensorlakeai/tensorlakeのmain上、コミット e90c47b から 6386121 付近にも同系統のペイロードが載っていた(StepSecurity)。 - 0.5.144 は分析当時もダウンロード可能だったが、The Hacker News時点ではnpmレジストリから取得できなくなっている(Socket、The Hacker News)。一時的には
0.5.143にピン留めする(StepSecurity)。
今すぐやること
- lockfile・
npm ls tensorlake・ビルドログで 0.5.144 の有無を確認する。入っていたホストは侵害済みとして扱う(Socket、StepSecurity)。 - 先に
gh-token-monitorの常駐を止めてから、奪われた可能性のあるGitHub/npm/クラウド/SSH等の認証情報をローテーションする。監視が残ったままトークンを取り消すと、ホームディレクトリ削除が走る(Socket、StepSecurity)。 - 自分のGitHubに説明文「Shai-Hulud: Here We Go Again」の公開リポジトリ、作者
claude@users.noreply.github.comの想定外コミット、.claude/.vscodeの想定外ファイルがないか確認する(StepSecurity、The Hacker News)。
概要
- 2026年10月8日 01:12 UTC頃、AIエージェント用サンドボックスを扱うTypeScript SDK
tensorlakeの 0.5.144 がnpmに公開された。Socketは約11分後に検知した。 - パッケージは
preinstallでlib/setup.mjsを動かし、Bun経由で難読化したワームMath_Symbol.jsを起動する。認証情報の窃取、永続化、遠隔コード実行、他パッケージへの自己増殖が含まれる。 - 特異な点は二点ある。(1)悪意あるファイルがメンテナ名義で正規リポジトリのmainに直接入り、そのリポジトリのリリースフローとnpm provenance付きで出たこと。(2)奪ったGitHubトークンを監視し、取り消されるとホームを消す「人質トークン」機構があること。
この記事では、ベンダー・公的機関・研究者・報道で確認できた内容を「事実」、筆者の推測や意見を「考察」として分けて書いています。
何が起きたか(時系列)
| 日付 | 出来事 |
|---|---|
| 2026-08頃 | ChainDrop/Shai-Huludとして、keyv・cacheableなど数百のnpmパッケージが同様のBunベースのワームで侵害されたと報じられる(Socket、The Hacker News) |
| 2026-10-07 01:20 UTC | tensorlakeai/tensorlake のmainに、メンテナ名義で最初の悪意あるコミット。その後数時間で7件追記し、package.json にpreinstallを追加。いずれもPRを経ていない(StepSecurity) |
| 2026-10-08 01:12 UTC | 同リポジトリのリリースワークフローが 0.5.144 をnpmへ公開。ファイルはmain上のものと同一(StepSecurity、Socket) |
| 2026-10-08 01:23 UTC頃 | Socketが検知(Socket) |
| 2026-10-08 | StepSecurityがメンテナへ報告(Issue #1014)。Socket・StepSecurity・OX Security・The Hacker Newsが分析を公開 |
技術的な問題点(根本原因)
事実(Socket、StepSecurity)
- 公開された
package.jsonに"preinstall": "node lib/setup.mjs"がある。依存関係のライフサイクルスクリプトが許可されていれば、SDKをimportしなくてもインストールだけでローダーが動く。 - Socketがフラグしたファイル:
lib/setup.mjs(SHA-256:25a0735d0db7dc40e5d45ce42d9c106067e6a66e184d967cfecfab17c3bcb5ef)— Bunで本体を起動する難読化ローダーlib/Math_Symbol.js(SHA-256:b50a00900399ba99fb6ce1fc151519cb99d44320ef2a631f2237e1aea0ad6fec)— 認証情報窃取と自己増殖のワーム本体
- StepSecurityによれば、ローダーはCIでは自分自身をスキップし、開発者マシンを狙う。Bunランタイムを取得して約856KBの難読化ペイロードを実行する。
- 窃取対象には、npmトークン、GitHubトークン、AWS(IMDS/ECS/Secrets Manager/SSM)、Vault(localhost:8200)、Kubernetes、SSH、
.env、暗号資産ウォレット、メッセージングアプリのデータ、Claude/Cursor/Kiro/Windsurf/ZedなどのAI開発ツール設定・MCPファイルが含まれる(Socket、The Hacker News)。 - C2の域名はハードコードせず、Ethereumコントラクトと約30の公開RPCで解決し、GitHubをフォールバックにする。窃取データは被害者アカウント上に作る公開リポジトリ(説明文「Shai-Hulud: Here We Go Again」)または
iseekaigogo.comへ送る(Socket、StepSecurity、The Hacker News)。 - 増殖:奪ったnpmトークンで被害者のパッケージを再公開し、Sigstore provenanceも付与する。奪ったGitHubトークンで、偽の作者
claude@users.noreply.github.com・メッセージ「chore: update dependencies」で.claude/.vscode配下のファイルをコミットし、Claude CodeやVS Codeを開いたときに再実行させる(Socket、StepSecurity)。 - 「人質トークン」:GitHubトークンがあると
gh-token-monitorを仕込む。最大24時間、60秒ごとにapi.github.com/userでトークンの有効性を確認し、無効化されると Linuxではrm -rf ~/、Windowsではユーザープロファイル削除相当を実行する。コード内にIfYouRevokeThisTokenItWillWipeTheComputerOfTheOwnerという文字列があり、過去のShai-Hulud波でも見られた手法(Socket、StepSecurity、The Hacker News)。
考察
npmのprovenanceは「どのリポジトリのどのワークフローからビルドされたか」を示す。今回は本物のメンテナリポジトリと本物のリリースフローから出ているため、provenanceは真実のまま役に立たない。信頼の境界は「署名や証明があるか」ではなく、「そのmainに誰が何を直接pushできるか」「ライフサイクルスクリプトを実行してよいか」に戻る。AIエージェント用サンドボックス製品のSDKが、サンドボックスに入る前のホスト(開発者PC・ビルドランナー)で動く、という位置づけも、侵害時の権限が広い理由になっている。
攻撃・侵入経路
flowchart TD
A[メンテナ名義でmainへ直接push<br/>PRなし] --> B[正規リリースWFが<br/>tensorlake@0.5.144を公開<br/>provenance付き]
B --> C[開発者がnpm install<br/>preinstallがsetup.mjsを実行]
C --> D[BunでMath_Symbol.jsを起動<br/>CIではスキップ]
D --> E[認証情報・AIツール設定を窃取]
E --> F[GitHub公開repo / iseekaigogo.comへ送出]
E --> G[npmトークンで他パッケージを再公開]
E --> H[GitHubトークンで.claude/.vscodeを埋め込み]
E --> I[gh-token-monitorを常駐]
I -->|トークン取り消し| J[ホームディレクトリ削除]
事実(StepSecurity)
- 復旧の順序を誤るとデータ損失につながる。監視を止める前にGitHubトークンを取り消してはならない、と明示されている。
なぜ防げなかったか・構造的要因の考察
ここからは筆者の考察である。
- 「正規ビルド=安全」への過信: provenanceやメンテナ署名は、侵害されたアカウント・侵害されたmainからは守れない。ポリシーがprovenanceを信頼する設定だと、むしろ通してしまう、とStepSecurityも指摘している。
- インストール時スクリプトがデフォルトで動く世界:
preinstall一発で、利用者がコードを読まなくても侵害が完了する。ignore-scripts=trueは摩擦が大きいが、今回のようなワームには直接効く。 - 復旧の常識が罠になる: 「まずトークンを取り消せ」は通常正しいが、人質機構がある場合は逆効果になる。攻撃側は運用者の手順書を読んだうえで設計している。
- AI開発ツールが新しい秘匿情報の置き場: Claude/Cursorなどの設定とMCP設定まで集めている。サンドボックス製品を使うチームほど、エージェント用の鍵やプロンプト設定が開発者マシンに溜まりやすい。
運用者向けの具体的な対策と検知ポイント
対策(Socket、StepSecurityの手順を要約)
npm ls tensorlakeとlockfileで 0.5.144 を探す。tensorlakeai/tensorlakeのmainを10/7以降にcloneしてtypescript/でnpm installしていないかも確認する。tensorlake@0.5.143へピン留めし、node_modules削除とキャッシュ清掃。可能なら.npmrcでignore-scripts=true。- 影響ホストで
~/.config/gh-token-monitor/の有無を確認し、ある場合は中のトークンファイルを控えたうえでサービスを止める。- Linux:
systemctl --user disable --now gh-token-monitor.serviceのあと、関連ファイルを削除 - macOS: LaunchAgentsの
com.user.gh-token-monitor.plistをunloadして削除 - Windows: ログオン時に
monitor.ps1を動かすタスクを削除
- Linux:
- その後に認証情報をローテーション(GitHub、npm、クラウド、SSH、K8s、Vault、
.env、ブラウザ保存、AIツール鍵)。 - 確信が持てなければマシンを再インストールする。依存関係を消しただけでは常駐は残る。
検知ポイント
- パッケージ版とファイルハッシュ(上記SHA-256)
- ドメイン
iseekaigogo.com - GitHubリポジトリ説明文「Shai-Hulud: Here We Go Again」
- コミット作者
claude@users.noreply.github.com - ディスク上の
~/.config/gh-token-monitor/、~/.local/bin/gh-token-monitor.sh - 想定外の
.claude/settings.json、.vscode/tasks.json、setup.mjs、Math_Symbol.js
参考リンク
- Socket: TensorLake npm SDK Compromised in ChainDrop Shai-Hulud Credential-Stealing Attack
- StepSecurity: Tensorlake npm Package Compromised: A Worm With a Hostage Token That Wipes Your Machine If You Revoke It
- The Hacker News: Tensorlake npm Package Compromised to Deliver Shai-Hulud Credential-Stealing Worm
- OX Security: “Shai-Hulud: Here We Go Again” - “tensorlake” npm Package Hit With Malware