Evil-Bit für Executables
Diese Woche wurde an mich wieder mal die Frage herangetragen, ob es nicht möglich sei, auf einem HTTP– und Mailgateway ausführbare Dateien (Executables) generell zu blocken und nicht bis zum Browser bzw. ins Postfach des Nutzers gelangen zu lassen. Da es in diesem Fall konkret um die Proxy-Software Squid und den Mailserver Postfix geht wäre eine Filterung auf Basis des Dateinamens relativ schnell über entsprechende ACLs und »header checks« umsetzbar; diese Art der Überprüfung ist allerdings auch sehr unzuverlässig.
Eine bessere Lösung, die den Inhalt von E-Mail-Anhängen und herunter geladenen Dateien untersucht, unabhängig vom Dateinamen bzw. der Dateiendung, sollte es schon sein. Schön wäre es auch, wenn der Inhalt von (komprimierten) Archiven auf das Vorhandensein von ausführbaren Binärdateien durchsucht werden könnte. Zudem sollte sich der Aufwand in Grenzen halten um das Gesamtsystem nicht noch komplexer zu machen. Ach ja, die Performance des HTTP-Proxys sollte ebenfalls nicht weiter leiden — immerhin werden hier schon alle Anfragen durch einen Virenscanner — in diesem Fall HAVP in Verbindung mit ClamAV — gejagt.
Moment mal! Der Virenscanner. Sowohl die E-Mails (clamsmtp) als auch der beim Surfen anfallende Datenverkehr werden in diesem Fall vom Virenscanner ClamAV auf Schadcode hin untersucht. Dabei werden auch sehr gewissenhaft unterschiedlichste Archivtypen zerlegt und deren Inhalt geprüft. Wäre es da nicht sinnvoll, man könnte dem Scanner gleich mitteilen generell alle ausführbaren Dateien als gefährlich einzustufen und Alarm zu schlagen?
Leider bringt ClamAV einen solchen Schalter nicht mit. Der Open Source Virenscanner verfügt aber über die Option, neben den offiziellen Virensignatur-Datenbanken auch selbst definierte Schadcode-Muster bei der Suche nach bösartigem Code zu nutzen.
Wie man eigene Signaturen für ClamAV erzeugt verrät das PDF »Creating signatures for ClamAV«. Das Dokument beschreibt recht gut, wie man aus entdecktem Schadcode eine Virensignatur erstellen kann. Das interessiert uns im vorliegenden Fall aber erstmal weniger. Im Abschnitt 3.3.4 finden wir aber die Lösung zu unserem Problem. Das »extended signature format« liefert uns genau die benötigten Optionen, damit wir eine »Generalsignatur« für ausführbaren Programmcode definieren können. Eine solche Signatur hat allgemein den folgenden Aufbau:
MalwareName:TargetType:Offset:HexSignature
“MalwareName« ist der Name unseres »Virus«. Hier sollte man sich für eine Bezeichnung entscheiden, die sofort klar macht, dass es sich nicht unbedingt um eine gefährliche Datei handelt. Das zweite Feld »TargetType« ist schon interessanter. Hier kann man den Dateityp bestimmen, auf den die Signatur zutreffen soll. Uns interessieren im konkreten Fall Dateien vom Typ »Portable Executable, both 32– and 64-bit«, TargetType ist also »1«.
Die nächsten beiden Felder definieren eine Binärsignatur und an welcher Stelle in der Datei diese Signatur erwartet wird. Windows-Executables zeichnen sich durch eine typische Zeichenfolge am Anfang der Datei aus. Daher wählen wir als Offset »0« um deutlich zu machen, das die aufgeführte Signatur am Anfang der Datei zu finden sein muss.
Kennt man den Binärcode von ausführbaren Dateien unter Windows nicht auswendig (ich bin mir auch nicht sicher, ob ich so Leute kennen will g) greift man unter UNIX-Systemen zum Tool hexdump und wirft damit schnell einen Blick in eine .exe-Datei:
$ hexdump putty.exe | head -1
0000000 5a4d 0090 0003 0000 0004 0000 ffff 0000
“5a4d« ist der gesuchte Fingerabdruck. Die Signatur für ClamAV sähe demnach wie folgt aus:
Executable.Not.Allowed:1:0:5a4d??
Die beiden Fragezeichen (»??«) sind ein Hinweis, dass es nach der vorherigen Sequenz noch weitere Bytes in der Datei gibt.
Damit wäre die Virensignatur fertig, jetzt muss sie nur noch ClamAV bekannt gemacht werden damit dieser auch über die neue Bedrohung Bescheid weiß. ClamAV sucht nach Virensignatur-Dateien im konfigurierten Datenbank-Verzeichnis — meist /var/lib/clamav. Ein Blick in die ClamAV-Konfiguration (clamav.conf) bringt hier aber Gewissheit. Damit also der Virenscanner unseren neuen Virus in seine Suchmusterdatenbank aufnimmt speichern wir die oben genannte Zeile in einer Datei mit der Endung ».ndb«:
$ echo 'Executable.Not.Allowed:1:0:5a4d??' > /var/lib/clamav/notallowed.ndb
Fertig. Zur Sicherheit sollte man nun alle Prozesse, die auf ClamAV zurückgreifen neu starten (z.B. HAVP, clamsmtp und clamd). ClamAV und die darauf basierenden Tools (clamscan, clamd, libclamav, clamsmtp, etc.) nutzen ab sofort die zusätzliche Signatur und werden Windows-Executables (darunter fallen neben .exe auch .dll, .sys und .drv) als Virus erkennen. Ein kurzer Test mit clamscan zeigt uns dies auch:
$ clamscan putty.exe
putty.exe: Executable.Not.Allowed.UNOFFICIAL FOUND
$ clamscan wnaspi32.zip
wnaspi32.zip: Executable.Not.Allowed.UNOFFICIAL FOUND
$ clamscan wnaspi32.dll
wnaspi32.dll: Executable.Not.Allowed.UNOFFICIAL FOUND
HAVP und clamsmtp bringen nun eine entsprechende Fehlermeldung oder verweigern die Annahme der Mail — und das ohne großen Mehraufwand in der Konfiguration oder verschlechterter Leistung.
PS: Wer sich jetzt auf Grund der Überschrift fragt was dieser Artikel mit dem in RFC3514 beschriebenen »evil bit« zu tun hat, den muss ich leider enttäuschen. Die Antwort lautet nämlich ‘ziemlich wenig’. :-)
Zumal das hier beschriebene Verfahren in der Praxis wirklich funktioniert und dabei mehr Sicherheit bringt als die Auswertung des »security bit« in IPv4-Headern — der Vorschlag hat sich leider nie so richtig durchgesetzt. ;-)