ヒューリスティックの数字ゲーム
長らく休業状態でしたがムックの仕事が終わり通常運営に戻ります。今回のムックは、長かった・・・。
最初に書いておきますが、これは数字ゲームです。
例えば、今Astalavistaだかから落としてきた怪しげなexeファイルが「未知のウイルス」に感染している確率を10%としよう。
これに対抗するために「未知ウイルス検出」「ヒューリスティックスキャン」といった機能が存在する。ただ、どうしたってこの手の機能は100%の精度を実現することはできない。絶対に漏れ/誤検出は生じる。ならば、どういう性質のエンジンが良いのだろうか。・・・と、いう話です。
□1:検出率90%・誤検出率10%
つまり
- 未知ウイルスが含まれていた場合90%の確率で「嫌疑ファイル」などと検出する(100-90=10%は検出漏れを起こす)
- 未知ウイルスが含まれていない場合でも10%は「嫌疑ファイル」などと検出する
というエンジン。
この場合、以下のような計算が可能です。
- スキャンしたファイルに実際にウイルスが含まれている(仮定より10%)
- ウイルスをエンジンが検出した(10%の中の90%=9%)・・・a
- ウイルスをエンジンが見逃した(10%の中の10%=1%)・・・b
- スキャンしたファイルに実際にウイルスが含まれていない(仮定より90%)
- エンジンがウイルスを誤検出した(90%の中の10%=9%)・・・c
- エンジンが「安全なファイル」と判定した(90%の中の90%=81%)・・・d
図で示せばこんな感じでしょう。青が「実際安全」で赤が「実際危険」、ベタ塗りが「エンジンが安全と判定」で格子が「エンジンが危険と判定」の意味。

しかし我々は「そのファイルが実際には安全なのかどうか」ということを知らないわけです。我々に与えられるのは「エンジンがそれをどう判定したか」であり、つまりどういう事かと言えば
- エンジンがウイルスを検出した(a/c)
- ウイルスをエンジンが検出した(10%の中の90%=9%)・・・a
- エンジンがウイルスを誤検出した(90%の中の10%=9%)・・・c
- エンジンがウイルスを検出しなかった(b/d)
- ウイルスをエンジンが見逃した(10%の中の10%=1%)・・・b
- エンジンが「安全なファイル」と判定した(90%の中の90%=81%)・・・d
図で示せば以下。


「検出率90%・誤検出率10%」程度の精度では、ヒューリスティックスキャンはあまり意味を持っていない。そのエンジンが「危険」と判定するファイルの中で実際に危険なのは半分でしかない。
安全と検出されたファイルが実際に安全である確率(d/b+d):98.8%
危険と検出されたファイルが実際に危険である確率(a/a+c):50%
では、ちとエンジンの方向性を変えてみましょう。
□2:検出率95%・誤検出率15%
少し厳しく判定するエンジンを仮定します。検出率はさっきのより高く、ただ誤検出率も高い。
- スキャンしたファイルに実際にウイルスが含まれている(仮定より10%)
- ウイルスをエンジンが検出した(10%の中の95%=9.5%)・・・a
- ウイルスをエンジンが見逃した(10%の中の5%=0.5%)・・・b
- スキャンしたファイルに実際にウイルスが含まれていない(仮定より90%)
- エンジンがウイルスを誤検出した(90%の中の15%=13.5%)・・・c
- エンジンが「安全なファイル」と判定した(90%の中の85%=76.5%)・・・d
ということで、図は省略しますが
- エンジンがウイルスを検出した(a/c)
- ウイルスをエンジンが検出した(10%の中の95%=9.5%)・・・a
- エンジンがウイルスを誤検出した(90%の中の15%=13.5%)・・・c
- エンジンがウイルスを検出しなかった(b/d)
- ウイルスをエンジンが見逃した(10%の中の5%=0.5%)・・・b
- エンジンが「安全なファイル」と判定した(90%の中の85%=76.5%)・・・d
安全と検出されたファイルが実際に安全である確率(d/b+d):99.4%・・・□1より↑0.6%
危険と検出されたファイルが実際に危険である確率(a/a+c):41.3%・・・□1より↓8.7%
□3:検出率85%・誤検出率5%
逆にもう少し緩いエンジンの場合は。
- スキャンしたファイルに実際にウイルスが含まれている(仮定より10%)
- ウイルスをエンジンが検出した(10%の中の85%=8.5%)・・・a
- ウイルスをエンジンが見逃した(10%の中の15%=1.5%)・・・b
- スキャンしたファイルに実際にウイルスが含まれていない(仮定より90%)
- エンジンがウイルスを誤検出した(90%の中の5%=4.5%)・・・c
- エンジンが「安全なファイル」と判定した(90%の中の95%=85.5%)・・・d
ということで、図は省略しますが
- エンジンがウイルスを検出した(a/c)
- ウイルスをエンジンが検出した(10%の中の85%=8.5%)・・・a
- エンジンがウイルスを誤検出した(90%の中の5%=4.5%)・・・c
- エンジンがウイルスを検出しなかった(b/d)
- ウイルスをエンジンが見逃した(10%の中の15%=1.5%)・・・b
- エンジンが「安全なファイル」と判定した(90%の中の95%=85.5%)・・・d
安全と検出されたファイルが実際に安全である確率(d/b+d):98.3%・・・□1より↓0.5%
危険と検出されたファイルが実際に危険である確率(a/a+c):65.4%・・・□1より↑15.4%
我々はヒューリスティックが完璧でないことを知っている。それは前提で、ヒューリスティックの判定結果を無視できないような状況においては、「安全」「危険」という判定結果もそう簡単に信じてはいけないことくらい知っている。それは前提であり、ヒューリスティックエンジンは判断材料の一つだ。そしてその上で、例えば自分が買うアンチウイルスソフトに入っている「べき」エンジンは上のどれか、と。
ヒューリスティックエンジンとは使い手からすれば本質的にこういう類の代物であり、多分作り手はこのことをあまり意識していない。この話だけに限らないが、「警告」はそれ自体が「ユーザーに行為を止めさせる」効果を持つ訳ではない。早い話、僕はテキストエディタとかに「保存しますか?」と聞かれてるのに反射的に「いいえ」を押して後から「しまった大事なデータを保存し損ねた」と思ったことが何度もあるよ(Windowsアプリは終了時の警告が多すぎるため我々はそれを無視する癖が付いている)。
ちなみにこれは「HIVに感染してる人」「検査の精度」という単語に置換すると結構有名なロジックだったりする。

TrackBack
この記事へのトラックバック