VSCodeフォークを使う全開発者を乗っ取れた可能性——脆弱性の全貌

要約:私たちは、open-vsx.orgCursorWindsurfVSCodiumなど人気のVSCodeフォークが採用するオープンソースのVS Code拡張機能マーケットプレイス)に重大な脆弱性を発見しました。このマーケットプレイスは1,000万人以上の開発者に利用されています。本脆弱性を悪用すると、マーケットプレイス全体を攻撃者が完全に制御でき、ひいては数百万台の開発者マシンを掌握できます。CIの欠陥を突くことで、悪意のある攻撃者はOpen VSXに公開されているすべての拡張機能に悪意のあるアップデートを配布できます。バグ一つで、マーケットプレイスの完全乗っ取り。数百万人の開発者とその組織が、まるごと危険にさらされます。拡張機能を制御できれば、マシンもコードもビジネスも制御できるのです。

OpenVSX誕生の背景——VS Codeの「壁に囲まれた庭園」

Visual Studio Codeの成功は主に拡張機能のエコシステムによるものですが、そのエコシステムには落とし穴があります。Microsoftの公式マーケットプレイスには制約があり、利用できるのはMicrosoft自身の製品のみです。利用規約では、VS Codeの非Microsoft製ビルドやフォークが公式の拡張機能マーケットプレイスにアクセスすることを明示的に禁じています。つまり、コミュニティビルドやVS Codeのフォークを使用している場合、Microsoftのサーバーから拡張機能を取得することは法的に認められていないのです。

こうした制限を受けて生まれたのがOpen VSXです。Eclipse Foundationが運営する、ベンダー中立のオープンソース拡張機能マーケットプレイスです。Open VSXは、VS Codeフォークやその他のオープンソースIDEのためのコミュニティ主導の代替手段として構想されました。Microsoftによる管理なしに拡張機能を共有できる場所を目指したものです。Eclipse Foundationは、コミュニティ主導の代替手段がなければ、VS Code専用マーケットプレイスが「オープンソースの開発ツールを採用した組織の能力を著しく制限する」公式に表明しています。

実際の使い勝手は公式のVS Code Marketplaceとほぼ同じですが、あらゆるVS Codeフォークに開放されています。開発者はOpen VSXに拡張機能を公開でき、VS Codeフォークのユーザーはそれらをシームレスにインストールできます。このプロジェクトは2020年から続いており、Cursor、Windsurf、Gitpod、Coderなど多くのVSCodeフォークにとって事実上の「アプリストア」となっています。

Open VSXの依存者たち

Cursor、Windsurf、Google Cloud Shell Editor、GitLab Web IDEをはじめとする数十種類のVS Codeベースのエディタを通じて、1,000万人以上の開発者がOpen VSXに依存しています。

Open VSXはもともと、Eclipse FoundationのVS CodeフォークEclipse Theia(GitHubスター数2万)のために開発されたもので、そのEclipse Theiaが幅広いコードエディタの基盤となっています。しかし実質的には、ほぼすべてのVSCodeフォークがopen-vsx.orgを主要な拡張機能マーケットプレイスとして利用しています。

現在これを使用している主なコードエディタを以下に挙げます。

  • Cursor:推定ユーザー数100万人以上
  • Windsurf(旧Codeium):推定ユーザー数60万人以上
  • VSCodium:GitHubスター数2万7,300、推定ユーザー数30万人以上
  • Google Cloud Shell Editor:推定ユーザー数10万人以上
  • GitLab Web IDE:推定ユーザー数10万人以上
  • StackBlitz:GitHubスター数1万500、推定ユーザー数300万人以上
  • Gitpod:GitHubスター数1万3,300、推定ユーザー数150万人以上
  • code-server(別名Coder.com):GitHubスター数7万1,600、推定ユーザー数100万人以上
  • Arduino IDE 2.x:GitHubスター数2,600、推定ユーザー数100万人以上
  • Red Hat OpenShift Dev Spaces
  • SAP Business Application Studio
  • IBM Wazi Developer
  • Texas Instruments Code Composer Studio
  • Arm Mbed Studio
  • Acquia Cloud IDE
  • Eclipse Che4z

これだけ広く普及しているということは、Open VSXが侵害されれば、それはサプライチェーン上の悪夢シナリオを意味します。拡張機能のインストール時も、バックグラウンドで自動的に行われる拡張機能の更新取得時も、そのすべての処理がOpen VSXを経由するからです。

そして残念ながら、私たちが発見したように、たった一つの単純なバグが数百万人の開発者を、過去に例を見ないほど深刻なリスクにさらしていました。

脆弱性の詳細——古典的「Pwnリクエスト」の変形

2025年5月、私たちの調査チームはpublish-extensionsリポジトリに欠陥を発見しました。このリポジトリはOpen VSXに拡張機能を取り込む仕組みを担っています。

Open VSXに拡張機能を公開する方法は2つあります。

  1. 自分でOpen VSXにアップロードする
  2. 拡張機能の自動公開をリクエストする——extensions.jsonファイル内のリストに拡張機能を追加するプルリクエストを作成する方法です。

Open VSXの自動公開の仕組みを簡潔に説明します。publish-extensionsリポジトリには夜間に実行されるGitHub Actionsワークフローがあり、extensions.jsonの拡張機能リストを読み込み、新しいバージョンがあるものを自動的に更新します。このワークフローは特権的な認証情報を使用して実行されます。具体的には、マーケットプレイス上のあらゆる拡張機能を公開・上書きする権限を持つ@open-vsxサービスアカウントのシークレットトークン(OVSX_PAT)です。理論上、信頼できるコードだけがこのトークンを参照できるはずです。

夜間ワークフローの処理はおおよそ次のとおりです。

  1. 拡張機能のリポジトリをクローンする
  2. package.jsonのバージョンが現在のバージョンより新しい場合:
  3. npm installを実行する
  4. 新しくビルドした拡張機能を、OVSX_PAT環境変数に格納された認証トークンを使って@open-vsxユーザーとしてopen-vsx.orgに公開する

脆弱性の根本的な原因は、npm installが自動公開されるすべての拡張機能(およびその依存関係)の任意のビルドスクリプトを実行する際に、OVSX_PAT環境変数へのアクセスが許可されていることにあります。

私たちはこのサンプルリポジトリを使用することで、脆弱なワークフロー設計を突いてOVSX_PATを実際に窃取できることを確認しました。

影響——数百万人の開発者を脅かすサプライチェーンの悪夢

@open-vsxアカウントのトークンを盗んだ時点で、実質的に「王国の鍵」を手に入れたも同然です。このトークンはOpen VSX Registryのスーパー管理者権限を持つ認証情報であり、新しい拡張機能の公開、既存の拡張機能の更新・上書きが可能です。攻撃者の観点から見れば、これはエコシステム全体のサプライチェーンを掌握することを意味します。次に開発者のIDEが拡張機能を自動更新したとき、またはユーザーが新しい拡張機能をインストールしたとき、侵害されたペイロードが気づかれることなく配信されます。

このような能力を持つ攻撃者は何ができるでしょうか。端的に言えば、あなたのマシン上で何でもできます¹。VS Codeの拡張機能はNode.jsプロセスとして動作するため、プロセスの起動、ファイルの読み書き、ネットワークリクエストが可能で、実質的にユーザーアカウントで動作するマルウェアとして機能します。たとえばPython拡張機能への悪意のあるアップデートは、キーロガーをひっそりと埋め込んだり、Cookieやソースコードを窃取したり、ビルド成果物に感染したり、あらゆる開発者のプロジェクトにバックドアを仕掛けたりすることが可能です。これはまさに開発者ツールにおけるSolarWindsシナリオです。アップデートの仕組みを侵害すれば、そのアップデートを利用するすべての下流システムを侵害できます。

これまでにも、SSHキーや暗号資産ウォレットのキーを盗むような悪意のあるVS Code拡張機能の事例は個別に発生していました。しかし今回の脆弱性は、そうした攻撃をまったく別の次元にまで拡大できるものでした。

[1]: これはCursor、WindsurfやVSCodiumなどデスクトップ型エディタに該当します。GitLab Web IDEやStackBlitzのようなウェブベースのエディタでは、影響の範囲はエディタのドメインと、そのエディタがアクセスするプロジェクトを侵害した場合の結果に依存します。

対処法

拡張機能、そしてマーケットプレイス、アプリストア、レジストリから提供されるあらゆるソフトウェアは、デフォルトで信頼できないものとして扱う必要があります。これらは個々のパブリッシャーが開発したサードパーティのツールであり、重要な権限を持ちながら、しばしば見過ごされがちです。あらゆるソフトウェア依存関係と同様に、継続的に発見・評価・監視・管理されなければなりません

具体的には以下のような対策が必要です。

  • インベントリの維持:どのマシンに何がインストールされており、誰が使用しているかを把握する
  • リスク評価の実施:拡張機能やマーケットプレイスのアイテムそれぞれを潜在的な攻撃対象として扱う。出所はどこか?継続的にメンテナンスされているか?どのような権限を要求しているか?実際に何をするのか?
  • ポリシーの強制と管理:許可するものを明確に定義し、ポリシーから逸脱した場合に是正措置を実施する。リスクの高いプラグインの自動削除や担当チームへのアラート通知など
  • 継続的な監視:拡張機能はひっそりと更新される場合があります。ガバナンスは一度きりであってはなりません。あらゆる更新フローに対する可視性と管理が必要です

私たちの調査チームは、Open VSX、MicrosoftのVS Code Marketplace、さらにはプライベートなエンタープライズマーケットプレイスにおいて、脆弱な拡張機能や実際に悪意のある拡張機能を毎日発見しています。この問題は普遍的なものです。コードであり、あなたの環境で動作するものである以上、それはあなたの攻撃対象領域の一部です。

マーケットプレイスのアイテムはすべて潜在的なバックドアです。それらは審査されていないソフトウェア依存関係であり、特権的なアクセス権を持っています。PyPI、npm、Hugging Face、GitHubのパッケージと同等の注意が必要です。放置すれば、攻撃者がますます悪用するようになっている、広大で目に見えないサプライチェーンが生まれてしまいます。

アプリ、拡張機能、プラグイン、モデル、MCP、コードパッケージ、コンテナを問わず、マーケットプレイスから提供されるすべてのソフトウェアに対してゼロトラストモデルを採用し、発見・分析・承認・監視が完了するまですべてを信頼しないものとして扱うべきです。

本レポートはKoi Securityの調査チームが執筆したものです。健全な疑念の精神と、より安全なオープンソースエコシステムへの希望を胸に。

驚くべきことに、MITREが最新のカテゴリとしてIDEの拡張機能を追加したわずか数日後に、私たちはこれらすべてを発見しました。このことは、この領域のセキュリティ確保の重要性をさらに強調するものです。

長い間、多くの場合最高レベルの権限で動作する信頼されていないサードパーティのコードの使用は、企業にも攻撃者にも見過ごされてきました。しかしその時代は終わりを迎えつつあります。潮目は変わっています。

私たちはこの瞬間に対応するためにKoiを構築しました。実務担当者にも企業にも対応しています。私たちのプラットフォームは、Chrome Web Store、VSCode、Hugging Face、Homebrew、GitHubなどのマーケットプレイスからチームが取得するすべてのものを発見・評価・管理する支援を行います。

Fortune 50企業、金融機関(BFSI)、世界最大規模のテクノロジー企業に信頼されているKoiは、この広大な攻撃対象領域全体にわたって可視性の確保、ガバナンスの確立、リスクの積極的な低減に必要なセキュリティプロセスを自動化します。

ソリューションにご興味がある方、または今すぐ行動を起こしたい方は、デモをご予約いただくか、こちらからお問い合わせください 🤙

まだ明かせない驚きのネタを用意しています。続報にご期待ください。

開示タイムライン

今回のインシデントは責任ある開示の慣行に従って対応しました。

以下に開示の経緯を示します。

  • 5月4日 午後3時18分:脆弱性を開示
  • 5月5日 午後12時25分:レポートの受領確認
  • 5月5日 午後11時34分:第1の修正案を提示
  • 5月6日 午前10時23分:私たちによる修正のレビュー完了
  • 5月7日 午後4時47分:第2の修正案を提示
  • 5月8日 午後1時41分:私たちによる修正のレビュー完了
  • 5月14日 午後2時18分:第3の修正案を提示
  • 5月14日 午後3時22分:私たちによる修正のレビュー完了
  • 5月15日 午後4時23分:第4の修正案を提示
  • 5月15日 午後9時02分:私たちによる修正のレビュー完了
  • 5月19日 午後1時29分:第5の修正案を提示
  • 5月19日 午後11時36分:私たちによる修正のレビュー完了
  • 5月21日 午後12時58分:第6の修正案を提示
  • 5月22日 午後6時09分:私たちによる修正のレビュー完了
  • 6月25日 午後7時20分:修正をデプロイ

翻訳元: https://www.koi.ai/blog/marketplace-takeover-how-we-couldve-taken-over-every-developer-using-a-vscode-fork-putting-millions-at-risk

ソース: koi.ai