WebKitから UTF-7が消えた経緯
この記事は 脆弱性"&'<<>\ Advent Calendar 2014 http://www.adventar.org/calendars/622 の23日目です。
WebKit の UTF-7 デコーダのバグを利用した XSS (CVE-2010-1390)がどのようなものだったのか、そろそろここでまとめようと思います。
エンコーディングがUTF-7 の場合に、以下のHTMLをSafari 5.0 / 4.1 以前でパースすると
<form id=a> <input type=text value="+"><input type=text value="- onclick=alert(document.getElementById('a').innerHTML)//"> </form>
以下のようにパースされます(?のところは実際には U+FFFD となります)。
ポイントは + の直後の " が違う文字に化けてしまっている点です。
<form id=a> <input type=text value="?><input type=text value="- onclick=alert(document.getElementById('a').innerHTML)//"> </form>
この現象に気付いたのは http://d.hatena.ne.jp/hoshikuzu/20090908#c のやり取りがきっかけです。
これを WebKit の Bugzillaに報告したら、HTML5の仕様策定の関係者から、
UTF-7を無効化しよう
という提案があり、誰からも反対意見が出されることなく、提案が通って UTF-7 が WebKit から消えました。
http://support.apple.com/en-us/HT4196
当時すでにChromeも存在していたのですが、Chrome Release の blogには修正記事が載らないまま、公式アナウンスなしで改修されてしまいました。