Hello there, ('ω')ノ
✅ CSRF(クロスサイトリクエストフォージェリ)の成立条件
CSRF攻撃を成立させるためには、次の3つの条件がそろっている必要があります。
🔑 条件①:実行すべき意味のある操作(リクエスト)が存在する
攻撃者にとって実行させたいアクションがアプリ内に存在していること
例:
- ユーザー情報の変更(メール・パスワードなど)
- 金銭の送金
- 設定の変更
- 他ユーザーへの影響を与える管理操作
✅ つまり、そのリクエストを送らせる価値があるか?が前提
🔑 条件②:クッキーによるセッション管理のみを使っている
- アプリが ログイン状態をセッションクッキーだけ で判別している
- リクエストごとに認証情報(セッションIDなど)を自動で送信してしまう
✅ このため、攻撃者の仕込んだリクエストにもセッションクッキーが勝手に添付される → 攻撃リクエスト=ユーザー本人の操作と誤認
🔑 条件③:予測不能なリクエストパラメータが存在しない
攻撃リクエストを生成する上で、攻撃者が知らないといけない情報が存在しないこと
例:
- 「現在のパスワード」が必要 → 攻撃者にはわからない
- 「CSRFトークン」が必要 → 攻撃者は生成できない
✅ 攻撃者が全てのリクエストパラメータを知っていて初めて攻撃可能
🎯 攻撃の実行イメージ
攻撃条件を満たすと:
- 被害者が銀行サイトなどにログイン(セッション有効)
- 攻撃者の用意したページにアクセス
- ページ内に次のようなリクエストが自動送信される:
<img src="https://bank.com/transfer?to=attacker&amount=1000">
- セッションクッキーが付与された状態で銀行に送信され、リクエストが実行されてしまう
✅ CSRF対策のキモは「この3条件のどれかを潰すこと」
対策 | 潰す条件 |
---|---|
CSRFトークンの導入 | 条件③:攻撃者が値を予測できない |
Referer / Origin ヘッダー検証 | 条件②:信頼できる発信元か確認 |
SameSite属性付きCookie | 条件②:外部サイトからのCookie送信を防止 |
ユーザー認証情報の再入力 | 条件③:パスワード要求で攻撃者は突破不能 |
✅ まとめ
CSRFは「ユーザーのクッキー」と「アプリの設計不備」を利用した、シンプルだが強力な攻撃です。
- 逆に言えば、クッキー送信を前提としない設計
- CSRFトークンを必ず導入する設計 を意識すれば防げる脆弱性です。
CSRF = 操作の価値 + クッキー自動送信 + 予測可能なリクエスト この3つが揃った瞬間、ユーザーは攻撃者の道具になるのです。
Best regards, (^^ゞ