[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のホワイトリストの実物を示すべきだと思う。書き下ろすのが大変であれば、書籍などの参照でもよいので示していただきたい。
- https://www.google.co.jp/ ×309
- http://tumblr.tokumaru.org/post/55958429832 ×38
- http://tumblr.tokumaru.org/ ×11
- http://www.tokumaru.org/ ×10
- https://www.google.com/ ×7
- http://tumblr.tokumaru.org/page/4 ×4
- http://otsune.tumblr.com/ ×3
- https://www.google.com/url?sa=t&rct=j&q=&esrc=s&so... ×2
- https://www.google.co.kr/ ×2
- http://tumblr.tokumaru.org/page/3 ×2
- http://tumblr.tokumaru.org/page/2 ×2
- http://tumblr.tokumaru.org/archive ×2
- http://matcha445.techtalk.jp/saturday-workshop/2nd... ×2
- http://getpocket.com/redirect?url=http://www.tokum... ×2
- http://devmng.yktest.allabout.co.jp/doll-search/ ×2
- https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&... ×1
- https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&... ×1
- https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&... ×1
- https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&... ×1
- https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&... ×1
- https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&... ×1
- http://www.asupara.jp/ ×1
- http://www.askapache.com/ ×1
- http://tumblr.tokumaru.org/search/大垣 ×1
- http://tumblr.tokumaru.org/post/55958429832/大垣さんと徳... ×1
- http://tumblr.tokumaru.org/page/5 ×1
- http://t.umblr.com/ ×1
- http://search.smt.docomo.ne.jp/result?search_box=ホ... ×1
- http://search.smt.docomo.ne.jp/result?MT=ホワイトリスト 基... ×1
- http://raydive.tumblr.com/archive ×1
- http://kichida.tumblr.com/post/55962842905/tumblr ×1
- http://feedly.com/i/subscription/feed/http://otsun... ×1
- http://bakera.jp/ebi/2008/8/23 ×1
- ホワイトリスティング ×10 / java ホワイトリスト ×7 / ホワイトリストでバリデーション 意味 ×2 / ホワイトリスト抜け漏れ ×1 / htmlエスケープ ホワイトリスト ×1 / Linuxでホワイトリスト ×1 / Java 8 ホワイトリスト ×1 / Excel ホワイトリストチェック ×1 / java ホワイトリスト 入力値チェック ×1 / 入力チェック ホワイト ×1 / リスティング プログラミング ×1 / ホワイトリスト式チェックによる入力値検証 ×1 / ホワイトリスト制作 危険プログラム ×1 / ホワイトリスト java ×1 / ホワイトリスチェック サンプルコード ×1 / バインディング ホワイトリスト ×1 / ホワイトリスト 作り方 ×1
[PR]小規模ECサイトに最適なWAF、SiteGuard Lite
HASHコンサルティング株式会社
最近の記事
- 2011年08月30日
- 1. RSSフィードをリダイレクトします
- 2011年07月01日
- 1.
- 2011年03月29日
- 1. PDO/MySQL(Windows版)の文字エンコーディング指定の不具合原因
- 2011年03月22日
- 1. PHP5.3.6からPDOの文字エンコーディング指定が可能となったがWindows版では不具合(脆弱性)あり
- 2011年01月27日
- 1. CSRF対策のトークンをワンタイムにしたら意図に反して脆弱になった実装例
- 2011年01月04日
- 1. escapeshellcmdの危険な実例
- 2011年01月01日
- 1. PHPのescapeshellcmdの危険性
- 2010年10月03日
- 1. 問題点の概要
- 2010年09月27日
- 1. 文字コードに起因する脆弱性を防ぐ「やや安全な」php.ini設定
- 2010年07月25日
- 1. ツッコミSPAM対策で、ツッコミ抜きのRSSフィードを用意しました
- 2010年07月01日
- 1. ぼくがPDOを採用しなかったわけ(Shift_JISによるSQLインジェクション)
- 2010年04月06日
- 1. PROXY(プロキシ)経由でのDNSリバインディングと対策
- 2010年04月05日
- 1. JavaアプレットのDNSリバインディングはJRE側で対策済みだった
- 2010年03月29日
- 1. DNSリバインディングによる無線LANパスフレーズの読み出しに成功
- 2010年03月25日
- 1. DNSリバインディングによるルータへの侵入実験
- 2010年02月22日
- 1. ケータイtwitter(twtr.jp)においてDNS Rebinding攻撃に対する脆弱性を発見・通報し、即座に修正された
- 2010年02月12日
- 1. かんたんログイン手法の脆弱性に対する責任は誰にあるのか
- 2010年01月18日
- 1. iモードブラウザ2.0のXMLHttpRequestでPOSTデータの扱いが困難になった
- 2009年10月19日
- 1. quoteメソッドの数値データ対応を検証する
- 2009年10月14日
- 1. htmlspecialchars/htmlentitiesはBMP外の文字を正しく扱えない
- 2009年10月09日
- 1. htmlspecialcharsのShift_JISチェック漏れによるXSS回避策
- 2009年09月30日
- 1. htmlspecialcharsは不正な文字エンコーディングをどこまでチェックするか
- 2009年09月24日
- 1. SQLの暗黙の型変換はワナがいっぱい
- 2009年09月18日
- 1. 文字エンコーディングバリデーションは自動化が望ましい
- 2009年09月14日
- 1. 既にあたり前になりつつある文字エンコーディングバリデーション
- 2009年08月05日
- 1. 携帯JavaScriptとXSSの組み合わせによる「かんたんログイン」なりすましの可能性
- 2009年03月28日
- 1. IPAは脆弱性の呼び方を統一して欲しい
- 2009年03月27日
- 2009年03月11日
- 1. U+00A5を用いたXSSの可能性
- 2008年12月22日
- 1. JavaとMySQLの組み合わせでUnicodeのU+00A5を用いたSQLインジェクションの可能性
入力値のバリデーションはよいとして、出力時のエスケープ処理は普通ホワイトリストと呼ばないのではないか?金床さんの本が、エスケープをブラックリストと説明していることに私は賛成ではないのだが、強いて言えばブラックリスト寄りの考え方だと思う。大垣さんの本でもhtmlspecialcharsを使った対策を説明されている(P144)。これは、「安全な文字を列挙する」アプローチではない。
-------------
出力にホワイトリスト、という概念はあまり一般的とは思っていませんが、同じ考え方が適用できます。出力の場合、「安全な文字を列挙」したり「安全なフォーマットの文字列のみ許可」するのではなく「安全な変数」のみ例外的に直接出力を許可する、と考えれば良いと思います。
現実のプログラミングでは、サブシステムに出力する場合にどうしてもエスケープ処理なしに出力しなければならない場合があります。
HTML出力の際に、アンカータグを入れたい場合、タグをエスケープしてしまっては意味が無いからです。
出力の際の「ホワイトリスティング」とは、完全に安全である変数のみ通常行うエスケープ処理を例外的に認める、事と考えています。
変数のホワイトリストを作成(通常は脳内ホワイトリスト)し、特別な例外として安全な変数のみ直接出力する、と考えれば分り易いと思います。
ブラックリスト的な思考で書かれているコードは、この例外であるべき安全だと思っている変数が直接出力されている事が非常に多いです。
他の件、今時間が無くてフォローできてません。9/27のまっちゃさんの勉強会の時にでも。