なぜ「ログインしているだけ」で攻撃されるのか?CSRFの正体を解き明かす
こんにちは。現場で泥臭いインシデント対応を続けていると、「まさか、そんなところで?」という隙を突かれた被害によく遭遇します。
今日は、初心者の方が最初にぶつかる壁の一つ、CSRF(クロスサイト・リクエスト・フォージェリ)についてお話ししましょう。「聞いたことはあるけど、具体的に何が怖いの?」という疑問を、身近な例えを交えて解き明かしていきますね。
—
1. CSRFを「合鍵」でイメージしてみよう
まずは、Webサイトの「セッション(ログイン状態)」を、あなたの家の「合鍵」だと想像してください。
ログインするということは、ブラウザという「あなた専用の執事」に「この合鍵(Cookie)」を渡して、「いつでも私の代わりに家(Webサイト)に入って用事を済ませておいて」と頼んでいる状態です。
攻撃者の狙い(泥棒の作戦)
CSRF攻撃の恐ろしいところは、攻撃者があなたの「合鍵」を盗む必要がないという点です。
1. あなたが銀行やSNSにログインしている(合鍵を持っている)。
2. その状態で、攻撃者が作った「罠サイト」をあなたがうっかり開いてしまう。
3. 罠サイトが、ブラウザ(執事)にこう命令します。「おい、今のうちに銀行のサイトへ行って、勝手に送金ボタンを押してこい!」
4. ブラウザは何も疑わず、「ご主人様の命令だ」と判断し、自動的にあなたの合鍵(Cookie)を添えて銀行サイトへリクエストを送ってしまいます。
これがCSRFのメカニズムです。ブラウザは「誰がそのリクエストを要求したか(元のサイトがどこか)」を気にせず、「ログイン中だから、この鍵を使っていいんだな」と自動的に判断して送信してしまうのが、この攻撃の最大の盲点なのです。
—
2. ブラウザが「勝手に」送信する仕組み
なぜブラウザはこんなにお節介なのでしょうか?
実は、ブラウザには「同じドメイン(サイト)へのリクエストなら、保存されているCookieを自動的に付け足して送る」という非常に便利な仕様があります。これがないと、ページを遷移するたびに毎回ログインし直す羽目になりますよね。
この「便利さ」が、CSRFという攻撃にとっての「最高の逃走経路」になってしまっているんです。
—
3. どうやって防ぐ?「二重の身分証明」
対策の基本は、「本当にその操作を本人がやりたくてやったのか?」を確認することです。
対策①:Anti-CSRFトークン(秘密の合言葉)
もっとも確実な方法は、フォームごとに「予測不可能なランダムな文字列(トークン)」を埋め込むことです。
- サーバー側: ページを表示する際、一度限りの秘密の合言葉(トークン)を発行します。
- クライアント側: フォームの裏側にその合言葉を隠しておきます。
- 検証: ユーザーが送信ボタンを押したとき、サーバーは「届いた合言葉が、先ほど発行したものと一致するか?」を確認します。
攻撃者はそのサイトの外からリクエストを送るため、この「秘密の合言葉」を知ることができず、不正なリクエストは門前払いになります。
対策②:SameSite属性(Cookieの門限)
最近のブラウザでは、Cookieに「SameSite」という設定を加えることで、外部からの自動送信を制限できます。
HTTPレスポンスヘッダーの設定例
Lax を指定すると、安全な遷移(リンククリックなど)以外での
Cookie送信をブロックし、CSRFのリスクを大幅に下げます。
Set-Cookie: session_id=abc123xyz; SameSite=Lax; Secure; HttpOnly
- Lax: 外部サイトからのリンク遷移などにはCookieを送りますが、悪意ある「勝手な送信」は拒否します。現代のWeb開発では、まずはこれを目指しましょう。
- Strict: 同一サイト内からのリクエストのみCookieを送信します。非常に安全ですが、利便性が下がる場合があるため注意が必要です。
—
現場のエンジニアへ:明日からできること
セキュリティ対策は「完璧な城」を作る作業ではありません。「泥棒が割に合わないと諦める仕組み」を重ねることです。
1. フレームワークの力を信じる: 今どきのフレームワーク(Laravel, Rails, Djangoなど)は、デフォルトでCSRF対策が組み込まれています。自作の仕組みで車輪の再発明をせず、まずはフレームワークの機能を正しく有効化しましょう。
2. 重要な操作には再認証を: 金額の変更やパスワード変更など、重大な操作には「もう一度パスワードを入力させる」のが最強の防御です。
3. SameSite属性をチェックする: 今開発しているサービスのCookieに、SameSite=Laxが付与されているか確認してみてください。これだけで、防御力は格段に跳ね上がります。
セキュリティは、知れば知るほど面白いパズルです。難しく考えすぎず、まずは身近な「執事(ブラウザ)」の振る舞いを観察するところから始めてみてくださいね。一歩ずつ、一緒に強くなっていきましょう!
コメント