Dance with Agents

別サイトを経由して、本人になりすまされる——CSRFとCORSの設定ミス

実践

Webアプリの主要セキュリティリスク一覧で触れた「CSRF・CORSの設定ミス」を掘り下げます。名前が似ていて紛らわしいので、まず違いから整理します。

略語 正式名 何の話か
CSRF Cross-Site Request Forgery ログイン中のユーザーに、意図しない操作を実行させる攻撃
CORS Cross-Origin Resource Sharing どのサイトからのアクセスを許可するかを決める、ブラウザ側の仕組み

CSRFは「攻撃の名前」、CORSは「防御にも設定ミスにもなり得る仕組みの名前」です。

CSRF:ログイン中に、別サイトを開いただけで

あるサイトに、送金や設定変更のようなフォームがあるとします。ログイン中のユーザーが、まったく別の、攻撃者の用意したページを開くと、そのページに仕込まれた仕掛けが、ログイン中のサイトへ向けて勝手にリクエストを送信します。ブラウザは自動的にログイン用のCookieを一緒に送るので、サーバー側からは本人が操作したリクエストと区別がつきません。

「別サイトを開いただけ」で被害に遭う、というのがCSRFの怖さです。攻撃者は、リンクを踏ませるか、仕込んだページを表示させるだけで済みます。

対策の具体策

  • CSRFトークンを使う。 フォームを表示するたびに、その場限りのランダムな値(トークン)を埋め込み、送信時にその値が一致するかを確認する仕組みです。攻撃者は事前にこの値を知ることができないので、なりすましの送信を弾けます
  • CookieにSameSite属性を設定する。 この属性は、「別のサイトからのリクエストに、このCookieを付けて送ってよいか」を制御します。StrictやLaxに設定しておくと、別サイト経由のリクエストにはログイン用のCookieが自動では付かなくなり、CSRFの土台そのものを弱められます
  • 多くのフレームワークは、これらの対策を標準で備えています。 まず確認したいのは、その標準の防御を、意図せず無効化していないかという点です

CORS:どこからのアクセスを許可するか

ブラウザには、あるサイトのJavaScriptから、別のサイトのAPIへ直接アクセスすることを、原則として制限する仕組みが備わっています。これがないと、悪意のあるサイトが、ログイン中の別サイトのAPIへ裏で自由にアクセスできてしまうためです。

自分のAPIを、別のドメインにある自分のフロントエンドから呼びたい、という正当な理由でこの制限を緩めるのがCORSの設定です。「このオリジン(サイトの発信元)からのアクセスは許可する」というリストをサーバー側で明示します。

典型的な設定ミス

「動かないから」という理由で、許可するオリジンを*(すべて許可)に設定してしまうケースがよくあります。これで動作確認上のエラーは消えますが、世界中のどのサイトからでも、あなたのAPIへ直接アクセスできる状態になります。

とくに危険なのが、Cookieを使った認証と、緩すぎるCORS設定を組み合わせたときです。この組み合わせでは、任意のサイトが、ログイン中のユーザーの権限でAPIを呼び出せてしまう可能性があります。

対策の具体策

  • 許可するオリジンは、必要なものだけを明示的に指定する。 *は「困ったから全部許可」であって、対策ではありません
  • Cookieを使った認証と組み合わせる場合は、とくに慎重に設定する。 許可するオリジンを絞ったうえで、必要な場合のみCookieを含むリクエストを許可する設定にする

エージェントへの頼み方

「フォームの送信処理に、CSRF対策(トークンの検証やSameSite属性)が働いているか確認して」「APIのCORS設定を確認して、許可しているオリジンが*のような広すぎる設定になっていないか教えて」のように、それぞれ具体的に頼むと点検が進みます。

まとめ

  • CSRFは、ログイン中のユーザーに別サイト経由で意図しない操作をさせる攻撃。対策はCSRFトークンとSameSiteCookie属性
  • CORSは、どのサイトからのアクセスを許可するかを決める仕組み。「動かないから」で*にしてしまうのが典型的な設定ミス
  • 名前は似ているが、CSRFは攻撃、CORSは設定という別の話。混同せずに、それぞれ個別に確認する

「動かないエラーを消すために設定を緩める」という判断は、あとから見直すことを前提にしておくと安全です。

セキュリティの記事

セキュリティのページへ →