2248013

Codeinspect: Ein Analysewerkzeug für Android-Apps

27.06.2017 | 14:30 Uhr |

Eine detaillierte Analyse, ob eine Android-App wirklich sicher ist und die Nutzerdaten geschützt sind, ist zeitaufwändig und nur mit Expertenwissen möglich. Im Fraunhofer SIT wurde Codeinspect entwickelt, das die Arbeit von App-Analysten erleichtern soll. Wie es funktioniert, wird hier anhand eines Beispiels erklärt.

Smartphone-Sicherheitsexperten, Forensiker, Penetration-Tester, Entwickler von Android-Apps, aber auch App-Interessierte wollen wissen: Enthält eine App Sicherheitslücken? Werden Daten in einer App sicher gespeichert? Erfüllt eine App die (Sicherheits-)Standards unseres Unternehmens? Warum stürzt eine App ab? Oft fehlt jedoch das nötige Expertenwissen oder die Zeit, solche – zum Teil –sehr komplexen Fragen zu beantworten.

Die Notwendigkeit für komplexe App-Analysen beschränkt sich jedoch nicht auf den Sicherheitsbereich. App-Entwickler benötigen oftmals ein detailliertes Verständnis einer Anwendung, um beispielsweise Programmierfehler in der eigenen App zu identifizieren und auszubessern. Solche Patches sind mitunter sehr zeitaufwändig, insbesondere durch die als Vorarbeit notwendige genaue Analyse der Applikation.

Besonders problematisch ist die Identifikation von Programmierfehlern in extern eingebundenen Bibliotheken, die nicht selbst implementiert wurden. Da weder der App-Entwickler den Quellcode der externen Bibliothek besitzt noch die Bibliotheks-Entwickler über den Quellcode der App verfügen, ist die genaue Identifikation der Absturzursache für beide Seiten sehr zeitaufwändig.

Ich möchte Ihnen nun ein Framework namens Codeinspect vorstellen, mit dem Sie Android-Apps detailliert und ohne spezielles Expertenwissen analysieren können, auch wenn kein Quellcode vorliegt.

Um Fragen wie „Werden meine Daten sicher in dieser App abgespeichert?“ oder „Wo ist der Programmierfehler, der zum Absturz führt?“ beantworten zu können, liefert das Framework unterschiedliche Funktionalitäten.

Die Basis-Funktionen dieses Frameworks stelle ich anhand einer Analyse einer schadhaften Applikation, der sogenannten Bad-Accents-Malware-Familie , exemplarisch vor. Die Beispiele enthalten originale Codeausschnitte, die nicht von mir verändert wurden.

CodeInspect, nachdem eine Applikation importiert wurde
Vergrößern CodeInspect, nachdem eine Applikation importiert wurde
© Dr. Siegfried Rasthofer

Apps können sowohl von der Festplatte als auch direkt vom Smartphone in Codeinspect geladen werden. Bild 1 zeigt Codeinspect, nachdem eine Applikation importiert wurde. Da Codeinspect auf der Eclipse-Umgebung basiert, erinnert die Oberfläche sehr stark an die Eclipse-IDE. So sollten sich Programmierer oder Analysten, die schon einmal mit Eclipse oder einer anderen IDE gearbeitet haben, schnell mit Codeinspect zurechtfinden.

Standardfunktionen

Codeinspect übersetzt zunächst den binären Code der App in eine für Menschen lesbare Zwischensprache namens „Jimple“. Bild 2 zeigt ein Beispiel einer Methode in der Jimple-Zwischendarstellung.

Jimple ist eine für Menschen lesbare Zwischensprache
Vergrößern Jimple ist eine für Menschen lesbare Zwischensprache
© Dr. Siegfried Rasthofer

Eine komplette Rückwandlung von binären Android-Applikationen in die Quellcode-Repräsentation (Java-Code) ist in vielen Fällen aufgrund von Obfuskierungstechniken nicht möglich. In den Fällen, in denen die Rückwandlung jedoch möglich ist, kann die Klasse auch als Java-Code dargestellt werden (Bild 3).

Darstellung als Java-Code
Vergrößern Darstellung als Java-Code
© Dr. Siegfried Rasthofer

Gängige Entwicklungsumgebungen wie Eclipse oder Android Studio stellen dem Entwickler einer App eine Vielzahl an Funktionen zur Verfügung, beispielsweise das Umbenennen von Variablen, Feldern und Methoden, das Auskommentieren oder Ändern von Codezeilen, das Hinzufügen neuen Codes, die Darstellung von Methoden-Aufrufhierarchien und Typhierarchien usw.

Diese Funktionen sind aber nicht nur für Entwickler relevant, sondern auch sehr hilfreich beim Analysieren von Android-Applikationen, um Details über das konkrete Verhalten einer App herauszufinden.

Beispiel, wann sendSMS aufgerufen wird
Vergrößern Beispiel, wann sendSMS aufgerufen wird
© Dr. Siegfried Rasthofer

Codeinspect stellt alle diese Funktionen auch dem Analysten zur Verfügung, ohne dass dieser Zugriff auf den Quellcode der App benötigt. So kann er beispielsweise mit Hilfe der Methoden-Aufrufhierarchie sehr schnell herausfinden, über welche Methoden der Programmfluss zu einer bestimmten Codezeile gelangt.

Bild 4 zeigt beispielsweise, dass die Methode sendSMS nur aufgerufen wird, wenn eine SMS empfangen wird (com.a.a.AR), ein Anruf eintrifft (Callservice) oder der Benutzer auf einen bestimmten Button klickt (rot markierte Stellen).

Im Folgenden beschreibe ich nun die zusätzlichen Analysefunktionen, die Codeinspect über die von einer normalen Entwicklungsumgebung bereits bekannten Funktionen hinaus bietet, um den Analysten noch besser bei seiner Arbeit zu unterstützen.

Values-Ansicht

Die Values-Ansicht listet alle konstanten Werte auf, die sich in der Applikation befinden. Zusätzlich bietet die Ansicht die Möglichkeit, eigene oder vordefinierte Filter festzulegen. Bild 5 zeigt beispielsweise alle Konstanten im Code, die zusätzliche APK-Dateien referenzieren (Endung auf .apk). In diesem Beispiel lädt die schadhafte Applikation zusätzlichen Code oder gar weitere maliziöse Applikationen von der SD-Karte nach. Weiter werden auch HTTP-Verbindungen aufgelistet, zu denen sich die Applikation verbindet. Dies sind sehr wichtige Informationen während einer Sicherheitsanalyse einer Applikation.

Alle Konstanten im Code, die zusätzliche APK-Dateien referenzieren (Endung auf .apk)
Vergrößern Alle Konstanten im Code, die zusätzliche APK-Dateien referenzieren (Endung auf .apk)
© Dr. Siegfried Rasthofer

Permission-Ansicht

Weitere wichtige Informationen über die Nutzung sensitiver Methoden liefert die Permission-Ansicht. Wenn ein Android-Entwickler eine sensitive Methode, beispielsweise das Senden von SMS-Nachrichten, implementieren möchte, muss er für seine App eine bestimmte Berechtigung (android.permission.SEND_SMS in diesem Fall) festlegen. Die Permission-Ansicht in Codeinspect zeigt zu jeder Berechtigung, wo die entsprechenden Methoden, die diese Berechtigung nutzen, in der App aufgerufen werden. Bild 6 zeigt, dass die App zwei Methoden für das Versenden von SMS-Nachrichten hat. Wenn der Analyst auf eine Methode klickt, springt er direkt an die jeweilige Programmcodezeile. Dies ermöglicht ihm, nachzuvollziehen, unter welchen Bedingungen der Versand der Nachricht erfolgt, um beispielsweise herauszufinden, ob sensitive Daten an dieser Stelle ungeschützt verschickt werden.

Die App hat zwei Methoden für das Versenden von SMS-Nachrichten
Vergrößern Die App hat zwei Methoden für das Versenden von SMS-Nachrichten
© Dr. Siegfried Rasthofer

Bytecode Debugging

Codeinspect bietet auch die Möglichkeit, Applikationen auf der menschenlesbaren Zwischensprache Jimple Schritt für Schritt zu debuggen. Dies bietet einem Analysten Detaileinsichten über die Funktionalität der Applikation zur Laufzeit. Mit Hilfe des Debuggers kann er beispielsweise sehen, ob ein eingegebenes Passwort in der App wirklich sicher abgespeichert wird, da die Handhabung des Passworts Schritt für Schritt nachvollzogen werden kann.

Am Breakpoint in Zeile 163 sieht man, wie eingehende SMS-Nachrichten auf ein bestimmtes Format untersucht werden
Vergrößern Am Breakpoint in Zeile 163 sieht man, wie eingehende SMS-Nachrichten auf ein bestimmtes Format untersucht werden
© Dr. Siegfried Rasthofer

Auch die Ursache von Programmfehlern kann ein Analyst so sehr schnell ausfindig machen. Bild 7 zeigt beispielhaft am Breakpoint in Zeile 163, wie eingehende SMS-Nachrichten auf ein bestimmtes Format untersucht werden. Dieser Breakpoint wird erreicht, sofern eine SMS-Nachricht an das Gerät gesendet wird. Die App reagiert darauf und überprüft die Absendernummer, ob diese mit +86 oder +82 beginnt (Zeile 166). Diese beiden Vorwahlen entsprechen China und Südkorea.

Senden einer SMS-Nachricht kann mit einem Plug-in angestoßen werden
Vergrößern Senden einer SMS-Nachricht kann mit einem Plug-in angestoßen werden
© Dr. Siegfried Rasthofer

Das Senden einer SMS-Nachricht kann in Codeinspect mit Hilfe eines zusätzlichen Plug-ins angestoßen werden (Bild 8). Sobald die SMS an das Gerät gesendet wird, stoppt die Applikation an Zeile 163.

CodeInspect unterstützt in diesem Beispiel den Analysten dabei , einen Datendiebstahl der eingehenden SMS-Nachrichten per Mail zu erkennen
Vergrößern CodeInspect unterstützt in diesem Beispiel den Analysten dabei , einen Datendiebstahl der eingehenden SMS-Nachrichten per Mail zu erkennen
© Dr. Siegfried Rasthofer

Bild 9 zeigt, dass die Variable „$String“ den Wert „12345678“ besitzt (Telefonnummer, die in Bild 8 angegeben wurde). Wenn der Analyst im Code Schritt für Schritt weitergeht, erreicht er einen Punkt (Zeile 66 in Bild 9), an welchem die App den Inhalt der eingehenden SMS-Nachricht per Mail an den Angreifer schickt. Man sieht, dass die Methode „Mailsend“ mit unterschiedlichen Argumenten aufgerufen wird, wobei der Inhalt der Mail (Inhalt von $String) unsere empfangene SMS-Nachricht ist, die zusätzlich noch einen Zeitstempel besitzt. In diesem Beispiel hat Codeinspect den Analysten dabei unterstützt, einen Datendiebstahl der eingehenden SMS-Nachrichten per Mail zu erkennen.

Datenfluss

In vielen Fällen ist es notwendig, herauszufinden, welche Daten in einer App wohin gesendet werden. Beispielsweise kann es gegen Richtlinien im Unternehmen oder gesetzliche Vorgaben verstoßen, bestimmte sensitive Daten an Server im Ausland zu verschicken. Um solche Fragestellungen zu bearbeiten, hat Codeinspect eine Funktion namens „Datenfluss“.

Über die Funktion "Datenfluss" lässt sich feststellen, welche Daten in einer App wohin geschickt werden
Vergrößern Über die Funktion "Datenfluss" lässt sich feststellen, welche Daten in einer App wohin geschickt werden
© Dr. Siegfried Rasthofer

In Bild 10 (oberer Teil rot markiert) ist eine UI zu sehen, die kreditkartenrelevante Daten verarbeitet. Die Datenfluss-Ansicht (unterer Teil des Bildes) zeigt, dass die in das Textfeld (linke Seite) eingegebenen Daten direkt per SMS an den Angreifer gesendet werden (rechte Seite Zeile 15) - also schickt die App Kreditkarteninformationen per SMS an den Angreifer. Codeinspect zeigt für jeden solcher Datenflüsse die Quelle (das Textfeld in diesem Fall), die Senke (die SMS) und sämtliche Codezeilen, die die sensitiven Daten auf dem Weg von der Quelle zur Senke verarbeiten, an. Diese Funktion von Codeinspect ist speziell für Privacy- und Compliance-Fragestellungen sehr nützlich.

Die vorgestellten Funktionen von Codeinspect und weitere, die in diesem Artikel nicht beschrieben wurden, können Sie auch im Video ansehen . Eine  voll funktionsfähige Demo  können Sie von der Website herunterladen.

Wie geht es mit Codeinspect weiter?

Codeinspect wird sehr aktiv weiterentwickelt. Im Moment wird vor allem an einer automatischen Schwachstellenerkennung und an dynamischen Analysen gearbeitet, so dass den App-Analysten künftig noch präzisere Informationen zur Verfügung stehen werden.

0 Kommentare zu diesem Artikel
2248013