
公式Claude Code拡張機能の侵害:Cursor MarketplaceでSSHバックドアが見つかる
Phorionは、Cursor Marketplace上の公式Claude Code for VS Code拡張機能にバックドアを検出した。このバックドアはmacOS、Linux、Windowsに永続的なSSHバックドアを配置し、Cursorは該当リリースを削除した。
Phorionは、Cursor Marketplace上で配布されている公式Claude Code for VS Code拡張機能の侵害を公表した。侵害された拡張機能バンドルには、macOS、Linux、Windowsの各環境で動作する永続的なSSHバックドアが含まれているとされる。
発表内容
- Phorionは、Cursor Marketplace上の公式Claude Code for VS Code拡張機能にバックドアを検出した。
- 組織は、Claude Code for VSCode 2.1.313の使用状況を直ちに確認し、拡張機能の使用が見つかった場合はインシデント対応を開始するよう勧告されている。
- Cursorは該当リリースをマーケットプレイスから削除し、2.1.313のNPM版とVSCode版をそれぞれのレジストリから取り下げた。
侵害の仕組み
侵害されたextension.jsファイルは、最小化された拡張機能バンドルの先頭に、注入された即時実行関数式(IIFE)が追加された形で始まる。この処理はNodeがファイルを読み込んだ時点で実行され、拡張機能の通常のactivateコールバックより前に走り、ユーザーの操作は不要である。
スクリプトは、svc-telemetryというコメントを付けた攻撃者管理のEd25519公開鍵を、~/.ssh/authorized_keysに追記する。~/.sshにはパーミッション0700、~/.ssh/authorized_keysには0600が設定される。
SSHの有効化処理はOSごとに異なる。
- Linuxでは、
systemctlを用いてsshdまたはsshの有効化と起動を試み、失敗時はserviceと/etc/init.d/にフォールバックする。 - macOSでは、昇格なしで
systemsetup -getremoteloginを実行し、出力が/Off/iに一致した場合にのみsudo -n systemsetup -setremotelogin onを試みる。 - 標準ユーザーで実行すると、
systemsetup -getremoteloginは管理者アクセスのエラーを標準出力に出力し、ステータス0で終了するため、Offは返されない。
Phorionは、マルウェアのSSH有効化処理に見落としがある可能性が高いと見ている。また、Windowsのコードパスにも別の不具合があるとみられ、PowerShellのサービス設定コマンドをdet()というヘルパー関数経由で渡すが、この関数は/bin/shをハードコードしている。
永続化とビーコン
スクリプトは、埋め込まれた暗号化されていないEd25519秘密鍵(コメントsvc-telemetry-tun)を使い、ユーザーtunnelとして134.209.82[.]225のポート22へ送信方向のSSH接続を確立する。トンネルは-R *:0:localhost:22でリモートポート転送を行い、-Nで実行される。ホストキーの確認は無効化され、known_hostsは無視される。ServerAliveCountMax=3、ServerAliveIntervalは30秒に設定される。autosshが存在すればそれを使い、なければsshにフォールバックする。いずれも、試行間に60秒のスリープを挟む切り離されたリトライループで包まれている。
永続化の方法はプラットフォームごとに次のとおりである。
- macOSでは、
~/Library/LaunchAgents/com.apple.sysmond.plistを書き込み、/bin/sh ~/.config/.smtをRunAtLoadおよびKeepAliveをtrueにして実行し、launchctlで読み込む。 - Windowsでは、SYSTEM権限で起動時に実行される
SysMonという名前のスケジュールタスクの作成を試みる。失敗した場合は、ユーザーのStartupフォルダにsysmon.cmdを配置する。
スクリプトは、初期設定後1.5秒の遅延をおいてビーコンを一度だけスケジュールする。ホスト偵察では、ホスト名、ユーザー名、OSプラットフォーム、アーキテクチャ、ホームディレクトリ、カレントディレクトリ、グローバルなGitのメールアドレス、パブリックIP、セットアップ状況のフラグ、そして/KEY|TOKEN|SECRET|PASS|AWS|GCP/iに一致する環境変数名が最大40件収集される。パブリックIPはifconfig[.]meに問い合わせ、失敗時はapi[.]ipify[.]orgにフォールバックする。
ビーコンは平文のHTTP POSTとして、/beacon宛に134.209.82[.]225:8099と127.0.0.1:8099へ送信される。ただし、なぜ127.0.0.1:8099にもビーコンの写しを送るのかは、サンプルからは明らかではない。また、スクリプト自体はそのポートでリスナーを設定していない。
検知の状況
Phorionによると、同社の標準検知機能は、この攻撃で使われるmacOSの永続化を複数のルールで検出する。また、同社のファイルアクセステレメトリは、IDEの拡張機能ホストが~/.ssh/authorized_keysを直接変更する様子を捉えているという。
筆者の見立て
- 元記事は、このマルウェアは依然として重大な脅威であり、永続化の設置とホスト偵察情報のオペレーターへの送信を行うと論じている。
- 元記事は、SSHバックドアの不具合によりmacOSでの影響は小さくなっていると解釈している。
- 元記事は、このペイロードの目的は長期的な対話型アクセスにあると解釈している。
- 元記事は、スクリプトがRemote Loginの状態を確認できない場合にSSHがすでに有効であるとみなしており、そのため有効化の試行がプロセステレメトリに現れないことを説明していると解釈している。
- 元記事は、SSHが動作していないMacでは、macOSの確認処理の誤りによって外部からのインバウンドアクセス経路が壊れると解釈している。
- 元記事は、このバグはアクセスチェーンの最後の段階を壊す可能性があると示唆している。
- 元記事は、SSH有効化の不具合を防御策として頼ることは推奨されないと論じている。Remote Loginがすでに有効な場合や後から有効になった場合には、バックドアが機能するためである。
- 元記事は、環境変数名の一覧が、オペレーターが優先すべきホストを素早く把握する手段になると示唆している。
- 元記事は、IDEのヘルパープロセスが
~/.ssh/authorized_keysへ書き込む挙動の監視は不可欠であると論じている。 - 元記事は、IDEのバイナリは正規に署名されていても、拡張機能ホストプロセスがバックグラウンドでSSH認証ファイルを変更する必要はないと論じている。
- 元記事は、プロセスのみに基づくルールでは追記を検知できないため、ファイル変更のテレメトリが必要だと解釈している。
- 元記事は、
systemsetup -setremotelogin onは、壊れた状態確認によりコマンドが実行されないことが多いため、必須の警告条件として頼るべきではないと示唆している。 - 元記事は、macOSの永続化に関する2つのシグナルは、このキャンペーンの強い指標であると論じている。
- 元記事は、
.smtとcom.apple.sysmond.plistのファイル作成をIDE拡張機能ホストに関連付けることで、攻撃の連鎖を組み立てやすくなると論じている。
この記事は元記事の事実のみに基づいて自動生成されました。
出典
- Phorion「Official Claude Code Extension Compromise: Security Advisory」
- https://phorion.io/blog/offical-claude-code-vsx-compromise/