ある日、大手SNS(Social Networking Site)のmixiの日記にこのような書き込みがあった。それも1人だけでなく、同日に数多くのユーザーの日記に同じ文面が掲載されていた。
これは、単にこのような文章がはやり、ユーザー自身が意図して掲載したのではなく、ある仕掛けによってユーザー自身が気付かないうちに引き起こされた現象なのである。その仕掛けとは、CSRF(Cross-Site Request Forgeries)と呼ばれる攻撃手法の一種だ。
編集部注:
現在、「はまちちゃん」トラップは、mixi運営者により対策されています。上記のサンプルは、mixi風に再構成したものです。
本稿の内容を検証する場合は、必ず影響を及ぼさない限られた環境下で行って下さい。また、本稿を利用した行為による問題に関しましては、筆者およびアイティメディア株式会社は一切責任を負いかねます。ご了承ください。
CSRFとは
CSRFという手法は、本来受け付ける必要がない(拒否すべき)外部のWebページからのHTTPリクエスト(POSTやGET)によって、Webサイトの何らかの機能が実行されるというものである。攻撃として利用されるCSRFの特徴としては、ログイン認証を必要とするWebサイトが攻撃対象となっていることである。
「はまちちゃん」事件のように、ユーザーの権限をもってログインしなければできない日記への書き込みがそれに該当する。削除機能や編集機能、退会機能などを実行されてしまう恐れもある。CSRFという名前はCross-Site Scripting (XSS)と似ているが、別の攻撃手法である。
CSRFでは、仕掛けを埋め込んだWebページを正規ユーザーが表示することでターゲットとなるWebアプリケーションにリクエストを送る。CSRFの主なターゲットはログイン認証が必要となるWebサイトなので、正規のアカウントがなければ当然Webアプリケーションを実行することができない。
しかし、ログイン認証が必要なWebサイトの多くは、ログイン認証手順を省くためにCookieを利用して自動ログイン機能を提供している。1度ログイン認証を行えば、その認証済みのセッションがしばらくの間は有効になっている。そのセッションの有効期限は短ければ5分程度で、長いところは永久に有効なところもある。それ故、CSRF攻撃が成立してしまう。
CSRFは、ログイン不要なものにも有効な攻撃である。例えば、アンケートフォームや問い合わせフォームなども攻撃できる。対象がショッピングサイトであれば、勝手に何か購入されてしまうかもしれない。最近では、ルーターなどのネットワーク機器や、サーバーの各種設定をWebブラウザ経由で行えるものが増えているので、これらもCSRF攻撃の対象となり得る。
CSRFを巧みに実行させるわな
CSRF攻撃を発動させるためには、外部のWebページかHTML形式のメールなどのHTMLテキストが必要となる。いかにも怪しげなことが書いてある投稿用Webフォームが設置してあっても、誰も“送信”ボタンをクリックしないだろう(と信じたい)。
ユーザーに“送信”ボタンをクリックさせるために、次のようなテクニックを併用していることが多い。これらは、「はまちちゃん」事件でも使われていた手法である。
●フィッシング詐欺のように
言葉巧みにクリックしたくなるような文言を並べてユーザー自身にクリックさせる。「はまちちゃん」の場合、「【発見】mixiの裏技」という見出しと、「↓オイオイ、すげぇぜ…」という本文だけで攻撃用ページへのリンクをクリックさせていた。また、XSSを利用して本当のWebサイトのように見せかけるといった悪質な手法も併用可能だ。
●URLのリダイレクト
「はまちちゃん」事件では、攻撃用ページへのリンクを無害なGoogleへのリンクのように偽装していた。Googleから攻撃用ページへとリダイレクトさせていたのである。
●JavaScriptによる自動送信
mixiの正規ユーザーが攻撃Webページを読み込んだ瞬間に、JavaScriptによって攻撃フォームを自動的にクリックさせられていた。また、画像を表示するためのIMGタグを悪用する方法もある。
Webサイト運営者側のCSRF対策
効果的なCSRF対策を講じるためには、Webアプリケーションのプログラムで行う必要がある。多くの対策が考えられるが主なものを次に挙げておく。
●Cookieを使ったセッションの追跡
これは、運営者側が想定したページ遷移どおりに利用者がページを移動していることを確認するための方法である。
まず1ページ目で渡すCookieの中に、セッションIDなどの使い捨ての一意な文字列を追跡用として含ませる。そして、2ページ目の下記のようにフォームに先ほど渡したCookieの文字列を含ませる。
<input type="hidden" name="sessionid" value="前ページで渡した追跡用の文字列">
Cookieの中身と受け取ったリクエストの文字列の両方が一致するのを確かめることで、利用者が正しいページから遷移していることを確認する。もちろん、その文字列がサーバー側で発行した有効な文字列であることも確かめる必要がある。
●リファラーで発信元をチェック
HTTPリクエストを受けたとき、そのリクエストがどこのWebページから発行されたものかを示すリファラー(REFERER)と呼ばれる情報を得ることができる。この情報を活用し、本来意図したWebページ以外からのリクエストを拒否することで、CSRFによる外部からのリクエストを防ぐことができる。
ただし、ユーザーがリファラー情報を出力しないブラウザを使っている場合、このチェックを導入すると正当な操作でも受け付けなくなってしまう。
懸念されるリファラー情報偽装に対する問題だが、以前はリファラー情報を発行するのは攻撃を踏んでしまった自分自身なので、リファラー情報を偽装する動機がなく、この対策は安全であるとされていた。しかし、Flashのアクションスクリプトを利用することではRefererヘッダーを自由に作成できてしまうため偽装できてしまう。よって、この対策だけでは安全と言えなくなった【注】。
【注】
この問題は2006年11月14日にリリースされた、Flash Player 9.0.28.0で修正されたようなので、現在のFlashPlayerのバージョン確認とアップデートを推奨する。Adobe Flash Player ダウンロードセンター
●チェックコードを利用
これは組み込むには少しの手間がかかるが、かなり効果的である。正式名称を何と呼ぶのか知らないが(筆者追記:「CAPTCHA」というそうだ)、フォーム入力時の画面で画像を使ってランダムな文字列を表示し、それをユーザーに手入力させるという方法だ。この方法は、ユーザーの明確な入力を求めるので、エンドユーザーには少し手間であるが、CSRF対策としての効果は高い。
編集部注:
このような「画像認証」技術は、ロボットを使った不正行為対策としてYahoo! JAPAN IDの登録などで実際に利用されています。
上記の対策より効果は劣るが、実装する手間が少なく、何もしないよりはマシな方法も挙げておく。
●GETよりPOST
HTTPリクエストを送る方法にはGETとPOSTがある。GETはURLにすべての情報を載せて送るリクエスト方法である。そのため、GETによるリクエストの受付を行っていると、POSTに比べて多くの攻撃手段を提供してしまうことになる。ただし、GETよりPOSTの方がまだマシだというだけで、POSTの場合でも攻撃手段はいくつも存在する。
●確認画面の追加
例えば“削除”という機能を実行するときに、“削除”ボタンを押したら即実行するのではなく、「削除しますがよろしいですか?」といったWebページを1枚挟むことによって、ユーザーの確認を促す方法だ。気休め程度の対策であるが、GETのような単一のリクエストには効果がある。しかし、確認画面を含め複数ページに渡ってリダイレクトされる可能性もあり万能ではない。
エンドユーザーのCSRF対策
常に「CSRFを巧みに実行させるわな」に挙げた項目を疑ってかかれといいたいが、そんなことをしていては、まともにWebページを見ることができなくなってしまう。残念ながら、エンドユーザー自身にできるCSRF対策は、小まめにログアウトし必要なときにログインするという手段ぐらいしかない。しかし、この方法ですらエンドユーザーにとってはWebの利便性を十分に損なうものなので、実際に対策するユーザーは少ないだろう。
Webサイトの運営者はエンドユーザーに期待せず、十分にCSRF対策を行っていただきたい。また、読者の皆さんがCSRF攻撃が可能になっているWebサイトを発見した場合には、Webサイトの管理者なり、IPAなりに適切に報告して欲しい。報告前に掲示板などで公にするのは、得策ではないので気を付けていただきたい。
Profile
上野 宣(うえの せん)
1975年京都生まれ。情報セキュリティを世に広げるべく、講演や執筆活動とさまざまな方面で活動中。近著に「今夜わかるメールプロトコル」、「今夜わかるTCP/IP」、「今夜わかるHTTP」(共に翔泳社)がある。
●修正履歴
【2006/11/6】
リファラーで発信元をチェックについて、「この方法は簡単に実装できて比較的効果の高い方法である。しかし、リファラー情報はリクエスト発信者が自由に発行できる情報であるので、偽装されてしまう恐れもあり100%防ぐといった効果はない。」という記述を見直しました。
【2006/11/8】
リファラーで発信元をチェックについて、Flashのアクションスクリプトを用いることでリファラーを偽装できる手段が発見されましたため、内容を全面的に見直しました。
【2006/11/16】
Flash Playerの脆弱性が修正されたため、注記として最新版Flash Playerへのリンクを追記しました。
- 今夜こそわかる安全なSQLの呼び出し方 〜 高木浩光氏に聞いてみた
- 「わざと脆弱性を持たせたWebアプリ」で練習を
- Perl Mongersはセキュリティの夢を見るか?
- 誰がシステムのセキュリティを“大丈夫”にするのか
- 技術は言葉の壁を越える! Black Hat Japan 2008&AVTokyo2008(後編)
- 技術は言葉の壁を越える! Black Hat Japan 2008&AVTokyo2008(前編)
- キャンプに集まれ! そして散開!
- 売り上げ重視か、それともセキュリティ重視か!? 「安全なウェブサイト運営入門」
- CeCOS IIにみるネット犯罪のもう一方の側面
- セキュリティ対策の行き着くところは……最終手段? 京都に究極のセキュリティ対策を見た
- 人はオレを情報の破壊神と呼ぶ せめて、ハードディスクの最期はこの手で……
- セキュリティ社会科見学:インターネット物理モデルでセキュリティを考えた
- セキュリティ自由研究:この夏、グミ指を作ってみないか
- Webアプリケーションを作る前に知るべき10の脆弱性
- セキュリティを教える人に知ってほしい 基本が詰まった1冊
- セキュリティのバランス感覚を養うための1冊
- 暗号化仮想ドライブで手軽にファイルを暗号化
- Windows管理者必携、Sysinternalsでシステムを把握する
- 今夜分かるSQLインジェクション対策
- 「取りあえず管理者アカウントで」という思考停止はもうやめよう
- CSSクロスドメインの情報漏えいの脆弱性「CSSXSS」とは
- 偽装メールを見破れ!(後編)
- 偽装メールを見破れ!(前編)
- メールは信頼できても信用できない
- 危機管理体制を整えよう! 個人情報漏えい後の対応ガイドライン
- メールアドレスを漏えいから守る方法
- 「Whoppix」を使ってペネトレーションテストをやろう
- 「ぼくはまちちゃん」 ――知られざるCSRF攻撃
- 25番ポートの攻防
- 平田です。届いてますか?
- 魔法の鍵と最後の鍵
- 個人情報保護法を論理的に読み解く
- 安全確保のために東京は明るく! 大阪は暗く!
- 言論の自由とセキュリティコミュニティ
- 標的にされる無防備なコンピュータ
- セキュリティ担当者には想像力が必要
- 端末を持ち歩くことの危険を意識せよ! 〜 「ノートPC=自動車」論 〜
- 脆弱性のあるサイトとセキュリティ技術者の関係
- いまこそ一般教養としてセキュリティを!
- 大事なことは製品でもなく知識でもなく……
- 治安の悪化で改めて痛感したこと
- Blasterがもたらした多くの“メリット”
- 企業でのセキュリティ資格の意味合いは?
- 人はミスをするものと思え、故に事前対策が重要
- オレオレ詐欺に学ぶソーシャル対策
- あらゆる人にセキュリティ教育を
- 猛威を振るうSARSウイルスに思ったこと
- 痛い目に遭って考えた、ビジネス継続性の重要さ
- 責められるべきはMSだけだろうか?
- セキュリティ技術者を「憧れの職業」にするには?
Copyright © ITmedia, Inc. All Rights Reserved.