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

This commit is contained in:
Translator 2025-08-21 04:19:27 +00:00
parent da1fb185e5
commit 88f86add8c

View File

@ -1,26 +1,40 @@
# React Native Application Analysis
{{#include ../../banners/hacktricks-training.md}}
# React Native アプリケーション分析
アプリケーションがReact Nativeフレームワークで構築されているか確認するには、以下の手順に従ってください。
アプリケーションが React Native フレームワークで構築されているか確認するには、以下の手順に従ってください
1. APKファイルの名前をzip拡張子に変更し、コマンド `cp com.example.apk example-apk.zip``unzip -qq example-apk.zip -d ReactNative` を使用して新しいフォルダーに抽出します
1. APK ファイルの名前を zip 拡張子に変更し、コマンド `cp com.example.apk example-apk.zip``unzip -qq example-apk.zip -d ReactNative` を使用して新しいフォルダーに抽出します。
2. 新しく作成されたReactNativeフォルダーに移動し、assetsフォルダーを見つけます。このフォルダー内に、minified形式のReact JavaScriptを含むファイル `index.android.bundle` があるはずです。
2. 新しく作成された ReactNative フォルダーに移動し、assets フォルダーを見つけます。このフォルダー内に、React JavaScript がミニファイされた形式で含まれている `index.android.bundle` ファイルがあるはずです。
3. コマンド `find . -print | grep -i ".bundle$"` を使用してJavaScriptファイルを検索します。
3. コマンド `find . -print | grep -i ".bundle$"` を使用して JavaScript ファイルを検索します。
注意: APKの代わりにAndroid App Bundle (.aab) が与えられた場合は、まずユニバーサルAPKを生成し、その後バンドルを抽出してください。
```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
## Javascript コード
# 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 コード(ミニファイされていても)を見つけることができれば、**機密情報や脆弱性を見つけるために分析できます**。
`index.android.bundle`の内容を確認すると、アプリケーションのJavaScriptコードミニファイされていてもを見つけることができます。これを**分析して機密情報や脆弱性を見つける**ことができます
バンドルには実際にアプリケーションのすべての JS コードが含まれているため、**異なるファイルに分割することが可能です**(逆アセンブルを容易にする可能性があります) **ツール [react-native-decompiler](https://github.com/numandev1/react-native-decompiler)** を使用して。
バンドルには実際にアプリケーションのすべてのJSコードが含まれているため、**異なるファイルに分割する**ことが可能です(逆コンパイルを容易にする可能性があります)**ツール [react-native-decompiler](https://github.com/numandev1/react-native-decompiler)** を使用して。
### Webpack
JavaScript コードをさらに分析するには、ファイルを [https://spaceraccoon.github.io/webpack-exploder/](https://spaceraccoon.github.io/webpack-exploder/) にアップロードするか、以下の手順に従ってください。
JavaScriptコードをさらに分析するには、ファイルを [https://spaceraccoon.github.io/webpack-exploder/](https://spaceraccoon.github.io/webpack-exploder/) にアップロードするか、の手順に従ってください。
1. 同じディレクトリに `index.html` という名前のファイルを作成し、次のコードを記述します:
1. 同じディレクトリに `index.html` という名前のファイルを作成し、次のコードを追加します:
```html
<script src="./index.android.bundle"></script>
```
@ -30,7 +44,7 @@ JavaScript コードをさらに分析するには、ファイルを [https://sp
4. Developer Toolbarで「Sources」をクリックします。フォルダとファイルに分かれたJavaScriptファイルが表示され、メインバンドルを構成しています。
`index.android.bundle.map`というファイルが見つかれば、ソースコードを圧縮形式で分析できます。マップファイルにはソースマッピングが含まれており、圧縮された識別子をマッピングすることができます。
`index.android.bundle.map`というファイルが見つかれば、ソースコードを圧縮形式で分析できます。マップファイルにはソースマッピングが含まれており、圧縮された識別子をマッピングすることができます。
機密の資格情報やエンドポイントを検索するには、次の手順に従います。
@ -38,44 +52,144 @@ JavaScript コードをさらに分析するには、ファイルを [https://sp
2. この特定のケースでは、アプリケーションがDialogflowサービスを使用していることが観察されました。その設定に関連するパターンを検索します。
3. コンプロセス中にJavaScriptコード内で機密のハードコーディングされた資格情報が見つかったのは幸運でした。
3. コンプロセス中にJavaScriptコード内で機密のハードコーディングされた資格情報が見つかったのは幸運でした。
### JSコードを変更して再構築
### バンドル内のクイックシークレット/エンドポイントハンティング
この場合、コードを変更するのは簡単です。アプリの名前を`.zip`拡張子に変更し、抽出するだけです。次に、このバンドル内の**JSコードを修正してアプリを再構築**できます。これで、テスト目的でアプリに**コードを注入**することができるはずです。
これらのシンプルなgrepは、圧縮された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)"
## Hermesバイトコード
# Firebase / Google keys (heuristics)
strings -n 6 index.android.bundle | grep -Ei "(AIza[0-9A-Za-z_-]{35}|AIzaSy[0-9A-Za-z_-]{33})"
バンドルに**Hermesバイトコード**が含まれている場合、アプリのJavaScriptコードに**アクセスできなくなります**(圧縮版にもアクセスできません)。
# 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*:)"
```
もしOver-The-Airアップデートフレームワークを疑う場合、次のものも探してください
- Microsoft App Center / CodePushデプロイメントキー
- Expo EAS Updates構成`expo-updates``expo\.io`、署名証明書)
### JSコードを変更して再構築する
この場合、コードを変更するのは簡単です。アプリの名前を`.zip`拡張子を使用するように変更し、抽出するだけです。次に、このバンドル内の**JSコードを修正してアプリを再構築**できます。これで、テスト目的でアプリに**コードを注入**することができるはずです。
## Hermesバイトコード
バンドルに**Hermesバイトコード**が含まれている場合、アプリのJavascriptコードに**アクセスできなくなります**(ミニファイ版にもアクセスできません)。
バンドルにHermesバイトコードが含まれているかどうかは、次のコマンドを実行して確認できます
```bash
file index.android.bundle
index.android.bundle: Hermes JavaScript bytecode, version 96
```
しかし、ツール **[hbctool](https://github.com/bongtrop/hbctool)**、**[hermes-dec](https://github.com/P1sec/hermes-dec)**、または **[hermes_rs](https://github.com/Pilfer/hermes_rs)** を使用して **バイトコードを逆アセンブル**し、さらに **それを擬似JSコードにデコンパイル**することができます。これを行うために、例えば以下のコマンドを使用します:
ただし、ツール **[hbctool](https://github.com/bongtrop/hbctool)**、新しいバイトコードバージョンをサポートする hbctool の更新されたフォーク、**[hasmer](https://github.com/lucasbaizer2/hasmer)**、**[hermes_rs](https://github.com/Pilfer/hermes_rs)** (Rust ライブラリ/APIs)、または **[hermes-dec](https://github.com/P1sec/hermes-dec)** を使用して **バイトコードを逆アセンブル**し、さらに **それを擬似 JS コードにデコンパイル**することができます。例えば:
```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
```
### コードの変更と再構築
Tip: オープンソースのHermesプロジェクトは、特定のHermesリリースに`hbcdump`などの開発者ツールも提供しています。バンドルを生成するために使用されたHermesのバージョンに一致するHermesをビルドすると、`hbcdump`は関数、文字列テーブル、バイトコードをダンプして、より深い分析が可能になります。
理想的には、逆アセンブルされたコードを修正(比較や値の変更など)し、**バイトコードを再構築**してアプリを再構築できるべきです。
### コードを変更して再ビルドするHermes
ツール **[hbctool](https://github.com/bongtrop/hbctool)** は、バンドルを逆アセンブルし、変更後に再構築することをサポートしていますが、**古いバージョン**のHermesバイトコードのみをサポートしています。
理想的には、逆アセンブルされたコードを修正(比較の変更、値の変更、または必要な変更)し、その後**バイトコードを再ビルド**してアプリを再ビルドできるはずです。
ツール **[hermes-dec](https://github.com/P1sec/hermes-dec)** は、バイトコードの再構築をサポートしていません。
- 元の**[hbctool](https://github.com/bongtrop/hbctool)**は、バンドルを逆アセンブルし、変更後に再構築することをサポートしていますが、歴史的に古いバイトコードバージョンのみをサポートしていました。コミュニティが維持するフォークは、新しいHermesバージョンミッド80年代から96までへのサポートを拡張しており、現代のRNアプリをパッチするための最も実用的なオプションであることが多いです。
- ツール**[hermes-dec](https://github.com/P1sec/hermes-dec)**は、バイトコードの再ビルドをサポートしていません(デコンパイラ/逆アセンブラのみ)が、ロジックをナビゲートし、文字列をダンプするのに非常に役立ちます。
- ツール**[hasmer](https://github.com/lucasbaizer2/hasmer)**は、複数のHermesバージョンの逆アセンブルとアセンブルの両方をサポートすることを目指しています。アセンブルはまだ成熟していませんが、最近のバイトコードで試す価値があります。
ツール **[hermes_rs](https://github.com/Pilfer/hermes_rs)** は、バイトコードの再構築をサポートしていますが、実際にはライブラリでありCLIツールではありません。
hbctoolのようなアセンブラを使用した最小限のワークフロー:
```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)
```
注意してください、Hermesバイトコード形式はバージョン管理されており、アセンブラはディスク上の形式と正確に一致する必要があります。形式エラーが発生した場合は、更新されたフォーク/代替に切り替えるか、一致するHermesツールを再構築してください。
## 動的分析
アプリを動的に分析する方法として、Fridaを使用してReactアプリの開発者モードを有効にし、**`react-native-debugger`** をアタッチすることが考えられます。ただし、これにはアプリのソースコードが必要なようです。詳細については、[https://newsroom.bedefended.com/hooking-react-native-applications-with-frida/](https://newsroom.bedefended.com/hooking-react-native-applications-with-frida/)を参照してください。
アプリを動的に分析するための方法として、Fridaを使用してReactアプリの開発者モードを有効にし、**`react-native-debugger`**を使用してそれに接続することが考えられます。ただし、これにはアプリのソースコードが必要なようです。これに関する詳細は[https://newsroom.bedefended.com/hooking-react-native-applications-with-frida/](https://newsroom.bedefended.com/hooking-react-native-applications-with-frida/)で確認できます
### Fridaを使用してリリースでDev Supportを有効にする注意点
一部のアプリは、Dev Supportを切り替え可能にするクラスを誤って出荷することがあります。存在する場合は、`getUseDeveloperSupport()`を強制的に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);
}
});
```
警告: 適切に構築されたリリースビルドでは、`DevSupportManagerImpl` および関連するデバッグ専用クラスは削除され、このフラグを切り替えるとアプリがクラッシュするか、効果がない場合があります。これが機能する場合、通常はデベロッパーメニューを表示し、デバッガー/インスペクターを接続できます。
### RNアプリにおけるネットワークインターセプション
React Native Androidは通常、内部でOkHttpに依存しています`Networking`ネイティブモジュールを介して)。非ルートデバイスで動的テスト中にトラフィックをインターセプト/観察するには:
- システムプロキシを使用し、ユーザーCAを信頼するか、他の一般的なAndroid TLSバイパス技術を使用します。
- RN特有のヒント: アプリがリリース時に誤ってFlipperをバンドルしている場合デバッグツール、Flipper Networkプラグインがリクエスト/レスポンスを公開できます。
一般的なAndroidのインターセプションおよびピンニングバイパス技術については、以下を参照してください:
{{#ref}}
make-apk-accept-ca-certificate.md
{{#endref}}
{{#ref}}
frida-tutorial/objection-tutorial.md
{{#endref}}
## 人気の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で修正されました入力とライブラリのバージョンを検証してください
クイックチェック:
```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
```
## 参考文献
- [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がAndroidでログの暗号化キーを記録、v2.11.0で修正 (NVD): https://nvd.nist.gov/vuln/detail/CVE-2024-21668
- hbctool (およびフォーク) for Hermes assemble/disassemble: https://github.com/bongtrop/hbctool
{{#include ../../banners/hacktricks-training.md}}