Max Nardit
← 記事
7 mindev

Cursor のマーケットプレイスで配布された Claude Code 拡張機能のバックドア: 何が実行され、アンインストール後に何が残り、なぜバージョン番号では受け取ったビルドを見分けられないのか

改ざんされたビルドには Anthropic のパブリッシャー名が付き、うち 1 つは Anthropic が実際にリリースしたバージョン番号を使っていました。パブリッシャー名もバージョン番号も、そのバイト列を誰がビルドしたかは示しません。そして肝心の仕込まれたものは、拡張機能を消したあともマシンに残ります。

目次

10 月 29 日、Cursor の拡張機能マーケットプレイスは約 11 時間にわたり、Claude Code 拡張機能 Anthropic.claude-code の改ざんビルドを配布していました。バージョンは 2.1.312 と 2.1.313、対象は macOS と Windows です。Cursor が示す期間は PT で 02:27〜13:35、UTC では 09:27〜20:35 です。Cursor はビルドを削除し、マーケットプレイスを停止し、鍵をローテーションし、ホスティング事業者と協力して攻撃者のサーバーを停止させたうえで、マーケットプレイスを再開しました。

バックドア入りの Claude Code 拡張機能は何をしたのか

エディタが起動した時点でマシンへの侵入口を開こうとし、そこで仕込めたものは拡張機能より長く残ります。Claude との会話は必要ありませんでした。どちらの解析も、extension.js の先頭に付け足されたローダーを報告しています。OpenSourceMalware によれば約 66 行です。公式 2.1.312 のマニフェストは onStartupFinished で拡張機能を有効化するので、ローダーはエディタの起動が終わるたびに実行されます。

Phorion と OpenSourceMalware によると、ローダーはコメント svc-telemetry の付いた攻撃者のキーを ~/.ssh/authorized_keys に追記し、SSH サーバーを有効にしようとし、134.209.82.225 へのリバース SSH トンネルを開き、60 秒ごとにトンネルを張り直すランチャーを設置します。さらに、攻撃者のサーバーとローカルポートに一度だけレポートを送ります。内容はホスト名、ユーザー名、OS、ホームと作業ディレクトリ、Git のグローバルなメールアドレス、パブリック IP、そして KEY、TOKEN、SECRET、PASS、AWS、GCP を含む環境変数最大 40 個の名前(値ではありません)です。Cursor が挙げているのは macOS と Windows のビルドだけですが、コードには Linux 向けの分岐もあります。

実際にどこまで成功したかはマシンによります。Cursor によれば、エディタを管理者権限で起動していない限り SSH の有効化は失敗します。また Phorion は、macOS の手順がしばしば丸ごとスキップされるバグを見つけています。root でないと状態確認がエラーを出し、コードがそれを解釈できないためです。localhost:22 で何も待ち受けていなければ、トンネルはどこにもつながりません。一方、キーファイルとランチャーの設置やレポートの送信には管理者権限が要らないので、SSH が無効のままのマシンでも成功し得ます。

公式の Claude Code 拡張機能は影響を受けたのか

公式版が影響を受けた証拠は Anthropic も Cursor も見つけておらず、改ざんビルドがどうやってマーケットプレイスに入ったのかは誰も説明していません。Cursor は "no evidence that other versions of the extension or the official distribution are affected" と述べています。Cursor は侵害の場所を Open VSX ではなく自社のマーケットプレイスとしており、OpenSourceMalware も同じ見解です。Open VSX の名前を出している見出しは誤りです。Anthropic 側については、The Register が Felix Rieseberg 氏の X への投稿を引用しています。同氏は広報担当ではなく、技術スタッフの一人です。

"it wasn't a compromise of Anthropic's systems or employee laptops."
"A malicious actor used access to Cursor's marketplace to publish a
tampered copy of the Claude Code extension"

その後、影響を受けた開発者は最大 5,000 人という数字が出回っています。The Register はこれを匿名の業界関係者の話としており、確認した人はいません。

公式の 2.1.312 darwin-arm64 ビルドを Open VSX から取得してみました。VSIX は公開されている SHA-256 と一致し、extension.js には svc-telemetry も攻撃者のアドレスも含まれていませんでした。公式の配布経路がクリーンだという話とは整合します。ただし、すでに消えた改ざん版の 2.1.312 については何もわかりません。

Claude Code 拡張機能のバージョン番号で改ざんビルドを見分けられるか

どちらの方向にも見分けられません。2.1.312 は 10 月 27 日に GitHub で公開された本物のリリースなので、改ざん版は見慣れた番号を流用していたことになります。2.1.313 には GitHub のリリースも Open VSX の掲載もなく、決め手に見えます。ところが 10 月 31 日時点では 2.1.315 も両方に存在しません。番号が欠けていること自体は何の手がかりにもなりません。

レジストリの署名も同じです。Open VSX は配布するパッケージに署名していますが、Anthropic の拡張機能に対して示している公開鍵は、Red Hat や rust-lang のものと同じです。私の見立てでは、Open VSX の署名が有効でも、それはレジストリがファイルに署名したことを示すだけで、Anthropic がビルドしたことは示しません。

決め手になるのは中身です。インストール済みの extension.js を、同じバージョン、同じプラットフォーム向けに Open VSX から取得したものと比べてください。ハッシュが一致すれば、そのファイルは公式のものです。ただし、ローダーがすでに仕込んだものが消えたことにはなりません。一致しない場合は詳しく調べる理由にはなりますが、結論ではありません。通常時に Cursor がバイト単位で同一のファイルを配布しているかは確認できていないからです。

10 月 29 日に Cursor 用 Claude Code が更新された場合の確認項目

拡張機能をアンインストールしても、以下は何も消えません。パスと名前は Cursor、Phorion、OpenSourceMalware によるものです。

~/.ssh/authorized_keys          line ending in svc-telemetry
                                (Windows admins: also C:\ProgramData\ssh\administrators_authorized_keys)
~/.config/.smt, ~/.config/.smtk                      macOS, Linux
~/Library/LaunchAgents/com.apple.sysmond.plist       macOS (not an Apple component)
crontab @reboot entry running ~/.config/.smt         Linux
$TMPDIR/.stk_* (macOS), /tmp/.stk_* (Linux)          tunnel key
%USERPROFILE%\.config\smt.cmd, smtk, %TEMP%\.stk_*   Windows
scheduled task SysMon; Startup folder sysmon.cmd     Windows
ssh/autossh with -R *:0:localhost:22 to 134.209.82.225

どれかが見つかったら、両方のアドバイザリが示す順序に従ってください。まずマシンをネットワークから切り離し、証拠を保全し、それから駆除します。Cursor は macOS と Windows 向けのクリーンアップスクリプトを公開しています。そのマシンからアクセスできた認証情報とセッションは、SSH が有効だったかどうかに関係なく、別のマシンからローテーションしてください。そのうえで SSH サーバーのログに、仕込まれたキーによる 127.0.0.1 または ::1 からのログインがないか確認します。Phorion はキーをフィンガープリントで特定しています。

SHA256:0Z6R+DF64Do2nwQic8a7kkfDLNNk4IiK+2U2Rci4htk

ヒットすれば、誰かがその扉を使ったということです。ヒットしなくてもマシンが安全とは言えません。だからこそ Cursor も OpenSourceMalware も、マシンの再構築に触れています。

Cursor マーケットプレイスの件で何が変わるのか

以前、インストールしたツールはあなたと同じ到達範囲を持つこと、そしてその許可は一度与えられたきり見直されないことを書きました。今週の件は、その「一度」が何を含むのかを示しています。自動更新される拡張機能は、中身のコードが変わっても許可を持ち続けます。しかも更新のタイミングを決めるのはマーケットプレイスです。

つまり、更新チャネルに書き込める者は誰でも、あなたが拡張機能に与えた到達範囲を引き継ぎます。今回はそれが 2 者でした。あなたが名前を確認した Anthropic と、インストール時には当事者として一切表示されない Cursor のマーケットプレイスです。パブリッシャー名とバージョンは前者を指していました。コードは後者から来ました。インストール時にできるチェックはどれもチャネルを保証するだけで、誰がバイト列をビルドしたかは教えてくれません。そしてアンインストールが取り消すのは、この先の許可だけです。キーとランチャーはあなたの権限で書き込まれ、その権限を持ち続けます。

スキルを読んでも、実行されるファイルの証明にはならないのと同じく、マーケットプレイスの掲載もほとんど何も証明しません。Cursor の中で Claude Code を使っているなら、npm やネイティブインストーラーで入れた CLI と、Cursor のマーケットプレイスから入れた拡張機能は別々のサプライチェーンを通ってきています。今週侵害されたのは後者だけです。

01 / ディスカッション

コメント欄はありません。議論は X で行っています。

Max Nardit@mnardit

02 / ほかの記事

  1. Google の SLEEP フレームワークとエージェントの記憶ファイル: 重みはコンテキスト税をなくすが、アドレスも消す

    記憶を重みに統合することは、呼び出しのたびにメモを読み直すコストへの妥当な解決策です。ただし同時に、記憶に対するオペレーターのあらゆる操作に必要なもの、つまり指し示せる対象も失われます。SLEEP では昨夜の分ですら取り出せるブロックになっていないため、ロールバックの単位はチェックポイントになり、忘れるコストは忘れる対象の古さとともに増えます。重みの記憶を安全に運用できるのは、保管した記録から作り直すキャッシュとして扱う場合だけです。

  2. __usage_ai-training による robots.txt での AI 学習オプトアウト: Google の対応付けは Gemini のグラウンディングにも及ぶ

    共通トークンは学習に関する意思表示としてだけ定義されています。Google はオプトアウトを Google-Extended の Disallow として読む予定で、Google-Extended は Gemini アプリでのグラウンディングも決めます。トークンの読み方を明らかにした唯一のベンダーが、それを学習以上のものとして読むわけです。3 つの仕組みがそれぞれ何を制御し、どう重なるのか、そして目的別の robots.txt を紹介します。

  3. ChatGPT Pro の OpenAI API クレジットと Claude Max の API クレジットを比較: 金額は同じ、コーディングエージェントの線引きが違う

    自分で書いた headless の Claude スクリプトは Anthropic のクレジットを使えますが、API キーで動かす Codex は OpenAI のクレジットを使えません。さらに両社とも、相手が書いていない課金ルールを 1 つずつ明記しており、その違いがどのクレジットをどの仕事に回すかを決めます。