セキュリティセンターTOP > セキュアプログラミング講座 > Webアプリケーション編 > マッシュアップ > クライアントサイドマッシュアップ: #3 リクエスト強要攻撃による善意のAPIへの侵害

第8章 マッシュアップ
クライアントサイドマッシュアップ: #4 リクエスト強要攻撃による善意のAPIへの侵害

シナリオ4 は、悪意のサイトのコンテンツにブラウザが操られ、ユーザの意思に反して善意のAPI への攻撃が起こるというものである。このシナリオで考えられる攻撃には「リクエスト強要攻撃」がある。本節では、クライアントサイドマッシュアップの状況におけるリクエスト強要攻撃について論じる。

「リクエスト強要攻撃」

リクエスト強要攻撃は、罠のコンテンツを用いてブラウザを誘導し、ユーザの意思に反した HTTPリクエストを善意のWebサーバへ送信させる攻撃である。ユーザ本人の望まない「更新系」のトランザクションが投入され、被害が生じる。

これまで注意深いWebアプリケーション開発者の間では、サーバにおける「更新系」の処理について「リクエスト強要攻撃」が警戒され、対策がとられてきた。対策が「更新系」に限定されていたのは、従来型のWebアプリケーションでは「参照系」のトランザクションが投入されても攻撃者がその処理結果を入手することが困難であり、あまり実害が無かったからである。

しかし、クライアントサイドマッシュアップにおいては「非同期の他源泉リクエスト」という手法が多用され、その状況においては「更新系」の処理のみならず、「参照系」の処理についても「リクエスト強要攻撃」への警戒と対策が必要になってきた。

「非同期の他源泉リクエスト」

本稿で「非同期の他源泉リクエスト」と呼ぶのは次のような動作を実現するプログラミング手法のことである──

ブラウザ上の JavaScript コード内からその JavaScript コードの出身サーバ ("源泉") とは異なる Web サーバ ("他源泉") へ HTTP リクエストを送ってレスポンスを受け取り、その後も元の JavaScript コードが動作を継続する動作

「非同期の他源泉リクエスト」複数の方法

「非同期の他源泉リクエスト」の実現方法には、これまで次の 5つが知られている。

「非同期の源泉横断リクエスト」の5つの方法
図8-8: 「非同期の他源泉リクエスト」の5つの方法

他源泉におけるリクエスト強要攻撃

5種類の「非同期の他源泉リクエスト」方法のそれぞれについて、サーバの「参照系」処理に対する「リクエスト強要攻撃」が情報漏えいを引き起こす模様を想定してみる。

(1) リクエスト強要攻撃―JSONP

JSONP におけるリクエスト強要攻撃は下記の図のように行われる。

JSONP
図8-9: JSONP

善意のサーバ (サーバB) のセッションが Cookie で維持されている状況下で、悪意のサーバのコンテンツが正常系と同様の JSONP 手法を用い、サーバBからデータを不正に入手する。

ここでは次を仮定している。

(2) リクエスト強要攻撃―iframeコール

iframeコールにおけるリクエスト強要攻撃は下記の図のように行われる。

iframeコール
図8-10: iframeコール

善意のサーバ (サーバB) のセッションが Cookie で維持されている状況下で、悪意のサーバのコンテンツが正常系と同様の iframe コール手法を用い、サーバB からデータを不正に入手する。

ここでは次を仮定している。

(3) リクエスト強要攻撃―iframe+postMessage

iframe+postMessageにおけるリクエスト強要攻撃は下記の図のように行われる。

iframe+postMessage
図8-11: iframe+postMessage

善意のサーバ(サーバB)のセッションが Cookie で維持されている状況下で、iframe 子要素が親要素へ postMessage でデータを受け渡してくるのをそのまま受け取り、悪意のサーバがデータを不正に入手する。

ここでは次を仮定している。

(4) リクエスト強要攻撃―ワーカ+importScripts

ワーカ+importScripts におけるリクエスト強要攻撃は下記の図のように行われる。

Webワ―カ+importScripts
図8-12: ワーカ+importScripts

善意のサーバ(サーバB)のセッションが Cookie で維持されている状況下で、悪意のサーバのコンテンツが importScripts を使用して、サーバB からデータを不正に入手する。

ここでは次を仮定している。

(5) リクエスト強要攻撃―XHR2

XHR2 におけるリクエスト強要攻撃は下記の図のように行われる。

XMLHttpRequest level2
図8-13: XHR2

善意のサーバ(サーバB)のセッションが Cookie で維持されている状況下で、悪意のサーバのコンテンツが XHR2 を使用して、サーバB からデータを不正に入手する。

ここでは次を仮定している。

 

リクエスト強要攻撃への耐性

どのリクエスト手段もリクエスト強要攻撃の餌食になり得る。「非同期の他源泉リクエスト」の 5つの方法それぞれのリクエスト強要攻撃への耐性を一覧にすると次のようになる 。

「非同期の源泉横断リクエスト」の5つの方法
図8-14: 「非同期の他源泉リクエスト」の5つの方法

XHR2

XHR2(XMLHttpRequest level 2)は「非同期の他源泉リクエスト」の 5つの方法の中でも比較的強固である。XHR2 の通信上の特徴は、HTTPリクエストおよびレスポンスの中で次のようなヘッダを用いるというものである。

上記のヘッダ群を用いて、XHR2 はセキュリティ確保のための振る舞いをする。主なものは次の3つである。

(参考) Mozilla Firefox の場合、次のところに仕様の解説がある。
  • "HTTP access control" (英語)
    https://developer.mozilla.org/En/HTTP_access_control

XHR2 を用いた他源泉リクエスト

XHR2 を用いた他源泉リクエストの通信の流れを次に示す。

XHR2を用いた源泉横断
図8-15: XHR2 を用いた他源泉リクエスト

XHR2 を突破できるケース

セキュリティの配慮がある XHR2 であっても、次のような条件が成立する場合にはリクエスト強要攻撃が成立し得る。

XHR2を突破できるケース
図8-16: XHR2 を突破できるケース