it-swarm.com.de

Wurde mathematisch nachgewiesen, dass Antivirus nicht alle Viren erkennen kann?

Auf welche Analyse bezog sich Bruce Schneier, als er schrieb:

Viren haben keine "Heilung". Es ist mathematisch erwiesen, dass es immer möglich ist, einen Virus zu schreiben, den ein vorhandenes Antivirenprogramm nicht stoppen kann.

Aus dem Buch Secrets & Lies von Bruce Schneier, Seite 154.

148
Cate

Unter einer möglichen Interpretation davon ist es ein Ergebnis von Reiss Theorem . Ein Programm ist böswillig, wenn es eine böswillige Aktion ausführt, die es zu einer semantischen Eigenschaft macht. Einige Programme sind bösartig und andere nicht, was es zu einer nicht trivialen Eigenschaft macht. Nach dem Satz von Rice ist es daher im allgemeinen Fall unentscheidbar, ob ein Programm bösartig ist.

Eigentlich kann das Gegenteil leicht bewiesen werden : Da alle Computerviren auf die eine oder andere Weise ausführbarer Code sind, müssen Sie nur Schreiben Sie ein Antivirenprogramm, das JEDEN ausführbaren Code als viral meldet. Daraus folgt logischerweise, dass ein solches Programm ALLE möglichen Viren erkennt :

  • Der gesamte Code wird von Ihrem Antivirenprogramm erkannt (C → D).
  • Alle Viren sind Code (V → C)
  • Alle Viren werden von Ihrem Antivirus erkannt (V → D)

Sicher, es könnte ein Argument dafür vorgebracht werden, dass diese Antivirensoftware zu viele "False Positives" ausschließt. Aber nach welchen Kriterien kann entschieden werden, ob ein Positiv falsch oder wahr ist? Ah! Es stellt sich heraus, dass die Unterscheidung zwischen gutartigem und bösartigem Code, zwischen einer ehrlichen "Remote PC Control" -Suite und einem Trojaner wie Netbus völlig willkürlich ist und die ganze Frage daher sinnlos ist.

191
walen

Laut Wikipedia :

Im Jahr 1987 veröffentlichte Fred Cohen eine Demonstration, dass es keinen Algorithmus gibt, der alle möglichen Viren perfekt erkennen kann.

Es verweist auch auf dieses Papier . Das könnte die Analyse sein, auf die sich Herr Schneier bezog.

93
Harry Johnston

Die Aussage kann nicht mathematisch bewiesen werden, wenn sie nicht als mathematischer Satz umformuliert wird.

Zumindest erfordert dies eine mathematisch fundierte Definition dessen, was ein "Virus" ist: was eine Herausforderung darstellt; und Sie könnten mit einer Abstraktion enden, die in der Praxis nicht nützlich ist, weil sie einige Verhaltensweisen enthält, die Menschen als völlig harmlos und nützlich betrachten, und/oder einige Verhaltensweisen ausschließt, die Menschen als unsozial betrachten.

Das Schwierige dabei ist, dass ein Virus ein Programm ist, das seine Umgebung auf irgendeine Weise verändert, und jeder Versuch, die Umgebung genau zu definieren, für den praktischen Gebrauch zu einschränkend sein wird.

Also würde ich nein sagen: Der Satz kann nicht mathematisch bewiesen werden, und das liegt daran, dass er nicht mathematisch formuliert werden kann.

25
Michael Kay

tl; dr - Die Antwort hängt davon ab, welche Anforderungen Sie an die Frage stellen.

  1. Wenn Sie lediglich alle Viren ohne weitere Einschränkungen erkennen möchten, markieren Sie einfach alles und jeden als Virus, und fertig.

  2. Wenn Sie alle Programme ordnungsgemäß als Virus identifizieren möchten oder nicht, ist dies im ungebundenen Fall nicht möglich, da sich das Klassifizierungsproblem auf das Stoppproblem reduziert.

  3. Wenn Sie alle Programme ordnungsgemäß als Virus identifizieren möchten oder nicht und eine endliche Maschine in Betracht ziehen, ist dies theoretisch möglich, in der Praxis jedoch im Allgemeinen nicht möglich.

  4. Wenn Sie zulassen, dass der Computer zufällige Fehler erzeugt, kann jedes Programm ein Virus sein.

Fall 1: Vollständige Viruserkennung

Wenn alle Programme als Viren gekennzeichnet werden, werden sie offensichtlich alle gefangen. ( Pok'e'mon !)

Beginnen Sie mit diesem Fall, um darauf hinzuweisen, dass es nicht schwer ist, alle Viren zu erkennen. Vielmehr besteht das spezifische theoretische Problem darin, iff Programme korrekt zu klassifizieren.

Fall 2: In einem allgemeinen, unbegrenzten Szenario kann keine korrekte Klassifizierung vorgenommen werden

Betrachten Sie das Programm:

doHaltingProblem();          //  Not a virus operation itself
installEveryVirusEver();     //  Definitely a virus operation, but will it happen?

In diesem Fall ist das Programm nur dann ein Virus, wenn das Stoppproblem angehalten wird und installEveryVirusEver() auftreten kann. Die Viruserkennung reduziert sich also auf das Problem des Anhaltens im allgemeinen, ungebundenen Fall.

Fall 3: Möglich durch Brute-Force-Suche in begrenzten Szenarien

Wenn Programme, die als Viren klassifiziert werden sollen oder nicht, auf einem endlichen Computer ausgeführt werden sollen, können Sie einfach den Computer simulieren, der von jedem möglichen Startzustand aus ausgeführt wird. Endliche Maschinen werden schließlich zu einem früheren Zustand zurückkehren , daher ist es notwendigerweise eine endliche (wenn auch langwierige) Analyse.

Fall 4: Bei fehlerhaften Maschinen können spontan Viren auftreten

Angenommen, ein Computer kann ein Programm ausführen, das als Virus betrachtet wird, und es besteht eine Wahrscheinlichkeit ungleich Null, dass eine zufällige Mutation es in diesen Zustand versetzt, dann sollte es schließlich zu einem Virenzustand gelangen.

Das ist ein langweiliger Punkt, aber der Vollständigkeit halber.


Diskussion über das Zitat in der Frage

Viren haben keine "Heilung". Es ist mathematisch erwiesen, dass es immer möglich ist, einen Virus zu schreiben, den ein vorhandenes Antivirenprogramm nicht stoppen kann.

" Secrets & Lies" , Bruce Schneier, Seite 154

Wie in Fall (1) oben ausgeführt, ist es möglich, alle Viren zu kennzeichnen, indem nur alles als Virus gekennzeichnet wird. das ist einfach. Was unmöglich ist, ist in einem ungebundenen Fall festzustellen, ob jedes mögliche Programm ein Virus ist oder nicht.

Außerdem ist es schwierig festzustellen, ob bestimmte Programme in gebundenen Fällen Viren sind. Betrachten Sie zum Beispiel das Programm:

var toExecute = decryptByBruteForce([ciphertext]);  // Decrypt the next part of the program by brute-force
run(toExecute);                                     // Run the now-decrypted part of the program

Wie in Fall (3) erläutert, kann dieses Programm auf einem endlichen Computer als Virus oder nicht eingestuft werden. Da dies jedoch das brutale Erzwingen einer verschlüsselten Nachricht erfordern würde, ist dies in praktischen Szenarien wahrscheinlich nicht möglich.

In realen Anwendungen reduziert sich dies auf das Problem Heuristik : Antivirenprogramme raten, was ein Virus ist oder nicht. Wenn Sie eine zuverlässigere Sicherheit wünschen, kann ein Antivirenprogramm alles kennzeichnen, was sich nicht als sicher erweisen kann, und das Problem umgehen, dass jedes mögliche Programm klassifiziert werden muss.

Leider gibt die Verwendung von Heuristiken sachkundigen Angreifern Sicherheitslücken zum Zielen. Ohne die Quelle des Zitats zu lesen, vermute ich, dass dieses Problem das ist, worauf sie sich beziehen wollten.

18
Nat

Dies hängt von Ihrer Definition von "Stopp" ab.

Wenn Sie stop als "im Voraus erkennen, dass dieser Code etwas Bösartiges tun und verhindern könnte, dass er ausgeführt wird" definieren, ist dies, wie andere erwähnt haben, nach dem Satz von Rice unmöglich.

Wenn Sie stop als "Erkennen, wann ein laufendes Programm versucht, etwas Schlechtes zu tun, und dann stoppen" definieren, gilt der Satz von Rice nicht. Ihr Antivirenprogramm muss nicht entscheiden, ob das Programm etwas Bösartiges tun könnte, sondern nur, ob es jetzt etwas Bösartiges tut.

AFAIK, die zweite Version hat sich mathematisch nicht als unmöglich erwiesen. Und tatsächlich ist es für jede hinreichend spezifische Definition von "bösartig" sehr machbar - dies ist im Wesentlichen Sandboxing.

Es ist jedoch wahrscheinlich, dass es keine gute Definition von "bösartig" gibt, die alle Formen von Bosheit abdeckt, die ein Virus versuchen könnte. Was ist mit einem Virus, der Bitcoin abbaut? Oder das serviert Piratenfilme? Oder dass Spam-Foren in Ihrem Namen? All dies ist nicht von Code zu unterscheiden, der von Benutzern ausgeführt wird, die wirklich genau diese Dinge tun möchten. Daher vermute ich (obwohl ich keinen Beweis kenne), dass die Erstellung von Antivirenprogrammen vollständig ist.

16
James_pic

Ja, es wurde von Alonzo Church in den Jahren 1935 bis 1936 mathematisch und kurz darauf von Alan Turing in den Jahren 1936 unabhängig bewiesen.

https://en.wikipedia.org/wiki/Entscheidungsproblem

8

Nein, das können Sie nicht, denn der Unterschied zwischen Malware und einem nützlichen Programm ist völlig subjektiv. Jedes "böse" Verhalten kann beabsichtigtes Verhalten sein. Zum Beispiel laufen derzeit folgende Programme auf meinem Computer:

  • Ein Programm, das alle meine Dateien verschlüsselt. Handelt es sich um eine Cryptolocker-Ransomware oder ein Tool zur vollständigen Festplattenverschlüsselung?
  • Ein Programm, mit dem der Fernzugriff meinen Computer steuern kann. Ist es ein Trojaner oder Team Viewer?
  • Ein Programm, das Netzwerkverbindungen zu allen Arten von Computern über das Internet herstellt und unklare Daten mit ihnen austauscht. Ist es ein Botnetz oder eine verteilte Computerplattform?
  • Ein Programm, das alle meine persönlichen Dateien an einen Remote-Server sendet. Handelt es sich um Spyware oder um Cloud Backup?
  • Ein Programm, das ausführbare Dateien aus dem Internet herunterlädt und ausführt. Ist es ein Malware-Dropper oder Steam?

Man kann den Unterschied nicht erkennen, weil sie aus rein technischer Sicht genau das Gleiche tun. Der einzige Unterschied liegt in der Absicht. Ein Programm täuscht den Benutzer darüber, was es tut und handelt gegen die Interessen des Benutzers, das andere tut genau das, was der Benutzer möchte. Aber was der Benutzer wirklich von seiner Software will, kann eine Maschine nicht entscheiden ... zumindest nicht in der gegenwärtigen Phase der KI-Technologie. Aus diesem Grund basieren alle Virenscanner hauptsächlich auf Signaturen.

8
Philipp

Um mathematisch zu beweisen, dass es immer möglich ist, einen Virus zu schreiben, der alle vorhandenen Antivirenprogramme umgehen kann, müssten Sie zunächst mathematisch definieren, was ein Virus ist, und viel Glück damit.

Vielleicht ein "Programm, das unerwünschte Aktionen ausführt"? Nun, das ist einfach unmöglich. Stellen Sie sich ein Programm vor, das eine Verbindung zu Ihrem PC herstellt und die Fernbedienung ermöglicht. Das Antivirenprogramm kann erkennen, dass das Programm dies tut, aber wie kann es wissen, ob es gewünscht wird oder nicht?

Es kann sich um ein legitimes Fernsteuerungsprogramm wie TeamViewer handeln, oder es kann sich um ein Virus handeln, das als einfaches Bildbetrachtungsprogramm maskiert wird. Ihr Antivirus erkennt ein Programm, das Bilder von Ihrem PC lesen und anzeigen und Remoteverbindungen öffnen kann kann nicht feststellen, ob dies ein "gewünschtes" Verhalten ist oder nicht, da es nicht wissen kann, warum Sie dieses Programm installieren.

5
kajacx

Wie von @walen hervorgehoben, ist es tatsächlich möglich, alle Viren zu erkennen, wenn Fehlalarme zulässig sind: Melden Sie einfach alles als Virus.

Nehmen wir an, dass es auch möglich ist, alle Viren zu erkennen, wenn Fehlalarme nicht zulässig sind. Wir haben eine IsVirus -Funktion, die auf jedem Programm ausgeführt werden kann und zurückgibt, ob dieses Programm ein Virus ist oder nicht. Betrachten Sie nun dieses Programm, das wir P nennen werden:

if IsVirus(P):
    exit
else:
    DoVirusThings

Was ist der Wert von IsVirus(P)? Wenn es true ist, dann wird P einfach beendet, ohne etwas zu tun, und wir haben daher ein falsch-positives Ergebnis. Aber wenn es false ist, dann macht P Virensachen und wir haben einen unentdeckten Virus.

Dies zeigt, dass es nicht möglich ist, alle Viren zu erkennen, wenn falsch positive Ergebnisse nicht zulässig sind.

4
Matthew

Die ursprüngliche Frage lautete "Wurde mathematisch nachgewiesen, dass Antivirus nicht alle Viren erkennen kann?"

Es ist wahrscheinlich richtig zu sagen, dass wir niemals beweisen können , dass wir Code geschrieben haben, der alle Viren erkennt.

Ein an das Internet angeschlossener Allzweckcomputer mit der Fähigkeit, Code herunterzuladen und auszuführen, entspricht wahrscheinlich einer universellen Turing-Maschine. Diese Äquivalenz umfasst die unendliche Bandgröße von Turing: Wenn die Bandbreite der Netzwerkschnittstelle des Computers geringer ist als die Gesamtwachstumsrate der über das Internet zugänglichen Daten, kann der Computer niemals das "Ende des Bandes" erreichen. (Ich habe dies in der Schlussfolgerung von diesem Artikel vor langer Zeit ein wenig behandelt. Obwohl dies im praktischen Sinne nachweisbar ist, würde die Erstellung eines mathematischen Beweises wahrscheinlich das Hinzufügen einiger Einschränkungen erfordern.)

Wenn das oben Gesagte zutrifft und "anhalten" bedeutet "einen Bericht erstellen, in dem alle Viren auf dem System aufgelistet sind, nicht mehr oder weniger", können wir nicht im Voraus beweisen, dass das Programm mit einer korrekten Antwort angehalten wird. wir müssen es ausführen, um es herauszufinden.

Wenn beide oben genannten Absätze zutreffen, können wir die Richtigkeit des resultierenden Berichts niemals überprüfen, da wir niemals eine vollständige Liste aller möglichen Viren erstellen können, mit denen wir sie vergleichen können: Diese Viren befinden sich alle irgendwo auf dem Band, es ist unendlich in der Größe, und wir können nie das Ganze lesen.

Wenn alle drei Absätze wahr sind, können wir niemals beweisen, dass wir einen 100% korrekten Virendetektor geschrieben haben.

2
stevegt

Wurde mathematisch nachgewiesen, dass Antivirus nicht alle Viren erkennen kann?

Auf welche Analyse bezog sich Bruce Schneier, als er schrieb:

Viren haben keine "Heilung". Es ist mathematisch erwiesen, dass es immer möglich ist, einen Virus zu schreiben, den ein vorhandenes Antivirenprogramm nicht stoppen kann. "[0]

[0] Geheimnisse & Lügen. Bruce Schneier. Seite 154

Diese Antwort bezieht sich nicht direkt auf die Analyse, auf die Bruce Schneier verwies. Eine Person, die daran interessiert ist, was eine Primärquelle bedeutete, als sie eine Erklärung abgab, sollte sich bemühen, die Primärquelle selbst zu kontaktieren, um ihre spezifischen Fragen zu stellen . um Spekulationen, Vermutungen oder Verwirrung zu vermeiden.

Kurt Gödels nvollständigkeitssatz veröffentlicht 1931 in Über formale unentscheidbare Sätze der "Principia Mathematica" und verwandter Systeme (auf Englisch genannt "Über formal unentscheidbare Sätze von "Principia Mathematica" und verwandte Systeme ") ist bei sorgfältiger Prüfung sehr lehrreich und relevant für die Analyse von any formales System, von Computerviren bis zur Politik

1. Wenn ein (logisches oder axiomatisches formales) System konsistent ist, kann es nicht vollständig sein.
2. Die Konsistenz von Axiomen kann in ihrem eigenen System nicht bewiesen werden.

Diese Theoreme beendeten ein halbes Jahrhundert der Versuche, beginnend mit der Arbeit von Frege und gipfelten in Principia Mathematica und Hilberts Formalismus, eine Reihe von Axiomen zu finden, die für die gesamte Mathematik ausreichen.

Im Nachhinein ist die Grundidee des Unvollständigkeitssatzes ziemlich einfach. Gödel konstruierte im Wesentlichen eine Formel, die behauptet, dass sie in einem gegebenen formalen System nicht beweisbar ist. Wenn es beweisbar wäre, wäre es falsch. Somit wird es immer mindestens eine wahre, aber unbeweisbare Aussage geben. Das heißt, für jede rechnerisch aufzählbare Menge von Axiomen für die Arithmetik (dh eine Menge, die im Prinzip von einem idealisierten Computer mit unbegrenzten Ressourcen ausgedruckt werden kann) gibt es eine Formel, die für die Arithmetik gilt, in der jedoch nicht nachweisbar ist dieses System. Um dies zu präzisieren, musste Gödel jedoch eine Methode entwickeln, um Aussagen, Beweise und das Konzept der Beweisbarkeit (als natürliche Zahlen) zu codieren. Er tat dies unter Verwendung eines Prozesses, der als Gödel-Nummerierung bekannt ist.

1
guest271314

Nun, die Definition eines Virus ist ziemlich vage. Ja, es ist eine böswillige Entität, aber böswillig ist genauso vage. Abhängig vom System und seinen Richtlinien ändern sich die Möglichkeiten für eine böswillige Entität. Die Definition einer sich ständig ändernden Entität ist etwas, das in verschiedenen Bereichen, in der Zahlentheorie, in Zustandsmaschinen usw. aufgetaucht ist, und es wurde auf unterschiedliche Weise bewiesen, dass dies nicht möglich ist, zumindest basierend auf dem, was wir wissen.

Ein Weg wäre, anstatt zu definieren, was bösartig ist, können wir definieren, was erlaubt ist, ein sehr strenges und unabhängiges System, das nur bestimmte Abfolgen von Operationen zulässt. Auf diese Weise kann es sicher aufbewahrt werden.

Dieses Problem IMO ist genauso schwer wie die Definition von Zufall.

1
Adithya Sama

Ein Virus ist nur Code - es ist nett, wenn man sagt "Kann mein AI-Rasenmäherprogramm den Unterschied zwischen Unkraut und Pflanzen erkennen" - wenn ja, zieht es Podeste?

Wenn Sie ein Programm herunterladen, das E-Mails an alle Personen in Ihrer Kontaktliste sendet, handelt es sich um einen Virus oder um einen Spammer? Hängt davon ab, warum Sie das Programm heruntergeladen haben, nicht von bestimmten Bytes im Programm.

Sie müssen also nicht einmal zum mathematischen Beweis gehen - Sie können nur argumentieren, dass dies nicht möglich ist.

Auf der anderen Seite könnte man sagen, dass es einfach ist, Viren zu identifizieren, wenn Sie Viren anhand ihres Verhaltens definieren. Programme werden im Rahmen eines Aktualisierungsprozesses aktualisiert. Wenn irgendetwas versucht, Code auf Ihrem Computer außerhalb dieses Prozesses zu ändern, können Sie ihn als Virus definieren. Mit diesen Definitionen können Sie leicht Änderungen erkennen, die außerhalb bestimmter Installationsverfahren auftreten. Möglicherweise ist Hardware erforderlich, die Code von Daten trennen und den Codebereich sperren kann, wenn Sie keine Taste gedrückt halten. Dies ist jedoch möglich (wenn dies ärgerlich ist).

Dies setzt auch voraus, dass der Code, den Sie während des Aktualisierungsprozesses absichtlich installiert haben, kein Virus selbst ist. Da wir in diesem Beispiel einen Virus nach Verhalten definieren, ist dies per Definition wohl nicht der Fall.

1
Bill K

Kein mathematischer Beweis, aber AFAIK gibt es zwei Möglichkeiten, Malware zu erkennen:

nterschriften

Da neue Malware entwickelt werden kann - einschließlich der Verschleierung oder Änderung vorhandener -, befindet sich die Signatur der neuen Malware nicht in der Antivirendatenbank und wird daher nicht erkannt

Heuristik

Diese Methode verwendet eine automatische dynamische und/oder statische Analyse, um das Verhalten der Software zu verstehen. Je nachdem, was sie tut, entscheidet das Antivirenprogramm, ob es böswillig ist oder nicht.

Und hier kommt der schwierige Teil, nicht alles, was heute als harmlos angesehen wird, könnte in der Zukunft liegen.

Vor 20 Jahren wurde beispielsweise eine Software, die Verschlüsselungsbibliotheken verwendet, möglicherweise nicht als bösartig angesehen. Jetzt wissen wir, dass es sich möglicherweise um eine Art Ransomware handelt, die Ihre Daten verschlüsselt. Gleichzeitig können (und sollten) Sie einen Kennwortmanager verwenden, der auch Verschlüsselungsbibliotheken verwendet, um Ihre Daten sicher zu speichern. Wie können wir also entscheiden, ob es sich um Malware handelt oder nicht nur aufgrund der Tatsache, dass Daten verschlüsselt werden? In ähnlicher Weise kann eine TCP -Verbindung) verwendet werden, um Informationen zu verlieren oder Websites zu durchsuchen

Der einzige Unterschied ist die Semantik, die sich nur schwer automatisch analysieren lässt, da sich die Technologien ständig weiterentwickeln und sich Malware an diese Entwicklung anpasst. Schließlich unterscheidet sich Malware nicht von anderer Software, außer von den schlechten Absichten des Besitzers

0
Mr. E