Translated ['src/mobile-pentesting/android-app-pentesting/react-native-a

This commit is contained in:
Translator 2025-08-21 04:23:08 +00:00
parent f4917ed82e
commit 1aa1717d0d

View File

@ -1,26 +1,40 @@
# React Native-Anwendungsanalyse
{{#include ../../banners/hacktricks-training.md}}
# Analyse von React Native Anwendungen
Um zu bestätigen, ob die Anwendung auf dem React Native Framework basiert, befolgen Sie diese Schritte:
Um zu bestätigen, ob die Anwendung auf dem React Native-Framework basiert, befolgen Sie diese Schritte:
1. Benennen Sie die APK-Datei mit einer Zip-Erweiterung um und extrahieren Sie sie in einen neuen Ordner mit dem Befehl `cp com.example.apk example-apk.zip` und `unzip -qq example-apk.zip -d ReactNative`.
2. Navigieren Sie zum neu erstellten ReactNative-Ordner und suchen Sie den Ordner assets. In diesem Ordner sollten Sie die Datei `index.android.bundle` finden, die das React JavaScript in minifizierter Form enthält.
2. Navigieren Sie zum neu erstellten ReactNative-Ordner und suchen Sie den Ordner assets. In diesem Ordner sollten Sie die Datei `index.android.bundle` finden, die das React JavaScript in einem minifizierten Format enthält.
3. Verwenden Sie den Befehl `find . -print | grep -i ".bundle$"`, um nach der JavaScript-Datei zu suchen.
3. Verwenden Sie den Befehl `find . -print | grep -i ".bundle$"`, um die JavaScript-Datei zu suchen.
Hinweis: Wenn Ihnen ein Android App Bundle (.aab) anstelle einer APK gegeben wird, generieren Sie zuerst eine universelle APK und extrahieren Sie dann das Bundle:
```bash
# Get bundletool.jar and generate a universal APK set
java -jar bundletool.jar build-apks \
--bundle=app-release.aab \
--output=app.apks \
--mode=universal \
--overwrite
# Extract the APK and then unzip it to find assets/index.android.bundle
unzip -p app.apks universal.apk > universal.apk
unzip -qq universal.apk -d ReactNative
ls ReactNative/assets/
```
## Javascript-Code
Wenn Sie beim Überprüfen des Inhalts der `index.android.bundle` den JavaScript-Code der Anwendung finden (auch wenn er minifiziert ist), können Sie **ihn analysieren, um sensible Informationen und Schwachstellen zu finden**.
Wenn Sie den Inhalt der `index.android.bundle` überprüfen, finden Sie den JavaScript-Code der Anwendung (auch wenn er minimiert ist). Sie können **ihn analysieren, um sensible Informationen und Schwachstellen zu finden**.
Da das Bundle tatsächlich den gesamten JS-Code der Anwendung enthält, ist es möglich, **ihn in verschiedene Dateien zu unterteilen** (was die Rückentwicklung potenziell erleichtert) mit dem **Tool [react-native-decompiler](https://github.com/numandev1/react-native-decompiler)**.
Da das Bundle tatsächlich den gesamten JS-Code der Anwendung enthält, ist es möglich, **es in verschiedene Dateien zu unterteilen** (was die Rückentwicklung potenziell erleichtert) mit dem **Tool [react-native-decompiler](https://github.com/numandev1/react-native-decompiler)**.
### Webpack
Um den JavaScript-Code weiter zu analysieren, können Sie die Datei auf [https://spaceraccoon.github.io/webpack-exploder/](https://spaceraccoon.github.io/webpack-exploder/) hochladen oder diese Schritte befolgen:
1. Erstellen Sie eine Datei namens `index.html` im selben Verzeichnis mit dem folgenden Code:
1. Erstellen Sie eine Datei mit dem Namen `index.html` im selben Verzeichnis mit dem folgenden Code:
```html
<script src="./index.android.bundle"></script>
```
@ -40,42 +54,142 @@ Um nach sensiblen Anmeldeinformationen und Endpunkten zu suchen, befolgen Sie di
3. Es war günstig, dass während des Recon-Prozesses sensible hartcodierte Anmeldeinformationen im JavaScript-Code gefunden wurden.
### Schnelles Suchen nach Geheimnissen/Endpunkten in Bündeln
Diese einfachen Greps bringen oft interessante Indikatoren selbst in minifiziertem JS zutage:
```bash
# Common backends and crash reporters
strings -n 6 index.android.bundle | grep -Ei "(api\.|graphql|/v1/|/v2/|socket|wss://|sentry\.io|bugsnag|appcenter|codepush|firebaseio\.com|amplify|aws)"
# Firebase / Google keys (heuristics)
strings -n 6 index.android.bundle | grep -Ei "(AIza[0-9A-Za-z_-]{35}|AIzaSy[0-9A-Za-z_-]{33})"
# AWS access key id heuristic
strings -n 6 index.android.bundle | grep -E "AKIA[0-9A-Z]{16}"
# Expo/CodePush deployment keys
strings -n 6 index.android.bundle | grep -Ei "(CodePush|codepush:\\/\\/|DeploymentKey)"
# Sentry DSN
strings -n 6 index.android.bundle | grep -Ei "(Sentry\.init|dsn\s*:)"
```
Wenn Sie Verdacht auf Over-The-Air-Update-Frameworks haben, suchen Sie auch nach:
- Microsoft App Center / CodePush-Bereitstellungsschlüsseln
- Expo EAS Updates-Konfiguration (`expo-updates`, `expo\.io`, Signaturzertifikate)
### Ändern Sie den JS-Code und bauen Sie neu
In diesem Fall ist es einfach, den Code zu ändern. Sie müssen die App nur umbenennen, um die Erweiterung `.zip` zu verwenden, und sie extrahieren. Dann können Sie **den JS-Code innerhalb dieses Bündels ändern und die App neu bauen**. Das sollte ausreichen, um Ihnen zu ermöglichen, **Code** in die App zu **injizieren** zu Testzwecken.
In diesem Fall ist es einfach, den Code zu ändern. Sie müssen nur die App umbenennen, um die Erweiterung `.zip` zu verwenden, und sie extrahieren. Dann können Sie **den JS-Code in diesem Bundle ändern und die App neu bauen**. Das sollte ausreichen, um Ihnen zu ermöglichen, **Code** in die App zu injizieren, um Tests durchzuführen.
## Hermes-Bytecode
Wenn das Bündel **Hermes-Bytecode** enthält, **werden Sie nicht auf den JavaScript-Code** der App zugreifen können (nicht einmal auf die minifizierte Version).
Wenn das Bundle **Hermes-Bytecode** enthält, **werden Sie nicht auf den Javascript-Code** der App zugreifen können (nicht einmal auf die minimierte Version).
Sie können überprüfen, ob das Bündel Hermes-Bytecode enthält, indem Sie den folgenden Befehl ausführen:
Sie können überprüfen, ob das Bundle Hermes-Bytecode enthält, indem Sie den folgenden Befehl ausführen:
```bash
file index.android.bundle
index.android.bundle: Hermes JavaScript bytecode, version 96
```
Sie können jedoch die Tools **[hbctool](https://github.com/bongtrop/hbctool)**, **[hermes-dec](https://github.com/P1sec/hermes-dec)** oder **[hermes_rs](https://github.com/Pilfer/hermes_rs)** verwenden, um **den Bytecode zu disassemblieren** und auch um **ihn in einen Pseudo-JS-Code zu dekompilieren**. Dazu beispielsweise diese Befehle:
Sie können jedoch die Tools **[hbctool](https://github.com/bongtrop/hbctool)**, aktualisierte Forks von hbctool, die neuere Bytecode-Versionen unterstützen, **[hasmer](https://github.com/lucasbaizer2/hasmer)**, **[hermes_rs](https://github.com/Pilfer/hermes_rs)** (Rust-Bibliothek/APIs) oder **[hermes-dec](https://github.com/P1sec/hermes-dec)** verwenden, um **den Bytecode zu disassemblieren** und auch, um **ihn in einen pseudo JS-Code zu dekompilieren**. Zum Beispiel:
```bash
# Disassemble and re-assemble with hbctool (works only for supported HBC versions)
hbctool disasm ./index.android.bundle ./hasm_out
# ...edit ./hasm_out/**/*.hasm (e.g., change comparisons, constants, feature flags)...
hbctool asm ./hasm_out ./index.android.bundle
# Using hasmer (focus on disassembly; assembler/decompiler are WIP)
hasmer disasm ./index.android.bundle -o hasm_out
# Using hermes-dec to produce pseudo-JS
hbc-disassembler ./index.android.bundle /tmp/my_output_file.hasm
hbc-decompiler ./index.android.bundle /tmp/my_output_file.js
hbc-decompiler ./index.android.bundle /tmp/my_output_file.js
```
### Code ändern und neu erstellen
Tipp: Das Open-Source-Projekt Hermes liefert auch Entwicklerwerkzeuge wie `hbcdump` in bestimmten Hermes-Versionen. Wenn Sie die passende Hermes-Version, die zur Erstellung des Bundles verwendet wurde, erstellen, kann `hbcdump` Funktionen, String-Tabellen und Bytecode für eine tiefere Analyse ausgeben.
Idealerweise sollten Sie in der Lage sein, den disassemblierten Code zu ändern (einen Vergleich, einen Wert oder was auch immer Sie ändern müssen) und dann **den Bytecode neu zu erstellen** und anschließend die App neu zu erstellen.
### Code ändern und neu erstellen (Hermes)
Das Tool **[hbctool](https://github.com/bongtrop/hbctool)** unterstützt das Disassemblieren des Bundles und das Wiederherstellen nach den Änderungen, jedoch **unterstützt es nur alte Versionen** des Hermes-Bytecodes.
Idealerweise sollten Sie in der Lage sein, den disassemblierten Code zu ändern (einen Vergleich, einen Wert oder was auch immer Sie ändern müssen) und dann **den Bytecode neu zu erstellen** und die App neu zu bauen.
Das Tool **[hermes-dec](https://github.com/P1sec/hermes-dec)** unterstützt nicht das Neuaufbauen des Bytecodes.
- Das ursprüngliche **[hbctool](https://github.com/bongtrop/hbctool)** unterstützt das Disassemblieren des Bundles und das Wiederherstellen nach Änderungen, unterstützte jedoch historisch nur ältere Bytecode-Versionen. Von der Community gepflegte Forks erweitern die Unterstützung auf neuere Hermes-Versionen (einschließlich Mid-80s96) und sind oft die praktischste Option, um moderne RN-Apps zu patchen.
- Das Tool **[hermes-dec](https://github.com/P1sec/hermes-dec)** unterstützt nicht das Neuaufbauen des Bytecodes (nur Decompiler/Disassembler), ist aber sehr hilfreich, um die Logik zu navigieren und Strings auszugeben.
- Das Tool **[hasmer](https://github.com/lucasbaizer2/hasmer)** zielt darauf ab, sowohl Disassemblierung als auch Assemblierung für mehrere Hermes-Versionen zu unterstützen; die Assemblierung entwickelt sich noch, ist aber einen Versuch mit aktuellem Bytecode wert.
Das Tool **[hermes_rs](https://github.com/Pilfer/hermes_rs)** unterstützt das Neuaufbauen des Bytecodes, ist jedoch tatsächlich eine Bibliothek und kein CLI-Tool.
Ein minimaler Workflow mit hbctool-ähnlichen Assemblierern:
```bash
# 1) Disassemble to HASM directories
hbctool disasm assets/index.android.bundle ./hasm
# 2) Edit a guard or feature flag (example: force boolean true)
# In the relevant .hasm, replace a LoadConstUInt8 0 with 1
# or change a conditional jump target to bypass a check.
# 3) Reassemble into a new bundle
hbctool asm ./hasm assets/index.android.bundle
# 4) Repack the APK and resign
zip -r ../patched.apk *
# Align/sign as usual (see Android signing section in HackTricks)
```
Beachten Sie, dass das Hermes-Bytecode-Format versioniert ist und der Assembler mit dem exakten On-Disk-Format übereinstimmen muss. Wenn Sie Formatfehler erhalten, wechseln Sie zu einem aktualisierten Fork/Alternativ oder bauen Sie die passende Hermes-Toolchain neu auf.
## Dynamische Analyse
Sie könnten versuchen, die App dynamisch zu analysieren, indem Sie Frida verwenden, um den Entwicklermodus der React-App zu aktivieren und **`react-native-debugger`** daran anzuhängen. Allerdings benötigen Sie dafür anscheinend den Quellcode der App. Weitere Informationen dazu finden Sie unter [https://newsroom.bedefended.com/hooking-react-native-applications-with-frida/](https://newsroom.bedefended.com/hooking-react-native-applications-with-frida/).
Sie könnten versuchen, die App dynamisch zu analysieren, indem Sie Frida verwenden, um den Entwicklermodus der React-App zu aktivieren und **`react-native-debugger`** zu verwenden, um sich daran anzuhängen. Allerdings benötigen Sie dafür anscheinend den Quellcode der App. Weitere Informationen dazu finden Sie unter [https://newsroom.bedefended.com/hooking-react-native-applications-with-frida/](https://newsroom.bedefended.com/hooking-react-native-applications-with-frida/).
### Aktivieren der Dev-Unterstützung in der Release-Version mit Frida (Einschränkungen)
Einige Apps versenden versehentlich Klassen, die die Dev-Unterstützung umschaltbar machen. Wenn vorhanden, können Sie versuchen, `getUseDeveloperSupport()` zu zwingen, true zurückzugeben:
```javascript
// frida -U -f com.target.app -l enable-dev.js
Java.perform(function(){
try {
var Host = Java.use('com.facebook.react.ReactNativeHost');
Host.getUseDeveloperSupport.implementation = function(){
return true; // force dev support
};
console.log('[+] Patched ReactNativeHost.getUseDeveloperSupport');
} catch (e) {
console.log('[-] Could not patch: ' + e);
}
});
```
Warnung: In ordnungsgemäß erstellten Release-Bauten werden `DevSupportManagerImpl` und verwandte Debug-Only-Klassen entfernt, und das Umstellen dieses Flags kann die App zum Absturz bringen oder keine Wirkung haben. Wenn dies funktioniert, können Sie typischerweise das Entwicklermenü anzeigen und Debugger/Inspektoren anhängen.
### Netzwerkinterzeption in RN-Apps
React Native Android verlässt sich typischerweise im Hintergrund auf OkHttp (über das `Networking`-native Modul). Um den Datenverkehr auf einem nicht gerooteten Gerät während dynamischer Tests abzufangen/beobachten:
- Verwenden Sie einen Systemproxy + vertrauen Sie dem Benutzer-CA oder verwenden Sie andere generische Android-TLS-Bypass-Techniken.
- RN-spezifischer Tipp: Wenn die App versehentlich Flipper im Release bündelt (Debug-Tools), kann das Flipper-Netzwerk-Plugin Anfragen/Antworten offenlegen.
Für generische Android-Interzeption und Pinning-Bypass-Techniken siehe:
{{#ref}}
make-apk-accept-ca-certificate.md
{{#endref}}
{{#ref}}
frida-tutorial/objection-tutorial.md
{{#endref}}
## Aktuelle Probleme in beliebten RN-Bibliotheken (worauf man achten sollte)
Bei der Überprüfung von Drittanbieter-Modulen, die im JS-Bundle oder in nativen Bibliotheken sichtbar sind, prüfen Sie auf bekannte Schwachstellen und verifizieren Sie die Versionen in `package.json`/`yarn.lock`.
- react-native-mmkv (Android): Versionen vor 2.11.0 protokollierten den optionalen Verschlüsselungsschlüssel in den Android-Protokollen. Wenn ADB/logcat verfügbar ist, könnten Geheimnisse wiederhergestellt werden. Stellen Sie sicher, dass >= 2.11.0 verwendet wird. Indikatoren: Verwendung von `react-native-mmkv`, Protokollanweisungen, die die MMKV-Initialisierung mit Verschlüsselung erwähnen. CVE-2024-21668.
- react-native-document-picker: Versionen < 9.1.1 waren anfällig für Pfadtraversierung auf Android (Dateiauswahl), behoben in 9.1.1. Validieren Sie Eingaben und Bibliotheksversion.
Schnelle Überprüfungen:
```bash
grep -R "react-native-mmkv" -n {index.android.bundle,*.map} 2>/dev/null || true
grep -R "react-native-document-picker" -n {index.android.bundle,*.map} 2>/dev/null || true
# If you also have the node_modules (rare on release): grep -R in package.json / yarn.lock
```
## Referenzen
- [https://medium.com/bugbountywriteup/lets-know-how-i-have-explored-the-buried-secrets-in-react-native-application-6236728198f7](https://medium.com/bugbountywriteup/lets-know-how-i-have-explored-the-buried-secrets-in-react-native-application-6236728198f7)
- [https://www.assetnote.io/resources/research/expanding-the-attack-surface-react-native-android-applications](https://www.assetnote.io/resources/research/expanding-the-attack-surface-react-native-android-applications)
- [https://payatu.com/wp-content/uploads/2023/02/Mastering-React-Native-Application-Pentesting-A-Practical-Guide-2.pdf](https://payatu.com/wp-content/uploads/2023/02/Mastering-React-Native-Application-Pentesting-A-Practical-Guide-2.pdf)
- CVE-2024-21668: react-native-mmkv protokolliert den Verschlüsselungsschlüssel auf Android, behoben in v2.11.0 (NVD): https://nvd.nist.gov/vuln/detail/CVE-2024-21668
- hbctool (und Forks) für Hermes assemblieren/demontieren: https://github.com/bongtrop/hbctool
{{#include ../../banners/hacktricks-training.md}}