この記事では、JSONハイジャックについて書きます。徳丸本に書いてあって知らなかったので記事にしようと思っていましたが、すでにCVEに登録済みでしたね。「JSONをvbscriptとして読み込ませるJSONハイジャック(CVE-2013-1297)に注意」として注意を呼びかけている。
JSONについてはここでは書きません。ググってください。
通常、JSON は XMLHttpRequest を利用した Ajax の通信として利用されますが、XMLHttpRequest はセキュリティ上の理由から JavaScript がある Web サーバーと同じリソースにしかアクセスできないように、「Access-Control-Allow-Origin」設定を行います。(結構メジャー)
<script src="Scripts/jsonp.js"></script>
しかし、設定が上手く行われていない場合、上記のようなJSの書き方をする(JSONP (JSON with padding) )、別ドメインの JavaScript を読み込み実行することができます。
JSONハイジャックの概要
JSON形式のデータは、通常はXMLHttpRequestオブジェクトにより読み出しますが、攻撃者が罠サイトを作成して、vbscriptを指定したscript要素により呼び出す攻撃です。JSONはvbscriptとして実行するとエラーになりますが、エラーハンドラに渡される引数としてJSONデータが入るため、通常は読み出せないJSON経由で秘密情報が漏洩します。
JSONデータをJavaScriptで読み出すことができます。JSONに機密情報の有無を基準に対策が必要です。
攻撃スクリプト
徳丸さんの本には次のような攻撃スクリプト書いてありました。
<body onload="alert(x)"> 罠サイト <script> var x = ""; object.prototype.__defineSetter__("mail",function(v){ x += v + " "; }); </script> <script src="http://json_url/xxx.json"></script> </body>
これだと、Json内に”mail”という項目があると、読み出すことが可能です。
この記事を書いている時点では、メジャーなブラウザでは防がれますが、FirefoxやAndroidブラウザでは読み出しが可能という情報があります。
対策
- JSONを返すスクリプトの先頭で「X-Requested-With: XMLHttpRequest」となっていること
- JSONを返すレスポンスに、「X-Content-Type-Options: nosniff 」ヘッダをつける
- JSONPはできるだけ使用せず、CORS+JSONにする
- JSONPは信頼できる提供元のみを使用する
まとめ
JSONハイジャックについて書きました。新しい技術を導入するときは、CVEの情報を観察し、情報収集と対策を行うようにしましょう。
コメント