初めに
前略、CSRFについてよく分かっていなかったのでまとめました。
CSRFとは
CSRFとは、「Cross-Site Request Forgeries/クロスサイト・リクエスト・フォージェリ」の略です。ブラウザに保存されているセッション情報を悪用し、第三者が勝手にアクセスを行う攻撃手法です。「Cross-Site」とあるように、攻撃用の罠サイトから対象のサイトに不正なリクエストを送ることで攻撃を成り立たせることから、こう呼ばれています。(罠サイトを利用するのがCSRFで、正規のサイトに罠を張るのはXSSのようなイメージ)
CSRFの手法
続いて、CSRFの手法について理解します。
1. 攻撃者による罠サイトの準備
①:攻撃対象のサイトを決める(ここでは「サイトA」とします)
②:罠サイトを作成する
③:サイトAへのリクエストを作成し、罠サイトに仕込んでおく。罠サイト描画時にリクエストを飛ばすようなイメージ。ログイン状態であれば、実行可能なリクエストを用意しておく。
2. 利用者が攻撃対象サイトにログイン
④:利用者がサイトAにログイン
⑤:サイトAのサーバ側は、ログインセッションを作成し、セッションキーをブラウザに返却
⑥:ブラウザはセッションキーを保存。次回のログアウトまではこのセッションキーを用いてログイン動作をスキップする。
3. 利用者が罠サイトにアクセス
⑦:ログイン情報を保持した状態で、罠サイトに訪問。訪問時、罠サイトに仕掛けられたリクエストが送信される。ブラウザはクッキーに保存されたセッションキーを自動的に送信してしまうため、不正なアクセスが成立する。
このように、罠サイトで送信されたリクエストはログイン情報と一緒に送られてしまうため、不正アクセスが成立します。
CSRFの対策
というわけで、CSRFの対策を確認しましょう。
CSRFは攻撃者が利用者のログイン情報を用いてしまうのがミソでした。そのため、開発者側ができる対策は、「セッションの情報以外で利用者を判別する」という機能を作ることになります。
IPAが出している安全なウェブサイトの作り方 - 1.6 CSRF(クロスサイト・リクエスト・フォージェリ)に記載されている対策3つを紹介します。
対策1:トークンを用いる
サーバ側で発行した一時的なトークン(CSRFトークン)を用いて正規のユーザかどうかを確認する手法です。
例えば、簡単なフォームを用いた登録処理を考えてみましょう。
フォームの生成時にサーバー側でCSRFトークンを発行しhidden属性でブラウザに渡しておきます。こうすることで、利用者がフォームを送信する際POSTのBodyの中にCSRFトークンを含めて送信することができるようになり、サーバ側は受け取ったCSRFトークンを検証し、正規のユーザかどうかを確認します。
ポイント
ブラウザの仕様上、クッキーなどの情報はリクエスト時に勝手に送付されてしまいます。罠サイトからのリクエストでもその限りではありません。それに対し、FormなどのHTMLの中にある情報は別サイトから参照することはできないため、トークンを悪用されることはなく、安全なやり取りを行うことができます。
対策2:重要な操作の際は再度ログインを求める
毎回ログイン情報を求めれば、不正アクセスされないという対策です。決済など、特に重要な重要な操作の際は、セッションのログイン情報のみを利用するのではなく、毎回ログインを求めることで安全にやり取りが行えます。
ポイント
CSRFでは攻撃者はログイン情報を盗んでいるわけではありません。勝手にクッキーの情報が付与されるというブラウザの仕様を悪用しているだけです。よって、毎回ログイン情報を求めれば安全にやるとりを行うことができます。
対策3:Refererを確認し、正しいリクエストかどうかを判断する
Refererとはリクエストヘッダーの一つで、ーザーが現在訪れているページからリクエストされるURLを示す機能です。Refererの値が意図しないURLの場合は攻撃者からのアクセスとみなすことができます。
ポイント
罠サイトを用いるCSRFでは有効な手段になります。ただし、XSSのように正規のサイト自体に罠を仕掛けられた場合は対応できません。
終わりに
今回はCSRFについて書きました。
今回のCSRFを学ぶにあたり、前提知識としてブラウザの仕組みやリクエスト情報が必要になりました。セキュリティを理解するためには、幅広いWebの知識を満遍なく学ぶ必要がありそうです。これからも理解を進めていきます。
ここまで読んでいただきありがとうございました!
参考