概要
Open VSX、VS Code のフォークである Cursor と Windsurf で使用されている拡張機能マーケットプレイスは、最近導入された事前公開スキャニングパイプラインの重大な脆弱性を修正しました。この脆弱性により、悪意のある拡張機能がセキュリティチェックを回避し、検出されることなく公開される可能性がありました。
脆弱性の詳細
この問題は「Open Sesame」と呼ばれ、スキャニングワークフローにおける開け放ち状態(fail-open condition)が原因でした。プラットフォームは、マルウェア検出、シークレットスキャン、バイナリ分析を通じて拡張機能のセキュリティを強化するためにこのパイプラインを導入しましたが、論理的な脆弱性により攻撃者が特定条件下で全てのスキャナーを回避することができました。
対応と修正
この脆弱性は 2026 年 2 月 8 日に責任ある開示が行われ、3 日後の 2 月 11 日に修正されました。修正では、スキャナー実行結果の処理に関する曖昧な論理を削除し、エラー状態を明確に扱うようにしました。
スキャニングパイプラインの仕組み
Open VSX のスキャニングシステムは、拡張機能が公開前に安全であることを確認するための多段階検証プロセスとして設計されています。開発者が拡張機能をアップロードすると、それは一時的に非アクティブな状態で保存されます。
- 最初に高速かつ同期的なチェックが実行され、明らかに悪意のあるコンテンツは即座に却下されます。
- これらのチェックがパスした場合、システムは複数の非同期スキャニングジョブをスケジュールします。それぞれがより深い分析(マルウェア検出やシークレットの露出を特定するなど)を行います。
- 全てのスキャナーが成功を報告した後で初めて、拡張機能は公開ダウンロード可能となります。
もしどのスキャナーも問題を検出した場合、拡張機能は手動レビューのために隔離されます。また、失敗または停止したスキャンの再試行を確保するための回復サービスも存在します。
脆弱性の根本原因
この問題の根元は、システムがスキャナー実行結果をどのように処理していたかにあります。バックエンドで使用される重要なメソッドは、スキャナーサブミッションの結果を示す論理値(Boolean)を返していました。
- この単一の値は、スキャナーが設定されていない状態と全てのスキャンジョブが失敗した状態を表していました。
システムは両方の状況を同じように扱っていました。高負荷時にデータベース接続が枯渇し、スキャンジョブが失敗すると、このメソッドは「false」を返しました。
脆弱性の影響
攻撃者は特別な権限を持つ必要なく、標準のパブリッシャーアカウントを使用してこの脆弱性を利用できました。攻撃者は複数の悪意のある拡張機能をアップロードしながら同時に公開 API を洪水状態にすることで、バックエンドリソース(特にスキャンジョブをスケジュールするための共有データベース接続プール)を圧迫しました。
- ジョブスケジューリングが失敗すると、システムは完全にスキャンをスキップします。
テストでは、この開け放ち状態(fail-open condition)が負荷下で信頼性よくトリガーされることを確認しました。公開エンドポイントにはレート制限が設けられていなかったため、攻撃者は無コストで反復的に脆弱性を利用することが可能でした。
対策と今後の課題
スキャンを回避した拡張機能はユーザーインターフェース上で正当なものと区別がつきませんでした。そのため、ユーザーはこれらの拡張機能を「PASSED」として表示する一方で、実際には分析されていませんでした。
- Open VSX チームは迅速に対応し、曖昧な論理値を削除し、エラー状態を明確に扱うように修正しました。
このインシデントは、開け放ち状態(fail-open condition)が、良好な設計のセキュリティシステムでも圧力下で静かに崩壊する可能性があることを示しています。エラー状態と有効な条件を区別できない場合、保護機能は無音で失敗します。
まとめ
この脆弱性の修正により、ユーザーが影響を受けたウィンドウ中にインストールまたは更新した拡張機能を確認するよう推奨されています。また、セキュリティ設計における重要な教訓として、開け放ち状態(fail-open condition)は、良好な設計のセキュリティシステムでも圧力下で崩壊する可能性があることを示しています。
