フレッドコーエンは、ウイルスの検出は決定不可能な問題であると理論的に決定しました。誰もが直感的な推論を提供できますか?
フレッドコーエンはコンピュータウイルスを実験し、ノイマンの仮定を確認し、検出可能性、初歩的な暗号化を使用した自己難読化など、マルウェアの他の特性を調査しました。彼の1988年の博士論文 論文 はコンピュータウイルスの主題でした
承知しました。コーエンの有名な結果では、完全なウイルス検出器は警告を発するはずだと述べていますもしあれば入力プログラムはウイルスのように振る舞う可能性があります(つまり、マシンに感染して損害を与えます)。
次のプログラムを検討してください。
_f();
infect_and_do_damage();
_
ここで、f()
は無害な関数であり、infect_and_do_damage()
はウイルスに感染し、あらゆる種類のダメージを与えます(ハードディスクを拭き取り、すべてのお金を盗みます)。
このプログラムについて完璧なウイルス検出器が何を言うべきかを考えてみましょう:
f()
が戻ることができる場合、これはウイルスであり、ウイルス検出器はアラームを発するはずです。
一方、f()
が常に無限ループに入り、戻ってこない場合、2行目はデッドコードであり、infect_and_do_damage()
が呼び出されることはなく、このプログラムはウイルスのようには動作しません。 、およびウイルス検出機能はアラームを発するべきではありません。
したがって、このコードがウイルスであるかどうかを判断する問題は、関数f()
が停止できるかどうかを判断する問題と同等です。それは有名な停止問題であり、決定不可能であることが知られています。
言い換えると、プログラムがウイルスであるかどうかを検出することは、プログラムが停止するかどうかを検出することと少なくとも同じくらい困難です。したがって、どちらの問題も決定できません。
これは純粋に理論上の結果であることに注意してください。決定不可能性は、純粋に理論的な構造です。問題が決定不可能であるという事実は、会話の終わりではありません。会話の始まりにすぎません。
実際には、決定不能性に対処するためのさまざまな方法があります。たとえば、すべてのプログラムで常に正しいとは限らない場合でも、確率的に正しいソリューションを記述してみます。すべてのプログラムで機能しない場合でも、実際に見つかる可能性が高いプログラムのセットで機能する解決策を見つけようとします。ソリューションが時々「わからない」と答えたり、プログラムをウイルスと宣言する側で誤解したりする(または誤検出の横で誤解する)ようにする。等々。
したがって、これをウイルス検出が不可能であるという決定的な陳述として扱わないでください。問題を特定できないからといって、実際に十分な解決策を見つけることが必ずしも不可能であるとは限りません。しかし、それは完全なウイルス検出器を構築するためのいくつかの基本的な障壁を特定します。
@DWの答えを補足するために:停止の問題が解決できたとしても、固有の定義の問題もあります:whatisaとにかくウイルス?
たとえば、冗談が言うと、Microsoft Wordはウイルスです。
Wordはどのようにしてウイルスにならないことができますか?
もちろん、多くの人々(Microsoftの弁護士を含む)は、Wordはウイルスではなく、とんでもない主張であると主張するでしょう。ただし、これはnot-a-virusプロパティがmacroscopicであることを示しています。これは、コードのみからの明確な区別ではありません(「macroscopic 「これは、実行可能ファイル内のアセンブリオペコードではなく、全体の緊急プロパティであることを意味します)。
それほど大げさではない例を見てみましょう。Linuxオペレーティングシステムのインストーラーです。コードですか?はい。自分自身をコピーしますか?はい、そうです。ブートセクターを変更しますか?もちろんです。マシンに既にインストールされているオペレーティングシステムを変更しますか?そうそう。 nonウイルスにする1つのプロパティは、インストーラーが上記のすべてを行うたびに、人間のユーザーそのようにしたい。
したがって、完璧なアンチウイルスは、ユーザーが何を望んでいるかを何らかの形で推測する必要があります。そして、それに対する絶対的な答えはあり得ません。実際には、ほとんどのウイルス対策ソフトウェアは「推測に基づく推測」を試み、ユーザーが何をしたいかを決定します(これが、今朝、顧客に実行可能ファイルを送信しようとする苛立たしい1時間を費やした方法です。実行可能ファイルをメールで送信したくない場合があると判断しました)。