🛡️

エコシステム全体でのソースコード漏洩への対処の振り返り

に公開2

🌐 Read this post in English

自分の2025年は、Viteの脆弱性の対応をし、エコシステム内の他のツールにそれを報告することから始まりました。このブログ記事は、その経験についての振り返りです。この記事は主に非技術的な側面に焦点を当てています。技術的な側面に興味がある場合は、次に書く予定の記事を参照してください。

Viteへの報告

新年の休みが開けてすぐの1月9日、ある脆弱性レポートがViteに報告されました(GHSA-vg6x-rcgg-rjx6 / CVE-2025-24010)。
その内容はViteのWebSocketサーバーがCross Site WebSocket Hijacking (CSWSH) attackに対して脆弱(CWE-1385)であり、ソースコードを外部から取得できてしまうというものでした(注: レポートの内容は報告時のものから変更されています)。
ViteのWebSocketサーバーがCSWSH attackに対して脆弱であることは確かだったのですが、実際にソースコードを外部から取得できてしまっていたのはViteがデフォルトでCORSを許可していたことが原因でした。
しかし、開発時においてもCORSを設定する必要があるとなると、Viteのユーザーにとって開発を始める際に意識しなければならないことが一つ増えてしまいます。
それはできれば避けたかったので、ほかのツールはこの問題に対してどのような対処をしているのかを確かめるため、以下の各ツールの設定を調査してみることにしました。

しかし、webpack-dev-serverとVue CLIを除いた全てのツールでは、デフォルトでCORSが許可されており、外部からのソースコードの取得が可能でした。
また、その際にwebpack-dev-serverがCORSのデフォルト設定を変更したという記事を発見しました。
その記事に記載されているDNS rebinding attackにも脆弱であることに気付きました。
webpack-dev-serverの実装を参考にして、Viteの修正に取り組むことにしました。

各脆弱性の調査と修正

ここまでで3つの脆弱性があることが分かったので、各脆弱性がどのような条件で利用されうるかを考えました。
その後、webpack-dev-serverの実装を確認しつつ、漏れがないかどうかを考えました。
その際にwebpack-dev-serverの実装に穴があることに気付きました。

実装の穴を修正しつつViteの修正のプルリクエストを作成しました。
リクエスト元のオリジンが信頼できるどうかをVite側が知りえず破壊的変更は避けられないので、

  • 破壊的変更の影響を最小のユーザーに留めること
  • 影響を受けるユーザーが明確にどうするべきかをレポートに含めること

を意識しました。
前者に対しては、攻撃の影響を受けない場合はデフォルトで許可することを行いました。
後者に対しては、レポートにアップデート時の各ユースケースでの設定が必要な項目を記載し、さらにセキュリティの影響を看過できるユーザーのために各変更をオプトアウトできるようにしました。

その後、レポートを書き上げ、修正のリリースとともにレポートの公開をしました。

修正のリリースのフォローアップ

公開ともプライベートとも言えないAPIに避けられない破壊的変更があり、GitHubの検索でそれを利用しているリポジトリがあったことに気付いていたので、それらのリポジトリにその旨を報告しました (wxt-dev/wxt#1360quasarframework/quasar#17777)。
これでアップデートが阻害されるとパッチバージョンで変更をリリースした意味が薄れるためです。

リリースした後、修正に関連するissueが2つ作成されました。
1つは@bluwyさん@patak-devさんが修正してパッチをリリースくださりました。
もう1つは報告されてから文字通り誰もreproductionを提供せず調査ができずクローズされました(vitejs/vite#19242)。
再現を試したり、Issue内で再現が必要であることを何度か伝え、さらに脆弱性の影響があることも伝えたが、ただただ「動かない、直してくれ」ということしかコメントされず、とても悲しかったです。

また、見つけたダウンストリームのPRに訂正のコメントをしました(ddev/ddev.com#313storybookjs/storybook#30432)。
これらのPRやほかのissue(vitejs/vite#19287vitejs/vite#19345)などから今の状態ではわかりやすくないことが窺えたので、ドキュメントの改善を行いました
今のドキュメントでは、何の設定をしてよいかが明確になったと思ってます(ドキュメントでのserver.allowedHostsserver.cors)。

他ツールへの報告

Viteでの脆弱性の修正の際やVitestの脆弱性の修正のレビューの際に発見した脆弱性を各ツールに報告しました。
各脆弱性の概要は以下の通りです。

  • webpack-dev-server
    • GHSA-4v9v-hfq4-rm2v / CVE-2025-30359: the source code can be leaked by accessing a malicious website while the dev server running if the user uses a predictable output path for the entrypoint script
    • GHSA-9jgg-88mc-972h / CVE-2025-30360: the source code can be leaked by accessing a malicious website while the user edits a file and the dev server running if the user uses a non-Chromium browser
  • Parcel
  • esbuild
    • GHSA-67mh-4wv8-2f99: the source code can be leaked by accessing a malicious website while the dev server running
  • Next.js
    • GHSA-3h52-269p-cp9r: Information exposure in Next.js dev server due to lack of origin verification
      • CSWSHの脆弱性
    • GHSA-mg8j-9gcq-6rrw: Source code of client components may be stolen during dev when turbopack is not enabled and you open a malicious web site
      • GHSA-4v9v-hfq4-rm2v / CVE-2025-30359と似た脆弱性
      • GHSA-3h52-269p-cp9rに統合されて公開された
    • GHSA-cj77-9qv9-v479: Source code may be stolen when you access a malicious web site when turbopack is not enabled.
      • ソースマップのCORSが許可されているという脆弱性
      • GHSA-3h52-269p-cp9rに統合されて公開された
  • Nuxt
  • Vitest
  • playwright
    • 報告したが、CVEの割り当てはない。CORSが許可されていたことで任意のファイルの読み取りか可能である脆弱性があった。

速やかに各ツールを更新することを強くおすすめします。

なお、各ツールにおいていくつかの注意点が存在します。

  • crate-react-app: 外部サイトからの取得を許可することを仕様としているため報告を行いませんでした。そのため、create-react-appを利用している場合はソースコードに機密情報が含まれないように注意が必要です。
  • webpack-dev-server: 修正のあったv5.2.1ののちに、v5.2.2に含まれる変更allowedHostsに含まれるホストは外部のサイトからソースコードが取得できるようになっているので、allowedHostsを利用する場合はそれを許容できるか注意して判断する必要があります
  • Next.js: 初期のレポートでは書かれていませんでしたが、これらの攻撃を防ぐには allowedDevOrigins オプションを設定する必要があります。設定していない場合は設定することを強くおすすめします。

最後に

脆弱性の修正について意見をくれたり、フォローアップの修正をしてくれたりしたチームメンバーに感謝します。
また、破壊的変更の影響を受けて対応をしてくださったダウンストリームのメンテナーの方々も感謝します。

正直、報告から修正や公開まで半年もかかっている報告もあるので、いくつかは報告したことを少し後悔しています。しかし、大半は修正されたので結果良ければ全てよしと考えることにしようと思います。

自分の報告した各レポートによって、フロントエンドツールのセキュティが改善されたことを願っています。
Private Network Accessの提案が進むと攻撃が行いにくくなるため、この提案が進展することを祈っています。

タイムライン

Vite

  • 2025-01-09: レポートが報告された
  • 2025-01-10: 他ツールの調査をした
  • 2025-01-14: 脆弱性の全容を把握し終え、修正案を書きあげた
  • 2025-01-15: 修正案の実装を開始
  • 2025-01-20: 修正の含んだv6.0.9、v5.4.12、v4.5.6のリリース
  • 2025-01-20: CVEとレポートの公開

他ツールへの報告

  • webpack-dev-server
    • 2025-01-14: GitHubのプライベート脆弱性レポート機能で報告
    • 2025-01-20: 報告した旨のメールを送信
    • 2025-01-26: WebpackチームメンバーへXのDMを送信、返答を確認
    • 2025-03-17: 自分で修正PRを作成
    • 2025-03-25: PRのレビューとマージ
    • 2025-03-27: 修正を含んだv5.2.1のリリース (報告から2.5ヶ月)
    • 2025-06-04: CVEとレポートの公開 (報告から4.5ヶ月)
  • Parcel
    • 2025-01-16: Discordでのダイレクトメッセージを送信
    • 2025-01-26: リポジトリに連絡方法についてのissueを作成
    • 2025-01-27: issueへの返答を確認
    • 2025-01-28: レポートをメールで送信
    • 2025-04-20: 修正のプルリクエストの作成
    • 修正のPRのマージ・リリースはされていない
  • esbuild
    • 2025-01-16: mastodonでのプライベートメッセージを送信
    • 2025-01-26: リポジトリに連絡方法についてのissueを作成
    • 2025-01-27: issueへの返答を確認
    • 2025-01-28: GitHubのプライベート脆弱性レポート機能で報告
    • 2025-01-31: レポートへの返答を確認
    • 2025-02-07: 修正PRの確認依頼を受け、確認
    • 2025-02-08: 修正を含んだv0.25.0のリリース
    • 2025-02-08: レポートの公開
  • Next.js
    • 2025-01-14: GitHubのプライベート脆弱性レポート機能で報告
    • 2025-01-20: 報告した旨のメールを送信
    • 2025-01-21: メールへの返答を確認
    • 2025-03-05: 修正に取り組み始めた連絡を受ける
    • 2025-03-07: 修正PRの確認依頼を受け、確認
    • 2025-05-29: CVEとレポートの公開とブログ記事の投稿 (報告から4.5ヶ月)
    • 2025-06-12: 言及されていなかった allowedDevOrigins の設定が必要である旨をレポートとブログ記事に追加 (報告から5ヶ月)
  • Nuxt
    • 2025-01-23: GitHubのプライベート脆弱性レポート機能で報告
    • 2025-01-24: レポートへの返答を確認
    • 2025-01-25: 片方の修正を含んだv3.15.3のリリース
    • 2025-01-25: CVEとレポートの公開
    • 2025-01-29: もう一方の修正を含んだv3.15.4のリリース
  • Vitest
    • 2025-01-16: @hiogawaさんがVitestでの似た脆弱性に気付く
    • 2025-01-17: レポートの作成を依頼されたので、GitHubのプライベート脆弱性レポート機能で報告
    • 2025-01-19: 修正PRが作成される
    • 2025-01-20: 別の脆弱性にも気付いたので、GitHubのプライベート脆弱性レポート機能で報告
    • 2025-02-03: 修正を含んだv3.0.5、v2.1.9、v1.6.1のリリース
    • 2025-02-04: CVEとレポートの公開
  • playwright
    • 2025-01-18: Microsoft Security Response Center Researcher Portalにてレポートを送信、返答を確認
    • 2025-01-20: 確認中との返答を確認
    • 2025-01-27: 修正のコミットがされる
    • 2025-01-29: トリアージがされた
    • 2025-03-07: 修正を含んだv1.51.0のリリース
    • CVEやレポートの公開はされていない

Discussion

look2233look2233

「外部からのソースコードが可能でした。」という部分、文脈からソースコードの取得、閲覧かなと考えました。

翠

確かにですね。ありがとうございます。修正しました。