« クロスサイトのセキュリティモデル | メイン | 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