Um Schwachstellen im Code unabhängig vom Gerät zu finden, führen die Bochumer IT-Forscher eine Softwareanalyse aus drei Schritten durch: Sie übersetzen die Binärsprache, spüren darin Programmierfehler auf und testen, unter welchen Bedingungen die Schwachstellen relevant werden.
Übersetzen
Im ersten Schritt übersetzen die Forscher die Binärcodes zunächst in eine Zwischensprache. Ein Additionsbefehl eines Mikrocontrollers sieht in der Zwischensprache dann genauso aus wie ein Additionsbefehl eines Intel-Prozessors.
„Das ist Fleißarbeit“, erzählt Holz, denn es gilt, viele verschiedene Instruktionen zu übersetzen. „Unsere Zwischensprache enthält weniger als zwei Dutzend Befehle. Was komplexe Prozessoren in einem einzigen Schritt tun, müssen wir daher in vielen kleinen Einzelschritten machen.“ Den Verschlüsselungsbefehl eines Intel-Prozessors würden die Wissenschaftler zum Beispiel in eine lange Folge von arithmetischen und logischen Operationen sowie Sprungbefehlen zerlegen.
Programmfehler suchen
Ist ein Programm in die Zwischensprache übersetzt, kann Holz’ Team es automatisch analysieren, um Schwachstellen aufzudecken. Die Forscher suchen nach Programmierfehlern, über die Angreifer die Software unter ihre Kontrolle bringen können.
Kritisch sind etwa Stellen im Code, an denen eine Variable eigentlich nur eine bestimmte Länge haben darf, aber Angreifer über diese Grenze hinausschreiben können. Oder logische Fehler: Sie können auftreten, wenn das Programm prüft, ob eine Variable einer bestimmten Bedingung entspricht, etwa kleiner, größer oder gleich null ist. Vergisst der Programmierer, eine dieser Bedingungen abzufragen, können Angreifer sich unter Umständen über die Lücke Zugang verschaffen.
Sicherheitsrelevanz prüfen
Haben die Forscher Programmierfehler aufgespürt, untersuchen sie im nächsten Schritt, ob diese sicherheitskritisch sind. Denn nicht jede Lücke hat Folgen in der Praxis. „Manchmal gibt es zwar Programmierfehler in der Software, aber nicht alle Fehler können von einem Angreifer ausgenutzt werden“, so Holz.
In ihrer Analyse ermitteln die Forscher, unter welchen Bedingungen eine bestimmte Stelle des Codes aufgerufen wird. Dazu verwenden sie Standardverfahren wie die symbolische Ausführung. Sie füttern das zu untersuchende Programm, etwa eine Taschenrechner-App, dafür mit Variablen statt konkreten Zahlen.
Ein Beispiel: Statt fünf und acht bekommt die App als Input die Platzhalter Alpha und Beta. Ein Algorithmus berechnet dann, welche Werte die Variablen annehmen müssen, um einen gewissen Punkt im Programmcode zu erreichen. „Das Ergebnis könnte etwa lauten, dass Alpha zwischen 100 und 500 liegen muss, um an die sicherheitskritische Schwachstelle im Code zu gelangen“, veranschaulicht Holz.
RUBIN/ Julia Weiler, Ruhr-Universität Bochum
Stand: 29.07.2016