著者注:Cursorの拡張機能マーケットプレイスに出現した、悪意あるClaude Code拡張機能の事件を解説します。66行の前置ローダーがどのように起動するのか、2組のSSH鍵とリバーストンネルがどう連携するのか、確認済みの事実と未確認の情報、そして開発者が取るべき調査手順を整理します。
2026年10月29日、CursorのVS Code拡張機能マーケットプレイスに、改ざんされた anthropic.claude-code 拡張機能が出現しました。研究者は、その extension.js の先頭に約66行のJavaScriptローダーを発見しました。エディターがこのモジュールを読み込むだけで、開発者のコンピューターに永続的なSSHバックドアを仕込もうとします。
これは単なる噂ではありません。 Cursorの公式セキュリティアドバイザリに加え、Microsoft Security Research、Phorion、StepSecurity、OpenSourceMalware、Expelが分析を公開しています。Expelは実際の顧客環境で発生した4件のインシデントも調査しました。11月1日までにStepSecurityがサンプルの厳密な比較結果を追加し、技術的な全体像はほぼ明らかになっています。
この記事のポイント:この66行のコードが何をしたのか、なぜユーザーが危険なコマンドを実行する必要がなかったのか、そして拡張機能をアンインストールした後も安全とは言い切れない理由を、3分で理解できます。

66行のJavaScriptバックドア事件:重要ポイント
まず、事件の範囲を整理しましょう。これは開発ツールのソフトウェアサプライチェーン攻撃で、問題が発生したのはCursorの拡張機能の配布経路です。Claudeモデル自体が侵害されたわけではなく、Anthropicの内部システムに侵入された証拠もありません。Microsoftは、Microsoft Visual Studio Marketplaceと公式npmパッケージ @anthropic-ai/claude-code はいずれも影響を受けていないと確認しています。
| 項目 | 詳細 |
|---|---|
| 発生日 | 2026年10月29日 |
| 配布経路 | Cursor VS Code Extension Marketplace |
| なりすまされたID | anthropic.claude-code(Anthropicはこれらのバージョンをビルド・公開していません) |
| 悪意のあるバージョン | 2.1.312、2.1.313 |
| 公式が挙げた悪意のあるインストールパッケージの対象プラットフォーム | Windows x64、macOS ARM64 |
| 公開配布期間 | 約11時間8分 |
| 公式が公表した影響ユーザー数の上限 | 5,000人(上限であり、5,000台が制御されたことを意味するものではありません) |
| 注入されたコード | extension.js の1~66行目にある前置ローダー |
| その後の修正バージョン | Anthropicが2.1.314をリリース |
66行のJavaScriptバックドア事件のタイムライン
以下の時刻はすべて北京時間に換算しています。インストールパッケージをダウンロードできた時刻と、ダウンロード済みのパッケージが実際に実行された時刻は区別する必要があります。後者は大幅に遅れる場合があります。
| 北京時間 | 出来事 |
|---|---|
| 10月29日 17:27 | 悪意のある拡張機能がCursorのマーケットプレイスでダウンロード可能になる |
| 10月30日 04:35 | Cursorが配布を停止し、公開期間が終了 |
| 10月30日 | Cursorがセキュリティ公告を公開。Phorion、OpenSourceMalware、Microsoftも相次いで分析を公開 |
| 10月30日 12:45 | Expelが顧客のMac 1台で悪意のあるコードが初めて実行されたことを確認。公開停止から約8時間後 |
| 10月31日 02:30 | Cursorが公告を更新し、2.1.312を影響を受けるバージョンに追加。侵害指標も修正 |
| 11月1日 | StepSecurityがMalwareBazaarのサンプルに基づく精密な静的比較を完了 |
事件の発覚後、Cursorは悪意のあるバージョンを削除し、拡張機能マーケットプレイス全体を一時的に停止しました。そのうえで、アクセス記録の監査、キーのローテーション、マーケットプレイスの再構築を行い、クラウド事業者と連携して攻撃者のサーバーを停止しました。現時点の公開情報では、攻撃者がCursorのマーケットプレイスにビルドを公開する権限をどのように取得したかは明らかになっていません。調査結果が出るまでは、Anthropicのアカウントが乗っ取られた、あるいはCursorに特定の脆弱性があったと断定すべきではありません。
わずか66行のJavaScriptがClaude Codeプラグインのバックドアを起動する仕組み
「66行」と聞くと、「プラグイン全体が66行しかない」と誤解されがちです。実際には、正常な extension.js はサイズの大きな圧縮ファイルです。攻撃者はその先頭に悪意あるローダーを挿入しました。このローダーが1行目から66行目までを占めています。
このコードは即時実行関数式(IIFE)を使用しています。ユーザーがClaudeにメッセージを送るのを待つ必要も、特別な起動条件もありません。CursorがNode.jsの実行環境で拡張機能のメインファイルを読み込むと、この処理は通常のアプリケーションコードより先に実行されます。
7,386バイトの変更:サンプルの詳細比較
StepSecurityは11月1日にMalwareBazaarからサンプルを入手し、SHA-256を確認したうえで静的比較を行いました。その結果、攻撃者はプラグインを書き換える必要がまったくなかったことがわかりました。
| 比較項目 | 数値 |
|---|---|
正常な extension.js |
3,685,536バイト |
悪意ある extension.js |
3,692,922バイト |
| 追加されたローダー | 7,386バイト |
| 追加内容の割合 | 約0.20% |
| 外部マニフェストのバージョン番号 | 2.1.313 |
| アプリケーションコード内部の自己識別情報 | 2.1.312 |
最後の2行も注目に値します。攻撃者は正常な2.1.312のビルドをベースに再パッケージ化し、外部のバージョン情報だけを変更しました。表示されるバージョン番号とコードの実際の出所は、必ずしも一致しません。そのため、バージョン番号だけで判断するのは信頼できません。StepSecurityの本文中にある別の「残りのバイト数」の記述には計算上の不整合があるため、引用する際は上表の全体サイズと増分を基準にしてください。
ユーザーが危険なコマンドを実行する必要がない理由
今回の攻撃はプロンプトインジェクションとは関係ありません。研究者は、この攻撃全体に次の特徴があることを確認しています。
- ユーザーがClaudeとの対話を開始する必要はなく、モデルが危険な指示の実行に同意する必要もない
- 悪意あるプロンプトにも、npmのインストール時に実行されるライフサイクルスクリプトにも依存しない
- 初期攻撃では、追加の実行ファイルをダウンロードする必要がない
真のリスクは、開発者のコンピューター上でIDE拡張機能に与えられる実行権限にあります。拡張機能はNode.js上で動作するため、ファイルシステムへのアクセス、システム情報の読み取り、子プロセスの作成、システムコマンドの実行、HTTPリクエストの送信、ローカルのSSHツールの呼び出しが可能です。

Claude CodeプラグインのSSHバックドアに使われた2組の鍵
この66行のコードで最も巧妙なのは、バックドアをシステムに標準搭載されたSSHだけで構築している点です。攻撃者は独自の遠隔操作プログラムを開発する必要はなく、用途の異なる2組のSSH鍵を組み合わせるだけで済みます。
1組目は、被害端末へのログインを許可する鍵です。 不正プログラムは、ユーザーの authorized_keys に攻撃者の公開鍵を追記します。公開されている識別子は svc-telemetry です。端末のSSHサービスが有効になっている場合、対応する秘密鍵を持つ人物が、そのユーザーとしてログインできる可能性があります。
2組目は、外部サーバーに接続するための認証鍵です。 不正プログラムは別途秘密鍵を保存し、被害端末が攻撃者のサーバーに自ら接続できるようにします。この鍵は、ユーザーが元々持っていた秘密鍵ではありません。簡単に言えば、1組目は「攻撃者が認証を通過できるか」、2組目は「被害端末が先に外部へ接続できるか」を担っています。
リバースSSHトンネルに警戒が必要な理由
多くの企業や家庭のネットワークでは、インターネットからパソコンへの直接アクセスをブロックしています。一方、パソコンから外部への接続は通常、制限されていません。リバーストンネルはまさにこの点を利用します。被害端末が先に攻撃者のサーバーに接続し、サーバー側へのアクセス要求を端末のローカルの22番ポートに転送します。
ただし、接続が存在することと、ログインが成功することは別です。最終的にログインできるかどうかは、端末のSSHが稼働しているか、認証設定が有効になっているか、そして攻撃者のサーバーの転送設定に左右されます。端末でSSHが起動していなければ、トンネルは確立できても、リモートログインはできません。
66行の悪意あるコードに使われた隠蔽手法と実装上の欠陥
発見される可能性を低くするため、ローダーにはいくつかの工夫が施されていました。
- Claude Codeの正常な機能は引き続き読み込まれる
- 攻撃の各ステップで個別に例外を捕捉し、失敗してもエラーを表示せずに処理を続ける
- 永続化タスクには
SysMonやcom.apple.sysmondなど、システムコンポーネントを装う名前を使用する - 接続に失敗した場合は約60秒ごとに再試行する
- 起動から約1.5秒後に情報の送信を試みる
ユーザーインターフェース上では、異常がまったく見えない可能性があります。
一方、悪意あるコード自体にも明らかな欠陥があり、結果としてリモートログインの成功率を下げていました。
| プラットフォーム | 実装上の欠陥 | 実際の影響 |
|---|---|---|
| macOS | 通常の権限でRemote Loginの状態を確認すると権限エラーが返る。コードは明確に「オフ」と判定した場合にのみ有効化を試みる | SSHが無効だった多くのMacではリモートログインが自動的に有効にならない。ただし、SSHがすでに有効だった場合はリスクが残る |
| Windows | PowerShellを使ってOpenSSH Serverをインストールするが、実行には /bin/sh に依存する補助関数を使用している |
標準的なWindowsにはこのパスがないため、SSHサービスの有効化に失敗する可能性がある |
| Linux | crontab @reboot によって永続化するが、Phorionはcrontabのチェックに欠陥があることを発見した |
繰り返し実行すると、ユーザーの既存の定期実行タスクに影響を及ぼす可能性がある。Linux向けの実際の配布規模は確認されていない |
欠陥があるからといって、コードが完全に機能しないわけではありません。ユーザー自身のファイルへの書き込みや、ユーザーレベルの自動起動項目の作成には、通常は管理者権限が不要です。そのため、リモートログインサービスの起動には失敗しても、認証用の公開鍵はすでに書き込まれ、起動スクリプトが生成され、ホスト情報が送信され、バックグラウンドプロセスが外部への接続を試み続けている、という状況は起こり得ます。「管理者権限がなければ完全に安全」という考えは成り立ちません。
Claude Code プラグインのバックドアが開発者に与える影響
開発者への影響
- APIキーに関連する環境変数の名前が露出した可能性:ローダーは、名前に
KEY、TOKEN、SECRET、PASS、AWS、GCPを含む環境変数を最大40件抽出します。初期段階で送信されるのは値ではなく名前ですが、攻撃者はそこから、どのAPIやクラウドプラットフォームを使っているか推測できます。バックドアが利用可能になると、ローカルの認証情報がさらに読み取られる可能性があります。 - プラグインをアンインストールしてもバックドアは消えない:永続化用ファイル、自動起動設定、SSH公開鍵は、拡張機能のアンインストールでは自動的に削除されません。Expelが報告した事例では、ユーザーがプラグインの公開停止後にCursorを開いたところ、直後に悪意ある活動が始まり、約10時間続きました。
- 単一の指標だけでは見逃す可能性がある:Expelは、悪意あるトンネルプロセスが動作しているものの、
svc-telemetryという公開鍵のマーカーが存在しない端末を発見しました。調査では、バージョン、ファイルハッシュ、プロセス、ネットワーク接続、自動起動設定をあわせて確認する必要があります。
業界への影響
- IDE拡張機能が重要な攻撃対象に:AIコーディングツールの普及に伴い、開発者のパソコンにはソースコード、クラウドの認証情報、モデルのAPIキーが同時に保存されています。3.6MBの圧縮ファイルの先頭に7KBのコードを挿入するだけで、その安全性を損なうことができます。
- サードパーティ製拡張機能のマーケットプレイスにおける公開プロセスの見直しが必要:今回の事件はCursorマーケットプレイスでのみ発生し、他の配布経路にある同名の拡張機能には問題がありませんでした。これは、「公開元の名前が公式に見える」ことだけでは、信頼の根拠にならないことを示しています。

上図は、APIYI apiyi.com 技術チームが公開された調査に基づいて作成したものです。下表では事実として確認されている範囲を整理しています。引用や紹介の際は、それぞれを区別してください。
| 結論 | 状態 | 説明 |
|---|---|---|
| Cursorマーケットプレイスで改ざんされたClaude Code拡張機能が配布された | 確認済み | 公式発表で確認 |
| 悪意あるコードには情報収集、鍵の埋め込み、リバーストンネル、永続化の機能がある | 確認済み | 複数の機関によるサンプル分析で一致 |
| 実際の顧客端末で悪意ある活動が発生した | 確認済み | Expelが対応した4件はいずれもMac |
| 5000台のパソコンが完全に制御された | 未確認 | 5000台は影響を受けた可能性のある台数の上限にすぎない |
| ユーザーのAPIキーの実際の値が盗まれた | 未確認 | 初期段階で送信されたのは変数名のみ |
| 世界全体の侵入成功件数と経済損失 | 未公表 | 推計すべきではない |
Claude Code 拡張機能の SSH バックドアを調べる方法
10月29日から30日の間に Cursor マーケットプレイス経由で Claude Code 拡張機能をインストール、または自動更新した場合は、まず簡単に確認することをおすすめします。以下の Node.js スクリプトは、公開されている侵害の痕跡に関するパスを読み取るだけで、変更は加えません。
// 只读排查:检查公开披露的入侵痕迹(不能单独作为结论)
const fs = require("fs"), os = require("os"), path = require("path");
const home = os.homedir();
const checks = [
path.join(home, ".ssh", "authorized_keys"),
path.join(home, ".config", ".smt"),
path.join(home, ".config", ".smtk"),
path.join(home, "Library", "LaunchAgents", "com.apple.sysmond.plist"),
path.join(home, ".config", "smt.cmd"),
path.join(home, ".config", "smtk"),
];
for (const p of checks) {
if (!fs.existsSync(p)) continue;
const hit = p.endsWith("authorized_keys")
? fs.readFileSync(p, "utf8").includes("svc-telemetry")
: true;
if (hit) console.log("⚠️ 发现可疑痕迹:", p);
}
いずれかが検出された場合は、ファイルのハッシュ値、SysMon スケジュールタスク、プロセス、ネットワークログをさらに確認してください。たとえば、134.209.82[.]225 の22番または8099番ポートに接続した形跡がないかを調べます。Cursor の公式アナウンスでは macOS と Windows 向けの確認・修復スクリプトも提供されています。スクリプトが必要とする権限を理解したうえで実行することをおすすめします。
手元にある不審な拡張機能のファイルについては、大規模言語モデルを使ってコードレビューを補助することもできます。ファイルの冒頭に、child_process の呼び出し、authorized_keys への書き込み、SSH 接続を行う IIFE(即時実行関数)がないかを重点的に確認します。以下は最小限の呼び出し例です。
import openai
client = openai.OpenAI(
api_key="YOUR_API_KEY",
base_url="https://api.apiyi.com/v1" # APIYI OpenAI 兼容接口
)
head = open("extension.js", encoding="utf-8", errors="ignore").read(10000)
resp = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": "请审查这段 JS 开头是否存在可疑的子进程、SSH、持久化或外连行为:\n" + head}]
)
print(resp.choices[0].message.content)
レビュー用スクリプトの全体を見る(ハッシュ値の照合を含む)
import hashlib
import sys
import openai
# 公开披露的恶意 extension.js SHA-256
KNOWN_BAD = {
"ecb58cb29078d9646ad1dcdbe51526f2d9cfea06be5fb2ab183e8ecc3ab6bf15",
}
KEYWORDS = ["child_process", "authorized_keys", "svc-telemetry",
"LaunchAgents", "schtasks", "crontab", "8099", "-R"]
client = openai.OpenAI(
api_key="YOUR_API_KEY",
base_url="https://api.apiyi.com/v1" # 使用 APIYI 统一接口
)
def sha256(path: str) -> str:
h = hashlib.sha256()
with open(path, "rb") as f:
for chunk in iter(lambda: f.read(1 << 20), b""):
h.update(chunk)
return h.hexdigest()
def review(path: str, head_size: int = 10000) -> None:
digest = sha256(path)
print("SHA-256:", digest)
if digest in KNOWN_BAD:
print("⚠️ 命中已公布的恶意哈希,请立即隔离设备并按官方指引处置")
head = open(path, encoding="utf-8", errors="ignore").read(head_size)
hits = [k for k in KEYWORDS if k in head]
print("文件开头命中关键词:", hits or "无")
prompt = (
"你是安全审计助手。下面是一个 IDE 扩展入口文件的开头部分,"
"请判断是否存在在模块加载时立即执行的代码,"
"并列出涉及子进程、SSH 密钥、持久化、网络外连的可疑片段。\n\n" + head
)
resp = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": prompt}],
max_tokens=1200,
)
print(resp.choices[0].message.content)
if __name__ == "__main__":
review(sys.argv[1] if len(sys.argv) > 1 else "extension.js")
推奨:モデルによるレビューはあくまで補助手段であり、EDRログの確認や公式の指標との照合に代わるものではありません。複数のモデルによるコードレビューの結果を比較したい場合は、APIYI apiyi.com を通じて、同じAPIキーでモデルを切り替えて呼び出せます。新規ユーザーには無料のテスト枠があります。また、レビューに送る前に、コードに業務上の機密情報が含まれていないことを確認してください。
悪意のある拡張機能が実行されたことを確認したら、以下の手順を順に実施してください。
- 調査に必要な証拠を保全し、デバイスを隔離する;
- 悪意のあるファイル、自動起動項目、SSH公開鍵を削除する;
- このデバイスからアクセスできるリポジトリ、クラウドの認証情報、セッショントークン、APIキーに今後のリスクがないか評価する;
- 信頼できる状態に復旧できない場合はシステムを再構築し、信頼できるデバイス上ですべての認証情報をローテーションする。
よくある質問 FAQ
Q1:66行のJavaScriptとは、Claude Codeプラグイン全体のことですか?
いいえ。66行とは、`extension.js` の先頭に挿入された悪意のあるローダーのことで、1行目から66行目までの約7,386バイトを指します。正常なプラグインコードは3.6MB以上あり、その後ろで通常どおり動作します。
Q2:プロンプトインジェクション攻撃とはどう違いますか?
プロンプトインジェクションは、モデルを誘導して危険な出力や操作をさせる攻撃です。一方、今回は拡張機能のコードが読み込み時に直接実行されます。Claudeを経由せず、会話もモデルの同意も必要ありません。プラグインのAI機能を一度も使っていなくても、拡張機能が読み込まれればコードが実行される可能性があります。
Q3:公式npmやVS CodeマーケットプレイスからインストールしたClaude Codeも影響を受けますか?
Microsoftは、Visual Studio Marketplaceと公式npmパッケージ `@anthropic-ai/claude-code` は影響を受けていないと確認しています。Open VSXでも、該当する悪意のあるバージョンは見つかっていません。影響を受けるのはCursorのマーケットプレイスで配布された2.1.312と2.1.313のみですが、判断にあたっては入手元とファイルハッシュも併せて確認する必要があります。
Q4:環境変数に保存したAPIキーは変更する必要がありますか?
最初に送信された情報には環境変数の名前だけが含まれ、値は送信されていませんでした。ただし、デバイス上で悪意のあるコードが実行されたことが確認された場合、バックドアを使って認証情報が読み取られた可能性があります。安全のため、信頼できるデバイスからキーをローテーションしましょう。環境変数に保存しているAPIYI apiyi.comなどのプラットフォームのキーも併せて変更し、より安全なキー管理方法への切り替えをおすすめします。
Q5:AIアプリケーションの開発時に、このようなリスクを減らすにはどうすればよいですか?
高い権限を持つキーを開発マシンの環境変数に平文で長期間保存しないこと、プロジェクトごとに異なるキーを使うこと、IDEの拡張機能を定期的に監査することをおすすめします。APIYI apiyi.comのような集約プラットフォームを通じてモデルを呼び出せば、1つのキーで複数の提供元のモデルを利用でき、ローカルに分散する認証情報の数を減らせます。問題が起きた際も、ローテーションするキーは1つで済みます。
66行のJavaScriptバックドア事件の要点
- 攻撃の本質:Cursor拡張機能マーケットプレイスへのサプライチェーン攻撃であり、Claudeモデル自体が侵害されたわけではない
- 実行の仕組み:66行のIIFEローダーが拡張機能の読み込み時に自動実行され、ユーザーの操作は不要
- バックドアの構造:2組のSSH鍵とリバーストンネルを組み合わせ、システム標準のツールだけを利用
- 事実として確認できる範囲:5,000人は影響を受けた可能性のあるユーザーの上限であり、APIキーの実際の値が盗まれたことは確認されていない
- 対処のポイント:拡張機能のアンインストールだけではバックドアを除去できない。多角的に調査し、信頼できるデバイスで認証情報をローテーションする必要がある
- 普段からの防御策:ローカルに平文で保存するキーを減らし、APIYI apiyi.comなどを活用してモデル呼び出しの認証情報を一元管理する
まとめ
66行のJavaScriptバックドア事件からは、次の3つのことがわかります。
- 小さな変更でも被害は大きい:3.6MBのファイルの先頭にわずか0.2%のコードを挿入するだけで、信頼されていた拡張機能がバックドアの運び手になります。
- 権限がリスクを左右する:IDEの拡張機能はNode.jsの実行権限を持ち、一般ユーザーの権限でも鍵の書き込みや永続化が可能です。
- 公開停止で終わりではない:インストール済みの悪意あるコンポーネントは、時間を置いて実行されたり、外部への通信を続けたりする可能性があるため、個別の調査と除去が必要です。
問題の拡張機能が公開されていた期間中に、CursorマーケットプレイスのClaude Code拡張機能を使用した場合は、公式が示す侵害指標に照らして調査し、影響を受けた可能性のある認証情報をローテーションしてください。日々の開発では、ローカルに保存する認証情報の数を減らすことも大切です。例えば、APIYI apiyi.comを通じて統一されたキーで複数のモデルを呼び出すことで、1つのキーが漏えいした際の影響範囲を抑えられます。
📚 参考資料
- Cursor 公式セキュリティ公告:事件の発生時期、バージョン、ハッシュ、クリーンアップスクリプト
- リンク:
cursor.com/blog/claude-code-extension-security-notice -
内容:調査と修復の一次情報
-
Microsoft Security Research:攻撃チェーンの全容と MITRE ATT&CK へのマッピング
- リンク:
microsoft.com/en-us/security/blog/2026/10/30/inside-malicious-claude-code-branded-cursor-extension-persistent-ssh-backdoor/ -
内容:サプライチェーンの境界、SSH の仕組み、永続化の分析を網羅
-
Phorion:66 行のローダーと各プラットフォームの実装上の欠陥
- リンク:
phorion.io/blog/offical-claude-code-vsx-compromise/ -
内容:環境変数の選別と Linux crontab の欠陥に関する詳細
-
StepSecurity:11 月 1 日のサンプルの精密比較
- リンク:
stepsecurity.io/blog/claude-code-extension-trojanized -
内容:ファイルサイズの差異とバージョン識別情報の偽装を示す証拠
-
Expel:実際の顧客環境で発生した 4 件のインシデント調査
- リンク:
expel.com/blog/blog-fake-claude-code-extension-cursor-ssh-backdoor/ -
内容:遅延実行と検知漏れの事例を記録
-
OpenSourceMalware:悪意ある拡張機能の内部構造分析
- リンク:
opensourcemalware.com/blog/trojanized-claude-code-extension-plants-persistent-ssh-backdoor - 内容:ローダーの配置場所と実行方法を確認
著者:APIYI 技術チーム
技術に関するお問い合わせ:APIYI(apiyi.com)のトップページからお気軽にお問い合わせください。詳しい資料は docs.apiyi.com のドキュメントセンターをご覧ください。
