Video Screencast Help
Symantec Appoints Michael A. Brown CEO. Learn more.
Security Response

Facebook の CSRF 対策トークンを盗み出す手口

Created: 28 Oct 2011 10:13:27 GMT • Translations available: English
Nishant Doshi's picture
0 0 Votes
Login to vote

過去数カ月、ソーシャルネットワークサイトへと誘導しようとするさまざまなスパム攻撃が確認されています。これらの攻撃のほとんどは、何らかのソーシャルエンジニアリング手法の特徴を備えていますが、ときとして、画期的なソーシャルエンジニアリング手法も登場しています。ここでは、そうした手法のなかでも、Facebook で特に重要な CSRF 対策トークンを盗み出そうとしてユーザーを欺く手口を紹介します。

クロスサイトリクエストフォージェリ攻撃
クロスサイトリクエストフォージェリ(CSRF)とは、ある Web サイトで認証済みのセッションを再利用して、ユーザーに気づかれないまま、または同意を得ずにその Web サイトで悪質な処理を実行する攻撃です。たとえば、ユーザーが自分のオンラインバンキングのサイトにログインしているとします。この Web サイトに CSRF の脆弱性があると、別の悪質な Web サイト(たとえば bad.com)からユーザーのブラウザに指示を送り、ユーザーに気づかれないように送金などの処理を実行させることが可能になります。ブラウザや銀行の Web サイトにとっては、ユーザーがもうひとつのタブを開いて自分で送金処理を実行したのと、何ら変わりません。CSRF 対策トークンは、このような CSRF 攻撃を防ぐために Web サイトで採用されている手段のひとつです。

一般的な CSRF 対策トークンは、Web サイトによって 1 回ごとにランダムに生成され、Web フォームで隠された入力パラメータとして送信されます。トークンは Web サイトのバックエンドで検証され、フォームやアクションの送信時に実行される CSRF 攻撃を除外します。CSRF 対策トークンを生成するには、CSRF 対策トークンを解読または推測する必要があるので、CSRF 攻撃の実行が困難になります。

今回のブログでは、攻撃者がこのような CSRF 対策トークンにアクセスするために利用しているテクニックについて説明します。この攻撃は、以下のような 3 段階で実行されます。

 

1 段階 - 詐欺にかける
攻撃はユーザーを誘導するメッセージから始まります。次の例のように、ユーザーの友達に関するニュースフィードとして出現します。

 

2 段階 - ユーザーを欺いて FaceBook CSRF 対策トークンを送信させる
ニュースフィードのリンクをクリックすると、次のように YouTube を偽装した Web ページにリダイレクトされます。ビデオを見るために、ユーザーは身元の確認を求められます。

この検証プロセスのステップ 1 では、[Generate Code(コードを生成)]リンクをクリックして検証コードを生成します。ステップ 2 では、ステップ 1 で生成されたコードをテキストボックスにコピーアンドペーストし、[Confirm(確認)]ボタンをクリックします。

このステップ 1 とステップ 2 を詳しく見てみましょう。次のスクリーンショットは、この Web ページの JavaScript コードの一部です。

[Generate Code(コードを生成)]リンクは、実際には 0.facebook.com/ajax/dtsg.php に対する要求です。この要求が送信されると、次のスクリーンショットに示すような JavaScript コードが返されます。Chrome や Firefox など多くのブラウザでは、view-source URI スキームがサポートされています。つまり、URI ハンドラとして「view-source:」が指定されている URL からは、そのページのソースコードが開くということです。したがって、[Generate Code(コードを生成)]リンクをクリックすると、dtsg.php に対する要求で返されたデータ(JavaScript)が、ブラウザのソース表示ウィンドウに表示されます。

ユーザーが次に求められるのは、この JavaScript コードを[Insert Verification Code Below(検証コードを下に挿入)]テキストボックスにコピーアンドペーストし、[Confirm(確認)]ボタンをクリックすることです。

では、この JavaScript コードの何がそれほど特殊なのでしょうか。答えは、「fb_dtsg」と呼ばれる CSRF 対策トークンです。CSRF 攻撃を防ぐために、Facebook のページでは fb_dtsg という独自のトークンがセッションごとに使われています。facebook.com/ajax/dtsg.php を要求すると、この fb_dtsg トークンを含む JavaScript が返されます。

攻撃者は、ユーザーを欺いて Facebook の CSRF 対策トークンを取得しようとしています。

この例では、ユーザーが JavaScript コードをコピーアンドペーストして[Confirm(確認)]をクリックすると、攻撃者の第三者サイトがこの CSRF 対策トークンを受け取ります。攻撃者はこれで、CSRF 攻撃を実行できるようになります。

 

3 段階 - CSRF 攻撃: ユーザーに気づかれずに悪質なリンクがウォールに投稿される
以下の図は、[Confirm(確認)]ボタンをクリックしたとき攻撃者によって返される JavaScript コードの詳細です。このコードが CSRF 攻撃を実行し、第 2 段階で盗み出した CSRF 対策トークンを使ってユーザーの Facebook ページに悪質なリンクを投稿します。

ここで注目すべき点は、post_form_id がどんな値であってもこの攻撃は成功するということです。実際、上のコードではランダムに post_form_id 値を生成しようとしていることがわかります。

 

セルフ XSS のコピーアンドペースト攻撃との比較
この攻撃の手法は、今年の夏に Facebook プラットフォームで確認された、セルフ XSS のコピーアンドペースト攻撃と性質が似ています。

以前確認されたセルフ XSS 攻撃でも、攻撃者はユーザーを欺いて悪質な JavaScript コードを自分のブラウザにコピーアンドペーストさせていました。この悪質な JavaScript は、Facebook.com の元のコンテキストでそのまま実行されるため、DOM を解析すれば fb_dtsg などのトークン値を抽出することが可能でした。こうして抽出されたトークン値が後から利用されて、悪質なスパムメッセージがユーザーやユーザーの友達のページに投稿されたのです。

ただし、今回の攻撃の場合には、犠牲者を欺いて Facebook アカウントへのアクセス中に JavaScript コードを実行させるのではなく、CSRF 対策トークンを攻撃者に送信するように仕向けている点が違っています。CSRF 対策トークンを入手した攻撃者は、CSRF 攻撃を実行して詐欺メッセージを拡散します。

 

まとめ
今のところ、このスパム攻撃を使って悪質なブラウザ悪用コードやドライブバイダウンロードを拡散している例はほとんど確認されていませんが、近い将来には攻撃者がこの手口に殺到するだろうとシマンテックでは推測しています。そのうえ、攻撃者がユーザーを欺くソーシャルエンジニアリングの手口も巧妙になっています。セキュリティソフトウェアを最新の状態に保ち、疑わしいリンクは決してクリックしないようにしてください。

シマンテックが Facebook に連絡したところ、Facebook はすでに、この問題を修正するために各ブラウザベンダーとの緊密な協力体制を組んでおり、今後もその取り組みを続けるということです。また、疑わしい挙動がないかどうかアカウントを自動的に監視し、こうした攻撃を防ごうとしている、いう報告も受けています。

 

* 日本語版セキュリティレスポンスブログの RSS フィードを購読するには、http://www.symantec.com/connect/ja/item-feeds/blog/2261/feed/all/ja にアクセスしてください。