Antivirus-Software soll den Computer vor Malware schützen. Diese Aufabe ist nicht lösbar. Nicht mal in der Theorie. Warum, erklärt dieser Artikel.
Antivirus-Programme, oder besser gesagt, Anti-Malware-Programme, müssen für beliebige andere Programme entscheiden, ob diese schädlich sind oder nicht. AV-Software bekommt als Eingabe ein anderes Programm und als Ausgabe wird erwartet, ob es sich um Malware handelt.
Ob ein Programm schädlich ist oder nicht, ist eine nicht-triviale Eigenschaft von Programmen. Nicht-trivial bedeutet, daß es eine Eigenschaft ist, die nicht alle Programme haben, man also nicht pauschal mit Ja (oder Nein) korrekt antworten könnte.
Wer Informatik studiert hat und mit der Theoretischen Informatik zu tun hatte, der kennt sicher die Begriffe Berechenbarkeit, Entscheidbarkeit, Turing-Maschine und vielleicht auch den Satz von Rice. Warum ist das für AV-Software wichtig?
Die Theoretische Informatik beschäftigt sich unter anderem mit der generellen Lösbarkeit von Problemen. Um zu zeigen, daß ein Problem nicht lösbar ist, also kein Algorithmus (Berechnungsvorschrift, Programm, Turing-Maschine) existiert, das die Aufgabe lösen kann, befreit man sich von allen irdischen Schranken und geht davon aus, man hätte einen Rechner, der unendlich viel Speicher und unendlich viel Rechenleistung hätte. Wenn man nun zeigen kann, daß eine Aufgabe auf so einem Rechner nicht lösbar ist, dann ist sie auf keinem Rechner jemals lösbar.
Eine der Erkenntnisse aus der Theoretischen Informatik ist der Satz von Rice (Rice's Theorem): Jede nicht-triviale Aussage über die von einer Turing-Maschine berechnete Funktion ist unentscheidbar. Mit anderen Worten, jede nicht-triviale Aussage über die von einem Programm berechnete Funktion ist unentscheidbar. Oder anders ausgedrückt, alle nicht-trivialen semantischen Fragen über Programme einer universellen Programmiersprache sind unentscheidbar. Mit noch anderen Worten, es ist nicht möglich, durch eine automatische Analyse über eine nicht-triviale Eigenschaft eines Programmes zu entscheiden. Oder nochmal anders formuliert, man kann über ein vorliegendes Programm nicht sagen, was es für nicht-triviale Eigenschaften hat. Man kann über ein gegebenens Programm nicht sagen, was es tut. Das bedeutet insbesondere, man kann nicht entscheiden, ob …
Unentscheidbar bedeutet, daß es kein Programm gibt, das die Frage beantwortet und
Man kann Software also nicht zuverlässig verifizieren oder prüfen. Für AV-Software bedeuten diese Erkenntnisse: AV-Software ist nicht machbar. Aber man könnte auf eine der beiden Bedingungen verzichten. Die zweite, immer zu terminieren, ist unverzichtbar, denn man will definitiv eine Antwort. Die erste, immer die richtige Anwort zu geben, ist also die einzige Möglichkeit, die Aufgabe so zu verändern, daß sie lösbar wird. Und das macht AV-Software; sie verzichtet darauf, immer die korrekte Anwort zu geben.
Die Antivirus-Leute wissen das auch alles oder sie sind spätestens in ihrer Praxis auf die Unlösbarkeit ihrer Aufgabe gestoßen. Für die AV-Industrie ist das gar nicht so übel, denn wenn man ein Problem niemals lösen kann, wird man bis in alle Ewigkeit damit beschäftigt sein, immer neue, ebenfalls nicht problemlösende Produkte auf den Markt zu bringen. Die Kasse stimmt, der Kunde ist mehr oder weniger beruhigt. Nur ein paar Informatiker wie ich meckern. Aber die kann man ja galant ignorieren.
Da niemand jemals, inbesondere die AV-Industrie nicht, für ein gegebenes Programm sagen kann, ob es schädlich ist, dieses auszuführen, kann man die Aufgabenstellung nochmals ändern: Versuche zu beobachten, was das Programm tut, während es ausgeführt wird. Versuche, Infektionen während der Laufzeit zu entdecken, verwende eine widerstandsfähige Laufzeitumgebung, die sich von einer Infektion erholen kann. Wer jetzt an virtuelle Machinen oder an Verhaltens-Analyse zur Laufzeit denkt, liegt richtig.
Dabei ist zu bedenken, daß man nicht alle Infektionen mitbekommen kann, weil man schlicht nicht weiß, worauf man alles achten müßte, und die Infektion auch den Überwachungsmechanismus kompromittieren kann.
Malware ist in der Lage festzustellen, ob sie in einer virtuellen Umgebung ausgeführt wird, und sich solange koscher zu verhalten, bis die Untersuchung zuende ist. Die Malware hat also die Möglichkeit, den Test zu überlisten, indem sie erst in der echten Umgebung oder ganz einfach zeitverzögert aktiv wird. Virtualisierungen lassen sich unter anderem an den verfügbaren Dateien erkennen. Die Malware kann schädliche Routinen auch später nachladen, so daß sie während der Untersuchung erstmal überhaupt keinen Schad-Code enthält. Das ist übrigens der Hauptgrund, warum iOS-Apps keinen Code dynamisch nachladen dürfen.
Prominentes Beispiel für dieses Vorgehen ist der Bouncer des Google Play Stores. Dieser macht eine statische Analyse der hochgeladenen Android-Anwendung und führt sie dann auch auf einem Geräte-Simulator aus und beobachtet ihr Verhalten. Wie sich auf die oben beschriebene Weise der Bouncer austricksen läßt, wurde von Jon Oberheide und Charlie Miller gezeigt. Der Bouncer verhält sich im Grunde wie eine herkömmliche AV-Software.
Eine Laufzeit-Analyse kann also Malware auch nicht zuverlässig erkennen.
Eine weitere Art, die Aufgabenstellung zu verändern, ist Blacklisting. Dies ist die klassische Art, Malware zu bekämpfen und sie besteht darin, bösartige Software wiederzuerkennen. Dazu berechnet man jeweils einen eindeutigen Hashwert pro bekanntem Malware-Exemplar und wenn man ein Programm mit allen bekannten Schadprogrammen vergleichen will, berechnet man auch von diesem einen Hashwert. Sind die Hashwerte gleich, sind auch die Programme gleich und eine Malware wiedererkannt.
So kann man mit relativ wenig Speicherplatz die bekannten Schadprogramme wiedererkennen. Der Nachteil ist hier jedoch, daß eine geringfügige Veränderung der Malware einen anderen Hashwert ergibt und sie dann erstmal nicht wiedererkannt wird, bis die schwarze Liste der Hashwerte wieder aktualisiert wird. Man hinkt also immer hinterher und erkennt nie neue Schad-Software.
Vorteil dieses Verfahren ist, daß es keine Fehlalarme liefert. Die Downloads von OS X werden auf diese Weise überprüft.
Antiviren-Software kann also nicht jede beliebige Malware davon abhalten, Schaden anzurichten, denn ein unbekanntes Programm kann nicht zuverlässig anhand seines Codes beurteilt werden, eine Laufzeit-Analyse ist nicht besonders wirksam und Blacklisting ist immer lückenhaft. Gibt es andere Wege, Malware zu stoppen? Ich sehe drei grundsätzliche Möglichkeiten: Signierter Code, Mandatory Access Control (MAC) und White-Listing von guten Programmen. Die Grundidee ist, nicht nach schädlicher Software zu suchen, sondern nur harmlose Software und notwendige Aktionen zuzulassen.
Wenn nur signierter Code laufen darf (wie bei iOS und teilweise bei OS X), und man dabei keine selbstsignierten Programme (wie bei Android) erlaubt, kann jeder Code zuverlässig einem bekannten Entwickler zugeordnet werden. Wechselt ein Entwickler die Seite, können seine Programme einfach identifiziert und am Laufen gehindert werden.
Dieser Weg kann natürlich noch kompromittiert werden, in dem eine der Stellen, die Zertifikate ausstellt, einen schwachen Punkt hat, wodurch ungeprüft oder bewußt falsche Zertifikate erstellt werden. Aber das ist recht selten.
Für jedes Programm wird definiert, was es tun darf. Alles andere ist automatisch verboten. Das wird zum großen Teil bei OS X schon umgesetzt, bei iOS jedoch ganz konsequent. Wird dann irgendein Programm (System oder User) von Malware manipuliert, dann kann es trotzdem nur weiterhin das tun, wofür es vorgesehen ist, und nicht für andere Dinge mißbraucht werden. Dazu gehört, welche Dateien gelesen oder geschrieben werden können, welche Art von Netzverkehr und mit wem ermöglicht wird und vieles mehr. Das kann sehr komplex werden, aber es ermöglicht definitiv, Malware die Tour gründlich zu vermasseln.
Andererseits kann natürlich ein Email-Programm auch in den Grenzen von MAC für Spam-Mails mißbraucht werden. Aber Angriffe, die Code nachladen und ein Programm um ganz anderes Verhalten erweitern, sind nicht mehr möglich.
Ebenfalls ein Feature, was man bereits von iOS durch den App Store kennt und optional in OS X verwendet werden kann. Anstatt zu prüfen, was bösartig ist, läßt man nur bekannt gutartige Programme zu. Für iOS sind nur von Apple geprüfte Programme genehm und bei OS X ist das konfigurierbar.
AV-Software arbeitet hingegen mit Blacklisting und hinkt damit zwangsläufig immer hinterher.