メインコンテンツまでスキップ

CSRF (Cross-Site Request Forgery)

CSRF 脆弱性は、ユーザが意図しないリクエストによって重要な処理が実行されるという問題を引き起こします。 この脆弱性が悪用された場合、ユーザの意図しないところでショッピングサイトでの購入や、アカウント情報の変更、不適切なメッセージの投稿などが行われる可能性があります。

攻撃の概要

CSRF 攻撃は、一般的に以下の手順で行われます。

  1. ユーザが攻撃対象のサイトにログイン
  2. ユーザが攻撃者が作成した偽のサイトを閲覧
  3. 偽のサイトから攻撃対象のサイトに意図しないリクエストを送信

CSRF では攻撃対象のサーバ内にある既存の機能を悪用するという点が XSS 攻撃と異なります。

対策

CSRF 攻撃が発生する原因は正規ユーザによる意図的なリクエストであることを確認していないことにあります。

ショッピングサイトの商品詳細ページなどの一部のページは誰でもアクセス可能であるべきですが、購入処理や個人情報の変更などの重要な処理が行われるページには以下のような特別な対策が必要です。

CSRF 対策用トークンの使用

form の送信ページなどにトークンを埋め込み、POST リクエストで送信することでサーバ側でトークンを検証します。 クリックジャッキングのような手法でユーザに送信ボタンなどを押させない限り正しいトークンを送信することはできないので、正規のアクセスでないことを確認できます。

実際に GitLab.com のログイン画面で form の確認をしてみると、次のような hidden 属性を持ったタグがあり、value にトークンが格納されていることが確認できました。

<input type="hidden" name="authenticity_token" value="xxxxxxxxxx" autocomplete="off">

ちなみにクリックジャッキングは重要な処理の確認ボタンとダミーのリンクなどを重ねることでユーザにボタン等を押させる攻撃ですが、ブラウザでの対策が進んでおり対策がしやすくなっています。

パスワードの再入力の要求

重要な処理を行う前にユーザにパスワードの再入力を求めることで、操作がユーザ自身によるものであることを確認します。

Refererの確認

リクエストのアクセス元のURL(Referer)を確認し、偽のページからのリクエストを検出します。

二要素認証の使用

二要素認証は直接的なCSRF対策とは言えませんが、個人情報が無意識に更新された場合、早期に問題を発見し被害を最小限に抑えることが可能となります。

参考

  • 徳丸 浩、「体系的に学ぶ 安全なWebアプリケーションの作り方 第2版」