CSRFとは
CSRF(Cross-Site Request Forgery / クロスサイトリクエストフォージェリ)とは、ユーザーが特定のWebサービス(SNSやネットショップ等)にログインした状態を利用し、悪意のある別サイトに仕込まれた不正なリンクやフォームを通じて、そのWebサービスに対して本人が意図しない操作(商品の購入、パスワードの変更、掲示板への書き込みなど)を強制的に実行させる攻撃手法です。Webサービス側は「ログイン中の本人からの正しい要求」と誤認して処理を実行してしまうため、被害者が知らないうちに不正な操作の加害者や当事者にされてしまいます。
具体例
ネットショッピングサイトにログインしたまま、悪意ある別のブログを閲覧した際、そのページに「買い物を確定する」という見えないボタンが隠されており、ページを開いただけで自動的に元のショッピングサイトへ高額商品の購入リクエストが送られてしまう事例。
[ユーザー] --(ログイン状態)--> [銀行サイト]\n ^\n | (罠サイトを開かせる)\n[罠サイト] --(自動で「送金しろ」というリクエストを送信)--> [銀行サイト] (本人からの要求として実行)
もう少し詳しく
CSRF(クロスサイトリクエストフォージェリ)は、Webアプリケーションにおけるセッション管理(ログイン状態の維持)の仕組みを悪用する攻撃です。多くのWebサイトは、ユーザーが一度ログインすると、その状態を証明するために「Cookie(クッキー)」を利用します。ブラウザは、そのWebサイトへリクエストを送信する際、対応するCookieを自動的にヘッダーに添付して送信する性質を持っています。
CSRF攻撃者はこのブラウザの自動送信の性質を悪用します。ユーザーがログインした状態のまま、攻撃者が作成した罠サイト(悪意あるJavaScriptや自動送信フォームが埋め込まれたページ)にアクセスすると、罠サイトからターゲットのWebサービス(例:SNSや銀行)に向けて、パスワード変更や送金手続きといったリクエストが勝手に送信されます。ブラウザは自動的に「ログイン状態を示すCookie」を添付して送信するため、Webサービス側は「ログイン中の正規のユーザー自身が自分の意志で操作を行った」と判断し、不正なリクエストを実行してしまいます。
XSS(クロスサイトスクリプティング)との違いとして、XSSは被害者のブラウザ上でJavaScriptを実行して情報を盗み取る攻撃であるのに対し、CSRFは情報を直接盗み取るのではなく、被害者の「ログイン権限」を勝手に借りて、別のサイトから不正な指示を送り込む攻撃であるという点が挙げられます。
試験でのポイント
試験対策としては、CSRF攻撃が「ログイン状態のCookie自動送信」を悪用していることを理解し、その脆弱性を排除するための「有効な防御策」を問う問題に対応できるようにすることが不可欠です。代表的な対策には以下のものがあります。
・ワンタイムトークン(CSRFトークン)の利用: 最も標準的な対策です。Webサービスがユーザーに対して入力画面を返す際、予測不可能な使い捨てのランダムな文字列(トークン)を発行し、セッションと画面内のフォームの両方に埋め込みます。データ送信時に両方のトークンが一致するかを検証します。罠サイトから直接送られてきたリクエストにはこのトークンが含まれていない(または一致しない)ため、Webサービス側は攻撃を遮断できます。試験ではこれが最も有効な対策として頻出します。
・パスワードの再入力(再認証): 商品の購入確定やパスワード変更などの重要な操作の直前に、再度現在のパスワード入力を求めることで、外部からの自動リクエストを防御します。
・CookieのSameSite属性の設定: Cookieに「SameSite=Lax」または「SameSite=Strict」を設定し、異なるサイト(クロスサイト)から送られてきたリクエストに対してはセッションCookieを添付しないように制限します。
関連する用語
ブラウザでセッション状態を管理しCSRFで自動添付される情報「Cookie」、利用者のブラウザ上でスクリプトを実行させる脆弱性「クロスサイトスクリプティング(XSS)」、通信が正しいWebサイトから行われたかを確認するための暗号トークン「CSRFトークン」などがあります。