
2026/06/21 10:35
開発者がCORSを理解できていない (2019)
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
この記事は、Zoom に深刻なセキュリティ上の欠陥を暴露している。
http://localhost:19421 という Web サーバーは画像を読み込むために使用されており、標準的な AJAX を使用するのではなく意図的に CORS をバイパスさせている。ブラウザが localhost に対して CORS を無視するという主張とは逆に、Chrome はローカルオリジンに対しても CORS ヘッダーを強制しており、この脆弱性の原因はブラウザの動作ではなく、不適切なオリジンのフィルタリングにある。これにより、どのウェブサイトも認可なしでネイティブの Zoom クライアント操作をトリガーし、機密データをアクセスできるようになる。安全なアプローチとして、Access-Control-Allow-Origin を信頼できるドメイン(例:https://zoom.us)に明確に制限することが必要である。Google Meet は、コンテンツセキュリティポリシーヘッダーを用いて危険な iframe 渲染をブロックする点で、より安全なパターンを示している例である。特権アクションのために localhost の迂回策に依存することは本質的にリスクが高く、CORS の要件を無視することは、Firefox がセキュアから非セキュアへのリクエストの扱いに対する誤解のような誤認に基づくとしても正当ではない。同様の事故を防ぐために、開発者は一貫性のない CORS バイパスを採用するのをやめ、意図されたドメインと整合した厳格なオリジンポリシーを実装しなければならない。本文
開発者が CORS を理解していないこと:Zoom の脆弱性から学ぶ教訓
2019 年 7 月 10 日に Chris Foster が執筆した記事に基づき、CORS(Cross-Origin Resource Sharing)の誤解とそのリスクについて整理します。
📌 コースの概要
- 開発者と企業の規模・業界は多様であるが、共通する課題がある。
- 特に顕在化している問題は、**「Web 開発者の多くが CORS の仕組みを理解していない」**という点です。
- この問題は直近で発覚したZoom のセキュリティ脆弱性とも密接に関連しています。
🔍 Zoom 脆弱性の背景と問題点
セキュリティ研究者の Jonathan Leitschuh が Zoom に以下の問題を発見しました:
というポートでローカルホスト上で動作する Web サーバーが存在する。http://localhost:19421- Zoom のウェブサイトへのアクセスにより、同サーバーにリクエストを送信することでネイティブの Zoom アプリを起動させることができる。
- この攻撃手法において、AJAX リクエストではなく、画像ファイルを読み込むことでデータを取得しています。
- 画像の幅や高さなどの情報は、エラーコードやステータスコードを決定するために利用され、ソースコード内で明確な実装が行われています。
❓ なぜ画像を使ってデータ返却するのか?
- 答えはCORS を回避するためです。
- かつてブラウザが localhost サーバーに対して CORS ポリシーを無視すると主張された事例がありましたが、これは誤りでした。
- Chrome は localhost 上の Web サーバーに対しても CORS ヘッダーを正しく尊重します。
- 「Create React App」などでは、フロントエンド(別のポート)とバックエンド API(localhost)を分離して動作させており、クロスオリジンリクエストが全ブラウザでサポートされているのが一般的です。
⚠️ 脆弱性がもたらすリスク
- Zoom が CORS の仕組みを理解していなかったため、AJAX リクエストを実行できず、「画像ハック」という迂回策を採用せざるを得なくなりました。
- この手法の結果:
- Zoom ウェブサイトからネイティブクライアントをトリガーし、応答データを取得できます。
- インターネット上のあらゆるウェブサイトからも同様の操作が可能になり、重大な脆弱性が露見しました。
✅ 安全な実装方法の推奨例
localhost:19421 で動作する Web サーバーは以下のように実装すべきです:
- REST API を実装する必要があります。
ヘッダーを設定し、値を**「https://zoom.us」**に指定します。Access-Control-Allow-Origin- これにより、ローカルホストとの通信は**「zoom.us」ドメイン上の JavaScript のみ**が許可されます。
- 自動的な Zoom ミーティングの立ち上げを防ぐために、CSP(Content Security Policy)ヘッダーを設定し、
が Iframe 内でのレンダリングをブロックするよう指示します。zoom.us
🔒 ユーザーエクスペリエンス(UX)に関する追加課題
- ブラウザが意図しない
リンクに誘導される脆弱性は完全には排除できません。zoom.us - これはソフトウェア欠陥というよりUX 上の判断の問題ですが、不適切です。
- 良い UX の原則は「ソフトウェアが予測可能であること」にあります。
- リンクをクリックしてカメラやマイクが突然利用可能になることは絶対に避けるべきです。
- Zoom は「アプリを直接起動させて優れた UX を実現したい」と述べていますが、標準ブラウザのポップアップ表示を避けたい場合でも、そのポップアップ自体を実装するのが適切です(Google Meet が適切に実装しています)。
🧩 脆弱性の原因と代替案
Zoom がこのように設計した理由は完全に特定はできませんが、以下の点が見解されます:
- 正当な理由を見出すことができない現行の実装手法。
- Reddit のユーザー
が提言し、Firefox が「安全なオリジンからの XHR を非安全なオリジンに対してブロックする可能性」を示唆したことで、そのアプローチの動機だったのではないかという解釈も可能。lerunicorn - ただし、以下のような事実により、「フィルタリングを見落とす正当な理由」とはなり得ません:
- Firefox は
でもこの挙動をサポートしている。localhost - ネイティブアプリは独自に自己署名証明書を作成可能。
- ブラウザ拡張機能を利用する代替案が存在する。
- Firefox は
💡 開発コミュニティ全体の課題
- Zoom の問題だけではありません。多くの開発者が CORS の仕組みを十分に理解していないのが現実です。
- Stack Overflow への投稿などでも、数多くの実例があります。
- 危険なデフォルト設定のコピー&ペースト:
- 「特定の Express 設定」などの不安全な値を採用しているページが多い。
- これらをそのままコピーすると、アプリケーション自体が脆弱化してしまいます。
- 多くのベンダーでZoom と同一の脆弱性が確認されています。
🚫 開発者の傾向と警告
- 開発者はコードを動作させることに主眼を置いているため、サマージポリシーを完全にはぐらかす手法で機能を働かせようとする傾向があります。
- 外部からその事実が明らかになれば、Zoom が直面しているような重大な問題を引き起こします。
🎓 今後の課題:CORS の理解と教育
- CORS の混同は、経験豊富な開発者だけでなく、初心者にも見られます。
- 2 つの可能性:
- CORS API が複雑で分かりにくすぎるのか?
- より優れた開発者教育が必要なのか?
- 確信はありませんが、現在のアプローチでは明らかな改善が見られないのが現状です。
結論: CORS を正しく活用すれば、この種の操作も安全に実現可能です。それを迂回するハックを行ってはなりません!