セキュリティセンターTOP > セキュアプログラミング講座 > Webアプリケーション編 > セッション対策 > リクエスト強要(CSRF)対策

第4章 セッション対策
リクエスト強要(CSRF)対策

リクエスト強要(CSRF)とは

リクエスト強要(Cross-site Request Forgery, CSRF)とは、別のサイトに用意したコンテンツ上の罠のリンクを踏ませること等をきっかけとして、インターネットショッピングの最終決済や退会等Webアプリケーションの重要な処理を呼び出すようユーザを誘導し、被害をもたらす攻撃である。

リクエスト強要
図8:リクエスト強要

この攻撃の被害を被るおそれがあるのは、Webクライアントから自動で得られる情報にもとづいてユーザやセッションを識別している Webアプリケーションと、そのユーザである。具体的には次のようなWebアプリケーションが挙げられる。

リクエスト強要(CSRF)攻撃のメカニズム

リクエスト強要(CSRF)攻撃は、ブラウザが正規のWebコンテンツにアクセスした際、所定のCookie、Basic認証データ、あるいはDigest認証データが毎回ブラウザからWebサーバに送出されるという性質を悪用するものである。

Cookieをはじめとするこれらの認証データ、識別データは、HTTPリクエストの対象コンテンツ(「目的地」)が正規のものでありさえすれば、Webアプリケーションが用意したものでない偽のフォームやハイパーリンク(「偽の出発地」)から発せられたものであっても送出される。

例えば、Cookieを用いてセッションを維持しているWebアプリケーションの場合、ブラウザから自動送出されるCookieにWebサーセッションIDを搭載し、サーバがそのIDを見て個々のブラウザを識別している。

特段の対策がとられていないWebアプリケーションでは、HTTPリクエストに伴って送られてきたCookieに正規のセッションIDが入っているのみでそのリクエストが受け入れられ、ユーザ本人の意志に反した処理が行われてしまうおそれがある。

リクエスト強要(CSRF)対策

リクエスト強要(CSRF)への対策は、ユーザ本人以外の人物がねつ造したコンテンツに基づいて発せられたHTTPリクエストをWebアプリケーションが受け付けないことである。

そのためには、代金決済やコミュニティ脱退等の重要な処理の場面において、秘密の「照合情報」をWebアプリケーションとブラウザの間でやりとりし、第三者が用意した偽のコンテンツから発せられたリクエストを区別できるようにする。

具体的には、フォームを表示するプログラムによって他者が推定困難なランダム値をhiddenフィールドとして埋め込み送信し、フォームデータを処理するプログラムによってそのランダム値がフォームデータ内に含まれていることを確認する。

そのランダム値がフォ−ムデータに含まれていない場合は処理を見合わせる。

照合情報

照合情報には、他者が推定困難な値を用いる、そのような値として下記の3つが挙げられる。

ただし、最近ではページトークンを自動生成してくれるWebアプリケーションフレームワークも珍しくなくなってきている。そのようなフレームワークを使う場合、わざわざ「セッションIDそのもの」や、その派生値を選択する必要はない。

照合情報の検証においては、実際に値を「照合」する。例えば、特定のアルゴリズムが満足させられることをもって適正と判断する方式では、攻撃者が自分自身に宛てて発行された照合用情報を罠の中に仕込むことによって対策を迂回することができてしまう。

SSL/TLSの使用

リクエスト強要(CSRF)対策に用いる照合情報は、他者に傍受されると都合が悪い。また、リクエスト強要(CSRF)対策が必要となる場面においては、ユーザやWebアプリケーションにとって重要なデータが送受信されることが十分考えられる。したがって、この場面においては、SSLあるいはTLSの使用が不可欠である。