# Анализа React Native апликације {{#include ../../banners/hacktricks-training.md}} Da biste potvrdili da li je aplikacija izgrađena na React Native okviru, pratite sledeće korake: 1. Preimenujte APK datoteku sa zip ekstenzijom i ekstraktujte je u novu fasciklu koristeći komandu `cp com.example.apk example-apk.zip` i `unzip -qq example-apk.zip -d ReactNative`. 2. 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. 3. 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: ```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 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](https://github.com/numandev1/react-native-decompiler)**. ### Webpack Da biste dalje analizirali JavaScript kod, možete otpremiti datoteku na [https://spaceraccoon.github.io/webpack-exploder/](https://spaceraccoon.github.io/webpack-exploder/) ili pratiti ove korake: 1. Kreirajte datoteku pod imenom `index.html` u istom direktorijumu sa sledećim kodom: ```html ``` 2. Otvorite `index.html` datoteku u Google Chrome-u. 3. Otvorite Developer Toolbar pritiskom na **Command+Option+J za OS X** ili **Control+Shift+J za Windows**. 4. 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: 1. 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. 2. U ovom konkretnom slučaju, primećeno je da aplikacija koristi Dialogflow uslugu. Potražite obrazac povezan sa njenom konfiguracijom. 3. 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: ```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*:)" ``` 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: ```bash file index.android.bundle index.android.bundle: Hermes JavaScript bytecode, version 96 ``` Međutim, možete koristiti alate **[hbctool](https://github.com/bongtrop/hbctool)**, ažurirane forke hbctool-a koje podržavaju novije verzije bajtkoda, **[hasmer](https://github.com/lucasbaizer2/hasmer)**, **[hermes_rs](https://github.com/Pilfer/hermes_rs)** (Rust biblioteka/APIs), ili **[hermes-dec](https://github.com/P1sec/hermes-dec)** da **dekompajlirate bajtkod** i takođe da **dekompajlirate u neki pseudo JS kod**. Na primer: ```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 ``` 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](https://github.com/bongtrop/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](https://github.com/P1sec/hermes-dec)** ne podržava ponovnu izgradnju bajtkoda (samo dekompajler/disassembler), ali je veoma koristan za navigaciju logikom i izbacivanje stringova. - Alat **[hasmer](https://github.com/lucasbaizer2/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: ```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) ``` 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/](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: ```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); } }); ``` 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: {{#ref}} make-apk-accept-ca-certificate.md {{#endref}} {{#ref}} frida-tutorial/objection-tutorial.md {{#endref}} ## 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: ```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 ``` ## Reference - [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 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 {{#include ../../banners/hacktricks-training.md}}