CVE-2015-1729(fixed by MS15-065)

そろそろ2015年7月のWindows定例アップデートで修正された CVE-2015-1729(MS15-065)の内容の解説と対策を書こうと思います。

PoC

以下のような CSV (http://example.jp/target.csv)があったとします。

a,b
c,d

これはIE9以降に以下のような攻撃コードを与えることで内容を読み取ることが可能でした。

<script>
window.onerror=function(){alert(arguments.callee.caller);};
</script>
<script src="http://example.jp/target.csv"></script>

このバグは、JavaScript として読み込ませると実行時エラーになるようなデータがある場合に、クロスオリジンの制約が働かずに、arguments.callee.caller によってエラー発生部分のコードのほぼ全体が取得できるというものでした。

修正前の表示

修正後の表示

Q4

実はこのPoC と先日の Q4 - masa’s memoスクリプトの置かれているオリジンが異なっている点以外ほとんど同じです。

攻撃可能なデータ形式

  1. CSV
  2. Windowsの iniファイルの形のデータ
  3. 頭に throw文 を付けたJSON
  4. JavaScriptの途中に秘密データが埋まっているもの

JavaScriptでトラップされない実行時エラーが出た時点で負けです。JSONの頭にthrow文を書くというJSONハイジャック対策は、逆にこの攻撃に脆弱になってしまいます。

クライアント側の対策

 Windows UpdateInternet Explorer を更新してください。問題が発生する全てのバージョンに修正がリリースされています。

Webアプリケーション側の対策

 問題が発生するのはIE9以降なので

X-Content-Type-Options: nosniff

JavaScriptではないデータ形式のものは完全に攻撃を防ぐことが可能です。
参考 機密情報を含むJSONには X-Content-Type-Options: nosniff をつけるべき - 葉っぱ日記