2016の21日目の記事ということにします!俺たちのクリスマスはこれからだ!怒涛のブラウザのXSS保護機能のバイパスネタです。Auditorのバイパスを発見しました。以前紹介したベクターがChromeの先行バージョンで塞がれはじめ、そろそろ新しい方法を発見しなければと思っていたところだったのでちょうどよかったです。今回はobject要素とparam要素を使ってバイパスします。57で動作することを確認しています。AuditorはFlashをロードできてしまうような、危険なparam要素をブロックしようとします。中にURLをロードできるparam要素かどうかのチェックがあり、これがXSSAuditorのコードから呼ばれます。場合をチェックし、マッチした場合はフィルターが遮断するようになっています。data=を使うのが一般的ですが、Chromeの場合はparam要素からもロードすることができるようです。実際に動作することをみてみましょう。以下のURLからスクリプトの実行を確認できます。Auditorをオフに制御しています。Auditorにブロックされるname=dataでは、少なくともFlashは動作しませんでした。この部分は、あまり考えずに追加されているか、あるいは以前XSSできたプラグインがあったと推測しますが、詳細は不明です。Auditorにさえ見落とされていることがわかりました。こちらがその方法です。name属性の値をurlという文字列に変えただけです。value=https://l0.cm/xss.swf>または、codeとしても動くようです。value=https://l0.cm/xss.swf>これらの値は、HTMLObjectElement.cppを見て発見しました。stripLeadingAndTrailingHTMLSpaces(p->value());srcやmovieなどと一緒に、codeとurlも書かれていたので、もしかしたらロードできるかもと思って試したらすんなり動いたというかんじでした。この動作、ソースコードのコメントを見ると、互換性のために残してあるといったことが書いてありますが、この方法ではIE/EdgeやFirefoxではFlashはロードされませんでした。Chromeが互換性という言葉を口にして自分だけ罠にハマっているパターンは珍しいですね。シンプルな反射型XSSさえあれば利用可能かつページを開いてからのユーザ操作も不要で、かなり有能なベクターだと思います。ちなみに、バイパスは以下で報告済みです。Auditorのバイパスはいつもノーマルバグとして扱われるので、そのうち見れるようになるはずです。