【セキュリティ】DOM Based XSSを調べてみた【覚書】


 

ページ概要

XMLhttpParser (XHP)の問題が今でもよく起きているそうです。 XHPが htmlと解釈されるときに XSS問題となりうる可能性があります。  発生箇所はサーバから、クライアントへの通信で起きています。 対策として、「htmlを直接操作しないでtextにエスケープする。」「扱うURLは限定する」ことなどがポイントです。 症状はXSSと同じ、JavaScript等の実行が任意のユーザから行われることが問題になります。

タイプ

(1) Reflected XSS (or Non Persistent) サイトから、文字(HTML書き換え処理)をそのまま返信(被害者のブラウザで実行されてしまう)するタイプ (2)Stored XSS サイトに文字列としてスクリプト自身を格納するタイプ 表示するときに、無意識に入力したURLで自ら実行者となり、被害者のブラウザで実行されてしまいます。 (3)Dom Based XSS サイトが動的にページを生成し、その時ユーザから任意のタグを入れた箇所を出力するタイプ いずれも、トリガーは、「メール経由で被害者にその脆弱サイトのページのURLを書いたメールを送る」ことで、ユーザのブラウザである文字列を表示(脆弱性のあるサイト/クライアントシステムでは、特殊な処理を実行)する。

これらの端的な共通項はないかまとめ ると

いずれも Webページ出力処理に問題があるケース

問題の特徴

本質的にはDOMの場合も ユーザからの情報であれば、サニタイジングが必要。 Webアプリで多く、 アクセス解析に問題があるケースもある。  サーバを介さないページでも問題は発生している。

NGな環境、OKな環境

IE8,9は エンコードされずそのまま出力してしまう。 FireFox17.0.1 やChrome24, Safari 5.1.7 Opera12.11 ならOK jQueryの古い版 はNGだが、jQuery Mobile Beta2 で対応済み。

問題箇所:実は、具体的に考えておかないと、対応しきれない

開発者の気づきにくいところがあり、そこで問題が起こる。 例えばエンドユーザが使える機能にリファラーがある 。ページ解析の時も使われているが、refereは気づきにくい。ひとつ前のサイトやページで間接的に特殊文字列を渡される。 その他にも  サーバを介さないページでも問題は発生している どうやって? ⇛実はIE、FireFox、その他多くのクライアントにおいて#以降の文字列はサーバサイドに送出せず、クライアント内で処理を行います。 サーバ側でURLをエンコードしても無理です。 どんな時か? ⇛TinyURLなどもある。直接的にエンコードできない。

問題のある実装例

innerHTML document.write() の箇所で問題が起こっている。 動的に作成したurlについては全ブラウザで javascriptが実行される。 refererについては、 IEの古いバージョン8,9でのみエンコードされなかった。

対応例

  • innerTextにしたり createElementしたりする 。つまり htmlとして解釈させない。または標準ライブラリでエンコードさせる。
  • URLを動的に作成するときも制限、またはエンコードする。
  • jQueryのライブラリを最新にする。
  • IE8以降ならOption をヘッダに設定します(textエンコードしてくれず、htmlと自動解釈してしまう問題がある)。
  • chromeを最新にする。古い版ではchromeの拡張機能で、アドオン内のローカルファイルにアクセスできる。(cookieと少し違うだけのlocalStorageのWeb技術と連携して、情報が取得できる問題があるので)
 

Optionについて

特に重要なオプション設定は以下の設定です。 X-XSS-Protection:XSSフィルタの有効/無効 X-Frame-Options:コンテンツのフレーム内における表示を許す/許さない X-Content-Type-Options:内容からのコンテントタイプの推測をする/しない Content-Security-Policy:スクリプトのロードと実行等に強い制約を設ける

まとめ

ajaxや DOMなどで 出力する時は全てText形式で出力するように心がける。サーバ側で直接見えない処理とは関係なさそうな思わぬところにURLと連携する問題が潜んでることもある。
この件に関しては、IPAのサイトがわかりやすいです。対応例や、問題を起こすコードなどまとまっています。
Delicious にシェア
Digg にシェア
reddit にシェア
LinkedIn にシェア
LINEで送る
email this
Pocket

267 views.



One thought on “【セキュリティ】DOM Based XSSを調べてみた【覚書】

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です