徳丸さんの「ホワイトリスト」についての整理、のまとめ

後で読み直したくなると思うので、備忘録として作成します。
2
徳丸 浩 @ockeghem

ホワイトリストについてしつこく考えていて、一応の整理がついてきたのですか、ブログにするほど皆様も興味がないでしょうから、twitterで気ままにつぶやくことにします。

2016-03-24 17:23:40
徳丸 浩 @ockeghem

まず、ホワイトリストが、何についてホワイトであるかを明確にする必要があります。ウェブアプリケーションのバリデーションの文脈でホワイトリストという場合には、アプリケーションの仕様に対してホワイトなのか、攻撃等に対して安全というホワイトなのかを明示する必要があります

2016-03-24 17:28:59
徳丸 浩 @ockeghem

僕が一々ホワイトリストに目くじらを立てるのは、実際にはアプリケーション仕様に対してホワイトであるのに、「ホワイトリスト=非常に安全なもの」というイメージを悪用しているのではないか、という疑問を持っているからです

2016-03-24 17:30:10
徳丸 浩 @ockeghem

バリデーションから一旦離れますと、「非常に安全なもの」というホワイトリストもあります。例えば、特定のユーザのみに接続を許す場合にリモートIPアドレスの制限をかける場合がありますが、このIPアドレスの一覧は一般にホワイトリストと呼ばれます

2016-03-24 17:31:29
徳丸 浩 @ockeghem

しかし、アプリケーションの仕様を元としたホワイトリストは、攻撃等に安全とは限りません。英数字のみを許すような場合は通常安全です(例外あり)が、「印刷可能文字256文字以下」という仕様だと、多くの攻撃に対して安全とはいえません

2016-03-24 17:33:02
徳丸 浩 @ockeghem

何に対してホワイトであるかを明示する確実な方法は、ホワイトリストという言葉を使わないことです。その辺りは、こちらの記事に書きました "僕が「ホワイトリスト」を採用しなかった訳" d.hatena.ne.jp/ockeghem/20110…

2016-03-24 17:34:28
徳丸 浩 @ockeghem

次に、リストというからには「列挙したもの」でないかという疑問があります。正規表現で表されたようなものを「リスト」と呼んでよいかという疑問です。言葉は生き物なのであまり目くじらを立てても仕方ないのかもしれませんが、私は、リストという言葉は列挙できるものだけに使いたい感覚があります

2016-03-24 17:36:14
徳丸 浩 @ockeghem

次に、ホワイトリストとブラックリストに対して、「グレーゾーン」の存在を考えたいところです。さまざまな入力の攻撃性について考えると、あきらかに安全なもの(ホワイト)と、あきからな攻撃(ブラック)がありますが、実は大半の入力はグレーとしか判断できません。だから判定が難しいわけです

2016-03-24 17:38:10
徳丸 浩 @ockeghem

アプリケーションの仕様をホワイトリストとして定義したとして、仕様を満たさないものはすべてブラックです。グレーゾーンはありません。したがって、ホワイトリストの裏返しがブラックリストであり、両者は表裏一体の関係にあります

2016-03-24 17:39:33
徳丸 浩 @ockeghem

これに対して、攻撃やウイルス等を考える場合、明らかに安全なもの(ホワイト)、グレーなもの、明らかなウイルスや攻撃(ブラック)があります。この場合ホワイトとブラックは表裏一体ではなく、どちらを採用するかは注意深い選択が必要です

2016-03-24 17:40:55
徳丸 浩 @ockeghem

ウイルス対策ソフトやWAF(ウェブアプリケーションファイアウオール)の多くがブラックリスト(シグネチャ)方式を採用しているのは、ホワイトリストの適用が現実的には難しいからです。

2016-03-24 17:41:53
徳丸 浩 @ockeghem

これに対して、アプリケーションのバリデーションを仕様のブラックリストではなくホワイトリストで実現せよという場合、両者は表裏一体なので、本来どちらでもよいはずです。ホワイトリストを推奨する理由は、漏れなどが少なくできるからでしょう。根源的な違いが両者にあるとは思えません

2016-03-24 17:43:46
徳丸 浩 @ockeghem

goto有害論が有名ですが、その他の有害論として「else有害論」を聞いたことがあります。「その他の場合」と書くのではなく、一々明示しろというのです。bが正の場合bを掛けて、その他の場合bで割るというプログラムはゼロ除算の可能性があり、b <= 0の場合と書くと見落としにくい

2016-03-24 17:51:45
徳丸 浩 @ockeghem

それと同じような感覚で、ブラックリストには見落としが発生しやすいのでホワイトリストで(禁止条件ではなく許可条件で)表現しろということなのだと思います。そこに異論はありませんが、ホワイト「リスト」ではないのでは、と個人的には思います。

2016-03-24 17:54:11
徳丸 浩 @ockeghem

OWASP Top 10などで、「 Positive or “white list” input validation」という書き方がしてあります。while listをクォートしているのは、「いわゆるホワイトリストというやつね」というニュアンスではないかと個人的には考えます

2016-03-24 17:56:42
徳丸 浩 @ockeghem

しかし、単に Positive input validation だと、Positiveって何だ? ということになりかねないので、"white list"を併記しているのでしょう…これは、分かりやすい文章を書く努力を放棄している、文章作成上の怠慢ではないかと思うわけですね

2016-03-24 17:58:59