Suchen

Expertenbeitrag

 Mark Hermeling

Mark Hermeling

Senior Director Product Marketing, GrammaTech, Inc., GrammaTech, Inc.

Analyse von Binär-Code Den Drittanbietern auf die Finger schauen

| Autor/ Redakteur: Mark Hermeling / Redaktion IoT

Die statische Analyse von Quellcode ist in den meisten Entwicklungs-Teams mittlerweile ein Standardprozess. Doch wie sieht es mit Code aus, der binär von Dritten zugeliefert wird? Hier gelangen die gängigen Test- und Analyse-Verfahren schnell an ihre Grenzen. Dennoch ist eine Analyse der Binaries wichtig - und mit dem richtigen Werkzeug auch möglich.

Firmen zum Thema

Analyse von Binär-Code: Den Drittanbietern auf die Finger schauen (Bild: GrammaTech)
Analyse von Binär-Code: Den Drittanbietern auf die Finger schauen (Bild: GrammaTech)
(Analyse von Binär-Code: Den Drittanbietern auf die Finger schauen (Bild: GrammaTech))

Software von Drittanbietern spielt bei der Entwicklung von Anwendungen eine immer größere Rolle. Experten gehen davon aus, dass heute bereits über 30 Prozent des Codes von Embedded-Applikationen aus den Händen von Zulieferern stammt. Meist handelt es sich dabei um spezielle Komponenten wie Grafik- und Windowing-Toolkits, Kryptografie-Bibliotheken oder Datenbanken. Diese Form des Outsourcings ist durchaus sinnvoll, die Entwickler können sich mehr auf die Kernfunktionen konzentrieren und so die Time to Market senken. Allerdings: Veröffentlicht ein Unternehmen Software mit Bestandteilen von Drittherstellern, übernimmt es gleichzeitig auch die Verantwortung für den gesamten Code.

Bei Open-Source-Komponenten ist das nicht weiter tragisch. Der Quellcode liegt vor, das Programm oder die Bibliothek kann mit den üblichen Test- und Analysemethoden geprüft werden. Ganz anders sieht es jedoch aus, wenn die Komponenten nur binär vorliegen. Diese können mit den meisten Analyse-Tools nicht überprüft werden. Somit bleibt nur das aufwändige Testing mit definierten Testfällen. Oder der Code bleibt ungeprüft. Blindes Vertrauen in den Drittanbieter birgt jedoch zahlreiche Risiken. Die Binärdateien können böswillige manipuliert werden, können einfach Programmierfehler enthalten oder die Binärdatei kann gefälscht sein. Leider kommen solche Dinge immer wieder vor, meist mit dem Ziel, die Hersteller der Software zu kompromittieren.

Fehlerquelle Compiler

Ein weiterer Grund, in der Entwicklung auch Binär-Code genauer unter die Lupe zu nehmen, sind die Compiler. Quellcode ist nicht der Code, der später im System tatsächlich ausgeführt wird. Die meisten Programmiersprachen sind in manchen Fällen ambig und inkonsistent. In solchen Fällen entscheidet der Compiler, wie der Code zu interpretieren ist. Das Ergebnis kann je nach eingesetztem Compiler deutlich variieren - mit weitreichenden Folgen. Ein prominentes und oft zitiertes Beispiel zeigte sich 2002 bei einem Sicherheits-Review bei Microsoft. Der Code

     {          char password[MAXLEN];          …          memset(password,‘\0‘,len);      }

 

wurde vom Compiler so interpretiert, dass auf den Speicherbereich nach memset nicht mehr zugegriffen wird und deswegen der memset() Call ignoriert werden kann. Das Ergebnis war, dass das Passwort im Klartext im Stack blieb.

Aufwändiger als Quellcode-Analyse

Auf die Analyse von Binär-Code zu verzichten, birgt also erhebliche Risiken. Ein Analyse-Tool, das sowohl Binär- als auch Quellcode statisch analysieren kann, ist CodeSonar von GrammaTech. CodeSonar ist in der Lage, sowohl ausführbare Dateien als auch binäre Bibliotheken auf Fehler und Schwachstellen zu prüfen. Dabei macht es keinen Unterschied, ob die Executables Symboltabellen und Debugging-Informationen enthalten (unstripped) oder nicht (stripped). Für viele Tools zur Analyse von Binärdateien stellen gestrippte Files eine große Hürde dar, CodeSonar kann auch aus diesen die relevanten Informationen gewinnen.

Binär-Code macht die Analyse einer Anwendung signifikant aufwändiger.

Und genau hierin liegt die Schwierigkeit bei der Analyse binärer Dateien: Viele der Informationen, die für eine statische Analyse notwendig sind, müssen erst aufwändig aus dem kompilierten Code generiert werden. Es sind also andere Analysemethoden gefordert als bei der Untersuchung von Quellcode. Auf der anderen Seite erzeugt die Analyse der Binaries auch Informationen, die sich aus den Quellen nicht ableiten lassen.

Einheitliches Modell

Das Tool erzeugt dazu ein Modell des gesamten Programms mit allen Source- und Binary-Bestandteilen: Was als Quellcode vorliegt, wird geparst und Binär-Code wird disassembliert. CodeSonar erzeugt daraus eine einheitliche Präsentation, die die Semantik beider Teile konsistent abbildet. Um mögliche Fehler zu erkennen, durchläuft das Werkzeug das Modell interprozedural und sucht nach Anomalien.

CodeSonar liefert den Entwicklern zahlreiche Informationen und Hinweise zur Fehlerbeseitigung.

Werden potenzielle Fehler gefunden, zeigt CodeSonar eine Warnung mit weiterführenden Hinweisen an. Im obenstehenden Screenshot entdeckte CodeSonar einen Buffer Overflow im Programm gnuchess. Alle relevanten Codebestandteile werden dabei automatisch markiert, eine detaillierte Meldung hilft bei der Fehlerbeseitigung. Wichtig sind diese Informationen nicht zuletzt deshalb, weil der erzeugte Assembler-Code kaum lesbar und völlig anders aufgebaut ist als ein Quellcode in einer modernen Programmiersprache. Binärcode kennt keine strukturierten Funktionen, somit lassen sich diese Hilfskonstrukte auch nicht beim Disassemblieren erzeugen. Man sieht nur, dass zum Beispiel die Funktion return_append_str ihren Platz in der Sektion _text hat und an die Adresse 0x419350 geladen wird. Eine manuelle Überprüfung dieses Codes wäre hier nicht nur sehr mühsam, sondern auch extrem fehleranfällig.

Schneller zu besserer Software

Der Einsatz von statischer Analyse bei Binär-Code hilft also dabei, eine hohe Software-Qualität auch dann sicherzustellen, wenn Komponenten Dritter in die Anwendung mit einfließen. Der Ansatz der statischen Analyse hat dabei einige Vorteile gegenüber anderen Methoden: Bei der statischen Analyse wird der Code nicht ausgeführt. Das Analyse-Tool ermittelt alle möglichen Zustände, die das Programm einnehmen kann. So können auch Fehler gefunden werden, die in definierten Test-Szenarien nicht auftreten. Durch die Möglichkeit, die Analyse zu automatisieren, skaliert das bei CodeSonar implementierte Verfahren auch für große und komplexe Software-Projekte. Für die Entwickler und für das Unternehmen bedeutet das: Sichere Software bei einer kürzeren Time to Market. Und gleichzeitig muss den externen Herstellern nicht mehr blind vertraut werden. Denn Vertrauen ist gut, Code-Analyse besser.

Über den Autor

 Mark Hermeling

Mark Hermeling

Senior Director Product Marketing, GrammaTech, Inc., GrammaTech, Inc.