Coders Conquer Security:シェア&ラーンシリーズ - クロスサイト・リクエスト・フォージェリ

2018年12月13日発行
ジャープ・カラン・シン著
ケーススタディ

Coders Conquer Security:シェア&ラーンシリーズ - クロスサイト・リクエスト・フォージェリ

2018年12月13日発行
ジャープ・カラン・シン著
リソースを見る
リソースを見る

Webサイトやアプリケーションの運営者を狙った攻撃とは異なり、多くのクロスサイトリクエストフォージェリ(CSRF)攻撃の目的は、ユーザーから直接、金品や認証情報を盗むことにあります。これは、サイト運営者がCSRFコードの脆弱性を無視すべきだということを意味するものではありません。純粋に金銭的な攻撃の場合、最終的に盗まれた資金の補充は、安全でないコードを持つホスティングサイトの責任となる可能性があるからです。また、標的となったユーザーが認証情報を紛失したり、知らないうちにパスワードを変更されたりした場合、特に被害者が特権的なアクセス権を持っている場合には、犯罪者は盗んだIDを使って大暴れすることができるかもしれません。

CSRF攻撃はかなり複雑で、成功させるためには複数のレイヤーに依存します。言い換えれば、この攻撃を成功させるためには、多くの要素が攻撃者に有利に働く必要があります。しかし、CSRF攻撃は、成功すればハッカーに直接お金を渡したり、サイト内を自由に動き回れるようにしたりできるため、非常に人気の高い攻撃手段です。すべてがハッカーの思惑通りに進めば、標的となったユーザーは攻撃の被害に遭ったことにさえ気づかないかもしれません。

しかし、CSRF攻撃を成功させるためには多くの要素が必要であるため、攻撃を阻止するための優れた防御技術がいくつかあります。

そのために、CSRF攻撃の3つのポイントについて説明します。

  • 仕組み
  • なぜ彼らは危険なのか
  • 彼らを冷遇するための防御策を講じることができます。

CSRF攻撃の仕組みは?

CSRF攻撃が成功すると、標的となるユーザーから金品や認証情報を直接盗むことができるため、その作成には多大な労力を要するにもかかわらず、人気があります。また、さまざまなプラットフォームで試行されることが多いため、長年にわたってさまざまな名前や称号が付けられてきました。CSRF攻撃は、XSRF、Sea Surf、Session Riding、Cross-Site Reference Forgery、Hostile Linkingなどと呼ばれることもあります。マイクロソフトは、ほとんどのドキュメントでこれらをワンクリック攻撃と呼んでいます。しかし、これらはすべてCSRF攻撃であり、その対策方法も同じです。

CSRF攻撃は、ユーザーがサイトにログインしてビジネスや仕事をしているときに起こります。重要なのは、ユーザーがウェブサイトやアプリケーションにログインし、積極的に認証されていることです。この攻撃は通常、二次的なウェブサイトや電子メールから行われます。多くの場合、攻撃者はソーシャルエンジニアリング技術を使用してユーザーを騙し、攻撃スクリプトが置かれた危険なWebサイトに誘導する電子メール内のリンクをクリックさせます。

侵害されたウェブサイトには、アクティブなブラウザにコマンドを実行するよう指示するスクリプトが含まれています。通常は、ユーザーのパスワードを変更したり、攻撃者が管理する口座に送金したりするような悪質なものです。ユーザーが認証されている限り、サイトはそのコマンドが認証されたユーザーによって発行されたものであると考えます。なぜそうしないのでしょうか?ユーザーはすでに自分自身を認証し、サイトにアクセスするために必要なパスワードを提供しています。また、ジオフェンス内にいて、オフィスの端末に座っているかもしれません。パスワードの変更や送金をしたいと思ったとき、それを要求したのが本人であると信じない理由はないだろう。

この攻撃の要素を分解してみると、なぜこの攻撃が攻撃者にとって非常に難しいものであるかがわかります。まず、攻撃が行われるサイトでは、ユーザーが積極的に認証を受ける必要があります。ユーザーがブラウザのセッションを終了したり、ログオフしたりした後に、攻撃スクリプトを含むメールが届いた場合、攻撃は失敗します。

また、攻撃者は、そのサイトがどのようなスクリプトを受け入れるかを知るために、標的となるサイトで多くのリコンを行う必要があります。攻撃者は被害者の画面を見ることができず、ウェブサイトからのフィードバックは攻撃者ではなく被害者に送られます。攻撃者は、被害者の口座に突然お金が入ってくるなど、攻撃が成功した証拠を見ることができなければ、攻撃が成功したかどうかもすぐにはわかりません。

CSRF攻撃を実行するためのコードは、攻撃時にユーザーがログインしていること、標的となるサイトがどのようなスクリプトを受け入れるかを知っていることという、難しいようでいて不可能ではない条件の中で、サイト自体によって異なりますが、非常にシンプルなものになります。

例えば、銀行や金融機関のアプリケーションが、以下のようにGETリクエストを使って送金するとします。

GET http://bank.com/transferdo?acct=NancySmith12&amount=100 HTTP/1.1

このコードは、NancySmith12というユーザーに100ドルを送金するリクエストを送信します。

しかし、ターゲットとなったユーザーが、同僚を装ったメールを受け取った場合、クリック操作にCSRF攻撃スクリプトが埋め込まれる可能性があります。

<a href="http://bank.com/transfer.do?acct=ShadyLady15&amount=100000">Can you quickly read over this quarterly report?<a></a></a>

ターゲットとなったユーザーがソーシャルエンジニアリングリンクに引っかかり、ファイナンスアプリケーションのブラウザセッションがまだ開いている間にリンクをクリックすると、ブラウザはアプリケーションにShadyLady15の口座に10万ドルを送金するように要求します。

このスクリプトは、ユーザーには見えないが、ブラウザがリクエストを行うきっかけとなるような不可視の画像の中に隠すこともできます。

<img src="http://bank.com/transfer.do?acct=ShadyLady15&amount=100000" width="0" height="0" border="0">

結果は同じです。ShadyLady15は、誰にも攻撃を検知されずに10万ドルを手に入れます。

なぜCSRFは危険なのか?

CSRF攻撃は、ランサムウェアが流行し続けているのと同じ理由で、現在人気があります。CSRF攻撃は、攻撃者と被害者の資金の間のホップが非常に少ないのです。ランサムウェア攻撃では、システムが暗号化され、ユーザーはそのデータを解読するために金銭を要求されます。CSRF攻撃では、さらに少ないステップで攻撃を行うことができます。CSRF攻撃が成功すると、被害者は知らないうちに攻撃者にお金を送ってしまいます。

CSRF攻撃が成功すると、被害者の金銭や企業の財務に対する直接的な攻撃だけでなく、有効なユーザーを使ってネットワークを侵害することができます。もし攻撃者がCSRF攻撃を利用して管理者のパスワードを変更したとしたらどうでしょう。攻撃者はすぐにそのパスワードを使用して、データの盗み出し、ネットワーク防御の穴を開け、バックドアをインストールすることができます。

CSRF攻撃を成功させるには、多大な労力とある程度の運が必要ですが、ハッカーにとっては、最終的な目的にかかわらず、宝くじに当たるようなものです。ネットワークを攻撃する場合、他のほとんどの種類の攻撃では、SIEMやサイバーセキュリティ担当者のレーダーに映らないようにしながら、何ヶ月もかけてじっくりと偵察する必要があります。これに対して、CSRF攻撃は、サイバーキルチェーンのいくつかのステップをスキップして、最終的な目標に非常に近いところからスタートさせることができます。

CSRF攻撃を防ぐにはどうすればいいですか?

一般的な脆弱性とは異なり、CSRF攻撃では、コードではなく、攻撃者が作成したエクスプロイトを利用して、ユーザーが望まない、あるいは知らないリクエストをブラウザにさせることができます。しかし、これらの攻撃は防ぐことができます。

最良の方法の1つは、新しいセッションが生成されるたびに、開発者がユーザーのIDにCSRFトークンを追加することです。このトークンは、ユニークでランダムな文字列で構成され、ユーザーからは見えないようにする必要があります。次に、新しいリクエストが送信されるたびにサーバがチェックするフォームに、CSRFトークンのリクエストを隠しフィールドとして追加します。ユーザーのブラウザを介してリクエストを送信する攻撃者は、隠されたトークン・フィールドについて知ることもできず、ましてやそれが何であるかを知ることもできないので、リクエストはすべて失敗します。

さらに簡単な方法として、プログラミングをあまり必要としない方法として、パスワード変更依頼や送金依頼のような機密性の高いものにCaptchaチャレンジを追加する方法があります。これは、ユーザーに、リクエストした人がロボットではないことを確認するボタンを1回クリックしてもらうという単純なもので、この場合はCSRFスクリプトを使っています。攻撃者はチャレンジに対する応答をスクリプトで作成することはできません。また、送金依頼などの操作をしていないのに突然CAPTCHAチャレンジが表示されたユーザーは、何かが起きていることに気づくでしょう。また、スマートフォンなどのサードパーティ製のトークンを使ってワンタイムパスワードを生成する方法もありますが、組織がセキュリティの名の下にどれだけ作業を遅らせたいかによって異なります。

最後に、鉄壁ではありませんが、Microsoft EdgeやGoogle Chromeなどの多くのブラウザには、ローカルユーザ以外からのリクエストをブロックする同一オリジンポリシーの制限が設けられています。ユーザーにこれらのブラウザの最新バージョンを使ってサイトにアクセスしてもらうことで、開発チームに負担をかけることなく、CSRFのセキュリティをさらに強化することができます。

CSRFの扉を閉める

しかし、なぜこのような攻撃が行われるのか、また、どのようにしてネットワークから遮断すればよいのかをご理解いただけたのではないでしょうか。

さらに詳しい情報は、OWASP Cross-Site Request Forgery Prevention Cheat Sheetをご覧ください。また、セキュリティに関する知識を深めたい方は、以下のブログをご覧になり、この脅威に対抗する方法を学んでください。 Secure Code Warriorブログをご覧ください。

新しいディフェンスの知識を試す準備ができたと思いますか?Secure Code Warrior プラットフォームの無料デモで遊んでみてください。

リソースを見る
リソースを見る

著者

Jaap Karan Singh

もっと知りたい?

セキュアコーディングに関する最新の知見をブログでご紹介しています。

当社の豊富なリソースライブラリは、安全なコーディングアップスキルに対する人間的なアプローチを強化することを目的としています。

ブログを見る
もっと知りたい?

開発者主導のセキュリティに関する最新の研究成果を入手する

ホワイトペーパーからウェビナーまで、開発者主導のセキュアコーディングを始めるために役立つリソースが満載のリソースライブラリです。今すぐご覧ください。

リソース・ハブ

Coders Conquer Security:シェア&ラーンシリーズ - クロスサイト・リクエスト・フォージェリ

2018年12月13日発行
Jaap Karan Singh著

Webサイトやアプリケーションの運営者を狙った攻撃とは異なり、多くのクロスサイトリクエストフォージェリ(CSRF)攻撃の目的は、ユーザーから直接、金品や認証情報を盗むことにあります。これは、サイト運営者がCSRFコードの脆弱性を無視すべきだということを意味するものではありません。純粋に金銭的な攻撃の場合、最終的に盗まれた資金の補充は、安全でないコードを持つホスティングサイトの責任となる可能性があるからです。また、標的となったユーザーが認証情報を紛失したり、知らないうちにパスワードを変更されたりした場合、特に被害者が特権的なアクセス権を持っている場合には、犯罪者は盗んだIDを使って大暴れすることができるかもしれません。

CSRF攻撃はかなり複雑で、成功させるためには複数のレイヤーに依存します。言い換えれば、この攻撃を成功させるためには、多くの要素が攻撃者に有利に働く必要があります。しかし、CSRF攻撃は、成功すればハッカーに直接お金を渡したり、サイト内を自由に動き回れるようにしたりできるため、非常に人気の高い攻撃手段です。すべてがハッカーの思惑通りに進めば、標的となったユーザーは攻撃の被害に遭ったことにさえ気づかないかもしれません。

しかし、CSRF攻撃を成功させるためには多くの要素が必要であるため、攻撃を阻止するための優れた防御技術がいくつかあります。

そのために、CSRF攻撃の3つのポイントについて説明します。

  • 仕組み
  • なぜ彼らは危険なのか
  • 彼らを冷遇するための防御策を講じることができます。

CSRF攻撃の仕組みは?

CSRF攻撃が成功すると、標的となるユーザーから金品や認証情報を直接盗むことができるため、その作成には多大な労力を要するにもかかわらず、人気があります。また、さまざまなプラットフォームで試行されることが多いため、長年にわたってさまざまな名前や称号が付けられてきました。CSRF攻撃は、XSRF、Sea Surf、Session Riding、Cross-Site Reference Forgery、Hostile Linkingなどと呼ばれることもあります。マイクロソフトは、ほとんどのドキュメントでこれらをワンクリック攻撃と呼んでいます。しかし、これらはすべてCSRF攻撃であり、その対策方法も同じです。

CSRF攻撃は、ユーザーがサイトにログインしてビジネスや仕事をしているときに起こります。重要なのは、ユーザーがウェブサイトやアプリケーションにログインし、積極的に認証されていることです。この攻撃は通常、二次的なウェブサイトや電子メールから行われます。多くの場合、攻撃者はソーシャルエンジニアリング技術を使用してユーザーを騙し、攻撃スクリプトが置かれた危険なWebサイトに誘導する電子メール内のリンクをクリックさせます。

侵害されたウェブサイトには、アクティブなブラウザにコマンドを実行するよう指示するスクリプトが含まれています。通常は、ユーザーのパスワードを変更したり、攻撃者が管理する口座に送金したりするような悪質なものです。ユーザーが認証されている限り、サイトはそのコマンドが認証されたユーザーによって発行されたものであると考えます。なぜそうしないのでしょうか?ユーザーはすでに自分自身を認証し、サイトにアクセスするために必要なパスワードを提供しています。また、ジオフェンス内にいて、オフィスの端末に座っているかもしれません。パスワードの変更や送金をしたいと思ったとき、それを要求したのが本人であると信じない理由はないだろう。

この攻撃の要素を分解してみると、なぜこの攻撃が攻撃者にとって非常に難しいものであるかがわかります。まず、攻撃が行われるサイトでは、ユーザーが積極的に認証を受ける必要があります。ユーザーがブラウザのセッションを終了したり、ログオフしたりした後に、攻撃スクリプトを含むメールが届いた場合、攻撃は失敗します。

また、攻撃者は、そのサイトがどのようなスクリプトを受け入れるかを知るために、標的となるサイトで多くのリコンを行う必要があります。攻撃者は被害者の画面を見ることができず、ウェブサイトからのフィードバックは攻撃者ではなく被害者に送られます。攻撃者は、被害者の口座に突然お金が入ってくるなど、攻撃が成功した証拠を見ることができなければ、攻撃が成功したかどうかもすぐにはわかりません。

CSRF攻撃を実行するためのコードは、攻撃時にユーザーがログインしていること、標的となるサイトがどのようなスクリプトを受け入れるかを知っていることという、難しいようでいて不可能ではない条件の中で、サイト自体によって異なりますが、非常にシンプルなものになります。

例えば、銀行や金融機関のアプリケーションが、以下のようにGETリクエストを使って送金するとします。

GET http://bank.com/transferdo?acct=NancySmith12&amount=100 HTTP/1.1

このコードは、NancySmith12というユーザーに100ドルを送金するリクエストを送信します。

しかし、ターゲットとなったユーザーが、同僚を装ったメールを受け取った場合、クリック操作にCSRF攻撃スクリプトが埋め込まれる可能性があります。

<a href="http://bank.com/transfer.do?acct=ShadyLady15&amount=100000">Can you quickly read over this quarterly report?<a></a></a>

ターゲットとなったユーザーがソーシャルエンジニアリングリンクに引っかかり、ファイナンスアプリケーションのブラウザセッションがまだ開いている間にリンクをクリックすると、ブラウザはアプリケーションにShadyLady15の口座に10万ドルを送金するように要求します。

このスクリプトは、ユーザーには見えないが、ブラウザがリクエストを行うきっかけとなるような不可視の画像の中に隠すこともできます。

<img src="http://bank.com/transfer.do?acct=ShadyLady15&amount=100000" width="0" height="0" border="0">

結果は同じです。ShadyLady15は、誰にも攻撃を検知されずに10万ドルを手に入れます。

なぜCSRFは危険なのか?

CSRF攻撃は、ランサムウェアが流行し続けているのと同じ理由で、現在人気があります。CSRF攻撃は、攻撃者と被害者の資金の間のホップが非常に少ないのです。ランサムウェア攻撃では、システムが暗号化され、ユーザーはそのデータを解読するために金銭を要求されます。CSRF攻撃では、さらに少ないステップで攻撃を行うことができます。CSRF攻撃が成功すると、被害者は知らないうちに攻撃者にお金を送ってしまいます。

CSRF攻撃が成功すると、被害者の金銭や企業の財務に対する直接的な攻撃だけでなく、有効なユーザーを使ってネットワークを侵害することができます。もし攻撃者がCSRF攻撃を利用して管理者のパスワードを変更したとしたらどうでしょう。攻撃者はすぐにそのパスワードを使用して、データの盗み出し、ネットワーク防御の穴を開け、バックドアをインストールすることができます。

CSRF攻撃を成功させるには、多大な労力とある程度の運が必要ですが、ハッカーにとっては、最終的な目的にかかわらず、宝くじに当たるようなものです。ネットワークを攻撃する場合、他のほとんどの種類の攻撃では、SIEMやサイバーセキュリティ担当者のレーダーに映らないようにしながら、何ヶ月もかけてじっくりと偵察する必要があります。これに対して、CSRF攻撃は、サイバーキルチェーンのいくつかのステップをスキップして、最終的な目標に非常に近いところからスタートさせることができます。

CSRF攻撃を防ぐにはどうすればいいですか?

一般的な脆弱性とは異なり、CSRF攻撃では、コードではなく、攻撃者が作成したエクスプロイトを利用して、ユーザーが望まない、あるいは知らないリクエストをブラウザにさせることができます。しかし、これらの攻撃は防ぐことができます。

最良の方法の1つは、新しいセッションが生成されるたびに、開発者がユーザーのIDにCSRFトークンを追加することです。このトークンは、ユニークでランダムな文字列で構成され、ユーザーからは見えないようにする必要があります。次に、新しいリクエストが送信されるたびにサーバがチェックするフォームに、CSRFトークンのリクエストを隠しフィールドとして追加します。ユーザーのブラウザを介してリクエストを送信する攻撃者は、隠されたトークン・フィールドについて知ることもできず、ましてやそれが何であるかを知ることもできないので、リクエストはすべて失敗します。

さらに簡単な方法として、プログラミングをあまり必要としない方法として、パスワード変更依頼や送金依頼のような機密性の高いものにCaptchaチャレンジを追加する方法があります。これは、ユーザーに、リクエストした人がロボットではないことを確認するボタンを1回クリックしてもらうという単純なもので、この場合はCSRFスクリプトを使っています。攻撃者はチャレンジに対する応答をスクリプトで作成することはできません。また、送金依頼などの操作をしていないのに突然CAPTCHAチャレンジが表示されたユーザーは、何かが起きていることに気づくでしょう。また、スマートフォンなどのサードパーティ製のトークンを使ってワンタイムパスワードを生成する方法もありますが、組織がセキュリティの名の下にどれだけ作業を遅らせたいかによって異なります。

最後に、鉄壁ではありませんが、Microsoft EdgeやGoogle Chromeなどの多くのブラウザには、ローカルユーザ以外からのリクエストをブロックする同一オリジンポリシーの制限が設けられています。ユーザーにこれらのブラウザの最新バージョンを使ってサイトにアクセスしてもらうことで、開発チームに負担をかけることなく、CSRFのセキュリティをさらに強化することができます。

CSRFの扉を閉める

しかし、なぜこのような攻撃が行われるのか、また、どのようにしてネットワークから遮断すればよいのかをご理解いただけたのではないでしょうか。

さらに詳しい情報は、OWASP Cross-Site Request Forgery Prevention Cheat Sheetをご覧ください。また、セキュリティに関する知識を深めたい方は、以下のブログをご覧になり、この脅威に対抗する方法を学んでください。 Secure Code Warriorブログをご覧ください。

新しいディフェンスの知識を試す準備ができたと思いますか?Secure Code Warrior プラットフォームの無料デモで遊んでみてください。

弊社製品や関連するセキュアコーディングのトピックに関する情報をお送りする許可をお願いします。当社は、お客様の個人情報を細心の注意を払って取り扱い、マーケティング目的で他社に販売することは決してありません。

送信
フォームを送信するには、「Analytics」のCookieを有効にしてください。完了したら、再度無効にしてください。