Laufzeitanalyse einer Mobile App in PARIS

Oct 25, 2023 von Stefan Bernhardsgrütter, Patrick Schmid

Das Testen von Sicherheitsrisiken bei mobilen Anwendungen ist mit einigen Herausforderungen verbunden. So wird der Code der Apps zum Beispiel oft verschleiert, was eine statische Analyse erschwert. In so einem Fall ist eine Analyse der Anwendung zur Laufzeit eine mögliche Alternative. Bei komplexen Anwendungen kann dies jedoch ebenfalls ein aufwendiges Unterfangen sein, da die Security Tester die Anwendung zuerst im Detail verstehen müssen. Typische Fragen, die beim Testen von Apps auftauchen, sind beispielsweise auf welche Art und Weise Daten gespeichert, ver- oder entschlüsselt werden, ob die Anwendung sichere Authentifizierung nutzt oder wie Netzwerkressourcen angesprochen und genutzt werden. Bei einer Laufzeitanalyse versuchen die Security Tester dabei jeweils die relevanten Funktionen zu überwachen, welche beim Verwenden der Anwendung ausgeführt werden (könnten). Je nach Komplexitätsgrad der Anwendung gleicht dies der Suche nach der Nadel im Heuhaufen. Um diese Komplexität zu minimieren und den Einstieg in die Analyse zu vereinfachen, haben sich zwei unserer Security Tester an den Redguard Research Days in Paris diesem Thema angenommen und dabei ein neues Tool entwickelt.

Process-Attached Remote Interception Solution (PARIS)

Um sich während einer Woche voll und ganz internen Entwicklungen und Verbesserungen widmen zu können, finden bei uns zweimal jährlich Research Days im Ausland statt. Interessierte Redguard-Mitarbeitende können sich für diese mit einem Projekt anmelden.

In diesem Rahmen wurde von den beiden Security Testern Stefan Bernhardsgrütter und Patrick Schmid eine Lösung für die zu Beginn beschriebene Problematik beim Testen von Mobile Apps erarbeitet. Das daraus entstandene Ergebnis ist ein neues Tool – natürlich unter dem Namen PARIS, wo es entwickelt wurde.

PARIS besteht insgesamt aus zwei Teilen: Einem Backend auf Basis von FRIDA und einer kuratierten Liste an FRIDA-Scripts zum einfachen Hooking von sicherheitsrelevanten Funktionen für Android und iOS sowie einem Frontend basierend auf Javascript, welches die vom Backend erfassten Events auf einer Timeline darstellt und mit entsprechenden Zusatzfunktionen wie Zoom, Filter, Clustering und mehr versieht.

Backend

Das Backend ist dafür verantwortlich, eine Mobile App zur Laufzeit zu überwachen und die relevanten Event-Daten zu generieren. Für eine möglichst umfangreiche und vollständige Liste an potentiell sicherheitsrelevanten Funktionen haben sich die Security Tester am OWASP Mobile Application Security Verification Standard (MASVS) orientiert. Dieser unterteilt die Sicherheitsrisiken in die folgenden Kategorien:

  • Datenablage: Art und Weise, wie Daten abgelegt werden
  • Kryptographie: Generelle Nutzung von Kryptographie der App
  • Authentifizierung: Implementierung von lokaler Authentifizierung
  • Network: Ansprechen und Nutzen von entfernten Ressourcen über das Netzwerk
  • Plattform: Interaktionen mit dem Betriebssystem oder anderen Anwendungen

Die verbleibenden beiden Kategorien Code und Resilience wurden nicht berücksichtigt, da diese im Kontext einer dynamischen Analyse nicht relevant sind.

Dazu ein Beispiel: Die Security Tester wollen wissen, ob eine Android-App Daten mit sensitivem Inhalt unverschlüsselt speichert. Dazu sollen folgender Konstruktor und Methode überwacht werden:

  1. Konstruktor von java.io.File
  2. write Methode der Klasse java.io.FileOutputStream

Das Backend generiert die entsprechenden FRIDA-Skripte basierend auf einer Definition, welche in einer YAML-Datei abgelegt ist. Der folgende Auszug zeigt diese für die zwei oben genannten Methoden:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
- title: Create new File
  category: storage
  class: java.io.File
  method: $init
  parameters:
  - type: java.lang.String
    name: pathname
- title: Write Data to File
  category: storage
  class: java.io.FileOutputStream
  method: write
  parameters:
  - type: '[B'
    name: b

Nun erstellt PARIS die entsprechenden Skripte und nutzt dann FRIDA, um bei der Ziel-App diese Funktionen und Methoden zu überwachen («hooken»). Von Interesse sind primär die folgenden Event-Informationen:

  • Parameter, welche übergeben wurden
  • Return-Werte
  • Zeitpunkt des Aufrufs

Die ersten beiden Punkte werden von auf dem Telefon ausgeführten Skript an das Backend zurückgesendet. Dabei versucht das Skript die Daten möglichst für die Security Tester gut lesbar zurückzugeben, indem zum Beispiel binäre Text-Daten entsprechend bereits decodiert werden. Das Backend normalisiert diese dann, indem die Daten um einen Zeitstempel ergänzt und in ein standardisiertes Format überführt werden. Das folgende Beispiel zeigt den Event, wenn die Methode write der Klasse java.io.FileOutputStream aufgerufen wurde:

1
2
3
4
5
6
7
8
9
{
  "id": 34,
  "content": "Write Data to File",
  "start": "2023-09-07T10:25:27.122051",
  "details_title": "java.io.FileOutputStream.write([B b)",
  "details_input": "[{\"name\": \"b\", \"value\": [67, 114, 101, 100, 105, 116, 32, 67, 97, 114, 100, 32, 78, 117, 109, 98, 101, 114, 32, 105, 115, 32, 49, 50, 51, 52, 32, 52, 51, 50, 49, 32, 53, 54, 55, 56, 32, 56, 55, 54, 53], \"valueDecoded\": \"Credit Card Number is 1234 4321 5678 8765\"}]",
  "details_ret": "null",
  "group": "storage"
}

Frontend

Sobald die Daten vom Backend aufgezeichnet wurden, werden diese jeweils in die Datei data.json geschrieben. Daraus werden die einzelnen Events vom Frontend dann in regelmässigen Abständen ausgelesen und die neuen Events der bestehenden Timeline zugefügt. Im Fall von unserem Beispiel sieht das konkret wie folgt aus:

Da je nach Funktionalität der Mobile App mehrere Events pro Sekunde keine Seltenheit sind, bietet PARIS eine Unterteilung von Events in die fünf relevanten Hauptkategorien gemäss dem OWASP Mobile Application Security Verification Standard (MASVS) sowie ein selektives Clustering von Events abhängig vom aktuellen Zoom-Level sowie der Anzahl Events:

Neben weiteren Funktionen wie Zoom, Verschieben der Timeline, Springen zum ersten oder letzten Event und mehr gibt es auch noch eine Filterfunktion. Somit können alle zur Verfügung stehenden Informationen von allen Events gefiltert werden, wodurch lediglich die Events in der Timeline inkludiert werden, welche das oder die angegebenen Schlüsselwörter enthalten. Und auch falls vorgängig nicht bekannt ist, wonach man eigentlich genau sucht, kann PARIS weiterhelfen: Eine selektive Refresh-Funktion fokussiert jeweils den aktuellen Zeitpunkt auf der Timeline mit einem definierbaren Anzeigebereich (beispielsweise +/- 5 Minuten), wo dann auf einen Blick jeweils sogleich die aktuell in der App ausgelösten Aktionen sichtbar werden:

Auch bei komplexeren Analysen kann PARIS unterstützen, unter anderem durch sogenannte «Custom Marker». Diese ermöglichen es, eigene Marker manuell an einem beliebigen Ort in der Timeline zu setzen und zu benennen:

So kann beispielsweise der Startpunkt oder die Zwischenschritte von einem komplexeren Ablauf markiert werden, wodurch dann bei der erneuten Analyse sofort ersichtlich ist, was während der Aufzeichnung ausgelöst wurde.

Weiterentwicklungen

Insgesamt sind in die Umsetzung von PARIS knapp zehn Arbeitstage geflossen. Dabei entstand ein Tool, welches bereits zum Testen von Android- und iOS-Anwendungen verwendet werden kann. Dennoch gibt es noch Potenzial für die Weiterentwicklung. Konkret sehen die Entwickler die folgenden Verbesserungen (welche dann auch nicht zwangsläufig in der Stadt Paris umgesetzt werden müssen😉):

  • Implementierung weiterer, sicherheitsrelevanter Events vom Betriebssystem (Android / iOS)
  • Implementierung von häufig verwendeten Bibliotheken wie beispielsweise okHTTP oder Alamofire
  • Integrieren von zusätzlichen Informationen aus Events wie beispielsweise Stack-Traces
  • Automatisches Erkennen, Klassifizieren und Anzeigen von möglichen Sicherheitsrisiken

Vor allem im letzten Punkt sehen die Entwickler sehr spannende Möglichkeiten. Daraus ergäbe sich nämlich ein Schwachstellen-Scanner für mobile Anwendungen, der mögliche Risiken auch bei verschleierten Anwendungen identifizieren kann, ohne dass aufwendiges Reverse-Engineering mit dem Code durchgeführt werden muss.

PARIS wird dabei sicherlich nie einen manuellen Penetration Test ersetzten, da gewisse Risiken nicht sinnvoll oder effizient automatisiert erkannt werden könnten. Dennoch hilft es bereits jetzt unseren Security Testern schnell und effizient die Funktionalität einer App zur Laufzeit zu verstehen und mögliche Sicherheitsrisiken oder Probleme basierend darauf zu identifizieren.

Haben Sie auch eine Mobile App, welche Sie gerne genauer untersuchen lassen möchten? Dann kontaktieren Sie uns, um Ihr persönliches Projekt unverbindlich zu besprechen.


< zurück