ikepyonのだめ人間日記

セキュリティに関することを書いていく予定。

プログラミングではホワイトリスティングが基本

http://blog.ohgaki.net/-13
なんか違和感があるなぁと思った。
脆弱性がどこで発生するかと言うと、多くの場合、他のプログラムへの出口だと思うんですよ。入り口で閉める(ホワイトリストブラックリストでフィルタリングする)ことで、そりゃある程度の対策は取れる。なぜなら、プログラムの挙動は入力データによりある程度左右されるから。でも、それらを通過してしまってなお、攻撃が有効なケースと言うのもあるわけで。作成したプログラム単体(DBとかファイルシステムとか)使ってないと言うのであれば、話は簡単なんだけど。実際のプログラムは他のプログラムと連携を取っていて、他のプログラムの仕様は変更できないから、出口で何とかしなけりゃいけないと思うんだよなぁ(ま、いじれる自分が開発したプログラムで何とかするということ)。
ホワイトリストが基本と言われると、あらゆるデータを受け付ける必要がある仕様の場合どうすんの?ってなるんだけど・・・それが特殊って言われるとかなり違うんじゃない?と思う。
「プログラミングの基本は、どのような条件であっても常に想定した動作(仕様に沿った動作)をすること」じゃないのかなぁ?
そのための方法として、ホワイトリストエスケープ処理、ブラックリストがあるんじゃないのかなと思ったり。
じゃ、仕様に抜けがあった場合どうするか?それはもちろんエラーにしてしまうとか安全側に倒すと言うことを行う必要があるんじゃないかなぁ?仕様外のことが発生したのでどうなるかわかりませんじゃ正しいプログラムじゃないと思うんだけど、違うかなぁ?

あと、WAFでゼロデイ攻撃を防ぐってどうやるんだろう?ゼロデイ攻撃と言うのは知られていないからこそ、ゼロデイと言うのであって既知のものはゼロデイじゃないと思うんだけど。ああ、市販とかOSSの未知の脆弱性に対するものってことか?それなら理解できるけど、Webアプリのゼロデイと言うと新しいXSSの攻撃方法が見つかったとかそういうイメージがあるんだけど。そういうのってWAFじゃ防げないよね?

(追記)
独自開発のWebアプリの場合、あらゆる攻撃はゼロデイ攻撃と言うツッコミをもらったw
感覚的にWebアプリでゼロデイ攻撃と言わなくてもゼロデイ攻撃だから、意図的に言わなくてもいいんでないかという話もある。そういうわけで、ゼロデイ攻撃?と違和感があったんだw