| SQLインジェクション対策はおすみですか? 開発開始時点からのコンサルティングから、公開済みWebサイトの脆弱性検査、 脆弱性発見後の適切な対策まで |
2008-07-16 ホワイトリストとブラックリスト
●ホワイトリスト方式の優位は神話
近々WAF(Web Application Firewall)の話題を取り上げたいと思っている(→WAFの話題はこちら)。WAFの説明には決まってホワイトリストとブラックリストという用語が出てくる。しかし、WAFの宣伝やブログなどのエントリを読んでいると、ホワイトリストやブラックリストという言葉に対する誤解があるように見受けられる。そのため、WAFの話題の前に、この二つの用語の説明をしておきたいと思う。
ごく大雑把に言って、ホワイトリストは「怪しくない人・モノ」を列挙したもの、ブラックリストは「怪しい人・モノ」を列挙したものだ。これらのうち、日常生活でなじみのある用語はブラックリストだろう。クレジットカードの支払いを延滞すると「ブラックリスト」に名前が載り以降しばらくカードが作れなくなるとか、テロ組織のメンバーの名前が書かれた一覧表も「ブラックリスト」と呼ばれる。
最近話題の携帯コンテンツのフィルタリングについても「ホワイトリスト」方式と「ブラックリスト」方式の是非が議論された。この場合は、青少年の閲覧に問題ないサイトの一覧が「ホワイトリスト」、問題が想定されるサイトの一覧が「ブラックリスト」となる。
さて、問題はこの二つの方法論の使い分けだ。冒頭に述べたようにセキュリティ業界ではなにかとホワイトリストの人気が高いようだが、この傾向はWAF分野において顕著だ。以下は、とあるWAFの宣伝文句であるが、ホワイトリスト方式の利点が高らかにうたわれている。
・・・のWAF機能は、ポジティブ・セキュリティと呼ばれるホワイトリスト方式を採用している。これはポリシーによって正しいと定義されたトラフィックのみに、Webアプリケーションへのアクセスを許可する方式。不正アクセスをブラックリスト方式で識別するIDC(不正侵入検知システム)やIDP(不正侵入防御システム)では常にリストを更新する必要があるが、ホワイトリスト方式なら頻繁な更新は不要で、新しい攻撃に対する防御能力も高い。 引用元
一例のみ紹介したが、このような題材を探すには苦労しない。そして、そのような説明の多くが、ブラックリスト=古くて劣ったもの、ホワイトリスト=新しくて優れたもの、という調子だ。引用した文もそうなっているが、ホワイトリスト方式=ポジティブ、ブラックリスト方式=ネガティブという用語も(こう呼ぶ意味はあるのだが)ホワイトリスト方式の優位を印象付ける。
しかし、である。本当にホワイトリストが優れていて、ブラックリストが劣っているのであれば、法律かなにかでブラックリスト方式を禁止し、今後はホワイトリスト方式のみを採用するようにすべてのセキュリティベンダに強制すべきではないのか。現実にはそんなことはできないのであって、例えばウィルス対策ソフトをホワイトリスト方式で実装することは不可能だ。ホワイトリストとブラックリストにはそれぞれ長所と短所があって使い分けをすべきものであり、どちらが優れているとか劣っているというものではないのだ。
右の図はホワイトリストとブラックリストの位置づけを概念的に示したものだ。図のように、ホワイトリスト(WL)は「まず安全と考えられるもの」を列挙したもの、「ブラックリスト(BL)」は「安全でない可能性がかなりあるもの」を列挙したものとなる。そして、ホワイトリストとブラックリストのどちらにも載ってない中間部分が、「白黒はっきりしない中間領域」すなわちグレイゾーンとなる。
この図からもわかるようにWLとBLで示すことのできる領域は全体として一部であり、どうしてもグレイゾーンが大きくなる。すなわち、WLは判断を安全サイドに倒して「安全という保証のないものは全て排除する」もの、BLはカバー範囲を広くとることを重視して「明らかに怪しいもの以外は受け入れる」方法ということになる。この関係を以下に表として示した。
| ホワイトリスト方式 | ブラックリスト方式 | |
| カバー範囲 | 狭い | 広い |
| 安全性 | 高い | 危険なものを受け入れる可能性あり |
これだけのことだ。ホワイトリスト方式の方が安全なことは確かだが、世の中全てホワイトリストで回せるはずがない。セキュリティの世界では守るべき対象の性質によってはホワイトリストが使える場合があって、その場合はぜひホワイトリストにしなさいというだけのことである。前述のように、ホワイトリストが使えない場合が現実には大半なので、(問題があるとは分かっていて仕方なく)ブラックリスト方式を使う。それだけのことだ。特に方法論自体の優劣とは関係ない。
ついでのように紹介して恐縮だが、大垣さんの書かれたホワイトリストはどう作る?は、ホワイトリスト神話の悪しき例と言わざるを得ない。
スクリプトインジェクション(XSS)防止にブラックリストが機能しない事は明らかです。ホワイトリストはどう作れば良いか参考となるリンクです。どう作るか書いておいても古くなる可能性が高いので、どこを参考に作れば良いか参考URLを書いておきます。
以下のリンクの情報からスクリプトのインジェクションがどのように行えるかを参考にホワイトリストを作れば概ね間違いないと思います。
Follow up:
XSS Cheat Sheet
スクリプトインジェクション手法の中でも有名な手法を集めているサイトです。XSSロケータと呼ばれている文字列はスクリプトインジェクション脆弱性検出に重宝します。よくある脆弱性であればこの文字列で簡単に検出できます。
[ホワイトリストはどう作る?より引用]
大垣さん、これではホワイトリストではなくて、ブラックリストそのものです。
一方、興味深いことに、金床さんの書かれたウェブアプリケーションセキュリティには、同じ題材を取り扱っているが、その記述はまるで異なる。
WAFを使用しブラックリスト方式のシグネチャマッチングによってXSS対策を行う場合、攻撃を完全に防ぐことは不可能である。これはXSSを引き起こす可能性のある文字列が非常に多岐にわたるためだ。このことは非常によく知られたドキュメントであるXSS Cheat Sheetを見るとよくわかる。【中略】望ましい対策として、パラメータごとにホワイトリスト式のチェックを行う方法が考えられるが、残念ながら多くのウェブアプリケーションではホワイトリストをきちんと定義することが難しい【中略】従って、WAFを使ってXSS攻撃を完璧に防ぐことは期待できない(P92〜P94)。
[ウェブアプリケーションセキュリティより引用]
同書の書評でも述べたが、オープンソースのWAFの開発者としてホワイトリストとブラックリストの両方に真剣に向き合ってきたからこそ書ける、正確かつ誠実な記述である。
金床さんのWAFの話題が出たところで、次回はWAFの説明に続く・・・徳丸浩の日記 - そろそろWAFに関して一言いっとくか - 三重苦を乗り越えてWAFが普及するための条件とは
最近、自分専用Webアプリケーションをちょこちょこと作っているため、(近いうちにライブラリ的なものを公開できるレベルに達すればいいので祟..
- http://www.st.ryukoku.ac.jp/~kjm/security/memo/ ×1047
- http://www.pluto.dti.ne.jp/~rinou/ ×406
- http://www.hash-c.co.jp/ ×126
- http://www.st.ryukoku.ac.jp/~kjm/security/memo/200... ×116
- http://blog.ohgaki.net/-13 ×77
- http://bakera.jp/ebi/topic/3221 ×49
- http://www.tokumaru.org/ ×40
- http://d.hatena.ne.jp/sonodam/ ×34
- http://blog.ohgaki.net/ ×33
- http://d.hatena.ne.jp/sonodam/20080723/p5 ×27
- http://yamagata.int21h.jp/d/ ×26
- http://bakera.jp/ebi ×22
- http://b.hatena.ne.jp/entry/http://www.tokumaru.or... ×13
- http://www.pluto.dti.ne.jp/rinou/ ×13
- http://www.tokumaru.org/JavaScript/ ×11
- http://www.pluto.dti.ne.jp/~rinou/saji/200807.html... ×10
- http://yamagata.int21h.jp/d/?date=20080716 ×9
- http://b.hatena.ne.jp/entrylist?sort=hot&of=50&thr... ×8
- http://www.tokumaru.org ×7
- http://www.pluto.dti.ne.jp/~rinou/index.html ×7
- http://www.hash-c.co.jp/index.html ×6
- http://www.st.ryukoku.ac.jp/~kjm/security/memo/ind... ×5
- http://b.hatena.ne.jp/Kanatoko/ ×5
- http://b.hatena.ne.jp/entrylist?url=http://&sort=h... ×5
- http://d.hatena.ne.jp/ockeghem/ ×4
- http://trombik.mine.nu/~cherry/w/ ×4
- http://b.hatena.ne.jp/entrylist?sort=hot&of=50&thr... ×4
- http://b.hatena.ne.jp/entrylist?url=http://&thresh... ×4
- http://labs.ceek.jp/hbnews/list.cgi ×3
- http://b.hatena.ne.jp/ockeghem/ ×3
- http://blog.ohgaki.net/?blog=7&paged=2 ×3
- http://b.hatena.ne.jp/entrylist?sort=hot&of=100&th... ×3
- http://search.live.com/results.aspx?q=fizzbuzz&for... ×3
- http://blog.ptlabo.net/index.php?cat=17 ×3
- http://blog.ohgaki.net/webdev/ ×3
- http://pfrb.blog114.fc2.com/blog-entry-5.html ×3
- http://blog.ptlabo.net/index.php?id=08070066 ×3
- http://search.live.com/spresults.aspx?q=携帯のホワイトリスト... ×3
- http://d.hatena.ne.jp/sonodam/searchdiary?word=ホワイ... ×2
- http://clip.nifty.com/entry/a59bf3224009c0bff718ff... ×2
- http://a.hatena.ne.jp/yamagata21/ ×2
- http://yamagata.int21h.jp/d/?year=2008;month=2H;ca... ×2
- http://b.hatena.ne.jp/entrylist?sort=hot&of=0&thre... ×2
- http://blog.ohgaki.net/index.php/yohgaki/ ×2
- http://postgresql.g.hatena.ne.jp/iakio/20080627/12... ×2
- http://takagi-hiromitsu.jp/diary/200806.html ×2
- http://r.hatena.ne.jp/fm8002/セキュリティ関係/ ×2
- http://b.hatena.ne.jp/t/ブラックリスト ×2
- http://bakera.jp/ebi/2008/8/23 ×2
- http://d.hatena.ne.jp/ockeghem/searchdiary?word=DB... ×2
- http://b.hatena.ne.jp/entry/http://blog.trendmicro... ×2
- http://b.hatena.ne.jp/keyword/ホワイトリスト ×2
- http://b.hatena.ne.jp/entrylist?sort=hot&threshold... ×2
- http://bakera.jp/ebi/2008/8 ×2
- http://blog.ohgaki.net/index.php/yohgaki ×2
- http://b.hatena.ne.jp/entrylist?sort=hot&of=0&thre... ×2
- http://b.hatena.ne.jp/keyword/XSS ×2
- http://labs.ceek.jp/hbnews/list.cgi?k=5 ×2
- http://takagi-hiromitsu.jp/diary/20080620.html ×2
- http://blog.ohgaki.net/security/ ×2
- http://d.hatena.ne.jp/ockeghem/?of=10 ×2
- http://b.hatena.ne.jp/Kanatoko/20080716 ×2
- http://www.mixclips.org/recent/ ×2
- http://d.hatena.ne.jp/teracc/20070715 ×2
- http://d.hatena.ne.jp/giugno/ ×2
- http://www.tokumaru.org/d/20080716.html ×2
- http://hash-c.co.jp/ ×2
- http://b.hatena.ne.jp/entrylist?sort=hot&of=150&th... ×2
- http://yamagata.int21h.jp/d/?category=ALL;year=200... ×1
- http://www.junk-search.com/tag/nsr250r.html ×1
- http://search.live.com/spresults.aspx?q=ブラックリスト&fi... ×1
- http://reader.livedoor.com/subscribe/http://www.to... ×1
- http://www.hash-c.co.jp/d/20080622.html ×1
- http://r.hatena.ne.jp/oldriver/ ×1
- http://r.hatena.ne.jp/Desperado/はてブ/ ×1
- http://search.live.com/spresults.aspx?q=ホワイトリスト方式 ×1
- http://labs.cybozu.co.jp/blog/takesako/2007/08/lls... ×1
- http://d.hatena.ne.jp/ockeghem/searchdiary?word=ja... ×1
- http://s.luna.tv/search.aspx?client=lunascape&s=0&... ×1
- http://search.live.com/spresults.aspx?q=ブラックリスト ホワ... ×1
- http://fastladder.com/subscribe/http://www.tokumar... ×1
- http://s.luna.tv/search.aspx?client=lunascape&s=0&... ×1
- http://tokumaru.org/d/20080601.html ×1
- http://www.mixclips.org/recent/3/ ×1
- http://yamagata.int21h.jp/d/?date=20080716-5 ×1
- http://pfrb.blog114.fc2.com/?tag=インジェクション ×1
- http://okyuu.com/ja/tips/1546 ×1
- http://mgw.hatena.ne.jp/?url=http://www.tokumaru.o... ×1
- http://search.live.com/spresults.aspx?q=ホワイトリスト方式&... ×1
- http://pfrb.blog114.fc2.com/ ×1
- http://search.live.com/results.aspx?q=ホワイトリスト方式&fo... ×1
- http://search.live.com/results.aspx?q=seozone&form... ×1
- http://labs.ceek.jp/hbnews/list.cgi?p=0&c=1 ×1
- http://www.mixclips.org/recent/10/ ×1
- http://r.hatena.ne.jp/steam_heart/ ×1
- http://labs.ceek.jp/hbnews/list.cgi?p=1&c=0 ×1
- http://d.hatena.ne.jp/sonodam/?of=20 ×1
- http://yamagata.int21h.jp/d/?date=20080716%23p02 ×1
- http://yamagata.int21h.jp/d/?date=200807 ×1
- http://d.hatena.ne.jp/ockeghem/20080622/p1 ×1
- キーワード不明 ×41 / ホワイトリスト方式 ×10 / ホワイトリスト ×9 / ホワイトリスト ブラックリスト ×8 / ブラックリスト方式 ×6 / escape sql ×5 / ブラックリスト ホワイトリスト ×4 / mod_imagefight ×3 / シグネチャ 定義ファイル ホワイトリスト ×3 / エスケープ 文字化け SQL ×3 / ブラックリスト ×3 / php ホワイトリスト セキュリティ ×3 / イメージファイト xss ×3 / ホワイトリスト SQLインジェクション ×2 / ブラックリスト XSS ×2 / XSS ブラックリスト方式 ×2 / waf ホワイトリスト ×2 / sqlインジェクション postgresql 数値 比較 ×2 / ホワイトリストとブラックリスト ×2 / WAF ホワイトリスト ×2 / 徳丸浩 バッファオーバーフロー ×2 / pg_escape_string php 複文 ×2 / sql standard_conforming_strings ×2 / switch 脱出 ×2 / ブラックリスト方式 必要 ×2 / XSS ブラックリスト ×2 / 徳丸 WAF ×2 / jvascript ラベル ×1 / mysql sql エスケープ文字 ×1 / oracle 複数のSQLを .net ×1 / SQLインジェクション対策再考 ×1 / クレジット ホワイトリスト ×1 / javascript ループ ×1 / ホワイトリスト WAF ×1 / oracle SQL エスケープ ×1 / セキュリティ ホワイトリスト ×1 / ホワイトリスト ブラックリスト アクティブリスト ネガティブリスト ×1 / postgre like 句 リテラル ×1 / ブラックリスト型スパムフィルタ ×1 / ブラックリスト方式 ホワイトリスト方式 ×1 / ブラックリスト 侵入検知 ×1 / スパムフィルター ブラックリスト ホワイトリスト ×1 / xssとは? ×1 / 徳丸浩 ×1 / ie firefox contenttype アップロード image/jpeg ×1 / クロスサイト スクリプティング ホワイトリスト方式 ×1 / update 文字列 数字 ORA 01722 ×1 / 3の倍数 5の倍数 プログラム ×1 / エスケープ SQL ×1 / sqlインジェクション 文字列 ×1 / ホワイトリスト 説明 ×1 / MySQL エスケープ文字 ×1 / ブラック&ホワイト チート ×1 / 画像 xss jpeg ×1 / xss ホワイトリスト ×1 / セキュリティソフト ホワイトリスト ×1 / sql エスケープ \ ×1 / 脱出 switch ×1 / ホワイトリスト XSS ×1 / perl postgres pg_escape_string ×1 / SQL エスケープ ×1 / ホワイトリスト サイト ×1 / IEEE754 表現範囲 ×1 / ブラッグリスト ×1 / break ×1 / php 画像種類判別 ×1 / Webアプリ ループ ×1 / IEEE 754 表現範囲 ×1 / webアプリ 入力値チェック ×1 / xss テスト ×1 / pg_escape_string 定義されていない ×1 / Content-Type image jpeg gif bmp ×1 / ホワイトリスト 実装 ×1 / java networkaddress.cache.ttl ×1 / SQLインジェクション エスケープ ×1 / firefox ホワイトリスト ×1 / sjis "%" SQLインジェクション ×1 / クレジットカード ホワイトリスト ×1 / sql 複文 ×1 / javascript ラベル ×1 / sql セミコロン ×1 / SQL 空白 エスケープ ×1 / ホワイトリスト方式 ブラックリスト方式 ×1 / HTML ホワイトリスト ×1 / ieee754 ×1 / php プログラム 正しい書き方 ×1 / XSS ホワイトリスト方式 ×1 / email ブラックリスト ×1 / web フィルタ ホワイトリスト ×1 / ラベル付break ×1 / ブラックホワイト ×1 / 不正侵入 ブラックリスト ×1 / 日記 徳丸 ×1 / javascript break ×1 / php sql インジェクション ブラックリスト ×1 / スパムフィルタ ホワイトリスト方式 ×1 / javascript break; ×1 / ruby 1から100まで print ×1 / ホワイトリスト方式 SQL ×1 / ウィルス ブラックリスト ホワイトリスト ×1
| SQLインジェクション対策はおすみですか? 開発開始時点からのコンサルティングから、公開済みWebサイトの脆弱性検査、 脆弱性発見後の適切な対策まで |
大垣です。手抜きエントリを見事に誤解されたので追記しました。
http://blog.ohgaki.net/-7
それから、ホワイトリスト方式とブラックリスト方式の考え方は私の考えとは大きく異なります。ホワイトリスト型、ブラックリスト型のセキュリティ対策では分かり辛いように思えるので個人的には能動的(プロアクティブ)と受動的(リアクティブ)なセキュリティ対策と言う方が好みですが、バッファーオーバーフローをバッファーオーバランと言うような物なのでホワイトリスト型、ブラックリスト型の対策として書いています。
http://blog.ohgaki.net/-13
ところでXSS Cheat Sheetは読まれましたか? アレを読んでそれでもブラックリスト方式でXSSを防げる、と信じられる方はかなりの重症だと思います。なので、読まれていないと思います。あのエントリはホワイトリストを自分で作る事を考えてもらえるように書いています。XSS Cheat Sheetを読まないと意味がありません。