WebKitから UTF-7が消えた経緯

この記事は 脆弱性"&'<<>\ Advent Calendar 2014 http://www.adventar.org/calendars/622 の23日目です。

WebKitUTF-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-7WebKit から消えました。
http://support.apple.com/en-us/HT4196
当時すでにChromeも存在していたのですが、Chrome Release の blogには修正記事が載らないまま、公式アナウンスなしで改修されてしまいました。