XSS脆弱性への対策について

XSS脆弱性への対策方法について勉強した。サニタイズ言うなキャンペーンにも目を通した。Webアプリケーションのセキュリティに詳しい,高木浩光先生や徳丸浩先生の考え方を含めながら,まとめてみる。

XSSとは

ソフトウェアのセキュリティホールの一つで,Webサイトの訪問者の入力をそのまま画面に表示する掲示板などのプログラムが,悪意のあるコードを訪問者のブラウザに送ってしまう脆弱性のこと。
悪意を持ったユーザがフォームなどを通してJavaScriptなどのスクリプトコードを入力した時に,プログラム側に適切なチェック機構がないと,そのスクリプト内容がそのままHTMLに埋め込まれ,ページを閲覧したコンピュータでスクリプトが実行されてしまうことがある。

サニタイズとは

Webサイトの入力フォームへの入力データからHTML,JavaScript,SQLなどを検出し,それらを他の文字列に置き換える操作のこと。「無害化」とも呼ばれ,サニタイジング操作により,入力データ中に含まれる悪意のあるHTML,JavaScript,SQLなどが解釈・実行されることを防ぐ。

サニタイズはするべきではない

ここまで見て,まず考えるのが「XSS対策としてサニタイズすれば良いのではないか」ということであるが,サニタイズはXSS対策の保険的なものであり,本来はサニタイズは推奨されない。

日本における「サニタイズ」という言葉の持つ意味やニュアンスを厳密に定義すると「入力処理で受け取ったデータに含まれる有害(別のリテラルで解釈可能)なメタ文字に対して,エスケープ処理を行うこと」となる。
ここで注意したいのは「サニタイズ」は「バリデーション」とは全く異なるという点である。バリデーションを行うことは一般的なのでここでは深く説明しないが「バリデーション」という言葉の定義は「入力処理で受け取ったデータに対してデータの妥当性をチェックすること」であり,サニタイズとは異なる。

では何故,サニタイズをしてはいけないのかということについての理由を説明する。まず,大前提として「サニタイズ」は間違った習慣が根付いてしまったものであり,本来は推奨されるべきではない,ということを念頭に置いてほしい。

サニタイズが推奨されないことには,以下の2つの理由がある。

  • プログラマの都合でユーザが入力した内容を勝手に改変するべきではない
  • サニタイズが行われるとシステムが汚染される

以下,それぞれの理由について説明する。

プログラマの都合でユーザが入力した内容を勝手に改変するべきではない

いくらセキュリティ上の危険があるからといって,ユーザーが入力した内容を勝手に改変して良い理由はない。もし,メタ文字のエスケープが必要になる入力が行われたとしたら,それは本来はエラーにするべきである。

サニタイズが行われるとシステムが汚染される

サニタイズは「スクリプトで受け取ったデータに含まれる,<>&"といったメタ文字を,JavaScriptのリテラルとして解釈できてしまう」という問題への付け焼刃的な対策方法である。だが必ずしもXSSへの対策にサニタイズを行う必要はなく,出力処理で適切にエスケープ処理を行うことでXSS脆弱性を回避することが可能である。
ここで大切なのは「サニタイズ」という言葉の定義を正しく理解することである。「サニタイズ」とは「入力処理で有害なメタ文字をエスケープ処理すること」である。「出力処理で有害なメタ文字をエスケープすること」を「サニタイズ」とは呼ばない。

ここで,どうして「入力処理」ではなく「出力処理」でメタ文字をエスケープすることにこだわるのかということについて説明する。その理由はメタ文字のエスケープ処理がシステムにもたらす「汚染」とも呼ぶべき影響範囲をなるべく小さくするためである。

ここでの「汚染」とは入力データがエスケープ処理によって本来のデータとは異なるデータに書き換えられることによって発生するシステムへの害のことを指す。
もし入力処理でメタ文字のエスケープ処理を行った場合,エスケープ処理の影響はシステム内部やDBにまで波及する。つまりシステム内部やDBにてエスケープ処理されたデータを本来のデータに戻すための2次3次的な変更が発生することになる。
一方で出力処理でメタ文字のエスケープ処理を行う場合,エスケープ処理の影響はシステム内のどこにも波及することはない。

以上の理由からXSS対策にサニタイズ(入力処理でのメタ文字のエスケープ処理)は推奨されない。

まとめ

  • XSS脆弱性の対策にはサニタイズは行わずに出力処理で適切にエスケープ処理を行う

参考
クロスサイトスクリプティングとは 【 XSS 】 【 Cross Site Scripting 】 – 意味/解説/説明/定義 : IT用語辞典
サニタイジングとは 【 sanitizing 】 〔 サニタイズ 〕 – 意味/解説/説明/定義 : IT用語辞典
高木浩光@自宅の日記 – WASF Times版「サニタイズ言うな!」
XSS再入門
XSS: 今こそXSS対策についてまとめよう – 徳丸浩の日記(2008-08-22)