ブルース・シュナイアーが書いたときに参照していた分析は次のとおりです。
ウイルスには「治療法」はありません。既存のウイルス対策プログラムでは止められないウイルスを作成することが常に可能であることが数学的に証明されています。
本からSecrets&Lies Bruce Schneier、154ページ。
その考えられる解釈の1つとして、それは ライスの定理 の結果です。プログラムが何らかの悪意のあるアクションを実行する場合、プログラムは悪意のあるものになり、セマンティックプロパティになります。一部のプログラムは悪意のあるものとそうでないものがあるため、それは重要なプロパティです。したがって、ライスの定理では、プログラムが悪意のあるものであるかどうかは、一般的なケースでは決定できません。
実際には、その逆は簡単に証明できます:すべてのコンピュータウイルスは何らかの方法で実行可能コードであるため、実行する必要があるのはすべての実行可能コードをそのようなプログラムがすべての可能なウイルスを検出することは論理的に従います:
確かに、このウイルス対策ソフトウェアがあまりにも多くの「誤検知」を排除していることについては、議論の余地があります。しかし、陽性が偽か真かを判断する基準は何ですか?ああ!善意のコードと悪意のあるコードの違い、正直な「リモートPCコントロール」スイートとNetbusのようなトロイの木馬の違いは完全に恣意的であり、問題全体は無意味です。
Wikipedia: によると
1987年に、Fred Cohenは、考えられるすべてのウイルスを完全に検出できるアルゴリズムがないことを示すデモを公開しました。
この論文 も参照しています。それはシュナイアー氏が言及していた分析かもしれない。
このステートメントは、数学的な命題として再定式化されない限り、数学的に証明できません。
少なくとも、これには「ウイルス」が何であるかについて数学的に正しい定義が必要です。そして、実際には役に立たない抽象化になってしまう可能性があります。これには、人々が完全に無害で有用であると考える行動や、反社会的であると考える行動が含まれないためです。
ここで難しいのは、ウイルスは何らかの方法で環境を変更するプログラムであり、環境を厳密に定義しようとすると、実際に使用するには制限が多すぎることです。
だから私はノーと言います:命題は数学的に証明することができない、そしてそれはそれが数学的に定式化することができないからです。
tl; dr-答えは、質問に課す要件に正確に依存します。
それ以上の制約なしにすべてのウイルスを検出したいだけの場合は、何でもすべてをウイルスとしてフラグを立てれば完了です。
すべてのプログラムをウイルスであるかどうかを適切に識別したい場合は、分類の問題が停止の問題になるため、非拘束の場合は不可能です。
すべてのプログラムをウイルスであるかどうかを適切に識別し、有限のマシンを検討している場合、理論的には可能ですが、実際には一般的には不可能です。
コンピュータがランダムなエラーを生成することを許可すると、プログラムはウイルスになる可能性があります。
明らかに、すべてのプログラムをウイルスとしてフラグを付けると、すべてのプログラムが捕捉されます。 (ポケモン!)
このケースから始めて、すべてのウイルスを検出することは難しくないことを強調します。むしろ、特定の理論上の問題は、iffプログラムをウイルスに正しく分類することです。
プログラムを考えてみましょう:
_doHaltingProblem(); // Not a virus operation itself
installEveryVirusEver(); // Definitely a virus operation, but will it happen?
_
この場合、プログラムはウイルスです 停止問題 が停止し、installEveryVirusEver()
が発生する場合のみ。したがって、ウイルス検出は、一般的な非拘束の場合の停止問題にまで減少します。
ウイルスかどうかに分類されるプログラムが有限マシン上で動作する場合、考えられるすべての開始状態から実行されるマシンを単純にシミュレートできます。有限マシンは 最終的には前の状態にループバックします なので、有限(長い場合)の分析になります。
マシンがウイルスと見なされるプログラムを実行でき、ランダム突然変異がその状態にシフトする可能性がゼロではないと想定すると、最終的にはウイルス状態になります。
これはつまらないポイントですが、完全を期すためです。
ウイルスには「治療法」はありません。既存のウイルス対策プログラムでは止められないウイルスを作成することが常に可能であることが数学的に証明されています。
– "Secrets&Lies" 、ブルースシュナイアー、154ページ
上記のケース(1)で指摘したように、everythingをウイルスとしてフラグ付けするだけで、すべてのウイルスにフラグを付けることができます。簡単だ。無制限のケースでは、可能なすべてのプログラムがウイルスであるかどうかを判断することは不可能です。
さらに、特定のプログラムがバインドされたケースでウイルスであるかどうかを確認することは困難です。たとえば、次のプログラムを考えてみます。
_var toExecute = decryptByBruteForce([ciphertext]); // Decrypt the next part of the program by brute-force
run(toExecute); // Run the now-decrypted part of the program
_
ケース(3)で説明したように、このプログラムは有限マシンで実行した場合はウイルスかどうかに分類できますが、その場合は暗号化されたメッセージをブルートフォースする必要があるため、実際のシナリオでは現実的ではありません。
したがって、実際のアプリケーションでは、それは heuristics の問題に減少します。アンチウイルスプログラムは、ウイルスであるかどうかを推測します。または、より信頼性の高いセキュリティが必要な場合は、ウイルス対策プログラムが安全であると証明できないものにフラグを付け、すべての可能なプログラムを分類する必要があるという問題を回避できます。
残念ながら、ヒューリスティックの使用は、標的となる知識のある攻撃者にセキュリティホールを与えます。引用のソースを読まずに、私はこの問題が彼らが言及しようとしていたものだと私は疑っています。
それは、「停止」の定義に依存します。
停止を「事前に検出して、そのコードが悪意のあるものを実行し、実行を阻止する」と定義した場合、他の人が述べたように、ライスの定理ではこれは不可能です。
Stopを「実行中のプログラムが何か悪いことをしようとしていることを検出し、それを停止する」と定義した場合、ライスの定理は適用されません。ウイルス対策は、プログラムが悪意のある何かを実行できるかどうかを判断する必要はなく、悪意のある何かを今実行しているだけです。
私の知る限り、2番目のバージョンは数学的に不可能であることが証明されていません。そして実際、「悪意のある」の十分に具体的な定義については、それは非常に実行可能です。これは本質的にサンドボックス化です。
ただし、ウイルスが試みる可能性のあるあらゆる種類の悪意をカバーするほど、「悪意のある」の適切な定義はないようです。ビットコインをマイニングするウイルスはどうですか?それとも海賊映画を提供していますか?それともあなたに代わってメッセージボードをスパムしますか?これらはすべて、まさにこれらのことを本当に実行したいユーザーが実行しているコードと区別がつきません。したがって、私は(証明しようとする試みは知りませんが)アンチウイルスの作成はAI完全であると疑っています。
はい、それは1935-36年にアロンツォ教会によって数学的に証明され、その後すぐに1936年にアランチューリングによって独立して証明されました。
いいえ、できません。マルウェアと有用なプログラムの違いは完全に主観的なものだからです。 「悪」な行動は、意図された行動である可能性があります。たとえば、現在、コンピューターで次のプログラムを実行しています。
純粋に技術的な観点から見ると、まったく同じことをしているため、違いはわかりません。唯一の違いは意図です。 1つのプログラムはそれが何をするかについてユーザーを騙し、ユーザーの利益に対して行動し、もう1つのプログラムはユーザーが望んでいることを正確に行います。しかし、ユーザーが本当にソフトウェアに求めているのは、マシンが決定できないことです...少なくともAIテクノロジーの現在の段階ではそうではありません。これが、すべてのウイルススキャナーが主に署名ベースである理由です。
既存のすべてのウイルス対策プログラムを迂回できるウイルスを作成することが常に可能であることを数学的に証明するには、まずウイルスとは何かを数学的に定義し、それで幸運を祈る必要があります。
おそらく「望ましくないアクションを実行するプログラム」でしょうか。まあそれは単に不可能です、あなたのPCへの接続を開き、リモート制御を可能にするプログラムを想像してください。アンチウイルスはプログラムがこれを実行していることを確認できますが、それが望ましいかどうかをどのようにして知ることができますか?
それは、TeamViewerのような正当なリモートコントロールプログラムかもしれません、またはそれは、単純な画像表示プログラムとしてのウイルスマスカラディングかもしれません。なぜそのプログラムをインストールしているのかわからないので、「望ましい」動作かどうかを判断する方法はありません。
@walenで指摘されているように、誤検知が許可されている場合は、実際にすべてのウイルスを検出できます。すべてをウイルスとして報告するだけです。
誤検知が許可されていない場合、すべてのウイルスを検出することも可能であると仮定しましょう。どのプログラムでも実行でき、そのプログラムがウイルスであるかどうかを返すIsVirus
関数があります。ここで、P
と呼ぶこのプログラムを考えます。
_if IsVirus(P):
exit
else:
DoVirusThings
_
IsVirus(P)
の値は何ですか? true
の場合、P
は何もせずに終了するため、誤検知が発生します。しかし、それがfalse
である場合、P
はウイルスに感染し、ウイルスが検出されません。
これは、偽陽性が許可されていない場合、すべてのウイルスを検出することが不可能であることを証明しています。
元の質問は「アンチウイルスがすべてのウイルスを検出できるわけではないことが数学的に証明されていますか?」
すべてのウイルスを検出するコードを書いたことを決して証明できないと言うのはおそらく正確です。
コードをダウンロードして実行する機能を備えたインターネットに接続された汎用コンピューターは、おそらくユニバーサルチューリングマシンと同等です。この同等性には、チューリングの無限のテープサイズが含まれます。マシンのネットワークインターフェイスの帯域幅がインターネットでアクセス可能なデータの総増加率よりも小さい場合、マシンは「テープの終わり」に到達できません。 (これについては少し前に この論文 の結論で説明しました。実用的な意味で実証可能ですが、数学的証明を考え出すには、おそらくいくつかの制約を追加する必要があります。)
上記が当てはまり、「停止する」が「システム上のすべてのウイルスを一覧表示するレポートを作成する」ことを意味する場合、プログラムが正しい答えで停止することを事前に証明することはできません。調べるために実行する必要があります。
上記の両方のパラグラフが当てはまる場合、考えられるすべてのウイルスの完全なリストをコンパイルして比較することができないため、結果のレポートが正しいことを確認することはできません。これらのウイルスはすべてテープのどこかにあり、無限です。サイズで、私たちは全部を読むことはできません。
3つの段落すべてが真である場合、100%正しいウイルス検出器を作成したことを証明できません。
アンチウイルスがすべてのウイルスを検出できるわけではないことが数学的に証明されていますか?
ブルース・シュナイアーが書いたときに参照していた分析は次のとおりです。
ウイルスには「治療法」はありません。既存のウイルス対策プログラムでは止められないウイルスを作成することが常に可能であることが数学的に証明されています。」[0]
[0]秘密と嘘。ブルース・シュナイアー。さちえ154
この回答は、ブルース・シュナイアーがどの分析を参照していたかについては直接触れていません。声明を発表したときに主な情報源が何を意味しているかに興味がある個人は、主な情報源に直接連絡して特定の質問をするように努力する必要があります、推測、推測、または混乱を避けるため。
カートゲーデルの 不完全性定理 1931年に出版されたÜber正式なunentscheidbareSätzeder "Principia Mathematica" und verwandter Systeme(英語で呼ばれる"正式には決定不能な" Principiaの命題について " Mathematica "と関連システム")慎重に検討すると、anyの正式なシステムの分析に非常に有益です政治へのコンピュータウイルス
1。 (論理的または公理的形式)システムが一貫している場合、それは完全ではありません。
2。公理の一貫性は、それら自身のシステム内で証明することはできません。これらの定理は、半世紀にわたって、すべての数学に十分な公理のセットを見つけるために、フレゲの研究から始まり、プリンシピアマテマティカとヒルベルトの形式論で最高潮に達しました。
後から考えると、不完全性定理の中心にある基本的な考え方はかなり単純です。 ゲーデルは本質的に、特定の形式システムでは証明できないと主張する式を構築しました。それが証明できれば、それは誤りです。したがって、常に少なくとも1つの真実だが証明できないステートメントが存在します。つまり、計算用に計算可能な列挙可能な公理のセット(つまり、原則として無制限のリソースを備えた理想的なコンピューターで出力できるセット)には、算術には当てはまるが、以下では証明できない公式があります。そのシステム。しかし、これを正確にするために、ゲーデルは、ステートメント、証明、および証明可能性の概念を(自然数として)エンコードするメソッドを作成する必要がありました。彼はこれをゲーデル番号付けと呼ばれるプロセスを使用して行いました。
まあ、ウイルスの定義はかなりあいまいです。はい、それは悪意のあるエンティティですが、悪意のあるものはあいまいです。システムとそのポリシーに応じて、悪意のあるエンティティの可能性は変化します。刻々と変化するエンティティを定義することは、さまざまな分野、数論、状態機械などで浮かび上がってきたものであり、少なくとも私たちが知っていることに基づいて、それが不可能であることがさまざまな方法で証明されています。
1つの方法は、悪意のあるものを定義する代わりに、許可されるものを定義できる、非常に厳密で独立したシステムで、特定の操作シーケンスのみを実行できるようにすることです。そうすれば、安全に保つことができます。
この問題IMOは、ランダムを定義するのと同じくらい難しいです。
ウイルスは単なるコードです-「私のAI芝刈り機プログラムが雑草と植物の違いを教えてくれますか?」
連絡先リストの全員にメールを送信するプログラムをダウンロードした場合、それはウイルスですか、それともスパマーですか?プログラム内の特定のバイトではなく、プログラムをダウンロードした理由によって異なります。
ですから、数学的な証明に行く必要すらありません。それができないという理由だけでいいのです。
一方、ウイルスを行動によって定義すると、ウイルスを簡単に特定できると言えます。プログラムは更新プロセスの一部として更新されます。このプロセス以外でコンピューター上のコードを変更しようとする試みがある場合、それをウイルスとして定義できます。この定義により、特定のインストール手順以外で発生する変更を簡単に検出できます。コードをデータから分離し、ボタンを押していないときにコード空間をロックできるハードウェアが必要になる場合がありますが、それは可能です(迷惑な場合)。
これは、更新プロセス中に故意にインストールしたコード自体がウイルスではないことも前提としていますが、この例では動作によってウイルスを定義しているため、定義ではそうではありません。
数学的な証明ではありませんが、マルウェアを検出するには2つの方法があります。
署名
新しいマルウェアが開発される可能性があるため(既存のマルウェアを難読化または変更することを含む)、新しいマルウェアのシグネチャはウイルス対策データベースに存在しないため、検出されません
ヒューリスティックス
この方法では、自動の動的分析または静的分析、あるいはその両方を使用して、ソフトウェアの動作を理解し、ソフトウェアの動作に従って、アンチウイルスが悪意のあるものかどうかを判断します。
そして、ここでトリッキーな部分が来ます、今日が無害であると考えられるすべてが未来にあるかもしれないというわけではありません。
たとえば、20年前、暗号化ライブラリを使用するソフトウェアは悪意のあるものと見なされていなかったかもしれませんが、データを暗号化するランサムウェアの一種である可能性があります。同時に、データを安全に保存するために暗号化ライブラリも使用するパスワードマネージャーを使用できます(また、そうする必要があります)。それでは、データが暗号化されているという事実だけに基づいて、それがマルウェアであるかどうかをどのように判断すればよいのでしょうか。同様に、TCP接続は、情報の漏えいやWebサイトの閲覧に使用される可能性があります
唯一の違いはセマンティックです。テクノロジーは絶えず進化し、マルウェアはその進化に適応するため、自動で分析することは困難です。結局のところ、マルウェアは所有者の悪意を除いて他のソフトウェアと何の違いもありません