入力バリデーションはセキュリティ対策の基本

7月 16, 2013 PHP Security, Security
(Last Updated On: 2018年8月4日)

徳丸さんとはホワイトリスト VS ブラックリストの議論から楽しく話をしています。私はホワイトリスト型で対処する方がよりセキュアであると考え、徳丸さんはブラックリストも変わらない。としています。考え方が反対なので楽しいのです。残念ながらあまりブログなどに時間を取りなくないのですが、わざわざ徳丸さんがブログを書いた、とツイッターで教えていただいたので簡単に返信しておきます。

http://tumblr.tokumaru.org/post/55587596019

私は「バリデーションはセキュリティ対策とは言えない」と思っているのですが、実は「世界の常識」という点に異論があるわけではなくて、話は逆なのです。「従来からバリデーションはセキュリティ対策としてとらえられてきて『世界の常識』となっているが、実はそれはおかしいのではないか?」という問題提起をしているのです。なので、「世界の常識だろ」と言われても、それでは反論になっていません。

結論からいうと入力パラメータのバリデーションは世界のセキュリティ専門家によって非常に有用なセキュリティ対策だと認められています。

ホワイトリストの基本中の基本は”デフォルトで全て拒否する”であることに注意してください。全て拒否した上で、許可するモノ、を指定しないとホワイトリストになりません。

参考:プログラムが正しく動作するには、正しい「データ」と「コード」両方が必須。データのバリデーション(=セキュリティ対策)がない対策はあり得ない。

データのセキュリティ対策が無いセキュリティ対策?!

まずセキュリティ対策とは何か?から簡単に説明します。セキュリティ対策の多くは「解決策」でなく「緩和策」です。問題を解消するのではなく、問題が起きにくくする対策がセキュリティ対策です。例えば、どんなに強い暗号でも論理的には総当り攻撃で解読できてしまいます。そこで総当り攻撃(本当の攻撃はもっと洗練された物もあるのですが単純化するため総当り)をされても確率論的に鍵を見つけることが不可能となるように暗号は作られています。

次にどんなセキュリティ専門家達が入力のバリデーションをセキュリティ対策だ、と考えているのか紹介します。多数ある脆弱性をカタログ化しているCWEデータベース(米政府の外郭機関であるMITRE社)を管理しているスタッフとSANS(米国のセキュリティ教育、研究、コンサルティング機関)が共同で公開しているSANS/CWE TOP 25と呼ばれる有名なレポートを公開しています。

このMITRE社は皆さんもよくご存知のCVEデータベースを管理している組織でもあります。毎年多数の脆弱性がデータベース化されているCVEには、それがどのような脆弱性なのでCWE番号が付けられています。SANS/CWE TOP 25はCVEでレポートされたCWE(脆弱性)を分析し、米軍などのセキュリティ維持にも関わっているセキュリティの専門家がTOP 25の脆弱性をまとめています。

このSANS/CWE TOP 25にはTOP 25以外に「Monster Mitigations」(直訳するなら「怪物的な緩和策」でしょうか?つまりTOP25以上の緩和策という事です)を紹介しています。その#1は何でしょうか?

Establish and maintain control over all of your inputs.

直訳するなら「全ての入力の制御を確立し維持する」でしょう。これはどういう意味かというと、信頼境界線(セキュリティ用語で信用できる物とできない物の境界)を超える入力を全て管理しなさいという事です。これをどうやって実行するかというと「全て入力はバリデーション」することによって確立できるのです。

徳丸さんは「入力パラメータのバリデーションがセキュリティ対策とは思えない」と主張されますが、私と同様に世界のセキュリティ専門家は入力パラメータのバリデーションがセキュリティ対策として有用であると認めているのです。

私は英語の資料を好んで読んでいるますが、セキュリティ専門家で「入力バリデーションがセキュリティ対策ではない」などと主張する資料を見たことがありません。もしかして、日本のセキュリティ専門家には沢山いるのでしょうか?

次に入力バリデーションと入力ミスについてです。入力ミスは妥当な入力でしょうか?当然、妥当な入力です。入力バリデーションでエラーとし、処理を中止するような物ではありません。入力ミスと入力バリデーションエラーは別の物として処理します。何が入力ミスで入力バリデーションエラーなのか?それはアプリケーションによって異なりますが、入力ミスと入力バリデーションエラー(つまりあり得ない入力)の区別ができないような方はマトモなプログラムが作れるとは思えません。何故なら、どんな入力が来るのか理解していないから区別できないからです。

『「入力エラーの処理の為のエラー処理とセキュリティ処理の為のバリデーション(入力チェック)を混同」ということですが、どうやって区別するのですか?』

簡単な問題です。プログラムが「想定する入力」以外は「妥当な入力」ではありません。プログラムを作っているプログラマが想定する入力を明確に理解していないなら、どのような入力仕様なのかもう一度考えた方が良いでしょう。バリデーションをブラックリスト方式で行うのは脆弱性の原因ですから「想定する入力」をホワイトリストとしてバリデーションします。

大垣さんの意図が上記だとして、これが本当に「世界の常識」なのでしょうか?私は見たことがありません。よろしければ、ソースを示していただければと思います。もちろん、私の理解が見当違いという可能性もありますので、その場合はご指摘ください。

と徳丸さんは書かれていますが

ISOの定義など私のブログの読者は関心がないと思います。

とも書かれています。国際標準というソースを出しても、世界の米軍のITセキュリティセキュリティを守る専門家のソースを出してもこのように拒まれるようではどんなソースも意味がないのでは無いでしょうか?

私が知らないだけで、国際標準や米国のトップセキュリティ専門家に匹敵するような人々が作った標準やガイドラインで「入力チェックはセキュリティ対策ではない」とするような物をあるという事なのでしょう。是非、読ませて頂きたいのでソースがあれば教えて下さい。

次はまたエスケープの話かな?徳丸さん、時間があれば返信するのでブログを書いたら教えて下さい。

参考:

入力バリデーションを第一のセキュリティ対策としている組織/ガイドラインなど:

投稿者: yohgaki