www\.google\.com に存在する文字エンコード切り替えによるSelf-XSS
First published Sat Aug 23 23:57:12 2014 +0900 ; substantive revision Sat Feb 14 12:41:39 2015 +0900
まとめ
- 密かに細工されたページやGoogleの検索結果画面で、文字化けを直すためにエンコーディングを切り替えるとログインしているGoogleアカウントから情報が漏れる脆弱性がある。
- Googleのセキュリティチームは、ユーザーは手動でエンコーディングを切り替えるべきではないと考えているので、この脆弱性は修正されない。
概要
以下のページでエンコーディングをShift_JISに切り替えると www\.google\.co\..* 上でXSSが発動します。
PoC 1: Googleマップのiframe埋め込み
http://www.tsg.ne.jp/nolze/static/google_self_xss_iframe_hidden.html
動作の原理は Masato Kinugawa Security Blog: エンコーディングの切り替えによるSelf-XSSを考える でわかりやすく説明されています。ほとんどのブラウザで動作します。
PoC 2a: Google検索の疑似文字化け
これは個人的に面白いケースでした。Google検索の X-Frame-Options は SAMEORIGIN になっているため埋め込みに制限があるので、1の手法は使えません。ただ、Googleがウェブ検索エンジンである特性上、文字化けしたクロール結果をうまく表示させることで、正しいエンコーディングの状態で文字化け「風」の画面を示すことができます。原理的にはShift_JIS→UTF-8の文字化けであるべきなのですが、文字化けの見た目とエンコーディングの対応まで覚えている人はそんなに多くなさそうので、簡単に見つかるUTF-8→Shift_JISにしました。
バグは音声検索のスニペットにあるので、普通の検索だけでなく画像検索や動画検索でも動作します。IEではフィルタ回避を挟む必要があり、Google Chromeでは検索結果ページの手動エンコーディング指定が無視されるので動作しません。
PoC 2b:
(ブラウザベンダーと調整中)
Googleに可能な対策の例
- JavaScript内に動的生成する文字列を \uXXXX の形で出力する
ユーザーに可能な対策の例
- エンコーディングを変える時はソースコードを読む
経緯
この件は2014年8月上旬にまとめて報告したのですが、最終的にGoogleのセキュリティチームからは以下のような回答を得ました。
- これらはセキュリティバグではない
- 修正の予定はない
- すぐに情報を公開してよい
興味深いのはその理由で、彼らの見解は次の通りでした。
Users shouldn't change the encoding and they would be fine.
▂▅▇█▓▒░(‘ω’)░▒▓█▇▅▂
まず最初の返信でこう言われたあと、2回のやり取りを使って担当者に「日本語圏では文字化けしたページでエンコーディングを変えるのは特殊な操作ではない」ということを説明したものの、残念ながらパネルの結論で結局この見解に戻ってしまいました。
もっともGoogleのセキュリティチームの人間が誰もエンコーディング絡みの問題を認識していないはずはなく、例えば大御所 Michal Zalewski はまあまあ早い時期に今はブラウザ側でも対策されている似たケースをブログで取り上げています。
lcamtuf’s blog: Using View > Encoding can kill you (in a manner of speaking)
パネルには Zalewski もいますし、今回の判断もこの流れを汲んでいるようですが、彼の記事内のデモや「完全に信頼できるページ以外では文字エンコードを切り替えるべきではない」という結論を見る限りでは、どうも「文字化けしたページでエンコーディングを変える」という行為のカジュアルさをあまり勘案していない気がします(そもそも最初はスクリーンショットを送っても正常な表示と文字化けの違いが理解されなかった)。加えて PoC 2 は彼の見立てに反して信頼できるページでもエンコーディング切り替えが安全とは限らないという例になっています。
同じXSSでも典型的なXSSとSelf-XSSではリスク評価に差があるのは当たり前ですが、今回のように重要性のあるページに存在するエンコーディング切り替えによるXSS脆弱性を修正しないということが一般化してしまうと、「エンコーディングを切り替えて文字化けを直す」という普通の操作があらゆるページで過剰なリスクを伴うことになってしまいます。Googleのセキュリティチームは正しく問題を認識した上での判断ができていない印象を受けました。
また、この記事の公開前に、Googleによるもの以外のいくつかのWebサービスについても同種の問題に関してきちんと対策されていることを確認していますが、実はGoogle自身のWebサービスも基本的に全てきちんと対策されているので、報告の対象となったページに限って直さなくていいということになるのも不思議なところです。
この記事を読んだ誰かが、彼らに修正に値するバグであることをうまいこと納得させてくれることを願っています。