対策としての入力値チェックは……
2008年8月23日(土曜日)
対策としての入力値チェックは……
まっちゃ445の懇親会で、大垣さんと徳丸さんとのやりとりが話題になっていました。
- ホワイトリストはどう作る? (blog.ohgaki.net)
- ホワイトリスト方式の優位は神話 (www.tokumaru.org)
- プログラミングではホワイトリスティングが基本 (blog.ohgaki.net)
- プログラミングではホワイトリスティングが基本ではない (www.tokumaru.org)
- 今こそXSS対策についてまとめよう (www.tokumaru.org)
……なんというか、何について議論されているのかがよく分からない感じがしますね。
徳丸さんは以下のように述べられていますが、
入力値チェックはアプリケーションの仕様に従っておこなうしかない。
以上、今こそXSS対策についてまとめよう より
これは「ホワイトリストかブラックリストか」という以前の話で、そもそも入力値チェックをXSSの「対策」とすること自体が不適切なのだ、と言われているのだと思います。これはその通りだと思います。
たとえば、このサイトには掲示板があり、コメントを書くことができます。そこで入力されるコメントに対して、どういう入力値チェックを行うことができるでしょうか。ちなみに、このサイトではHTMLの書き方やXSS脆弱性の攻撃パターンについて議論されることがありますから、<script> などが含まれていたらエラーにする、という処理をされては困ります。
結論としては何でも書けて良いわけで、あえて言うなら制御文字を取り除いたり、長さチェックをしたりするくらいでしょう。もちろん、これらはXSS対策ではなく、「アプリケーションの仕様」によるチェックに過ぎません。
……というわけで、このようなケースでは、そもそも「入力値チェックで脆弱性を防ぐ」なんてことは一切できないのですね。では脆弱になるのかといえば、そんなことはありません。単に、入力された内容を#PCDATAの内容として問題ないように、< を < にしたりして出力すれば良いだけです。
※もちろん、#PCDATA でないところに出力する場合は別な処理が必要になることがあります。
入力値チェックをしなくても、XSSは防げるのです。必要なのは、HTMLを正しく表示することだけです。
しかし、入力値チェックでXSSを防がなければならないようなケースも存在します。それは、入力されたHTMLを文字列として表示するのではなく、マークアップとして有効にしようとしているようなケースです。その場合、<em> は OK だが <em onclick="……"> は NG とする……といった複雑なチェックが必要になってきます。これは脆弱性対策のための入力値チェックだと言えるでしょう。
※もっとも、この場合にも、どのタグを許可するのかは仕様で定められるでしょうから、アプリケーションの仕様に従ったチェックをするだけであるとも言えます。
……と、ここまでが通常の前提の話。最近ではこれに加えて、「アプリケーションがちゃんと作られている自信がないから、予防的対策として……」という微妙な話があったりします。この場合、アプリケーションやWAFによって入力値チェックが行われますが、あくまで予備的なものです。本質的な部分の話ではないということに注意する必要があるでしょう。
※こういう対策をするべきのなのかどうか……という議論もあるでしょうが、まあここではその議論は置いておくとしましょう。
まとめると、XSSと入力値チェックとの関係には、以下の3つのケースがあるのではないかと思うのです。
- 通常のケース: 基本的に、XSS脆弱性を防ぐために入力値チェックは必要ない。
- 特殊なケース: タグをマークアップとして有効にするようなケースでは、入力値チェックをしなければならないことがある。
- 予防的対策: 本質的でない部分で、予防的対策として入力値チェックが行われることもある。
最初のケースについてはそもそもチェックが不要なのですから、ホワイトリストもブラックリストも関係ありません。ホワイトリストかブラックリストか、という話は後二者に関連してくる話ですが、特殊ケースにおけるチェックと、予防的対策におけるチェックではまた事情が異なってくると思います。
このあたりがもう少し整理されると、議論が分かりやすくなったりするのかもしれません。
- 「対策としての入力値チェックは……」へのコメント (1件)
関連する話題: セキュリティ / まっちゃ445勉強会
- 前(古い): 第01回まっちゃ445勉強会: ライトニングトーク
- 次(新しい): System.Uriに%2fが入らない