Анализа React Native апликације
Reading time: 10 minutes
tip
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
Da biste potvrdili da li je aplikacija izgrađena na React Native okviru, pratite sledeće korake:
-
Preimenujte APK datoteku sa zip ekstenzijom i ekstraktujte je u novu fasciklu koristeći komandu
cp com.example.apk example-apk.zip
iunzip -qq example-apk.zip -d ReactNative
. -
Idite u novokreiranu ReactNative fasciklu i pronađite fasciklu assets. Unutar ove fascikle, trebali biste pronaći datoteku
index.android.bundle
, koja sadrži React JavaScript u minifikovanom formatu. -
Koristite komandu
find . -print | grep -i ".bundle$"
da biste pretražili JavaScript datoteku.
Napomena: Ako dobijete Android App Bundle (.aab) umesto APK-a, prvo generišite univerzalni APK, a zatim ekstraktujte bundle:
# 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
Ako proverite sadržaj index.android.bundle
, pronaći ćete JavaScript kod aplikacije (čak i ako je minifikovan), možete analizirati ga da pronađete osetljive informacije i ranjivosti.
Pošto paket zapravo sadrži sav JS kod aplikacije, moguće je podeliti ga u različite datoteke (potencijalno olakšavajući njegovo obrnuto inženjerstvo) koristeći alat react-native-decompiler.
Webpack
Da biste dalje analizirali JavaScript kod, možete otpremiti datoteku na https://spaceraccoon.github.io/webpack-exploder/ ili pratiti ove korake:
- Kreirajte datoteku pod imenom
index.html
u istom direktorijumu sa sledećim kodom:
<script src="./index.android.bundle"></script>
-
Otvorite
index.html
datoteku u Google Chrome-u. -
Otvorite Developer Toolbar pritiskom na Command+Option+J za OS X ili Control+Shift+J za Windows.
-
Kliknite na "Sources" u Developer Toolbar-u. Trebalo bi da vidite JavaScript datoteku koja je podeljena na foldere i datoteke, čineći glavni paket.
Ako pronađete datoteku pod nazivom index.android.bundle.map
, moći ćete da analizirate izvorni kod u nekompresovanom formatu. Map datoteke sadrže izvorno mapiranje, što vam omogućava da mapirate kompresovane identifikatore.
Da biste pretražili osetljive akreditive i krajnje tačke, pratite ove korake:
-
Identifikujte osetljive ključne reči za analizu JavaScript koda. React Native aplikacije često koriste usluge trećih strana kao što su Firebase, AWS S3 usluge, privatni ključevi itd.
-
U ovom konkretnom slučaju, primećeno je da aplikacija koristi Dialogflow uslugu. Potražite obrazac povezan sa njenom konfiguracijom.
-
Bilo je sreće što su osetljivi hard-kodirani akreditive pronađeni u JavaScript kodu tokom procesa rekognosciranja.
Brzo pronalaženje tajni/krajnjih tačaka u paketima
Ovi jednostavni greps često otkrivaju zanimljive indikatore čak i u kompresovanom JS:
# 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*:)"
Ako sumnjate u Over-The-Air update okvire, takođe tražite:
- Microsoft App Center / CodePush ključeve za implementaciju
- Expo EAS Updates konfiguraciju (
expo-updates
,expo\.io
, sertifikate za potpisivanje)
Promenite JS kod i ponovo izgradite
U ovom slučaju, promena koda je jednostavna. Samo treba da preimenujete aplikaciju da koristi ekstenziju .zip
i da je raspakujete. Tada možete modifikovati JS kod unutar ovog paketa i ponovo izgraditi aplikaciju. Ovo bi trebalo da bude dovoljno da vam omogući da ubacite kod u aplikaciju u svrhe testiranja.
Hermes bajtkod
Ako paket sadrži Hermes bajtkod, nećete moći da pristupite Javascript kodu aplikacije (čak ni minifikovanoj verziji).
Možete proveriti da li paket sadrži Hermes bajtkod pokretanjem sledeće komande:
file index.android.bundle
index.android.bundle: Hermes JavaScript bytecode, version 96
Međutim, možete koristiti alate hbctool, ažurirane forke hbctool-a koje podržavaju novije verzije bajtkoda, hasmer, hermes_rs (Rust biblioteka/APIs), ili hermes-dec da dekompajlirate bajtkod i takođe da dekompajlirate u neki pseudo JS kod. Na primer:
# 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
Tip: Otvoreni projekat Hermes takođe uključuje alate za programere kao što je hbcdump
u specifičnim izdanjima Hermesa. Ako izgradite odgovarajuću verziju Hermesa koja je korišćena za proizvodnju paketa, hbcdump
može da izvuče funkcije, tabele stringova i bajtkod za dublju analizu.
Promenite kod i ponovo izgradite (Hermes)
Idealno bi bilo da možete da modifikujete disassembled kod (menjajući poređenje, ili vrednost ili šta god da treba da modifikujete) i zatim ponovo izgradite bajtkod i ponovo izgradite aplikaciju.
- Originalni hbctool podržava disassembling paketa i ponovnu izgradnju nakon izmena, ali je istorijski podržavao samo starije verzije bajtkoda. Forkovi koje održava zajednica proširuju podršku na novije verzije Hermesa (uključujući sredinu 80-ih–96) i često su najpraktičnija opcija za patchovanje modernih RN aplikacija.
- Alat hermes-dec ne podržava ponovnu izgradnju bajtkoda (samo dekompajler/disassembler), ali je veoma koristan za navigaciju logikom i izbacivanje stringova.
- Alat hasmer ima za cilj da podrži i disassembly i assembly za više verzija Hermesa; assembly se još uvek razvija, ali vredi probati na recentnom bajtkodu.
Minimalni radni tok sa hbctool-sličnim assemblerima:
# 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)
Napomena da je Hermes bytecode format verzionisan i da assembler mora odgovarati tačno onom formatu na disku. Ako dobijete greške u formatu, prebacite se na ažuriranu verziju/alternativu ili ponovo izgradite odgovarajući Hermes alat.
Dinamička analiza
Možete pokušati da dinamički analizirate aplikaciju koristeći Frida da omogućite developerski režim React aplikacije i koristite react-native-debugger
da se povežete na nju. Međutim, za ovo vam očigledno treba izvorni kod aplikacije. Više informacija o tome možete pronaći na https://newsroom.bedefended.com/hooking-react-native-applications-with-frida/.
Omogućavanje Dev podrške u izdanju sa Frida (napomene)
Neke aplikacije slučajno isporučuju klase koje omogućavaju prebacivanje Dev podrške. Ako su prisutne, možete pokušati da primorate getUseDeveloperSupport()
da vrati true:
// 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);
}
});
Warning: U pravilno izgrađenim verzijama, DevSupportManagerImpl
i povezane klase koje su samo za debagovanje se uklanjaju, a prebacivanje ove zastavice može uzrokovati pad aplikacije ili nemati efekta. Kada ovo funkcioniše, obično možete otvoriti dev meni i povezati debagere/inspektore.
Presretanje mreže u RN aplikacijama
React Native Android obično se oslanja na OkHttp u pozadini (putem Networking
nativnog modula). Da biste presreli/posmatrali saobraćaj na uređaju koji nije rootovan tokom dinamičkih testova:
- Koristite sistemski proxy + verujte korisničkom CA ili koristite druge generičke Android TLS zaobilaženje tehnike.
- RN-specifičan savet: ako aplikacija greškom uključuje Flipper u verziji (alatke za debagovanje), Flipper Network dodatak može izložiti zahteve/odgovore.
Za generičke Android tehnike presretanja i zaobilaženja pinovanja pogledajte:
Make APK Accept CA Certificate
Nedavni problemi u popularnim RN bibliotekama (na šta obratiti pažnju)
Kada audirate module trećih strana vidljive u JS paketu ili nativnim bibliotekama, proverite poznate ranjivosti i verifikujte verzije u package.json
/yarn.lock
.
- react-native-mmkv (Android): verzije pre 2.11.0 su beležile opcioni ključ za enkripciju u Android logovima. Ako su ADB/logcat dostupni, tajne bi mogle biti povraćene. Osigurajte >= 2.11.0. Indikatori: korišćenje
react-native-mmkv
, log izjave koje pominju MMKV inicijalizaciju sa enkripcijom. CVE-2024-21668. - react-native-document-picker: verzije < 9.1.1 su bile ranjive na prelazak putanje na Androidu (izbor datoteka), ispravljeno u 9.1.1. Validirajte ulaze i verziju biblioteke.
Brze provere:
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
Reference
- 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://payatu.com/wp-content/uploads/2023/02/Mastering-React-Native-Application-Pentesting-A-Practical-Guide-2.pdf
- CVE-2024-21668: react-native-mmkv beleži ključ za enkripciju logova na Androidu, ispravljeno u v2.11.0 (NVD): https://nvd.nist.gov/vuln/detail/CVE-2024-21668
- hbctool (i forke) za Hermes sastavljanje/raspoređivanje: https://github.com/bongtrop/hbctool
tip
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.