Universelle Schwachstellen-Erkennung für IoT
Ein Forscher der Universität Bochum will Sicherheitslücken von vernetzten Geräten im Binärcode automatisch aufspüren – und das unabhängig davon, welcher Prozessor in den Geräten arbeitet.
Immer mehr Geräte kommunizieren über das Internet. Nahezu jedes Gerät verwendet dafür aber eine eigene Software. Nun wollen IT-Sicherheitsexperten der Instituts für Systemsicherheit der Universität Bochum um Prof. Dr. Thorsten Holz eine Methode entwickeln, wie sich trotz der Unterschiede zwischen Geräten, durchgängige Sicherheit realisieren lässt. Bislang unterstützten Analyse-Tools meist nur bestimmte Komponenten oder Plattformen.
Im Zuge des von der EU geförderten Bochumer Projekts “Bastion – Leveraging Binary Analysis to Secure the Internet of Things“, soll eine universelle Sprache für die Geräte und deren Prozessoren entwickelt werden. Da die Hersteller den Quellcode als Betriebsgeheimnis hüten, können die Forscher nicht auf diesen Code zugreifen. Statt dessen lesen sie daher den Binärcode aus den Geräten aus.
Abhängig von der Komplexität des Prozessors gibt es natürlich auch im Binärcode der Geräte starke Unterschiede, so dass auch gleichlautende Instruktionen sehr unterschiedlichen Code generieren können. Damit das Team um Holz herum dennoch eine Sicherheitsanalyse des Codes realisieren kann, wird der Binärcode zunächst in eine “Zwischensprache” übersetzt. Für Intel-, ARM- und MIPS-Prozessoren liegt diese Sprache bereits vor.
Durch die Analyse des Codes in dieser Sprache können die Forscher Programmierfehler und Sicherheitslecks aufspüren. Schon 2015 konnte das Bochumer Forscher-Team auf diese Weise im Internet Explorer eine Lücke finden und auch automatisch beheben.
Holz hatte unter anderem auch die Testsoftware für Dieselfahrzeuge aus dem Volkswagen-Konzern analysiert und dank der Methode nachvollziehen können, wie der Hersteller die Software genau manipuliert hatte. Allerdings lasse sich derzeit die Methode nicht auf jede Software anwenden. Bis das Projekt 2020 ausläuft, soll das Verfahren aber für alle Prozessor-Typen verfügbar sein und auch die Mehrzahl der Geräte soll dann automatisch aktualisiert werden können.
Bis dahin aber wartet noch viel Arbeit auf das Bochumer Team. Denn wo zum Beispiel ein moderner Autoschlüssel mit 20 Instruktionen auskommt, verwendet ein komplexer Intel-Prozessor mehr als 500 Befehle.
Damit ihre Sicherheitsanalysen unabhängig vom Prozessor sind, müssen die Bochumer Forscher die Binärcodes zunächst übersetzen. Am Ende sollen Instruktionen eines Microcontrollers genau so aussehen, wie die Befehle aus einem PC-Prozessor: “Das ist Fleißarbeit”, kommentiert Holz, denn die Forscher müssen dazu viele verschiedene Instruktionen umwandeln. “Unsere Zwischensprache enthält weniger als zwei Dutzend Befehle. Was komplexe Prozessoren in einem einzigen Schritt tun, müssen wir in viele kleine Schritten zerlegen.”
Das heißt: Wo ein Intel-Prozessor einen einzigen Befehl für eine Verschlüsselung ausgibt, müssen die Forscher auf eine lange Folge von arithmetischen und logischen Operationen und verschiedenen Sprungbefehlen zurückgreifen. Wenn sie den Befehlssatz in die Metasprache übersetzt haben, können sie gezielt nach Programmierfehlern suchen, über die sich Kriminelle möglicherweise Zugriff auf das System verschaffen können. Wie es aussieht, sind solche Programmierfehler relativ weit verbreitet.
“Durchschnittlich finden sich in einer gut gepflegten Software ein bis zwei sicherheitskritische Schwachstellen pro 20.000 Zeilen Code”, sagt Thorsten Holz. Das Betriebssystem Windows besteht beispielsweise aus 40 bis 50 Millionen Zeilen. Laut Holz Rechnung müsste Windows damit Tausende von Sicherheitslücken enthalten.
Besonders gefährlich sind Code-Zeilen, an denen eine Variable nur eine bestimmte Länge haben darf, Angreifer aber über diese Grenze hinaus schreiben können (Buffer Overflow). Ebenfalls fehleranfällig sind Prüfungen, ob eine Variable einer bestimmten Bedingung entspricht, etwa kleiner, größer oder gleich null ist. Wird im Programm dann die Abfrage dieser Bedingung vergessen, kann das Angreifern ebenfalls Zugriff auf das System ermöglichen.
Aber nicht alle auf diese Weise aufgespürten Fehler können sich auch für einen Angriff ausnutzen lassen, betont Holz. Daher prüfen die Forscher in einem dritten Schritt, in welchem Kontext ein Code ausgeführt wird. Dafür greifen sie wieder auf Standardverfahren zurück, etwa symbolische Ausführung. Dafür wird einem Programm, wie etwa eine Taschenrechner-App, mit Variablen statt konkreten Zahlen gefüttert. Statt Zahlen werden für die Prüfung die Variablen Alpha und Beta eingesetzt. Dann prüft ein Algorithmus, welche Werte die Variablen annehmen müssen, um einen gewissen Punkt im Programmcode zu erreichen. “In unserem Beispiel könnte das etwa lauten, dass Alpha zwischen 100 und 500 liegen muss, um an die sicherheitskritische Schwachstelle im Code zu gelangen”, erklärt Holz.
“Manchmal dauert es eine Weile, bis Sicherheitslücken in einem Gerät auffallen und Hersteller sie beheben”, so Holz weiter. Genau hier können die Methoden seiner Gruppe helfen. Daher will er nicht nur Lücken aufspüren, sondern diese Lecks auch automatisch schließen.
Das ist aber nicht so ohne weiteres möglich, denn um diese Lecks zu schließen, müssen die entsprechenden Aktualisierungen in der Zwischensprache durchgeführt werden. Damit der Prozessor diese Instruktionen ausführen kann, muss der Befehl wieder in die Binärsprache zurückübersetzt werden. “Es ist, als würde man einen deutschen Text ins Englische übersetzen, eine Passage hinzufügen, und dann zurück ins Deutsche übersetzen”, veranschaulicht Holz. “Beim letzten Übersetzungsschritt hakt es derzeit noch. Aber ich bin optimistisch, dass wir das hinbekommen.”
Tipp der Redaktion: Erfahren Sie mehr über die Chance, Einsatzmöglichkeiten und Risiken des Internet der Dinge in unserem Special.