[PR]小規模ECサイトに最適なWAF、SiteGuard Lite

徳丸浩の日記


2008年08月20日 ホワイトリスト

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

大垣さんのブログにて反論をいただいた。

長文のエントリで、「暇な方だけお付き合いください」と書かれている。あいにく締め切りを抱えていて暇ではないのだが、名指しで反論されている以上、放置するのも失礼なので、簡潔にコメントしたい。

私は、一応セキュリティの専門家の端くれのつもりで、XSS Cheat Sheetをはじめ、大垣さんや金床さんの本にも目を通している。しかし、大垣さんの上記2エントリは、私にはさっぱり理解できない。以下、プログラミングの局面で、XSS向けのホワイトリストが作成可能なのかというポイントに絞って議論する。

プログラミングの基本は仕様に忠実であること

大垣さんが具体的な「ホワイトリストの作り方」を提示してくれないので、どのようなホワイトリストをイメージしてよいのか分からない。私の主張は、以前ブログに書いている内容(アプリケーションの先頭で行う入力値検証は業務要件により行うべし)の通りだ。つまり、仕様に忠実に入力値のバリデーションを行えというだけであって、まさかこれが理解できないソフトウェア・エンジニアはいないと思う。それだけだと、XSSの対策にならないという指摘には、はいその通りと答えるしかない。それゆえ、入力値のバリデーションはXSSの保険的対策にはなっても、根本対策にはなりえない。XSS対策としては、それぞれの局面で最適なエスケープなどにより行うのが正解と考える。

大垣さんと金床さんの主張はまったく異なる

次に、大垣さんは、(私がかつて引用した)金床さんの本と大垣さんの主張は同じだという意味のことを書いておられるが、本当にそうだろうか?

金床本の3章XSS ウェプアプリケーション側の対策(P61)には、以下のような記述がある。

【前略】まずはホワイトリスト形式でのアプローチを検討するべきである。

 電話番号や年齢、メールアドレスなどのように、使用可能な文字を限定できる項目について考える。これらの項目ではホワイトリスト形式でデータの確認を行った上でHTML中に埋め込むことで、確実なXSS対策を行うことが可能になる。

 一方、名前や住所に代表されるような、やや自由度が高い項目も存在する。これらの項目についてはホワイトリスト形式を採ることは難しいため、ブラックリスト形式でのアプローチ、つまりエスケープ処理を行う必要がある。

これならよく分かる。しかも、表現方法は違っていても、現実的なプログラミングレベルでは、徳丸方式と金床方式は実質的な差はない。アプリケーションの仕様として数値や英字などに限定できる場合は、その文字種であることをチェックする(=業務要件チェック)が、たまたまホワイトリスト検査にもなっているというだけのことである。

そして、金床氏が書かれているように、汎用的なホワイトリストを書くことは困難であるので、仕様上自由度の高い入力欄についてはブラックリスト(あるいはエスケープ)するということで、徳丸のやり方と実質的な差はない。強いえて言えば、徳丸方式は、ホワイトリスト検査が可能なパラメタについてもエスケープを要求しているので、より念がいっているわけだし、大垣さんがご本(P26など)に書かれている「多重のセキュリティ」という考えにもかなうだろう。

一方、大垣さんの主張はこうだ。

ホワイトリストの作り方にはケースバイケースで幾つもの指針が有りますが、最も重要と言える指針は

「許容する入力・出力は必要最低限だけ留め、許容した入力・出力は確実に安全である事を保証し、もし不正な入力があった場合は必ず記録し、必要であればプログラムの実行を停止する」

です。これは私の本でも書いている事です。稀に誤解されるので書きますが「プログラムの実行を停止する」とは入力間違いで実行を停止するのではなく、不正な入力で実行停止する事を意味します。

[ホワイトリストはどう作る?より引用]

「入力間違い」と「不正な入力」をどう区別をつけるのだろう。しかもホワイトリストで。大垣さん、私は大垣さんのご本も持っていますので、長文の説明が大変であれば、本の何ページ何行目に書かれているか、ご教授いただけませんか?

それと次の内容は気になったのだが、

私はいつも基本的に能動的なセキュリティ対策を選択するようにお勧めしています。能動的なセキュリティ対策とは全ての入力値の厳格なバリデーション処理であり、出力時に過剰とも言えるエスケープ処理です。いわゆるホワイトリスティングと呼ばれるような対策です。

[ホワイトリストはどう作る?より引用]

入力値のバリデーションはよいとして、出力時のエスケープ処理は普通ホワイトリストと呼ばないのではないか?金床さんの本が、エスケープをブラックリストと説明していることに私は賛成ではないのだが、強いて言えばブラックリスト寄りの考え方だと思う。大垣さんの本でもhtmlspecialcharsを使った対策を説明されている(P144)。これは、「安全な文字を列挙する」アプローチではない。

大垣さんは、セキュリティの専門家としてXSSのホワイトリストの実物を示すべきだと思う。書き下ろすのが大変であれば、書籍などの参照でもよいので示していただきたい。

本日のツッコミ(全1件) [ツッコミを入れる]
_ yohgaki (2008年08月27日 12:45)

入力値のバリデーションはよいとして、出力時のエスケープ処理は普通ホワイトリストと呼ばないのではないか?金床さんの本が、エスケープをブラックリストと説明していることに私は賛成ではないのだが、強いて言えばブラックリスト寄りの考え方だと思う。大垣さんの本でもhtmlspecialcharsを使った対策を説明されている(P144)。これは、「安全な文字を列挙する」アプローチではない。
-------------

出力にホワイトリスト、という概念はあまり一般的とは思っていませんが、同じ考え方が適用できます。出力の場合、「安全な文字を列挙」したり「安全なフォーマットの文字列のみ許可」するのではなく「安全な変数」のみ例外的に直接出力を許可する、と考えれば良いと思います。

現実のプログラミングでは、サブシステムに出力する場合にどうしてもエスケープ処理なしに出力しなければならない場合があります。

HTML出力の際に、アンカータグを入れたい場合、タグをエスケープしてしまっては意味が無いからです。

出力の際の「ホワイトリスティング」とは、完全に安全である変数のみ通常行うエスケープ処理を例外的に認める、事と考えています。

変数のホワイトリストを作成(通常は脳内ホワイトリスト)し、特別な例外として安全な変数のみ直接出力する、と考えれば分り易いと思います。

ブラックリスト的な思考で書かれているコードは、この例外であるべき安全だと思っている変数が直接出力されている事が非常に多いです。

他の件、今時間が無くてフォローできてません。9/27のまっちゃさんの勉強会の時にでも。

本日のリンク元
アンテナ
その他のリンク元
検索


[PR]小規模ECサイトに最適なWAF、SiteGuard Lite

ockeghem(徳丸浩)の日記はこちら
HASHコンサルティング株式会社

最近の記事

最近のツッコミ

  1. yohgaki (08-27)
Google