要約: Open VSXの新しい事前公開スキャンパイプラインにはフェイルオープンバグがありました。公開エンドポイントに殺到させると、スキャナーがスキップされ、悪意のある拡張機能が公開される – 合格とマークされます。報告から3日以内に修正されました。
• • •
Open VSXは、Cursor、Windsurf、およびより広いVS Codeフォークエコシステムの背後にある拡張機能マーケットプレイスで、最近事前公開スキャンパイプラインをロールアウトしました。これは大きな取り組みであり、正しい判断です。マルウェア検出、シークレットスキャン、バイナリ分析、名前スクワッティング防止。エコシステムが切実に必要としていた種類のインフラストラクチャです。
ここに問題があります。パイプラインは、「スキャナーが構成されていない」と「すべてのスキャナー実行に失敗した」の両方を意味する単一のブール値を持っていました。呼び出し元は違いを区別できませんでした。そのため、スキャナーが負荷の下で失敗すると、Open VSXは「スキャンするものがない」として扱い、拡張機能をそのまま通してしまいました。
無料のパブリッシャーアカウントを持つ悪意のあるアクターなら誰でもこれを悪用できました。特別な権限もありません。インサイダーアクセスもありません。エンドポイントに殺到して待つだけです。
私たちは2月8日(日曜日)にこの問題をOpen VSXチームに報告しました。彼らは問題を認め、2月11日に修正をリリースしました。迅速で専門的で、正確に開示が進むことを期待する方法です。チームに称賛します。
私たちはこれを「Open Sesame」と呼んでいます。すべてがどのように展開するか見てみましょう。
スキャンパイプライン
悪意のある拡張機能の増加する脅威に対応して、Open VSXチームは事前公開スキャンパイプラインの実装を開始しました(Issue #1331、 PR #1529)。ビジョン:公開前にすべての拡張機能を検査する拡張可能な検証システム。マルウェア検出、名前スクワッティング防止、シークレットスキャン。失敗した拡張機能は管理者レビュー用に検疫されます。
パイプラインはこのように機能します:

- パブリッシャーがAPIを介して拡張機能をアップロードします。
- 拡張機能は保存されますが、スキャンが完了するまでは非アクティブで、ダウンロード不可です。
- スキャンは2つのフェーズで実行されます。まず、高速同期チェックがインラインで実行され、チェックが失敗した場合、拡張機能は即座に却下されます。次に、登録されたすべてのスキャナーが並列バックグラウンドジョブとして送信されます。
- 完了サービスはこれらのジョブを監視し、すべてが成功すると、拡張機能をダウンロード用にアクティブ化します。スキャナーが脅威をフラグ付けした場合、拡張機能は管理者レビュー用に検疫されます。
- 別個の回復ウォッチドッグは、定期的に詰まったスキャンまたは失敗したスキャンをチェックし、それらを再度キューに入れます。
拡張機能がユーザーに到達するには、構成されたすべてのスキャナーに合格する必要があります。それが保証です。それでは、どのように壊れるかを見てみましょう。
バグはExtensionScanService.javaが結果を報告する方法と、その呼び出し元がそれらを解釈する方法に存在します。
スキャン送信メソッドは次のとおりです:

そしてこれがPublishExtensionVersionHandler.javaの呼び出し元です:

問題が見えますか?そのブール値は2つの完全に異なる状況を混同しています:
(A) スキャナーが構成されていません。意図的な管理者の選択。アクティブ化しても安全です。
(B) すべてのスキャナージョブキューイングが失敗しました。負荷時の一時的なエラー。アクティブ化しても安全ではありません。
submitScannerJobsがfalseを返すと、呼び出し元は常に(A)と仮定します。拡張機能は合格とマークされ、アクティブ化され、ダウンロード可能になります。しかし負荷下では、その同じfalseは実際には(B)を意味します。スキャナーは存在します。ただし、データベース接続プールが枯渇しているため、キューイングできませんでした。
それはさらに悪くなります。同じパターンはExtensionScanJobRecoveryService.javaにも存在していました – 失敗したスキャンをキャッチして再試行するために特別に設計された回復パス。セーフティネットは、それが支援すべきシステムと同じ穴を持っていました。
悪用がどのように見えるか
特別な前提条件はなく、攻撃者はユーザーを持っているだけです!彼らは悪意のある拡張機能のバッチを準備し、それぞれが望むペイロードを含む標準的な.vsixファイルとしてパッケージ化され、公開エンドポイントに殺到させます。
それが機能する理由は次のとおりです:各公開はスキャンパイプラインをトリガーします。これはScanJobレコードを保存し、それらをJobRunrにキューイングする必要があります。両方の操作は同じ共有プールからのデータベース接続のために競争します。十分な同時負荷の下では、jobScheduler.enqueue()は例外をスローし始めます。catchブロックはエラーをログに記録して続行します。すべてのスキャナーのキューイングに失敗します。enqueuedCountはゼロのままです。メソッドはfalseを返します。
ゲートが開きます。拡張機能はopen-vsx.orgでライブになります。スキャンステータス:合格。
私たちはこの動作を制御条件下のテストで確認し、フェイルオープンパスを確実にトリガーすることができました。本番環境での単一の試行のレース窓は狭いでしょうが、攻撃者は公開エンドポイントにレート制限がないため、無制限にゼロコストで再試行できます。それはいつかではなく、必ず起こることです。
ひび割れて通過する拡張機能は、マーケットプレイス上の他の拡張機能と区別できません。拡張機能がすべてのセキュリティチェックをスキップしたことをUIに示すものはありません。合格したように見えます。
修正
いつものように、OpenVSXチームはこの脆弱性を閉じるのに優れた仕事をし、すぐに対応し、3日以内に修正しました。
きれいな修正は、コアの曖昧さに対処します。曖昧なブール値はもうありません。失敗は失敗を意味します。


あなたがすべきこと
直急の危険は解決されました。Open VSXは2月11日に修正をリリースしました。脆弱なウィンドウ中に新しい拡張機能をインストールまたは更新した場合は、それらのレビューを検討してください。
この特定のバグを超えて、このパターンがより広く何を意味するかを考える価値があります。事前公開スキャンは重要な層ですが、それは1つの層です。パイプラインの設計は健全ですが、「何もすることはない」と「何かが間違った」を区別できない単一のブール値が、負荷の下で開いた圧力の下で開いたゲートに変わったパイプラインの全体インフラストラクチャ。これは一般的なアンチパターンです:正当な「何もすることはない」ケースで隠れているフェイルオープンエラー処理。
同様のパイプラインを構築している場合は、失敗状態を明示してください。「作業が不要」と「作業が失敗した」が戻り値を共有してください。
これはまた、Koiが検出するために構築された種類のギャップでもあります。私たちのリスクエンジンは、ネットワークリクエスト、ファイルシステムアクセス、コードパターンなど、マーケットプレイススキャナーが実行されたかどうかに関わらず、悪意のあるインテント深くの拡張機能の動作を分析します。デモをお約束ください。
開示タイムライン
- 2026-02-08(日曜日): 脆弱性がOpen VSXチームに直接報告されました
- 2026-02-11(火曜日): Open VSXチームが報告書を認めました
- 2026-02-11(火曜日): コミットで修正が出荷されました 64720cc
CWEs
- CWE-636(安全に失敗しません): コアの問題 – スキャナーの失敗により、拡張機能がブロックされるのではなく承認されました。
- CWE-755(異常な状態の不適切な処理): enqueue()例外がキャッチされてログに記録されましたが、結果は変わりませんでした。
- CWE-362(競合状態): 利用は、スキャン中に接続プールを枯渇させるために同時発行のタイミングに依存しています。
- CWE-400(無制御リソース消費): 公開エンドポイントにはレート制限がなく、無制限の接続プール枯渇を許可しました。