濃紺のフィールド上に描かれた抽象的なテクニカルイラスト。中央左には小さなフラットベクター調のパッケージキューブがあり、細いアンバー色の線が下へフック状に延びて、開発者ワークステーションを簡潔に表したものへとつながっている。細いシアンとスチールブルーのフィラメントが扇状に、ワークステーションから右へ広がり、緩い格子状に並ぶ多数の小さな円形ノードへと向かっている。そのうち2つは湾曲して上方のパッケージキューブへ戻り、右端の1つのノードは単独で切り離されたままになっている。人物、ロゴ、テキストは一切描かれていない。OrcaRouterのロゴが右下隅に合成されている。
AI Safety Incidents

Tensorlakeのnpm SDKが汚染され、AIエージェントの認証情報を窃取し、トークンを取り消すとあなたのホームディレクトリを消去するように仕組まれていた

著者

Alistair Wren

公開日

最新モデル · 20すべてのモデルを見る →
ベンチマーク:Artificial Analysis · 毎日更新
すべての記事に戻る

2026年10月8日、tensorlakeの汚染されたリリースがnpmレジストリに到達しました。これはTensorlakeのプラットフォーム用のnpm SDKで、分離されたサンドボックス内で信頼できないLLM生成コードを実行するものです。バージョン0.5.144は01:12:07 UTCに公開されました。Socketの研究者によると、約11分後にそれにフラグを立てたとのことです。これは許可されたリリースではありませんでした。Tensorlakeによると、攻撃者は同社のGitHubリポジトリに直接コードをプッシュし、プロジェクト自身のリリースワークフローを通じて公開したため、このパッケージは有効なnpm provenance — すでに汚染されていたソースについて、どこでビルドされたかを示す署名付き証明を帯びていました。同社によると、このバージョンは約1時間40分、01:12から02:54 UTCまで、npmが削除する前に公開されていました。

ペイロードはインポートも実行中のエージェントも必要としなかった。preinstallフックがパッケージマニフェスト内で実行したのはnode lib/setup.mjs、すなわち難読化されたローダー。これはマシン上にBunランタイムを落とし、それを使って実行したのはlib/Math_Symbol.jsである。856,501バイトの認証情報窃取ツール兼自己増殖ワームだ。そのバージョンを単純にインストールした者は誰でもそれを実行した。これがパッケージのlatestタグだったため、公開中はデフォルトのインストールが解決する先がそのバージョンだった。

この記録を保存する価値があるのは、ペイロードのサイズではありません — Shai-Huludファミリーは以前にも文書化されています。それはターゲットリストです。npmやGitHubのトークン、AWS認証情報、KubernetesやVaultのシークレット、SSHキー、.envファイル、ブラウザのパスワード、暗号通貨ウォレットに加えて、このビルドは特に収集しました:AI開発ツールの設定とMCPファイル — これらは以下に関連するものです:Claude Code、Cursor、Kiro、Windsurf、Zed(Socketによる)。また、独自の.claude/settings.jsonと.vscode/tasks.jsonを、到達可能なリポジトリに書き込んだため、開発者が次にそのプロジェクトをClaude CodeやVS Codeで開いたときにコードが再び実行されるようになります。これは、人々がエージェントを構築するマシンを狙ったサプライチェーン攻撃です。

リリースがメンテナーのアカウントから流出した経緯

Socket、SafeDep、Aikidoはそれぞれ10月8日に独自の分析を公開しており、そのメカニズムに関する各社の説明は一致している。この記録に対するアーカイブの信頼度格付けはAであり、係争中とはされておらず、情報源の中に見つかったもののうち、彼らのいずれかの説明と矛盾するものは何もない。

SafeDepの解説記事は、8件のコミットを、リポジトリのmainブランチに対して10月7日の01:20から03:57 UTCの間に行われたものとして追跡しており、それらはリポジトリ管理者アカウントに帰属され、GitHubのWebインターフェースを通じて行われた。アーカイブが最初の不正なコミットとして挙げているのは41b38f0で、これは10月7日03:44:48 UTCの4ファイルの改訂であり、そのメッセージは「Add files via upload」で、GitHubのverified署名が付いている——GitHubは自身のWebエディタで行われたコミットに署名するため、「verified」が記録するのは編集インターフェースであり、人物ではない。GitHub APIによれば、そのコミットはtypescript/lib/Math_Symbol.jsとtypescript/lib/setup.mjs以外のファイルには一切触れておらず、ペイロード、それだけである。

SafeDepは、オペレーターの行動についての解釈を提示しており、それを自らの推論として明示している。preinstallフックの最初の編集がファイルのJSON構文を壊し、19分後に修復コミットが続いた。これは、スクリプト化されたパイプラインではなく、人物がブラウザでファイルを編集していたことと整合すると説明している。Socket、SafeDep、Aikido、StepSecurity、Tensorlakeのいずれが公表したものも、メンテナーのアカウントがどのような方法で乗っ取られたのかを明らかにしていない。

攻撃者はnpmトークンを必要としなかった。SafeDepは、アカウントが開始したと報告している:プロジェクトのpublish_npm.yamlワークフローを10月8日00:08 UTCに手動で。ビルドログには、公開されたtarball内のペイロードファイルが表示されている。リリースは使用した:npm trusted publishing、そして兄弟のtensorlake-native-*パッケージは同じ実行から公開され、有効なSLSA provenanceを持っている — 毒されたソースのビルドに対して本当に有効なprovenanceである。リリースはワークフロー開始から12分後に到着した。

アーカイブには、リポジトリがおよそ20時間にわたって侵害された状態にあり、その後に公開が発動したことが記録されている。以下のタイムラインがコミットごとに示すのがその空白期間であり、これは攻撃者が「私たち自身のリリースワークフローを通じて」公開したというTensorlake自身の声明と一致する。

実行後にペイロードが行ったこと

A screenshot of a card titled 'A credential stealer with an AI-tooling list', kicked 'tensorlake@0.5.144 · what the payload collected', subtitled 'Per Socket, SafeDep and Tensorlake's advisory — grouped by what each collector reached for'. Three columns of paired labels sit side by side. 'Publishing and source control' lists npm tokens from .npmrc, the token API and the OIDC exchange; GitHub tokens with a repository and workflow permission check; GitHub Actions secrets read from Runner.Worker memory; and cryptocurrency browser wallets across 14 extensions. 'AI agent tooling' lists ~/.claude.json for Claude Code settings; ~/.kiro/settings/mcp.json for Kiro MCP config; .cursor, Windsurf and Zed config and MCP files; and .claude/settings.json and .vscode/tasks.json written back into reachable repositories. 'Cloud, cluster and endpoint' lists AWS via STS, SSM Parameter Store and Secrets Manager; Kubernetes service-account tokens and kubeconfigs; HashiCorp Vault at 127.0.0.1:8200; SSH and GPG keys, .env files and Docker and CLI files; the Wallets row, wallet.dat, Exodus, Electrum and MetaMask; and saved passwords via a downloaded HackBrowserData binary. A footer reads 'Collector list per Socket's initial assessment, SafeDep's decoded payload analysis and the Tensorlake advisory (GHSA-8g63-53c9-65j2). Socket flags AI development tooling for Claude Code, Cursor, Kiro, Windsurf and Zed by name.'

Socket の評価では、ローカルファイル、CI 環境、Kubernetes、Vault の各ソースにまたがる収集、さらに外部への持ち出し、永続化、およびリモートから供給されたコードの実行が特定されている。SafeDep はデコードされたペイロードを再現した:lib/setup.mjsは公式 GitHub リリースから Bun 1.3.13 をダウンロードし、それを使ってワームを実行する。そして CI ランナー上では終了する — 標的はビルドエージェントではなく開発者のマシンである。SafeDep はまた、ペイロードが同じローダーの平文コピーを含んでおり、それを他のパッケージやリポジトリに植え付けることも発見した。

このペイロードは3層の難読化を施しており、SafeDepはサンプルを実行することなくそれをデコードした。すなわち、難読化ツールの文字列配列、ソルト svksjrhjkcejg を使ったカスタム暗号 — 以前の keyv 侵害で報告されたものと同一 — そして、スクリプト、フック、2つのRSA公開鍵を含む11個の埋め込みファイルに対するAES-256-GCMだ。その最初の行にはビルドタグ WORMTAG='tensrlake' が含まれているが、綴りが誤っている。これが、SafeDepがこのビルドを進行中の再感染と区別する方法である。

AIツールの設定にとどまらず、収集リストは広範かつ具体的だ: ~/.claude.json と ~/.kiro/settings/mcp.json はエージェント設定用;SSH鍵、クラウドCLIのファイル、.npmrc、.env、DockerとKubernetesのファイル、シェル履歴;wallet.dat に加えて Exodus、Electrum、Ledger Live のデータ、および MetaMask や Phantom などのブラウザウォレット拡張機能;AWS STS、SSM Parameter Store、Secrets Manager;Runner.Worker プロセスメモリから読み取られた GitHub Actions のシークレット;そして Kubernetes のサービスアカウントトークンと Vault トークン。プラットフォーム別のバイナリを iseekaigogo[.]com/hbd/<platform> から取得し、引数「dump -b all -c password -f json」を付けて実行した。この引数は HackBrowserData ツールと一致するが、SafeDep はバイナリ自体は回収されておらず、この特定は推測であると注記している。SafeDep はさらに、このワームはロシア語ロケールでは終了すると付け加えている。

A screenshot of a card titled 'Persistence, resolution, and the wipe trigger', kicked 'tensorlake@0.5.144 · staying power', subtitled 'The release was removed in under two hours; the implant it installed was built to outlive that.' Three columns sit side by side. 'Persistence: gh-token-monitor' lists a systemd user service on Linux, a LaunchAgent com.user.gh-token-monitor on macOS, a scheduled task with a PowerShell monitor on Windows, and files left behind in ~/.local/bin, ~/.config and %LOCALAPPDATA%. 'Endpoint resolution order' lists, in numbered order, the primary endpoint iseekaigogo[.]com:443/router; an Ethereum contract 0xb614155Fd88...1Df091B9; the public RPC endpoints that contract is read through, given as ~30 by Socket and 35 by SafeDep; signed GitHub commits found by the string thebeautifulmarchoftime; and public dead-drop repositories described as 'Shai-Hulud: Here We Go Again'. 'The dead-man switch' lists a poll of api.github.com/user every 60s, for 24 hours, firing on a 40x response to that token, with the effect rm -rf ~/ (advisory: home dir), armed only if the account has no orgs, and the order that matters: remove monitor, then revoke. A footer reads 'Per Socket's blog and SafeDep's analysis, with the C2 endpoint, the contract and the gh-token-monitor service confirmed in Tensorlake's advisory. Socket and SafeDep give different counts of the public RPC endpoints the contract is read through.'

永続化は意図的なものだ。Socketはペイロードについて「この組み合わせは、単一のAPIキーが盗まれた場合を超えてリスクを拡大する」と述べ、「永続化は、影響を受けた依存関係が削除された後も攻撃者のアクセスを保持し得る」と付け加えている。SafeDepは、このワームがClaude CodeとVS Codeのフックファイルをgit作者claudeとしてコミットし、リポジトリのシークレットをすべてダンプしたうえでその実行とブランチを削除する「Run Copilot」ワークフローを仕込むと報告している。Tensorlakeの勧告は、ログを確認する開発者に対し、dependabot/github_actions/format/setup-formatterという名前のブランチと、同じ識別情報で作成されたコミットを探すよう促している。

Spread は、2つ目の脆弱性ではなく、盗まれたトークンによって動いている。Socket によると、このワームは被害者のパブリッシング ID に関連付けられたパッケージを列挙し、Sigstore の来歴情報を構築し、汚染されたバージョンを再公開する。SafeDep はさらに、CI 内で git 依存関係を追加し、その出力を Fulcio と Rekor で署名する点を補足している。そのため、次に公開するパッケージに付く来歴情報は、0.5.144 に付いていた来歴情報と同じくらい有効になる。

公開前の20時間

最初の不正なコミットとリリースの間のギャップは、汚染されたパッケージがどのようにして有効な来歴を持つに至ったのかを説明するタイムラインの部分です。時刻はすべて UTC です。コミット時刻は SafeDep と GitHub API のもので、公開、削除、アドバイザリの時刻は Tensorlake のものです。

A screenshot of a card titled 'Compromised source in the repo, then one manual publish', kicked 'tensorlake@0.5.144 · the ~20-hour window', subtitled 'All times UTC. Commit times per SafeDep's timeline and the GitHub API; publish and removal times per the Tensorlake advisory.' Three columns sit side by side. '7 October 2026 — source, main branch' lists 01:20 setup.mjs and Math_Symbol.js added; 01:24 the preinstall script added; 01:43 package.json JSON repaired; 02:13 to 03:44 four loader and payload revisions; 03:44 commit 41b38f0, the payload commit; 03:57 the version set to 0.5.144. '8 October 2026 — release and removal' lists 00:08 publish_npm.yaml started by hand; 01:12:07 version 0.5.144 published to npm; 01:22:02 issue #1014 opened by StepSecurity; 01:23:10 flagged by Socket, about eleven minutes in; 02:54 the version removed, after roughly 1h 40m live; 20:24 version 0.5.145 published next. '9 October 2026 — disclosure closed' lists advisory GHSA-8g63-53c9-65j2; pull request #1016, source reverted and 0.5.145 cut; issue #1014 closed as completed; 0.5.143 as the last version stated unaffected; and no usage seen, per Tensorlake's user-agent telemetry. A footer reads 'The ~20-hour gap between the first rogue commit and the publish is SafeDep's commit timeline, and matches the archive's own upstream record.'

全体を通して読むと、ソースは10月7日にリポジトリのメインブランチに入り、同日午前3時57分にバージョンは0.5.3に設定され、翌日0時8分に誰かが手動でリリースワークフローを開始するまで何も公開されなかった。侵害されたソースは、プロジェクト自身のパイプラインがビルドするまで、ブランチ内に20時間留まっていた。これがリリース経路への攻撃のすべてだ——偽造されたアテステーションはなく、再公開されたtarballもない。プロビナンスは、ブランチに決してあるべきではなかったコードのビルドについて正確だった。

デッドマンスイッチ

このインシデントで、これまでのnpm侵害には前例がなかった部分は、被害者が正しく対応した後に起きることだ。盗まれたGitHubトークンが組織を一つも持たないアカウントのものである場合、SafeDepの報告によれば、ワームはgh-token-monitorをインストールする。これはapi.github.com/userをその盗まれたトークンで60秒ごとに、24時間にわたってポーリングするサービスだ。GitHubが40xを返すと——トークンが失効した瞬間にまさにそうなる——モニターは攻撃者が用意したハンドラーを実行し、ユーザーのホームディレクトリを削除する。

Socket は、同じコンポーネントについて、ONLOGON のスケジュールタスクを通じて永続化する PowerShell モニターを使用しており、攻撃者が用意したハンドラーを Invoke-Expression で実行するものだと説明し、そのコードには以前の Shai-Hulud の波でも見られたリテラル文字列「IfYouRevokeThisTokenItWillWipeTheComputerOfTheOwner」が含まれていると指摘しています。SafeDep はこのハンドラーを rm -rf ~/ と名付けています。Socket の文言は、失効がどこで行われようとこれが発火することを明示しています。モニターはローカルにあり、失効はローカルではありません。Socket、SafeDep、StepSecurity、そして Tensorlake 自身の勧告という 4 つの情報源はすべて、同じ操作順序を示しています: まずモニターを削除し、その後で失効させる。

何が確立されており、何が推論にすぎないのか

アーカイブには確認された害はこの項目について記録されておらず、情報源は単に矛盾しないというだけでなく、むしろそのことを裏付けている。

• Tensorlakeはこのバージョンの使用がないと述べている。同社の勧告には、同社がユーザーエージェントヘッダーを通じてSDKの使用状況を監視しており、「このバージョンがリリースされて以来、その使用は一切見られていない」と記されている。これはベンダー自身のテレメトリに関する声明であり、監査済みの数値ではない。

• ダウンロード数は感染件数ではありません。Socketはこのパッケージについて週あたりおよそ12,000ダウンロードと報告しており、これはパッケージ全体の利用状況を表すもので、悪意のあるバージョンのダウンロード数ではないと注記しています。SafeDepは同じパッケージについて月あたりおよそ106,000ダウンロードを挙げています。いずれも、0.5.144がどこかで実行された証拠にはなりません。Socketがフラグを立てた公開期間とTensorlakeの2時間という期間は、拡散する前に削除されたバージョンと整合しています。

• ペイロード自体のバグがその拡散を制限した可能性がある。SafeDepは2つを発見した。npmの伝播経路は./dist/Math_Symbol.jsがディスク上に必要で、それがなければ停止する。また、仕込まれたローダーはai_init.jsを探すが、ワームはmath_init.jsを書き込む。SafeDepはこれらの発見を拡散の制限として位置づけ、記事はそれをコードのある分析による解釈として扱っているのであって、何も伝播しなかったことの保証としてではない。

• プロベナンスの証明は本物です。これは議論の余地のある主張ではありません。npmのプロベナンスは、パッケージがどこで、どのワークフローによってビルドされたかを記録するものであり、今回のケースでは真実が記録されていました — プロジェクト自身のリリースワークフローが、汚染されたソースをビルドしていたのです。Tensorlakeのアドバイザリは、まさにそのとおりに述べています。「このパッケージは有効なnpmプロベナンスを備えている」と。Socketも同じ点を簡潔に指摘しており、プロベナンスは「パッケージがどこでビルドされたかを示すものであり、コードが安全であることを示すものではない」と述べています。

流通しているいくつかの詳細は単一の分析に基づく主張であり、そのように読むべきだ。攻撃者がメンテナーのアカウントを入手した具体的なメカニズムは、調査を行っているどの企業からも、また Tensorlake からも公表されていない。Ethereum のコントラクトアドレスと、エンドポイントを解決する上でのその役割は、SafeDep と Socket の記述に現れている——Socket によれば、ペイロードは GitHub へのフォールバックを備えた約30の公開 RPC エンドポイントを使用する Ethereum コントラクトを通じてエンドポイントを解決するが、SafeDep は RPC の数を35とし、10月8日にそのコントラクトが iseekaigogo.com を返したと報告している——そして Tensorlake は自社のアドバイザリでエンドポイントとコントラクトを確認している。正確な RPC 数は両者の記述で異なるが、設計は異ならない。

公的な記録に残る空白が一つあり、これは率直に述べておく価値がある。本記事のために参照したどの情報源も、確認された二次感染──このパッケージから盗み出した認証情報を用いてワームが別のパッケージやリポジトリを汚染した事例──を報告していない。伝播用のコードは存在し、SafeDepはそれを読んでいる。だが、それによって二つ目の被害者が生まれたかどうかは不明である。

その後、何が変わりましたか

対応はインシデントよりも迅速で、より連携が取れていた。

• そのバージョンは削除された。 Tensorlakeによると、UTC 10月8日の01:12から02:54まで公開されていた。SafeDepは、npmがそれを削除したと報告している。本記事のため10月10日にnpmレジストリを直接照会したところ、0.5.144はパッケージの公開済みバージョンの中にもはや存在せず、パッケージのlatestタグは0.5.148である。Tensorlakeの勧告は、開発者に0.5.143を最後の影響を受けていないバージョンとして指し示している。

• 勧告は修正とともに公開されています。TensorlakeのGHSA-8g63-53c9-65j2勧告は、PyPIおよびcrates.ioのtensorlakeパッケージとtensorlakeCLIは影響を受けておらず、影響を受けたのはnpmパッケージのみで、バージョン0.5.143以前は影響を受けないと述べています。SafeDepは、メンテナーがプルリクエスト#1016でソースを元に戻し、0.5.145をリリースしたと報告しています。

• 開示スレッドは異例なほど完全だ。StepSecurityの研究者Ashish Kurmi氏はGitHub issue #1014を、10月8日 01:22:02 UTC に起票した——公開から約10分後——StepSecurity自身が「hostage token」ワームと呼ぶものについての同社の解説記事を指して。AikidoのOliver Smith氏は、ペイロードがコミット 41b38f0 で導入されたとコメントし、それを新しいShai-Hulud情報窃取マルウェアと特定した。メンテナーDavid Lorenzo氏——npmパッケージにcalaveraとして記載されているメンテナーID——は、10月9日に返信し、セキュリティアドバイザリを確認するとともに、同日にissueを完了としてクローズした。issueのタイトル自体が証拠をたどっている。当初は「possibly malicious(悪意の可能性あり)」という報告だったが、クローズされるまでに、ペイロードを無条件に悪意あるものとして説明するタイトルに変更された。

• これが属するキャンペーンは、このパッケージよりも大規模です。 Socket、SafeDep、Aikidoはいずれも、Tensorlakeのリリースを、2026年8月上旬に初めて文書化されたChainDrop / Mini Shai-Huludの波に位置づけています。そのnpm被害にはkeyv、cacheableおよび関連パッケージが含まれます。Tensorlakeのアドバイザリも同様に述べており、Socket、SafeDep、Aikidoを引用しています。

Socketのガイダンスは、このバージョンをインストールした人に対して、ホストを侵害されたものとして扱うべきだというものです:バージョンのlockfile、manifest、ビルドログをチェックし、削除するgh-token-monitorサービス前に トークンを無効化する; その後、クリーンなマシンから資格情報をローテーションする。Tensorlakeの勧告は同じ順序を追加し、露出したトークンが書き込む可能性のあるパッケージレジストリとリポジトリを予期しないリリースがないか確認することを提案している。Aikidoの記事は、以下の設定を勧めている:ignore-scripts=true を .npmrc に設定してインストールフックをブロックし、フックが実行されたマシンは完全に侵害されたものとして扱う。

これは1件の記録であり、他者によって報告され、ここではそれらの報告元に帰属するものとして引用されている。AIインシデントアーカイブ。こうすることで、エージェント向けツールを狙ったサプライチェーン侵害を、実際に起きたその他の事象と並べて読むことができる。