| SQLインジェクション対策はおすみですか? 開発開始時点からのコンサルティングから、公開済みWebサイトの脆弱性検査、 脆弱性発見後の適切な対策まで |
2008-08-20 ホワイトリスト
●プログラミングではホワイトリスティングが基本ではない
大垣さんのブログにて反論をいただいた。
長文のエントリで、「暇な方だけお付き合いください」と書かれている。あいにく締め切りを抱えていて暇ではないのだが、名指しで反論されている以上、放置するのも失礼なので、簡潔にコメントしたい。
私は、一応セキュリティの専門家の端くれのつもりで、XSS Cheat Sheetをはじめ、大垣さんや金床さんの本にも目を通している。しかし、大垣さんの上記2エントリは、私にはさっぱり理解できない。以下、プログラミングの局面で、XSS向けのホワイトリストが作成可能なのかというポイントに絞って議論する。
プログラミングの基本は仕様に忠実であること
大垣さんが具体的な「ホワイトリストの作り方」を提示してくれないので、どのようなホワイトリストをイメージしてよいのか分からない。私の主張は、以前ブログに書いている内容(アプリケーションの先頭で行う入力値検証は業務要件により行うべし)の通りだ。つまり、仕様に忠実に入力値のバリデーションを行えというだけであって、まさかこれが理解できないソフトウェア・エンジニアはいないと思う。それだけだと、XSSの対策にならないという指摘には、はいその通りと答えるしかない。それゆえ、入力値のバリデーションはXSSの保険的対策にはなっても、根本対策にはなりえない。XSS対策としては、それぞれの局面で最適なエスケープなどにより行うのが正解と考える。
大垣さんと金床さんの主張はまったく異なる
次に、大垣さんは、(私がかつて引用した)金床さんの本と大垣さんの主張は同じだという意味のことを書いておられるが、本当にそうだろうか?
金床本の3章XSS ウェプアプリケーション側の対策(P61)には、以下のような記述がある。
【前略】まずはホワイトリスト形式でのアプローチを検討するべきである。
電話番号や年齢、メールアドレスなどのように、使用可能な文字を限定できる項目について考える。これらの項目ではホワイトリスト形式でデータの確認を行った上でHTML中に埋め込むことで、確実なXSS対策を行うことが可能になる。
一方、名前や住所に代表されるような、やや自由度が高い項目も存在する。これらの項目についてはホワイトリスト形式を採ることは難しいため、ブラックリスト形式でのアプローチ、つまりエスケープ処理を行う必要がある。
これならよく分かる。しかも、表現方法は違っていても、現実的なプログラミングレベルでは、徳丸方式と金床方式は実質的な差はない。アプリケーションの仕様として数値や英字などに限定できる場合は、その文字種であることをチェックする(=業務要件チェック)が、たまたまホワイトリスト検査にもなっているというだけのことである。
そして、金床氏が書かれているように、汎用的なホワイトリストを書くことは困難であるので、仕様上自由度の高い入力欄についてはブラックリスト(あるいはエスケープ)するということで、徳丸のやり方と実質的な差はない。強いえて言えば、徳丸方式は、ホワイトリスト検査が可能なパラメタについてもエスケープを要求しているので、より念がいっているわけだし、大垣さんがご本(P26など)に書かれている「多重のセキュリティ」という考えにもかなうだろう。
一方、大垣さんの主張はこうだ。
ホワイトリストの作り方にはケースバイケースで幾つもの指針が有りますが、最も重要と言える指針は
「許容する入力・出力は必要最低限だけ留め、許容した入力・出力は確実に安全である事を保証し、もし不正な入力があった場合は必ず記録し、必要であればプログラムの実行を停止する」
です。これは私の本でも書いている事です。稀に誤解されるので書きますが「プログラムの実行を停止する」とは入力間違いで実行を停止するのではなく、不正な入力で実行停止する事を意味します。
[ホワイトリストはどう作る?より引用]
「入力間違い」と「不正な入力」をどう区別をつけるのだろう。しかもホワイトリストで。大垣さん、私は大垣さんのご本も持っていますので、長文の説明が大変であれば、本の何ページ何行目に書かれているか、ご教授いただけませんか?
それと次の内容は気になったのだが、
私はいつも基本的に能動的なセキュリティ対策を選択するようにお勧めしています。能動的なセキュリティ対策とは全ての入力値の厳格なバリデーション処理であり、出力時に過剰とも言えるエスケープ処理です。いわゆるホワイトリスティングと呼ばれるような対策です。
[ホワイトリストはどう作る?より引用]
入力値のバリデーションはよいとして、出力時のエスケープ処理は普通ホワイトリストと呼ばないのではないか?金床さんの本が、エスケープをブラックリストと説明していることに私は賛成ではないのだが、強いて言えばブラックリスト寄りの考え方だと思う。大垣さんの本でもhtmlspecialcharsを使った対策を説明されている(P144)。これは、「安全な文字を列挙する」アプローチではない。
大垣さんは、セキュリティの専門家としてXSSのホワイトリストの実物を示すべきだと思う。書き下ろすのが大変であれば、書籍などの参照でもよいので示していただきたい。
最近、自分専用Webアプリケーションをちょこちょこと作っているため、(近いうちにライブラリ的なものを公開できるレベルに達すればいいので祟..
- http://bakera.jp/ebi/topic/3217 ×138
- http://blog.ohgaki.net/-13 ×68
- http://bakera.jp/ebi/topic/3221 ×49
- http://bakera.jp/ebi ×35
- http://www.st.ryukoku.ac.jp/~kjm/security/memo/ ×33
- http://pfrb.blog114.fc2.com/blog-entry-5.html ×31
- http://yamagata.int21h.jp/d/ ×23
- http://blog.ohgaki.net/php-session ×19
- http://b.hatena.ne.jp/entry/http://www.tokumaru.or... ×19
- http://www.tokumaru.org/ ×13
- http://b.hatena.ne.jp/entry/http://blog.ohgaki.net... ×11
- http://b.hatena.ne.jp/entrylist?sort=hot&of=50&thr... ×10
- http://pfrb.blog114.fc2.com/ ×8
- http://yamagata.int21h.jp/d/?date=20080821 ×7
- http://blog.ohgaki.net/ ×7
- http://b.hatena.ne.jp/t/セキュリティ ×6
- http://www.st.ryukoku.ac.jp/~kjm/security/memo/200... ×6
- http://d.hatena.ne.jp/ockeghem/ ×6
- http://www.tokumaru.org/JavaScript/ ×6
- http://bakera.jp/ebi/2008/8/23 ×5
- http://r.hatena.ne.jp/fm8002/セキュリティ関係/ ×4
- http://b.hatena.ne.jp/entrylist?sort=hot&of=50&thr... ×4
- http://b.hatena.ne.jp/ockeghem/ ×4
- http://b.hatena.ne.jp/entrylist?sort=hot&of=100&th... ×4
- http://yamagata.int21h.jp/d/?year=2008;month=2H;ca... ×4
- http://b.hatena.ne.jp/t/security ×3
- http://www.tokumaru.org/d/20080820.html ×3
- http://d.hatena.ne.jp/monjudoh/20070807/1186505259... ×3
- http://pfrb.blog114.fc2.com/blog-category-3.html ×3
- http://d.hatena.ne.jp/teracc/20070715 ×3
- http://anond.hatelabo.jp/ ×3
- http://b.hatena.ne.jp/hasegawayosuke/ ×3
- http://b.hatena.ne.jp/cubed-l/ ×3
- http://r.hatena.ne.jp/steam_heart/ ×2
- http://blog.ohgaki.net/index.php/yohgaki/ ×2
- http://blog.ohgaki.net/?disp=comments ×2
- http://yamagata.int21h.jp/d/?date=20080820 ×2
- http://b.hatena.ne.jp/entrylist?sort=hot&of=100&th... ×2
- http://d.hatena.ne.jp/hasegawayosuke/20070625/p1 ×2
- http://labs.ceek.jp/hbnews/list.cgi?p=1&c=0 ×2
- http://www.tokumaru.org ×2
- http://codezine.jp/bookmark/?dt=20080817&g=php ×2
- http://nogue.cocolog-nifty.com/diary/2007/05/refiz... ×2
- http://www.tokumaru.org/was/ ×2
- http://mgw.hatena.ne.jp/?url=http://www.tokumaru.o... ×2
- http://b.hatena.ne.jp/ihag/ ×2
- http://www.math.sansu.org/u/diary/?date=20070604 ×2
- http://www.hash-c.co.jp/index.html ×1
- http://b.hatena.ne.jp/entrylist?sort=hot&of=1150&t... ×1
- http://r.hatena.ne.jp/oldriver/ ×1
- http://209.85.175.104/search?q=cache:7kXohO490i4J:... ×1
- http://www.hash-c.co.jp/d/ ×1
- http://b.hatena.ne.jp/t/大垣靖男 ×1
- http://b.hatena.ne.jp/hasegawayosuke/20080821 ×1
- http://b.hatena.ne.jp/u--san/ ×1
- http://labs.ceek.jp/hbnews/ ×1
- http://b.hatena.ne.jp/t/DBMS ×1
- http://b.hatena.ne.jp/nilnil/favorite ×1
- http://yamagata.int21h.jp/d/?category=ALL;year=200... ×1
- http://b.hatena.ne.jp/keyword/セキュリティ ×1
- http://b.hatena.ne.jp/Kanatoko/favorite ×1
- http://takagi-hiromitsu.jp/diary/200806.html ×1
- http://wassr.jp/mobile_redirecter/?url=http://www.... ×1
- http://codezine.jp/bookmark/?dt=20080819 ×1
- http://b.hatena.ne.jp/entrylist?sort=hot&of=150&th... ×1
- http://b.hatena.ne.jp/entrylist?sort=hot&of=50&thr... ×1
- http://b.hatena.ne.jp/ohsuga/windows/?mode=detail ×1
- http://catbot.sakura.ne.jp/planetphpjapan/ ×1
- http://blog.ptlabo.net/index.php?id=08070066 ×1
- http://b.hatena.ne.jp/ockeghem/大垣靖男/ ×1
- http://anond.hatelabo.jp/?page=5 ×1
- http://yamagata.int21h.jp/d/?date=20080601 ×1
- http://pfrb.blog114.fc2.com/?tag=インジェクション ×1
- http://d.hatena.ne.jp/ockeghem/20071210/p1 ×1
- http://b.hatena.ne.jp/entrylist?sort=hot&of=950&th... ×1
- http://fastladder.com/subscribe/http://www.tokumar... ×1
- http://b.hatena.ne.jp/kazuhooku/ ×1
- http://labs.cybozu.co.jp/blog/takesako/2007/08/lls... ×1
- http://anond.hatelabo.jp/?page=10 ×1
- http://b.hatena.ne.jp/entrylist?sort=hot&of=150&th... ×1
- http://b.hatena.ne.jp/hiro_y/ ×1
- http://b.hatena.ne.jp/knzm_img/favorite ×1
- http://b.hatena.ne.jp/mincemaker/sql/ ×1
- http://b.hatena.ne.jp/fbis/favorite ×1
- http://b.hatena.ne.jp/entrylist?sort=hot&of=200&th... ×1
- http://a.hatena.ne.jp/yamagata21/ ×1
- http://labs.ceek.jp/hbnews/list.cgi?k=5 ×1
- http://b.hatena.ne.jp/t/エスケープ ×1
- http://b.hatena.ne.jp/ihag/?mode=detail ×1
- http://d.hatena.ne.jp/ockeghem/searchdiary?word=SQ... ×1
- http://b.hatena.ne.jp/entry/9255117 ×1
- http://okyuu.com/ja/tips/986 ×1
- http://b.hatena.ne.jp/cubed-l/20080821 ×1
- http://labs.ceek.jp/hbnews/list.cgi?k=5&p=2&c=0 ×1
- http://b.hatena.ne.jp/ockeghem/security/sqlインジェクショ... ×1
- http://clip.livedoor.com/site/www.tokumaru.org?p=2... ×1
- http://209.85.175.104/search?q=cache:FC8LJ8TBxK4J:... ×1
- http://b.hatena.ne.jp/pero1/favorite?of=40 ×1
- http://b.hatena.ne.jp/Kanatoko/?of=20 ×1
- http://209.85.175.104/search?q=cache:t4Ux8QYXLioJ:... ×1
- キーワード不明 ×23 / 画像 XSS ×15 / mod_imagefight ×13 / SQL エスケープ ×9 / sql エスケープ ×5 / DNS Rebinding ×4 / ホワイトリスト形式 ×4 / javascript break ×4 / XSS ホワイトリスト ×3 / SQLインジェクション 入力値チェック ×2 / SQL 文字列 数値 比較 自動変換 ×2 / session_set_save_handler ×2 / 徳丸浩 ×2 / ホワイトリスティングとは ×2 / javascript for break ×2 / MS SQL Server エスケープ ×2 / WAF ×2 / session_set_save_handler 脆弱性 ×2 / IE7 MIME 判別 ×2 / xss コンテキスト エスケープ ×2 / sql '&' エスケープ ×1 / 暗黙の型変換 SQL ×1 / ウイルス ホワイトリスト方式 ×1 / oracle sql エスケープ文字 ×1 / PHP セッション管理 サンプル ×1 / クロスサイトスクリプト バリデーション処理 ×1 / sql oracle update シングルクォート 囲む ×1 / session_set_save_handler サンプルコード ×1 / pg_escape_string ×1 / php エスケープ ホワイトリスト ×1 / プログラミング 処理速度 検証 ×1 / SQLSERVER エスケープ ×1 / mysql インジェクション 文字列 ×1 / ruby :type png イメージ content ×1 / postgres SQLインジェクション ×1 / SQL エスケープ ×1 / WAF ホワイトリスト ブラックリスト ×1 / sqlインジェクション 言語 多い ×1 / PHP タグ ホワイトリスト ×1 / SQL インジェクション対策再考 ×1 / SiteGuard セッション管理 ×1 / jpg クロスサイト ×1 / db2 sql escape ×1 / ホワイトリスト方式 XSS 作り方 ×1 / IIS クエリストリング 禁止 ×1 / oracle 数値チェック 関数 ×1 / セキュリティ 入力値 バリデーション ×1 / マジックバイト ×1 / ホワイトリスト 入力値 検証 ×1 / WAF ホワイトリスト ×1 / エスケープ処理 ホワイトリスト方式 ×1 / +with文 +"sql server" ×1 / SQL 暗黙 型変換 ×1 / Switch break for ×1 / ホワイトリスト ×1 / メタキャラクタ SQL ×1 / javascript escape ユニコード 変換 無効 ×1 / break JavaScript ×1 / SQL エスケープ文字 ×1 / php pg_escape_string エスケープされる文字列 ×1 / php sql インジェクション セミコロン ×1 / html ホワイトリスト ruby ×1 / パストラバーサル ×1 / BMP javascript 埋め込み ×1 / T/SQL JAVA ×1 / XSS テスト ×1 / java ラベル付き break 文 ×1 / SQL % エスケープ ×1 / oracle sql リテラル true ×1 / sql エスケープ % ×1 / データベース 円記号 エスケープ ×1 / ラベル付きbreak ×1 / SQLインジェクション 対策 ×1 / データベース エスケープ 記号 ×1 / エスケープ インジェクション 文字 ×1 / javascript エスケープ 金床 ×1 / break javascript ×1 / エスケープ文字 sql ×1 / mod_imagefight, ×1 / 徳丸 Web ×1 / ホワイトリスティング ×1 / sql エスケープ ×1 / php 日記 ×1 / IPS WAF ×1 / PHP 脆弱性 ファイル名 ×1 / SQLsever IIS データベース ×1 / 高木 脆弱性 検証 ×1 / PHP 脆弱性 チェック ×1 / sqlserver 複数 シングルクォート エスケープ ×1 / WAF ブロック ×1 / sybase 複文 ×1 / 暗黙の型変換 Oracle ×1 / バリデーション ホワイトリスト ×1 / LAC WAF ×1 / sql \ 文字列 エスケープ ×1 / ホワイトリスト ブラックリスト ×1 / "sql server" エスケープ like ×1 / ? エスケープ ×1 / sqlインジェクション エスケープ処理 方法 ×1 / XSS ブラックリスト ×1
| SQLインジェクション対策はおすみですか? 開発開始時点からのコンサルティングから、公開済みWebサイトの脆弱性検査、 脆弱性発見後の適切な対策まで |
入力値のバリデーションはよいとして、出力時のエスケープ処理は普通ホワイトリストと呼ばないのではないか?金床さんの本が、エスケープをブラックリストと説明していることに私は賛成ではないのだが、強いて言えばブラックリスト寄りの考え方だと思う。大垣さんの本でもhtmlspecialcharsを使った対策を説明されている(P144)。これは、「安全な文字を列挙する」アプローチではない。
-------------
出力にホワイトリスト、という概念はあまり一般的とは思っていませんが、同じ考え方が適用できます。出力の場合、「安全な文字を列挙」したり「安全なフォーマットの文字列のみ許可」するのではなく「安全な変数」のみ例外的に直接出力を許可する、と考えれば良いと思います。
現実のプログラミングでは、サブシステムに出力する場合にどうしてもエスケープ処理なしに出力しなければならない場合があります。
HTML出力の際に、アンカータグを入れたい場合、タグをエスケープしてしまっては意味が無いからです。
出力の際の「ホワイトリスティング」とは、完全に安全である変数のみ通常行うエスケープ処理を例外的に認める、事と考えています。
変数のホワイトリストを作成(通常は脳内ホワイトリスト)し、特別な例外として安全な変数のみ直接出力する、と考えれば分り易いと思います。
ブラックリスト的な思考で書かれているコードは、この例外であるべき安全だと思っている変数が直接出力されている事が非常に多いです。
他の件、今時間が無くてフォローできてません。9/27のまっちゃさんの勉強会の時にでも。