Dynamische Analyse von Android Apps - Eine Einführung in Frida

Dynamische Analyse von Android Apps

Eine Einführung in Frida

Ralph Meier
von Ralph Meier
am 02. Mai 2024
Lesezeit: 12 Minuten

Keypoints

So analysieren Sie Android Apps mit Frida

  • Frida ist ein umfangreiches Toolkit für die dynamische Analyse unter Android und iOS
  • Verschiedene Modi erlauben es Frida mit jailbroken/rooted sowie normalen Geräten zu verwenden
  • Zusätzlich im Code auferlegte Schutzmechanismen wie Certificate Pinning und Root Detection lassen sich damit einfach umgehen
  • Mit Frida lässt sich der Speicher des Zielgeräts auslesen, in Methoden von Apps einhaken oder diese sogar überschreiben

Dieser Artikel gibt eine Einführung in die dynamische Analyse von Android Apps mittels Frida und baut unter anderem auf dem Artikel Analyse von Mobile Apps – Eine Einführung auf. Nach einer statischen Analyse eines Android Packages (APK) können durch eine dynamische Analyse weitere Erkenntnisse und mögliche Schwachstellen identifiziert werden.

Frida

Frida ist ein Toolkit für die dynamische Analyse von Android-Geräten beziehungsweise deren installierten Apps und laufenden Prozesse. Der Kern von Frida ist in C geschrieben und bietet die Möglichkeit QuickJS in den Zielprozess einzuschleusen. QuickJS ist eine kleine, einbettungsfähige JavaScript-Engine, welche die ECMAScript 2023 Sprachespezifikation einhält. Frida funktioniert am besten mit einem rooted Gerät, es gibt jedoch auch Wege, um mit einem Gerät ohne Root Tests oder Analysen durchzuführen. Im Artikel zur Einführung in iOS Mobile Application Testing gibt es ein Beispiel mit Objection jedoch zu iOS, was ohne Jailbreak beziehungsweise Root funktioniert. Durch Frida kann man unter anderem Zugriff auf den Speicher (Arbeitsspeicher und Hauptspeicher) des Zielgeräts erlangen, Methoden aus Apps überschreiben, sich in eine Methode einhaken (Hooking), die Inter-Process Communication (IPC) abfangen beziehungsweise manipulieren sowie verschiedene Schutzmechanismen wie Root Detection oder Certificate Pinning umgehen.

Frida Modes

Frida bietet drei verschiedene Modi an:

Injected

Dies ist der gängigste Modus und beinhaltet die Funktionalität sich beim Start eines vorhandenen Apps anzuhängen oder einklinken und zusätzliche Logik/Code einzubetten. Frida-Core bietet die dazu nötige Funktionalität, indem es GumJS als gemeinsame Bibliothek in existierende Software integriert und damit eine bidirektionale Kommunikation aufbaut und am Schluss auch wieder entfernt. Zusätzlich bringt frida-core noch grundlegende Funktionalität mit sich: Installierte Apps, laufende Prozesse und verbundene Geräte aufzulisten. Frida-Server ist das benötigte Gegenstück auf dem mobilen Gerät, welches darauf kopiert und gestartet wird. Durch den laufenden frida-Server wird die Funktionalität von frida-core über einen offenen TCP-Port bereitgestellt.

Embedded

Dieser Modus wird gewählt bei nicht jailbroken iOS-Geräten oder nicht rooted Android-Geräten. Hierbei wird das frida-gadget in die zu analysierende App integriert. Somit kann dann mittels Frida basierten Tools wie frida-trace interagiert werden. Unter diesen Modus fällt das Tool Objection, welches im Artikel iOS Mobile Application Testing – Eine Einführung veranschaulicht wird.

Preloaded

Dieser Modus beinhaltet das autonome Ausführen von Scripts vom Dateisystem mittels frida-gadget ohne Kommunikation von aussen.

Installation von Frida im Injected Modus

Die Installation ist am einfachsten mit einem rooted Android-Gerät, welches via Kabel mit dem Computer verbunden ist. Diese Variante funktioniert wie folgt:

  1. USB-Debugging/Android Debugging auf dem Android-Gerät aktivieren. Diese Option kann in den Einstellungen unter System > Developer options oder via Suchfunktion gefunden werden
  2. Die Android Debug Bridge Tools auf dem eigesetzten Computer installieren. Auf Debian kann dies mittels sudo apt install adb durchgeführt werden
  3. Frida und frida-tools via pip installieren:
    pip install frida-tools
    pip install frida
  4. Das Android-Gerät via USB-Kabel mit dem Computer verbinden und den adb-Server mit adb start-server starten
  5. Mittels adb devices -l prüfen, ob das Gerät mit dem Computer verbunden ist
  6. Nun den Frida-Server in der passender Prozessorarchitektur des Android-Geräts mit dem Computer vom Frida Github Repository herunterladen und anschliessend entpacken
  7. Eine Kommandozeile mit Administratorrechten (root shell) mittels ADB öffnen
    Bei älteren Android Versionen geht dies direkt mit adb root und anschliessend adb shell
    Bei neueren Android Versionen am einfachsten eine normale Shell öffnen mit adb shell und diese dann mit su zu einer root shell session privilegieren
  8. Den passenden Frida-Server auf das Android-Gerät kopieren: adb push frida-server /data/local/tmp/
    Dieser Befehl wird in der Kommandozeile des Computers ausgeführt, nicht in der ADB shell
  9. Die Zugriffsberechtigung der frida-server Datei anpassen: chmod 755 /data/local/tmp/frida-server
  10. Frida-Server starten als Hintergrundjob /data/local/tmp/frida-server & in der ADB shell.
    Beim Verwenden einer Produktionsversion mittels adb shell "su -c /data/local/tmp/frida-server &"

Anschliessen kann mittels Frida auf das Gerät zugriffen werden. Hier einige hilfreiche Kommandos:

Abfrage aktiver Prozesse

frida-ps -U

Abfrage laufender Applikationen

frida-ps -Ua

Abfrage installierter Applikationen

frida-ps -Uai

Prozess beenden

frida-kill <PID>

Am Ende der Analyse sollte der ADB-Server durch adb kill-server beendet werden.

Anwendungsfälle mit Frida

Nachdem wir nun erfahren haben, was Frida ist, welche Modi es gibt und wie Frida installiert wird, folgen nun einige Anwendungsbeispiele.

Einfaches Injection Script

Als erstes Beispiel verwenden wird die JavaScript-Datei injection_example.js mit einer einfachen Konsolenausgabe:

Java.perform(() => {
        console.log("This is a test.");
});

Diese können wir mit dem folgenden Befehl in einen laufenden Prozess injizieren:

frida -U -l injection_example.js Clock

Mit dem folgenden Befehl ist es möglich einen Prozess zu starten und darin den gewünschten Code zu injizieren:

frida -U -l injection_example.js -f com.android.deskclock

Deskclock App starten und Injection Script injizieren

Überschreiben einer Methode

Mit folgendem Code wird die encrypt Methode der WeakCryptography Klasse überschrieben und um zwei Konsolausgaben erweitern sowie anschliessend die originale encrypt Methode aufgerufen, damit die App weiterhin wie vorgesehen funktioniert.

Java.perform(function () {
var class2overload = Java.use("infosecadventures.allsafe.challenges.WeakCryptography")
class2overload.encrypt.overload('java.lang.String').implementation =  function (arg1) {
        console.log("Input: " + arg1);
        console.log("Encrypted value: " + this.encrypt(arg1));
        return this.encrypt(arg1);
        }
});

Dieser Code wird nach dem Starten der App mittels Frida in den laufenden Prozess injiziert.

Encrypt Methode der Klasse WeakCryptography überschreiben

Die verwendete Allsafe App ist eine absichtlich verwundbare Android App mit verschiedenen Challenges zum Lernen von Android App Testing auch in Verbindung mit Frida.

Frida CodeShare Repo

Frida betreibt ein CodeShare Repository, welches eine Vielzahl an nützlichen Scripts beinhaltet, zum Beispiel um Schutzmechanismen wie Certificate Pinning, Root Detection, Wi-Fi Prüfungen zu umgehen, die Kommunikation abzufangen, sich in Methoden einzuhängen oder statische Analysen durchzuführen. Der Source Code ist bei den jeweiligen Projekten einsehbar und kann entweder herauskopiert werden oder direkt mit dem Parameter --codeshare und der Eingabe des gewünschten Projeks mittels Frida auf der Konsole ausgeführt werden. Bei der Ausführung mit dem Codeshare Parameter solle der Fingerprint, welcher jeweils unterhalb dem Source Code steht, mit demjenigen in der Konsole abgeglichen werden. Zudem gilt, dass jeglicher Code vor Ausführung geprüft werden sollte, um unerwünschte Nebeneffekte zu verhindern.

Root Detection umgehen

Der Schutzmechanismus zur Erkennung eines rooted Gerät wird oft eingesetzt, um bei einer Erkennung die Funktionalität der App teilweise oder komplett einzuschränken. Um dies auf einem rooted Android-Gerät für eine Analyse zu umgehen, gibt es bereits bestehende, ausführliche Injection Scripts auf dem Frida CodeShare Repository. fridaantiroot ist aktuell das bekannteste Injection Script und kann folgendermassen verwendet werden:

frida -U -f infosecadventures.allsafe -l anti_root.js
frida -U --codeshare dzonerzy/fridantiroot -f infosecadventures.allsafe

Es besteht jedoch die Möglichkeit, dass das fridaantiroot Injection Script nicht gegen den eingesetzten Schutzmechanismus wirkt. In diesem Fall müsste manuell mittels Dekompilieren einen Weg gefunden werden und diesen im Injection Script erweitert oder ein neues Script erstellt werden.

Certificate Pinning umgehen

Es gibt mehrere Wege einen auferlegten Certificate Pinning Schutzmechanismus zu umgehen. Man kann die APK-Datei dekompilieren, den für das Certificate Pinning zuständigen Code entfernen oder anpassen und die APK neu kompilieren und anschliessen signieren. Ein zweiter Weg, der weniger Aufwand benötigt, ist ein Injection Script mit einem Certificate Pinning Bypass zu verwenden, um so den Schutzmechanismus zu umgehen. Auf dem bereits vorgestellten CodeShare Repository von Frida befinden sich bereits einige Certificate Pinning Bypass Projekte, welche teilweise sehr umfangreich sind und mehrere verschiedene Schutzmechanismen umgehen können. Die zum Zeitpunkt dieses Artikels bekanntesten zwei Projekte sind Universal Android SSL Pinning Bypass with Frida und frida-multiple-unpinning, mit Ersterem kann man sein eigenes Zertifikat injizieren, die zweite Variante unterstützt eine grössere Anzahl an CertificatePinning Varianten unter anderem auch viele eher alte Verfahren. Damit kann schnell geprüft werden, ob das Certificate Pinning im Android App einfach umgangen werden kann.

Fazit

Dynamische Analysen von Apps sind eine gute Erweiterung zu einer bestehenden statischen Analyse und können weitere Schwachstellen ans Licht bringen. Frida ist ein umfangreiches Toolkit, mit verschiedenen Modi, welche auf rooted/jailbroken Geräten sowie mit dem Embedded Modus auch mit normalen Geräten eingesetzt werden können. Mit Frida kann man auf eine einfache Art Code in einen laufen Prozess injizieren, sich bei einer Methode einhaken und bestehende Methoden einer App überschreiben. Es gibt ein umfassendes CodeShare Repository mit einer Vielzahl an vorhandenen Frida Injection Scripts für viele verschiedene Analysen oder die Umgehung von Schutzmechanismen.

Über den Autor

Ralph Meier

Ralph Meier hat eine Lehre als Applikationsentwickler, Fokus Webentwicklung mit Java, bei einer Schweizer Grossbank absolviert und danach einen Bachelor of Science ZFH in Informatik an der ZHAW School of Engineering abgeschlossen. Er fokussiert sich auf die sicherheitstechnische Untersuchung von Webapplikationen. (ORCID 0000-0002-3997-8482)

Links

Sie benötigen ein solides Cyber Threat Intelligence?

Unsere Spezialisten kontaktieren Sie gern!

×
Burp Bambdas & BChecks

Burp Bambdas & BChecks

Ralph Meier

Disk Cloning

Disk Cloning

Ralph Meier

Das BIOS

Das BIOS

Ralph Meier

Flipper Zero

Flipper Zero

Ralph Meier

Sie wollen mehr?

Weitere Artikel im Archiv

Sie brauchen Unterstützung bei einem solchen Projekt?

Unsere Spezialisten kontaktieren Sie gern!

Sie wollen mehr?

Weitere Artikel im Archiv