Burp Bambdas & BChecks
Ralph Meier
So analysieren Sie Android Apps mit 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 bietet drei verschiedene Modi an:
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.
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.
Dieser Modus beinhaltet das autonome Ausführen von Scripts vom Dateisystem mittels frida-gadget ohne Kommunikation von aussen.
Die Installation ist am einfachsten mit einem rooted Android-Gerät, welches via Kabel mit dem Computer verbunden ist. Diese Variante funktioniert wie folgt:
sudo apt install adb
durchgeführt werdenpip install frida-tools
pip install frida
adb start-server
startenadb devices -l
prüfen, ob das Gerät mit dem Computer verbunden istadb root
und anschliessend adb shell
adb shell
und diese dann mit su
zu einer root shell session privilegierenadb push frida-server /data/local/tmp/
chmod 755 /data/local/tmp/frida-server
/data/local/tmp/frida-server &
in der ADB shell. 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.
Nachdem wir nun erfahren haben, was Frida ist, welche Modi es gibt und wie Frida installiert wird, folgen nun einige Anwendungsbeispiele.
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
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.
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 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.
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.
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.
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.
Unsere Spezialisten kontaktieren Sie gern!
Ralph Meier
Ralph Meier
Ralph Meier
Ralph Meier
Unsere Spezialisten kontaktieren Sie gern!