mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/mobile-pentesting/android-app-pentesting/android-task-h
This commit is contained in:
parent
b79928dadd
commit
63240e4547
@ -4,13 +4,13 @@
|
||||
|
||||
## タスク、バックスタックとフォアグラウンドアクティビティ
|
||||
|
||||
Androidにおいて、**タスク**はユーザーが特定の作業を完了するために対話するアクティビティのセットであり、**バックスタック**内に整理されています。このスタックはアクティビティが開かれた時に基づいて順序付けられ、最も最近のアクティビティが最上部に表示され、**フォアグラウンドアクティビティ**となります。どの瞬間でも、このアクティビティだけが画面に表示され、**フォアグラウンドタスク**の一部となります。
|
||||
Androidにおいて、**タスク**はユーザーが特定の作業を完了するために対話するアクティビティのセットであり、**バックスタック**内に整理されています。このスタックはアクティビティが開かれた順に並べられ、最も最近のアクティビティが最上部に表示され、**フォアグラウンドアクティビティ**となります。どの瞬間でも、このアクティビティだけが画面に表示され、**フォアグラウンドタスク**の一部となります。
|
||||
|
||||
アクティビティの遷移の簡単な内訳は以下の通りです:
|
||||
|
||||
- **アクティビティ 1** はフォアグラウンドの唯一のアクティビティとして開始されます。
|
||||
- **アクティビティ 2** を起動すると、**アクティビティ 1** がバックスタックに押し出され、**アクティビティ 2** がフォアグラウンドに表示されます。
|
||||
- **アクティビティ 3** を開始すると、**アクティビティ 1** と **アクティビティ 2** がスタックのさらに後ろに移動し、**アクティビティ 3** が前面に出ます。
|
||||
- **アクティビティ 2** を起動すると、**アクティビティ 1** はバックスタックに押し出され、**アクティビティ 2** がフォアグラウンドに来ます。
|
||||
- **アクティビティ 3** を開始すると、**アクティビティ 1** と **アクティビティ 2** はスタックのさらに後ろに移動し、**アクティビティ 3** が前面に出ます。
|
||||
- **アクティビティ 3** を閉じると、**アクティビティ 2** が再びフォアグラウンドに戻り、Androidの効率的なタスクナビゲーションメカニズムを示します。
|
||||
|
||||
.png>)
|
||||
@ -19,25 +19,31 @@ Androidにおいて、**タスク**はユーザーが特定の作業を完了す
|
||||
|
||||
### タスクアフィニティと起動モードの概要
|
||||
|
||||
Androidアプリケーションにおいて、**タスクアフィニティ**はアクティビティの好ましいタスクを指定し、通常はアプリのパッケージ名に一致します。この設定は、攻撃を示すための概念実証(PoC)アプリを作成する際に重要です。
|
||||
Androidアプリケーションにおいて、**タスクアフィニティ**はアクティビティの好ましいタスクを指定し、通常はアプリのパッケージ名に一致します。この設定は、攻撃を示すための概念実証(PoC)アプリを作成するのに重要です。
|
||||
|
||||
### 起動モード
|
||||
|
||||
`launchMode`属性は、タスク内のアクティビティインスタンスの処理を指示します。**singleTask**モードはこの攻撃にとって重要であり、既存のアクティビティインスタンスとタスクアフィニティの一致に基づいて3つのシナリオを指示します。この脆弱性は、攻撃者のアプリがターゲットアプリのタスクアフィニティを模倣する能力に依存し、Androidシステムを誤導して攻撃者のアプリを起動させることにあります。
|
||||
`launchMode`属性は、タスク内のアクティビティインスタンスの処理を指示します。**singleTask**モードはこの攻撃にとって重要であり、既存のアクティビティインスタンスとタスクアフィニティの一致に基づいて3つのシナリオを指示します。攻撃者のアプリがターゲットアプリのタスクアフィニティを模倣する能力に依存し、Androidシステムを誤導して攻撃者のアプリを起動させます。
|
||||
|
||||
### 詳細な攻撃手順
|
||||
|
||||
1. **悪意のあるアプリのインストール**: 被害者は攻撃者のアプリをデバイスにインストールします。
|
||||
2. **初期アクティベーション**: 被害者は最初に悪意のあるアプリを開き、攻撃の準備をします。
|
||||
3. **ターゲットアプリの起動試行**: 被害者はターゲットアプリを開こうとします。
|
||||
4. **ハイジャックの実行**: 一致するタスクアフィニティにより、悪意のあるアプリがターゲットアプリの代わりに起動されます。
|
||||
4. **ハイジャックの実行**: ある時点でアプリが**singleTask**ビューを開こうとします。タスクアフィニティが一致するため、悪意のあるアプリがターゲットアプリの代わりに起動されます。
|
||||
5. **欺瞞**: 悪意のあるアプリはターゲットアプリに似た偽のログイン画面を表示し、ユーザーを騙して機密情報を入力させます。
|
||||
|
||||
> [!TIP]
|
||||
> この攻撃が機能するためには、脆弱なビューが**exported to true**である必要はなく、メインアクティビティである必要もありません。
|
||||
|
||||
この攻撃の実践的な実装については、GitHubのTask Hijacking Strandhoggリポジトリを参照してください: [Task Hijacking Strandhogg](https://github.com/az0mb13/Task_Hijacking_Strandhogg)。
|
||||
|
||||
### 予防策
|
||||
|
||||
このような攻撃を防ぐために、開発者は`taskAffinity`を空の文字列に設定し、`singleInstance`起動モードを選択することで、他のアプリからの隔離を確保できます。`onBackPressed()`関数をカスタマイズすることで、タスクハイジャックに対する追加の保護を提供します。
|
||||
このような攻撃を防ぐために、開発者は以下を行うことができます:
|
||||
- **`taskAffinity`**を**singleTask**ビューの空文字列に設定する (`android:taskAffinity=""`)
|
||||
- **`singleInstance`**起動モードを選択し、他のアプリからの隔離を確保する。
|
||||
- **`onBackPressed()`**関数をカスタマイズして、タスクハイジャックに対する追加の保護を提供する。
|
||||
|
||||
## **参考文献**
|
||||
|
||||
|
@ -6,25 +6,33 @@
|
||||
|
||||
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 ファイルを検索します。
|
||||
|
||||
JavaScript コードをさらに分析するために、同じディレクトリに `index.html` という名前のファイルを作成し、以下のコードを記述します:
|
||||
## Javascript コード
|
||||
|
||||
`index.android.bundle` の内容を確認すると、アプリケーションの JavaScript コード(ミニファイされていても)を見つけることができれば、**機密情報や脆弱性を見つけるために分析できます**。
|
||||
|
||||
バンドルには実際にアプリケーションのすべての 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/) にアップロードするか、以下の手順に従ってください。
|
||||
|
||||
1. 同じディレクトリに `index.html` という名前のファイルを作成し、次のコードを記述します:
|
||||
```html
|
||||
<script src="./index.android.bundle"></script>
|
||||
```
|
||||
ファイルを[https://spaceraccoon.github.io/webpack-exploder/](https://spaceraccoon.github.io/webpack-exploder/)にアップロードするか、次の手順に従ってください。
|
||||
2. `index.html`ファイルをGoogle Chromeで開きます。
|
||||
|
||||
1. Google Chromeで`index.html`ファイルを開きます。
|
||||
3. **OS Xの場合はCommand+Option+J**、**Windowsの場合はControl+Shift+J**を押してDeveloper Toolbarを開きます。
|
||||
|
||||
2. **OS Xの場合はCommand+Option+J**、**Windowsの場合はControl+Shift+J**を押してDeveloper Toolbarを開きます。
|
||||
|
||||
3. Developer Toolbarで「Sources」をクリックします。フォルダーとファイルに分割されたJavaScriptファイルが表示され、メインバンドルを構成しています。
|
||||
4. Developer Toolbarで「Sources」をクリックします。フォルダとファイルに分かれたJavaScriptファイルが表示され、メインバンドルを構成しています。
|
||||
|
||||
`index.android.bundle.map`というファイルが見つかれば、ソースコードを未圧縮形式で分析できます。マップファイルにはソースマッピングが含まれており、圧縮された識別子をマッピングすることができます。
|
||||
|
||||
機密の資格情報やエンドポイントを検索するには、次の手順に従ってください。
|
||||
機密の資格情報やエンドポイントを検索するには、次の手順に従います。
|
||||
|
||||
1. JavaScriptコードを分析するための機密キーワードを特定します。React Nativeアプリケーションは、Firebase、AWS S3サービスエンドポイント、プライベートキーなどのサードパーティサービスを使用することがよくあります。
|
||||
|
||||
@ -32,8 +40,42 @@ JavaScript コードをさらに分析するために、同じディレクトリ
|
||||
|
||||
3. 再コンプロセス中にJavaScriptコード内で機密のハードコーディングされた資格情報が見つかったのは幸運でした。
|
||||
|
||||
### 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コードにデコンパイル**することができます。これを行うために、例えば以下のコマンドを使用します:
|
||||
```bash
|
||||
hbc-disassembler ./index.android.bundle /tmp/my_output_file.hasm
|
||||
hbc-decompiler ./index.android.bundle /tmp/my_output_file.js
|
||||
```
|
||||
### コードの変更と再構築
|
||||
|
||||
理想的には、逆アセンブルされたコードを修正(比較や値の変更など)し、**バイトコードを再構築**してアプリを再構築できるべきです。
|
||||
|
||||
ツール **[hbctool](https://github.com/bongtrop/hbctool)** は、バンドルを逆アセンブルし、変更後に再構築することをサポートしていますが、**古いバージョン**のHermesバイトコードのみをサポートしています。
|
||||
|
||||
ツール **[hermes-dec](https://github.com/P1sec/hermes-dec)** は、バイトコードの再構築をサポートしていません。
|
||||
|
||||
ツール **[hermes_rs](https://github.com/Pilfer/hermes_rs)** は、バイトコードの再構築をサポートしていますが、実際にはライブラリでありCLIツールではありません。
|
||||
|
||||
## 動的分析
|
||||
|
||||
アプリを動的に分析する方法として、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/)を参照してください。
|
||||
|
||||
## 参考文献
|
||||
|
||||
- [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)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -4,18 +4,20 @@
|
||||
|
||||
## **基本情報**
|
||||
|
||||
**Tapjacking** は、**悪意のある** **アプリケーション** が起動し、**被害者アプリケーションの上に位置する** 攻撃です。被害者アプリが視覚的に隠されると、そのユーザーインターフェースはユーザーを騙してそれに対話させるように設計されており、その間にその対話を被害者アプリに渡します。\
|
||||
**Tapjacking**は、**悪意のある** **アプリケーション**が起動し、**被害者アプリケーションの上に位置する**攻撃です。被害者アプリが視覚的に隠されると、そのユーザーインターフェースはユーザーを騙してそれに対話させるように設計されており、同時にその対話を被害者アプリに渡します。\
|
||||
実際には、**ユーザーが実際に被害者アプリでアクションを実行していることを知らないようにしています**。
|
||||
|
||||
### 検出
|
||||
|
||||
この攻撃に対して脆弱なアプリを検出するには、Androidマニフェスト内の**エクスポートされたアクティビティ**を検索する必要があります(インテントフィルターを持つアクティビティはデフォルトで自動的にエクスポートされることに注意してください)。エクスポートされたアクティビティを見つけたら、**それらが何らかの権限を必要とするか確認してください**。これは、**悪意のあるアプリケーションもその権限を必要とするためです**。
|
||||
この攻撃に対して脆弱なアプリを検出するには、androidマニフェスト内の**エクスポートされたアクティビティ**を検索する必要があります(インテントフィルターを持つアクティビティはデフォルトで自動的にエクスポートされることに注意してください)。エクスポートされたアクティビティを見つけたら、**それらが何らかの権限を必要とするか確認してください**。これは、**悪意のあるアプリケーションもその権限を必要とするためです**。
|
||||
|
||||
アプリの最小SDKバージョンを確認することもできます。**`AndroidManifest.xml`**ファイル内の**`android:minSdkVersion`**の値を確認してください。値が**30未満**の場合、そのアプリはTapjackingに対して脆弱です。
|
||||
|
||||
### 保護
|
||||
|
||||
#### Android 12 (API 31,32) 以降
|
||||
|
||||
[**この情報源によると**](https://www.geeksforgeeks.org/tapjacking-in-android/)**、** tapjacking攻撃はAndroid 12 (API 31 & 30) 以降、Androidによって自動的に防止されます。したがって、アプリケーションが脆弱であっても、**それを悪用することはできません**。
|
||||
[**この情報源によると**](https://www.geeksforgeeks.org/tapjacking-in-android/)**、**Tapjacking攻撃はAndroid 12 (API 31 & 30) 以降で自動的に防止されます。したがって、アプリケーションが脆弱であっても、**それを悪用することはできません**。
|
||||
|
||||
#### `filterTouchesWhenObscured`
|
||||
|
||||
@ -23,8 +25,8 @@
|
||||
|
||||
#### **`setFilterTouchesWhenObscured`**
|
||||
|
||||
属性 **`setFilterTouchesWhenObscured`** を true に設定することでも、この脆弱性の悪用を防ぐことができます。\
|
||||
例えば、**`true`** に設定されている場合、ボタンは自動的に**隠されている場合無効化される**ことがあります:
|
||||
属性**`setFilterTouchesWhenObscured`**がtrueに設定されている場合、Androidバージョンが低い場合でもこの脆弱性の悪用を防ぐことができます。\
|
||||
例えば、**`true`**に設定されている場合、ボタンは**隠されている場合に自動的に無効化される**ことがあります:
|
||||
```xml
|
||||
<Button android:text="Button"
|
||||
android:id="@+id/button1"
|
||||
@ -37,13 +39,13 @@ android:filterTouchesWhenObscured="true">
|
||||
|
||||
### Tapjacking-ExportedActivity
|
||||
|
||||
最も**最近のAndroidアプリケーション**でTapjacking攻撃を実行するもの(+ 攻撃されたアプリケーションのエクスポートされたアクティビティの前に呼び出すこと)が見つかるのは: [**https://github.com/carlospolop/Tapjacking-ExportedActivity**](https://github.com/carlospolop/Tapjacking-ExportedActivity)。
|
||||
最も**最近のAndroidアプリケーション**でTapjacking攻撃を実行するもの(+ 攻撃対象アプリケーションのエクスポートされたアクティビティの前に呼び出すこと)が見つかるのは: [**https://github.com/carlospolop/Tapjacking-ExportedActivity**](https://github.com/carlospolop/Tapjacking-ExportedActivity)。
|
||||
|
||||
**READMEの指示に従って使用してください**。
|
||||
|
||||
### FloatingWindowApp
|
||||
|
||||
**FloatingWindowApp**を実装した例のプロジェクトは、他のアクティビティの上に置いてクリックジャッキング攻撃を実行するために使用できるもので、[**FloatingWindowApp**](https://github.com/aminography/FloatingWindowApp)に見つかります(少し古いですが、apkのビルドに幸運を祈ります)。
|
||||
**FloatingWindowApp**を実装した例のプロジェクトは、他のアクティビティの上に置いてクリックジャッキング攻撃を実行するために使用できるもので、[**FloatingWindowApp**](https://github.com/aminography/FloatingWindowApp)に見つかります(少し古いので、apkのビルドに幸運を祈ります)。
|
||||
|
||||
### Qark
|
||||
|
||||
@ -52,10 +54,10 @@ android:filterTouchesWhenObscured="true">
|
||||
|
||||
`--exploit-apk` --sdk-path `/Users/username/Library/Android/sdk` パラメータを使用して[**qark**](https://github.com/linkedin/qark)を使用すると、可能な**Tapjacking**脆弱性をテストするための悪意のあるアプリケーションを作成できます。\
|
||||
|
||||
緩和策は比較的簡単で、開発者は別のビューに覆われているときにタッチイベントを受け取らないことを選択できます。[Android Developer’s Reference](https://developer.android.com/reference/android/view/View#security)を使用すると:
|
||||
緩和策は比較的簡単で、開発者は別のビューに覆われているときにタッチイベントを受け取らないことを選択できます。[Android Developer’s Reference](https://developer.android.com/reference/android/view/View#security)を使用して:
|
||||
|
||||
> アプリケーションがユーザーの完全な知識と同意のもとでアクションが実行されていることを確認できることが重要な場合があります。たとえば、権限リクエストの承認、購入の実行、広告のクリックなどです。残念ながら、悪意のあるアプリケーションは、ビューの意図された目的を隠すことによって、ユーザーを騙してこれらのアクションを無意識に実行させようとする可能性があります。これに対する対策として、フレームワークは、機密機能へのアクセスを提供するビューのセキュリティを向上させるために使用できるタッチフィルタリングメカニズムを提供します。
|
||||
> 時には、アプリケーションがユーザーの完全な知識と同意のもとでアクションが実行されていることを確認することが不可欠です。たとえば、権限リクエストを承認したり、購入を行ったり、広告をクリックしたりする場合です。残念ながら、悪意のあるアプリケーションは、ビューの意図された目的を隠すことによって、ユーザーを騙してこれらのアクションを無意識に実行させようとする可能性があります。これに対する対策として、フレームワークは、機密機能へのアクセスを提供するビューのセキュリティを向上させるために使用できるタッチフィルタリングメカニズムを提供します。
|
||||
>
|
||||
> タッチフィルタリングを有効にするには、[`setFilterTouchesWhenObscured(boolean)`](https://developer.android.com/reference/android/view/View#setFilterTouchesWhenObscured%28boolean%29)を呼び出すか、android:filterTouchesWhenObscuredレイアウト属性をtrueに設定します。有効にすると、フレームワークは、ビューのウィンドウが別の可視ウィンドウによって覆われているときに受信したタッチを破棄します。その結果、トースト、ダイアログ、または他のウィンドウがビューのウィンドウの上に表示されるときに、ビューはタッチを受け取らなくなります。
|
||||
> タッチフィルタリングを有効にするには、[`setFilterTouchesWhenObscured(boolean)`](https://developer.android.com/reference/android/view/View#setFilterTouchesWhenObscured%28boolean%29)を呼び出すか、android:filterTouchesWhenObscuredレイアウト属性をtrueに設定します。有効にすると、フレームワークは、ビューのウィンドウが別の可視ウィンドウによって覆われているときに受信したタッチを破棄します。その結果、トースト、ダイアログ、または他のウィンドウがビューのウィンドウの上に表示されるとき、ビューはタッチを受け取らなくなります。
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -471,12 +471,13 @@ window.search = window.search || {};
|
||||
showResults(true);
|
||||
}
|
||||
|
||||
fetch(path_to_root + 'searchindex.json')
|
||||
var branch = lang === "en" ? "master" : lang
|
||||
fetch(`https://raw.githubusercontent.com/HackTricks-wiki/hacktricks/refs/heads/${branch}/searchindex.json`)
|
||||
.then(response => response.json())
|
||||
.then(json => init(json))
|
||||
.catch(error => { // Try to load searchindex.js if fetch failed
|
||||
var script = document.createElement('script');
|
||||
script.src = path_to_root + 'searchindex.js';
|
||||
script.src = `https://raw.githubusercontent.com/HackTricks-wiki/hacktricks/refs/heads/${branch}/searchindex.js`;
|
||||
script.onload = () => init(window.search);
|
||||
document.head.appendChild(script);
|
||||
});
|
||||
|
@ -55,6 +55,7 @@
|
||||
<!-- Provide site root to javascript -->
|
||||
<script>
|
||||
var path_to_root = "{{ path_to_root }}";
|
||||
var lang = "{{ language }}";
|
||||
var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "{{ preferred_dark_theme }}" : "{{ default_theme }}";
|
||||
</script>
|
||||
<!-- Start loading toc.js asap -->
|
||||
|
Loading…
x
Reference in New Issue
Block a user