Webアプリケーション攻撃

CORS設定ミス こーすせっていみす

CORSオリジン間リソース共有Same-Origin PolicyAccess-Control-Allow-OriginクロスサイトリクエストAPI不正アクセス
CORS設定ミスって何が問題なの?

簡単に言うとこんな感じ!

Webサービスが「どのサイトからのアクセスを許可するか」を決めるルールが「CORS」なんだ。設定ミスをすると、悪意あるサイトが「正規のサービスのふりをして」あなたの個人データをこっそり盗み見できちゃう状態になるよ。鍵をかけ忘れた金庫みたいなものだね!


CORS設定ミスとは

CORS(Cross-Origin Resource Sharing:オリジン間リソース共有)とは、あるWebサイトが「別のドメインにあるサーバー」へデータを取りに行くときのルールを定める仕組みです。ブラウザには本来「Same-Origin Policy(同一オリジンポリシー)」という安全機能があり、異なるドメインへの通信を原則ブロックします。CORSはこの制限を「条件付きで緩める」ための公式な抜け道です。

CORS設定ミスとは、このルールの設定が甘くなりすぎてしまった状態のことです。「どこからでもアクセスしていいよ」「リクエスト元が何を言っても許可するよ」という設定にしてしまうと、攻撃者が用意した悪意あるWebサイトから、ログイン済みユーザーの個人情報・APIレスポンス・セッション情報を盗み取れてしまいます。

特にシステム発注・選定をする立場では、「APIサーバーのCORS設定を開発者任せにしたまま本番リリースしてしまった」というケースが多く報告されています。設定ミスは外見上は動いているように見えるため、テストで見落としやすい点も危険なポイントです。


CORSの仕組みと設定ミスのパターン

CORSの基本的な流れ

ブラウザとサーバーのやり取りでは、サーバーが**Access-Control-Allow-Origin**というHTTPヘッダーで「どのドメインからのアクセスを許可するか」を返します。

ヘッダー名役割安全な設定例
Access-Control-Allow-Origin許可するオリジン(ドメイン)を指定https://example.com
Access-Control-Allow-CredentialsCookieなど認証情報の送信を許可するかfalse(原則)
Access-Control-Allow-Methods許可するHTTPメソッドを指定GET, POST
Access-Control-Allow-Headers許可するリクエストヘッダーを指定Content-Type

代表的な設定ミスのパターン

【パターン1】ワイルドカード設定
  Access-Control-Allow-Origin: *
  → すべてのドメインからのアクセスを許可(認証情報がない場合でも情報漏えいリスク)

【パターン2】リクエスト元をそのまま反映(最も危険)
  リクエスト:  Origin: https://evil-site.com
  レスポンス:  Access-Control-Allow-Origin: https://evil-site.com  ← 攻撃者のサイトを許可!
               Access-Control-Allow-Credentials: true              ← Cookieまで渡す!

【パターン3】サブドメインの前方一致チェックミス
  許可したいドメイン: https://myapp.example.com
  ミスった正規表現:   example.com で終われば全部OK
  攻撃者が用意:       https://evil-example.com → 通過してしまう

攻撃が成立する流れ

攻撃者が https://evil-site.com を用意し、被害者がそこにアクセスすると、ブラウザが裏側で正規のAPIサーバーにリクエストを送り、被害者のCookieを使ってデータを取得。結果を攻撃者のサーバーへ転送します。


歴史と背景

  • 1995年頃 — ブラウザにJavaScriptが導入され始め、悪意あるスクリプトによる他サイトへのアクセスが問題視される
  • 2006年頃 — W3CがCORSの仕様策定を開始。「制限を壊すのではなく、安全に緩める」アプローチが採用される
  • 2014年 — CORS仕様がRFC 6454(オリジンの概念)およびW3C勧告として正式化
  • 2018年頃〜 — SPA(シングルページアプリケーション)やREST APIの普及で、フロントエンドとバックエンドが別ドメインになる構成が急増。CORS設定の機会が激増し、ミスも増加
  • 2019年 — PortSwigger(BurpSuite開発元)の調査で、主要Webサービスの約200サイトに深刻なCORS設定ミスが存在すると報告。設定ミスが「よくある脆弱性」として広く認識される
  • 現在 — OWASPのAPI Security Top 10にも関連項目として掲載。クラウドネイティブ・マイクロサービス時代においてますます重要な設定項目に

正しい設定 vs 設定ミス の比較

CORS設定ミス:攻撃の仕組み 被害者のブラウザ ログイン済みユーザー evil-site.com 攻撃者のサイト api.example.com 正規APIサーバー(設定ミスあり) attacker-server.com 攻撃者の収集サーバー ①悪意あるページを開く ②スクリプトがAPI にリクエスト送信 (被害者のCookie付き) ③設定ミスで レスポンス返却 Access-Control-Allow-Origin: https://evil-site.com Access-Control-Allow-Credentials: true ④データを 攻撃者サーバーへ転送 ✅ 正しい設定 Access-Control-Allow-Origin: https://myapp.example.com(固定) + 許可リストを厳格に管理 ❌ 危険な設定 Access-Control-Allow-Origin: * または リクエスト元をそのまま反映 + Credentials: true の組み合わせ

発注・選定時のチェックポイント

チェック項目確認内容対応
CORS設定の管理許可オリジンは固定リストで管理されているか仕様書・設計書に明記させる
*の使用禁止認証付きAPIにワイルドカードを使っていないかセキュリティ要件として明文化
Credentialsの扱いAllow-Credentials: trueとの組み合わせに注意レビュー・監査の対象に含める
セキュリティテストCORS設定のペネトレーションテストを実施しているか受け入れ検査に含める

関連する規格・RFC

規格・RFC番号内容
RFC 6454オリジン(Origin)の概念を定義したRFC
W3C CORS勧告(2014)CORSの正式仕様。Access-Control-*ヘッダーを定義
OWASP API Security Top 10API3(過剰なデータ露出)や不適切な設定としてCORSミスが言及される
Fetch Living Standard現在のブラウザにおけるCORSの実装仕様(WHATWGが管理)

関連用語