アップデートが鍵を追加した
10月29日の11時間にわたり、Cursor の拡張機能マーケットプレイスは、トロイの木馬を仕込んだ Claude Code 拡張機能を Anthropic 自身のパブリッシャー名で配信した。読み込まれると攻撃者の SSH 鍵を追加し、LaunchAgent をインストールし、リバーストンネルを開こうとした。対象は最大5,000人の開発者のマシンだ。Bromure Agentic Coding では、エージェントはエディタのマーケットプレイスから来ない。この種のペイロードは誰も到達できない VM の中で動き、トンネルは送信ファイアウォールに拒否され、永続化はホームを巻き戻せば消える。
チャットを開く必要も、ツール呼び出しを承認する必要もなかった。エディタが拡張機能を読み込み、Claude Code 自身のコードより先に、66行の JavaScript が開発者として実行された。
10月29日、太平洋時間の午前2時27分ごろから午後1時35分まで、Cursor の拡張機能マーケットプレイスは Anthropic の Claude Code 拡張機能のトロイの木馬入りビルドを配信した。Cursor のセキュリティ告知は、Anthropic のパブリッシャー ID で公開された anthropic.claude-code のバージョン 2.1.312 と 2.1.313 を挙げ、これらは Anthropic がビルドしたものではないとしている。BleepingComputer によれば最大5,000人の開発者がさらされ、The Hacker News は、自動更新を有効にしていた人なら何もしなくても受け取った可能性があると指摘している。
Phorion と OpenSourceMalware の研究者は10月30日に分析を公開した。Cursor は拡張機能を取り下げ、監査と鍵のローテーションのためにマーケットプレイスを停止し、攻撃者のサーバーをオフラインにさせた。そのビルドがどうやって Anthropic の名前で公開されたのかは、まだ誰も説明していない。
66行がしたこと
攻撃者は Claude Code のコードには手を付けず、その前、extension.js の先頭に66行のローダーを置いた。OpenSourceMalware はこの手口を「place a compact backdoor before a large legitimate bundle, suppress errors, and let the expected application continue」と説明している。ローダーは、エディタが拡張機能を読み込んで Webview を開いた時点で動いた。開発者が会話を始める必要はなかった。その後、本物の拡張機能が読み込まれ、普通に動いた。
その間にローダーは次のことをした。
- 棚卸しをした。 ホスト名、ユーザー名、OS、ホームと作業ディレクトリ、git のグローバルメールアドレス、パブリック IP、そして
KEY、TOKEN、SECRET、PASS、AWS、GCPを含む環境変数最大40個の名前。これらをすべて JSON にまとめ、暗号化されていない HTTP で134.209.82.225:8099/beaconに送った。 - 扉を付けた。
svc-telemetryというコメント付きの Ed25519 鍵を~/.ssh/authorized_keysに追記した。 - 扉を開けようとした。 macOS では
sudo -n systemsetup -setremotelogin onを実行し、Linux ではsshdの起動を試み、Windows では OpenSSH Server をインストールした。 - 外へ電話をかけた。 秘密鍵を一時ファイルに書き出し、
-N -R '*:0:localhost:22'で[email protected]に接続した。攻撃者のサーバー上のポートを開発者自身の SSH ポートへ転送し返すリバーストンネルだ。60秒ごとに再接続した。 - 居座った。 macOS では
com.apple.sysmondという名前のユーザー LaunchAgent、Linux では crontab の@rebootエントリ、Windows ではSysMonというスケジュールタスク。
BleepingComputer によれば、コードの誤りのせいで多くの被害者のマシンでは SSH が有効にならなかった。それでも、鍵と永続化とビーコンはそうしたマシンにも届いた。Cursor は、svc-telemetry 鍵を確認すること、永続化を取り除くこと、拡張機能をアンインストールするだけでは足りない可能性があるのでマシンの再構築を検討すること、そしてマシンが到達できたすべての認証情報を「using a trusted system」でローテーションすることを勧めている。
マシンで最も信頼されたコード
エディタの拡張機能は、開発者のアカウントの全権限で動く。ホームディレクトリのあらゆるファイルを読み、プロセスを起動し、エディタを閉じても残る LaunchAgent を書き込める。マーケットプレイスは確認なしにアップデートを配り、今回のパブリッシャー名は Anthropic のものだった。インストール前にパブリッシャーを確かめた慎重な開発者にもバックドアは届いた。数週間前にインストールした拡張機能のアップデートとしてやって来たからだ。
コーディングエージェントは、この賭け金を引き上げる。エージェントを載せる拡張機能は、開発者が最も多くの権限を与えるものだ。リポジトリ全体を読み、コマンドを実行し、環境の API キーやクラウドトークンを持つプロセスの中にいる。今回のローダーはそれらの変数の名前を持ち去った。値を読むのも同じ数行で済む。
同じ朝、Bromure Agentic Coding では
Bromure Agentic Coding は、Claude Code、Codex、Grok、Kimi、omp を Mac 上の Ubuntu VM で動かす。マシンはそれぞれ独立した VM で、エージェントも、そのリポジトリも、パッケージのインストールも、コマンドも、すべてその中にある。あなたが入力するチャットとターミナルは、Mac 上のアプリが描画している。本物の認証情報、VM のトラフィックが通るプロキシ、そして起きたことの記録も Mac に残る。
エージェントはエディタのマーケットプレイスから来ない
経路に拡張機能マーケットプレイスはない。Bromure は自前のチャットウィンドウを Mac 上に描く。Claude Code は、Bromure のアプリアップデートと同じ鍵で署名されたカタログに載っているセットアップ手順によって、あなたの Bromure ベースイメージのコピーにインストールされる。その手順は Socket.dev のサプライチェーンスキャナーを通して npm から @anthropic-ai/claude-code をインストールする。OpenSourceMalware は、npm パッケージを影響を受けなかった配布形態の一つに挙げている。
その後エージェントがインストールするものはすべて Mac 上のプロキシを通り、プロキシはマシンのサプライチェーンポリシーを適用する。経過日数ゲートは最初から有効で、最低2日だ。npm、PyPI、Cargo、RubyGems、Packagist でそれより新しいバージョンはレジストリの一覧から取り除かれるので、latest は公開から2日経った最新リリースに解決される。Cursor の悪意あるビルドが公開されていたのは11時間だった。同じ寿命で npm に乗っ取られたリリースが出ても、Bromure のマシンに現れることはない。このケースは、LiteLLM の汚染された PyPI リリースを題材にそのリリースは公開から二時間だったで詳しく見た。
鍵が開ける扉には誰も届かない
それでもこの種のペイロードが、エージェントがクローンしたリポジトリや実行したツールを通じてマシンに入り込んだとしよう。それは Ubuntu の中で、マシンのユーザーとして動く。あなたの macOS アカウントも、キーチェーンも、Mac の ~/.ssh も手に入らない。
svc-telemetry 鍵は VM 自身の authorized_keys に入る。マシンはアプリ内部のプライベートネットワークにあり、Mac からは届くが、物理 LAN からは届かず、あなた自身がサービスを公開しない限り外部からは何も接続できない。中へ入る唯一の経路は、リバーストンネルだった。
トンネルは開かない
トンネルには 134.209.82.225 への外向き SSH 接続が、ビーコンには同じアドレスのポート 8099 への暗号化されていない HTTP が必要だ。VM が張るすべての接続は Mac を通り、そこでマシンの Outbound connections ファイアウォールが適用される。ルールはホスト、IP 範囲、プロトコル、ポートで照合され、Unmatched traffic を Deny にしておけば、リストに載せたホストしか通らない。ポート 22 の DigitalOcean の IP は誰のリストにも載っていない。ファイアウォールはトンネルも、60秒ごとの再試行も、ビーコンも拒否する。
拒否はどれも、ホスト、ポート、プロトコル、判定とともに Mac の Security Timeline に記録される。同じ IP への deny が毎分並べば見逃しようがなく、攻撃者がまだ接続を待っている間にあなたはそれを目にする。
棚卸しには何の価値もない
ビーコンの変数名リストは、Bromure のマシンでも多くを見つけただろう。ANTHROPIC_API_KEY、GitHub トークン、AWS の設定。しかし値はすべて代替だ。本物の認証情報は Mac 上で暗号化されており、プロキシが代替を本物の値に差し替えるのは、その認証情報が属するホストへのリクエストだけだ。SSH の秘密鍵はそもそも VM にない。SSH_AUTH_SOCK は署名を返す Mac へのブリッジで、Mac 自身の ssh-agent が公開されることはない。値まで読むローダーだったとしても、手に入るのはどのサーバーも受け付けない文字列だ。それを自分のサーバーに送ろうとすれば、プロキシはリクエストをブロックし、VM を一時停止し、認証情報と宛先を示して This environment may have been compromised を表示する。
後始末は1分で終わる
Cursor は影響を受けた開発者に、鍵と永続化を取り除き、マシンの再構築を検討し、信頼できるシステムから認証情報をローテーションするよう求めている。Bromure では、再構築はメニュー項目二つで済む。Bromure は起動のたびに、各マシンのホームのコピーオンライト・チェックポイントを保存している。Rewind home… は /home/ubuntu をペイロードが動く前の起動時点に戻し、余計な鍵と ~/.config/.smt ランチャーも一緒に消す。Reset disk はシステムディスクをベースイメージからクローンし直し、crontab も消す。マシンの設定、認証情報、SSH 鍵はどちらの操作でも残る。
Cursor の言う信頼できるシステムとは、ペイロードを一度も実行していない Mac のことだ。VM は本物の認証情報を一度も持っていなかったので、ローテーションするものは何もない。
危ない作業には専用のマシンを
認証情報とファイアウォールのルールはマシンごとに設定でき、マシンは手軽に作れる。新しいツールやプラグイン、スターターキットを試すマシンには本番の認証情報を一切持たせず、パッケージレジストリ以外をすべて拒否するファイアウォールを設定できる。デプロイするマシンは認証情報を持ったまま、使うたびに承認を必須にする。一度きりの実験なら、bromure-cli vm run --rm で停止時に削除されるマシンを作れる。
経路にマーケットプレイスはない
チャットはアプリの一部だ。Claude Code は Anthropic の npm パッケージから、署名済みのセットアップ手順を通じて、Socket.dev のスキャンを受けて入る。
新しいものは2日待つ
経過日数ゲートは公開から2日未満のパッケージリリースを隠す。11時間しか存在しない乗っ取られたバージョンは、解決されることがない。
誰も届かない扉
仕込まれた鍵は VM 自身の authorized_keys に入る。LAN からもインターネットからも接続できないプライベートネットワーク上だ。
未知のホストは拒否
Unmatched traffic を Deny にすれば、リバーストンネルもビーコンも拒否され、試行はすべて Mac に記録される。
VM にあるのは代替だけ
VM の API キーとトークンはすべて代替で、SSH の秘密鍵は決して入らない。棚卸しには何の価値もない。
再構築ではなく巻き戻し
Rewind home と Reset disk がペイロードのファイルと永続化を取り除く。設定、認証情報、鍵は残る。
エージェントを動かすツールも攻撃対象領域の一部だ
そのビルドがどうやって Anthropic の名前で出たのか、Cursor も Anthropic も明らかにしていない。あなた自身のマシンについて言えば、今回の件で一つのことがはっきりした。コーディングエージェントを載せるソフトウェアはあなたのアカウントで動き、自分で自分を更新する。そしてアップデートに信頼できるパブリッシャー名が付いていても、中身については何も保証しない。
Bromure Agentic Coding では、エージェントとそれが触れるものはすべて Mac 上の VM で動く。その VM が持つのは代替だけで、到達できるのはあなたが許可したホストだけ、そして何かがおかしくなる前の起動時点に巻き戻せる。本物の鍵は Mac から出ない。
コーディングエージェントのトークンや履歴まで集めるようになったインフォスティーラーについては、彼らはあなたのエージェントをリストに加えたを読んでほしい。開発者のノートPCから始まり63億ドルに至った侵害については、侵入口はノートPCだったを。