« クロスサイトのセキュリティモデル | メイン | E4X-XSS 脆弱性について »
2007年01月06日
安全な JSON, 危険な JSON (Cross-site Including?)
先のエントリで、
JSON については、JavaScript として副作用をもたない (もたせようがない) ゆえに
(Kazuho@Cybozu Labs: クロスサイトのセキュリティモデル)文法違反であるがゆえに、秘密情報を含むデータフォーマットとして使用することができるのです。
と書いたのですが、認識が甘かったようです。Jeremiah Grossman: Advanced Web Attack Techniques using GMail によると、配列の初期化演算子 [] の動作を外部から変更することができる注1とのこと。
実際に手元の Firefox 1.5 で試してみたところ、JSON データが配列として返される場合は、サイトをまたいで参照できるようです。コードは下記のとおり。
<script> var _Array = Array; var a = null; var Array = function () { Array = _Array; a = Array.apply(this, arguments); return a; } </script> <script src="http://target/json.js"></script> <script>document.write(a.toSource());</script>
JSON データがオブジェクトの場合は、ブロックとして解釈され多くの場合コンパイルエラーが発生するので、この問題の影響は受けることは少ないです受けません注2。文字列や数値である場合は、副作用がないので同様に問題ないということになるでしょう。
ただ、この種の攻撃 (Cross Site Including とでも呼ぶべき?) を未然に防ぐために、Ajax で返す秘密情報については、GET メソッドでのアクセスを拒否し、POST メソッドのみ許可するように設定すべきだろう、と思いました。
注1: ECMA-262 の 11.1.4 の解釈によるのですが、Firefox 以外では不可能のようです。
注2: 2006/1/7 修正: こまかな条件や Object() への攻撃可能性については、未検証です。
投稿者 kazuho : 2007年01月06日 10:07
トラックバック
このエントリーのトラックバックURL:
http://labs.cybozu.co.jp/cgi-bin/mt-admin/mt-tbp.cgi/1024