Аналіз додатка React Native
Reading time: 10 minutes
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
Щоб підтвердити, чи був додаток створений на основі фреймворку React Native, виконайте ці кроки:
-
Перейменуйте файл APK з розширенням zip і витягніть його в нову папку, використовуючи команду
cp com.example.apk example-apk.zip
таunzip -qq example-apk.zip -d ReactNative
. -
Перейдіть до новоствореної папки ReactNative і знайдіть папку assets. Усередині цієї папки ви повинні знайти файл
index.android.bundle
, який містить React JavaScript у мінімізованому форматі. -
Використовуйте команду
find . -print | grep -i ".bundle$"
для пошуку файлу JavaScript.
Примітка: Якщо вам надано Android App Bundle (.aab) замість APK, спочатку згенеруйте універсальний APK, а потім витягніть пакет:
# 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
Якщо перевіряючи вміст index.android.bundle
, ви знайдете JavaScript код програми (навіть якщо він мінімізований), ви можете проаналізувати його, щоб знайти чутливу інформацію та вразливості.
Оскільки бандл фактично містить увесь JS код програми, можливо поділити його на різні файли (потенційно спрощуючи його реверс-інжиніринг), використовуючи інструмент react-native-decompiler.
Webpack
Щоб далі проаналізувати JavaScript код, ви можете завантажити файл на https://spaceraccoon.github.io/webpack-exploder/ або виконати ці кроки:
- Створіть файл з назвою
index.html
в тому ж каталозі з наступним кодом:
<script src="./index.android.bundle"></script>
-
Відкрийте файл
index.html
у Google Chrome. -
Відкрийте панель розробника, натиснувши Command+Option+J для OS X або Control+Shift+J для Windows.
-
Клацніть на "Sources" у панелі розробника. Ви повинні побачити файл JavaScript, який розділений на папки та файли, що складають основний пакет.
Якщо ви знайдете файл під назвою index.android.bundle.map
, ви зможете проаналізувати вихідний код у немінімізованому форматі. Файли карт містять відображення виходу, що дозволяє вам відображати мінімізовані ідентифікатори.
Щоб знайти чутливі облікові дані та кінцеві точки, дотримуйтесь цих кроків:
-
Визначте чутливі ключові слова для аналізу коду JavaScript. Додатки React Native часто використовують сторонні сервіси, такі як Firebase, кінцеві точки сервісу AWS S3, приватні ключі тощо.
-
У цьому конкретному випадку було помічено, що додаток використовує сервіс Dialogflow. Шукайте шаблон, пов'язаний з його конфігурацією.
-
Було щасливо, що чутливі жорстко закодовані облікові дані були знайдені в коді JavaScript під час процесу розвідки.
Швидкий пошук секретів/кінцевих точок у пакетах
Ці прості grep часто виявляють цікаві індикатори навіть у мінімізованому 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*:)"
Якщо ви підозрюєте фреймворки оновлення по повітрю, також шукайте:
- Microsoft App Center / CodePush ключі розгортання
- Expo EAS Updates конфігурація (
expo-updates
,expo\.io
, сертифікати підпису)
Змінити JS код і перезібрати
У цьому випадку змінити код легко. Вам просто потрібно перейменувати додаток, щоб використовувати розширення .zip
і витягти його. Потім ви можете модифікувати JS код всередині цього пакету і перезібрати додаток. Це має бути достатньо, щоб дозволити вам впровадити код в додаток для тестування.
Hermes байт-код
Якщо пакет містить Hermes байт-код, ви не зможете отримати доступ до Javascript коду додатка (навіть до мінімізованої версії).
Ви можете перевірити, чи містить пакет Hermes байт-код, запустивши наступну команду:
file index.android.bundle
index.android.bundle: Hermes JavaScript bytecode, version 96
Однак ви можете використовувати інструменти hbctool, оновлені форки hbctool, які підтримують новіші версії байт-коду, hasmer, hermes_rs (бібліотека/API на Rust) або hermes-dec для дизасемблювання байт-коду та також для декомпіляції його в деякий псевдо JS код. Наприклад:
# 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
Порада: Проект з відкритим кодом Hermes також постачає інструменти для розробників, такі як hbcdump
, у специфічних релізах Hermes. Якщо ви зберете відповідну версію Hermes, яка використовувалася для створення пакету, hbcdump
може вивантажити функції, таблиці рядків та байт-код для глибшого аналізу.
Змінити код і перебудувати (Hermes)
В ідеалі ви повинні мати можливість змінити дизасембльований код (змінюючи порівняння, значення або що завгодно, що потрібно змінити), а потім перебудувати байт-код і перебудувати додаток.
- Оригінальний hbctool підтримує дизасемблювання пакету та його повторну збірку після змін, але історично підтримував лише старі версії байт-коду. Форки, які підтримуються спільнотою, розширюють підтримку новіших версій Hermes (включаючи середину 80-х–96) і часто є найпрактичнішим варіантом для патчування сучасних RN додатків.
- Інструмент hermes-dec не підтримує повторну збірку байт-коду (тільки декомпілятор/дизасемблер), але дуже корисний для навігації по логіці та вивантаження рядків.
- Інструмент hasmer має на меті підтримувати як дизасемблювання, так і збірку для кількох версій Hermes; збірка все ще розвивається, але варто спробувати на останньому байт-коді.
Мінімальний робочий процес з асемблерами, подібними до hbctool:
# 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)
Зверніть увагу, що формат байт-коду Hermes має версію, і асемблер повинен відповідати точному формату на диску. Якщо ви отримуєте помилки формату, перейдіть на оновлений форк/альтернативу або перебудуйте відповідні інструменти Hermes.
Динамічний аналіз
Ви можете спробувати динамічно проаналізувати додаток, використовуючи Frida, щоб увімкнути режим розробника React-додатку та використовувати react-native-debugger
для підключення до нього. Однак для цього вам, очевидно, потрібен вихідний код додатку. Ви можете знайти більше інформації про це за https://newsroom.bedefended.com/hooking-react-native-applications-with-frida/.
Увімкнення підтримки розробника в релізі з Frida (зауваження)
Деякі додатки випадково постачають класи, які роблять підтримку розробника перемикаючою. Якщо вони присутні, ви можете спробувати примусити getUseDeveloperSupport()
повернути 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: У правильно побудованих релізних збірках DevSupportManagerImpl
та пов'язані з ним класи, призначені лише для налагодження, видаляються, і зміна цього прапорця може призвести до збою програми або не мати жодного ефекту. Коли це працює, ви зазвичай можете відкрити меню розробника та підключити налагоджувачі/інспектори.
Перехоплення мережі в RN додатках
React Native Android зазвичай покладається на OkHttp під капотом (через нативний модуль Networking
). Щоб перехопити/спостерігати трафік на пристрої без root-доступу під час динамічних тестів:
- Використовуйте системний проксі + довіряйте CA користувача або використовуйте інші загальні техніки обходу TLS для Android.
- Порада для RN: якщо програма випадково включає Flipper у релізі (інструменти налагодження), плагін Flipper Network може відкрити запити/відповіді.
Для загальних технік перехоплення Android та обходу пінінгу зверніться до:
Make APK Accept CA Certificate
Останні проблеми в популярних бібліотеках RN (на що звернути увагу)
При аудиті сторонніх модулів, видимих у JS бандлі або нативних бібліотеках, перевірте наявність відомих вразливостей та перевірте версії у package.json
/yarn.lock
.
- react-native-mmkv (Android): версії до 2.11.0 записували необов'язковий ключ шифрування в журнали Android. Якщо доступний ADB/logcat, секрети можуть бути відновлені. Переконайтеся, що версія >= 2.11.0. Показники: використання
react-native-mmkv
, журнальні записи, що згадують ініціалізацію MMKV з шифруванням. CVE-2024-21668. - react-native-document-picker: версії < 9.1.1 були вразливі до обходу шляху на Android (вибір файлів), виправлено в 9.1.1. Перевірте вхідні дані та версію бібліотеки.
Швидкі перевірки:
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
Посилання
- 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 записує ключ шифрування журналів на Android, виправлено в v2.11.0 (NVD): https://nvd.nist.gov/vuln/detail/CVE-2024-21668
- hbctool (та форки) для Hermes складання/розбирання: https://github.com/bongtrop/hbctool
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.