開発者向けの拡張機能は、便利なぶん一度入り込まれると厄介です。今回Phorionが報告したのは、Cursor Marketplaceに載っていた公式のClaude Code for VS Code拡張のバンドルにバックドアが仕込まれていた、という話でした。しかも影響はmacOSだけに限られず、LinuxやWindowsにもまたがります。単なる「悪い拡張があった」ではなく、IDEの権限でローカルファイルや開発環境にすぐ触れられる点が重い。だからこそ、今この件を整理しておく意味があります。
Phorionの説明によると、問題の拡張はCursor Marketplace上の「Claude Code for VS Code」拡張バンドルに含まれていました。対象として挙げられているのは Claude Code for VSCode 2.1.313 です。Cursorはこのリリースをマーケットプレイスから削除し、さらにNPMとVSCode版の2.1.313も各レジストリから引き下げたとされています。
仕組みはかなり露骨です。拡張のextension.jsの先頭に、即時実行される関数が差し込まれていて、Node.jsの標準モジュールを読み込んだ瞬間に動き出します。activateのような通常の起動処理を待たないので、ユーザーが拡張を触らなくても、ロードされた時点でペイロードが発火します。ここがまず厄介です。拡張はIDEとそのユーザーの権限で動くため、バックドア入りの拡張はローカルのソースコードやファイル、開発用ツールに即座にアクセスできます。
最初に行うのはSSHの準備です。~/.sshを作り、攻撃者が管理するEd25519公開鍵をauthorized_keysに追記します。コメントはsvc-telemetryで、これが見えたら気づけるかもしれませんが、実際にはコメント名だけで追うのは危険だと記事は指摘しています。その後、Linuxではsystemctlやservice、/etc/init.d/を使って、macOSではsystemsetup -setremotelogin onを試し、WindowsではPowerShellでOpenSSH Serverの導入と起動を試みます。もっとも、ここには権限の壁があります。sudo -nは、すでにパスワードなしsudoが通る状態でないと失敗します。
macOSでは、さらに妙な不具合が見つかったとされています。systemsetup -getremoteloginを通常ユーザー権限で実行すると、「administrator access」が必要だと表示されるのに、終了コードは0で返るのです。マルウェア側はその出力がOffかどうかだけを見ていたため、権限エラーの文字列はOffではないと判断され、Remote Loginを有効化する処理を飛ばしてしまいます。つまり、SSHがまだ有効でないMacでは、侵入用の鍵は入るのに、待ち受け側が立たないことがあります。
ただし、それで安心とは言えません。次の段階として、攻撃者のサーバー134.209.82[.]225へ向けて逆向きのSSHトンネルを張ります。埋め込まれている別のEd25519秘密鍵を使い、-R *:0:localhost:22で外部サーバー側に動的ポートを開かせ、そのポート経由で被害側のlocalhost:22へ流します。要するに、被害端末が外へSSH接続を張り、攻撃者はその先で被害機のSSHに入る形です。これならJavaScript側で独自のC2命令をやり取りしなくても、SSHそのものが対話シェルとファイル転送を担います。
さらに、再起動後も残るように永続化も仕込まれています。Linuxでは~/.config/.smtや~/.config/.smtkを置き、crontabの@rebootで再接続させます。macOSでは~/Library/LaunchAgents/com.apple.sysmond.plistを作り、RunAtLoadとKeepAliveを有効にしたLaunchAgentとして登録します。Windowsでは、起動時に動くスケジュールタスクSysMonをSYSTEM権限で作ろうとし、失敗したらStartupフォルダにsysmon.cmdを置く構成です。Phorionは、Linux側のcrontab確認にバグがあり、繰り返し実行で既存のcronジョブを壊す可能性にも触れています。今回の件は、単なる鍵の埋め込みではなく、長期滞在を狙った実用的なバックドアでした。
まず気になったのは、攻撃者が「拡張機能」という経路を選んだことです。ソフトウェア供給網の攻撃は珍しくありませんが、IDE拡張はとくに効きます。開発者は日常的に入れ替え、しかも権限の感覚がゆるくなりがちだからです。ブラウザ拡張よりもさらに、コード、SSH鍵、環境変数、ローカルリポジトリが近い。つまり、一つ崩れると仕事の中枢に直結します。今回のように「公式」と見える拡張が混ざると、利用者は見分けづらい。そこが本当に厄介だと思います。
記事では、macOSでsystemsetup -getremoteloginが権限エラーを返すため、Remote Loginの有効化が飛ぶ可能性が示されています。これは確かに、すべての端末で同じように侵入できるわけではない、という点で重要です。ただ、ここを「macOSなら助かった」と受け取るのは危ないとも思います。鍵はすでにauthorized_keysに入り、永続化の仕組みも用意され、外向きのトンネルも張られている。SSHが後から有効になった瞬間に、アクセス経路は生き返ります。つまりこれは防御ではなく、手順の一部が環境依存でこけたにすぎません。攻撃の設計としてはかなり実務的で、失敗しても完全には無駄にならない作りです。
このマルウェアが面白いのは、独自の通信プロトコルをほとんど作っていない点です。代わりに、SSHの機能だけで「外へつなぐ」「中へ入る」「ファイルをやり取りする」を済ませています。これは攻撃者にとって運用が楽ですし、被害側から見ても普段の管理作業に紛れやすい。ネットワーク監視でも、単純な怪しい送信先だけでは見逃しやすいはずです。さらに、autosshがあればそれを使い、なければ通常のsshに落ちる設計も、現場適応の強さを感じさせます。派手な機能より、壊れにくさを優先している。そこが不気味です。
Phorionはsvc-telemetryというコメントや、~/.config/.smt、~/.config/.smtk、com.apple.sysmond.plistといった痕跡を挙げていますが、実際の調査では単一の文字列だけを見ていては足りません。コメント名は変えられますし、ファイル名も派手に変わるかもしれません。大事なのは、authorized_keysの追加、LaunchAgentやcron、Startupフォルダ、そして不自然な外向きSSH接続が同時に起きていないかをつなげて見ることです。特に開発端末は、通常の業務でもSSHや拡張機能の更新が多いので、誤検知を恐れて弱く見張りがちです。けれど、今回は「拡張が入る → 鍵が置かれる → 外へトンネルが張られる」という筋がはっきりしています。端末単体ではなく、行動の流れとして追うべき事案だと思います。
参考: Official Claude Code Extension Compromise: Security Advisory