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

This commit is contained in:
Translator 2025-07-30 08:14:25 +00:00
parent e2406b5295
commit a03c199fe3

View File

@ -4,9 +4,9 @@
## タスク、バックスタックとフォアグラウンドアクティビティ
Androidにおいて、**タスク**はユーザーが特定の作業を完了するために対話するアクティビティのセットであり、**バックスタック**内に整理されています。このスタックはアクティビティが開かれた順に並べられ、最も最近のアクティビティが最上部に表示され、これが**フォアグラウンドアクティビティ**となります。どの瞬間でも、このアクティビティだけが画面に表示され、**フォアグラウンドタスク**の一部となります。
Androidにおいて、**タスク**はユーザーが特定の作業を完了するために対話するアクティビティのセットであり、**バックスタック**内に整理されています。このスタックは、アクティビティが開かれた時点に基づいてアクティビティを順序付け、最も最近のアクティビティが最上部に表示され、**フォアグラウンドアクティビティ**となります。どの瞬間でも、このアクティビティだけが画面に表示され、**フォアグラウンドタスク**の一部となります。
アクティビティの遷移の簡単な説明は以下の通りです:
アクティビティの遷移の簡単な内訳は以下の通りです:
- **アクティビティ 1** はフォアグラウンドの唯一のアクティビティとして開始されます。
- **アクティビティ 2** を起動すると、**アクティビティ 1** はバックスタックに押し出され、**アクティビティ 2** がフォアグラウンドに来ます。
@ -19,9 +19,9 @@ Androidにおいて、**タスク**はユーザーが特定の作業を完了す
## タスクアフィニティ攻撃
`taskAffinity`は、`Activity`が*属したい*タスクをAndroidに伝えます。2つのアクティビティが同じアフィニティを共有している場合、**Androidは異なるAPKから来たものであっても、それらを同じバックスタック内にマージすることが許可されます**。
`taskAffinity`は、`Activity`が*属したい*タスクをAndroidに伝えます。2つのアクティビティが同じアフィニティを共有している場合、**Androidは異なるAPKから来たものであっても、それらを同じバックスタック内にマージすることが許可されています**。
攻撃者がそのスタックの**ルート**に悪意のあるアクティビティを配置できれば、被害者が正当なアプリケーションを開くたびに、悪意のあるUIがユーザーの最初に表示されます - フィッシングや悪用の権限要求に最適です。
攻撃者がそのスタックの**ルート**に悪意のあるアクティビティを配置できれば、被害者が正当なアプリケーションを開くたびに、悪意のあるUIがユーザーが最初に見るものになります フィッシングや悪用の権限要求に最適です。
攻撃面は多くの開発者が考えるよりも広範囲で、**すべてのアクティビティは自動的にアプリケーションパッケージ名と等しいアフィニティを継承します**(開発者が`android:taskAffinity=""`を設定しない限り)。したがって、*何もしない*ことは、Android 11以前のバージョンでタスクハイジャックに対してアプリを開いたままにします。
@ -40,12 +40,12 @@ android:launchMode="singleTask" >
</activity>
```
2. 悪意のあるアプリが一度起動され、タスク(偽のアフィニティを持つ)が最近のタスクに存在します。
3. ユーザーが後で本物のアプリケーションを開くと、Androidは**ルートアフィニティがパッケージと一致するタスク**がすでに存在することを見つけ、そのタスクをフォアグラウンドに持ってきます。
3. ユーザーが後で本物のアプリケーションを開くと、Androidは**ルートアフィニティがパッケージと一致する**タスクがすでに存在することを見つけ、そのタスクをフォアグラウンドに持ってきます。
4. 攻撃者のUIが最初に表示されます。
### デフォルトアフィニティ(`singleTask`なし)バリアント - コーラーIDケーススタディ
### デフォルトアフィニティ(`singleTask`なし)バリアント コーラーIDケーススタディ
**コーラーIDcaller.id.phone.number.block**アプリケーションで報告された脆弱性は、攻撃がデフォルトの`standard`起動モードに対しても*機能する*ことを示しています:
**コーラーID (caller.id.phone.number.block)** アプリケーションで報告された脆弱性は、攻撃がデフォルトの`standard`起動モードに対しても*機能する*ことを示しています:
1. 攻撃者アプリケーションは偽のルートアクティビティを作成し、すぐに自分自身を隠します:
```kotlin
@ -56,7 +56,7 @@ moveTaskToBack(true) // タスクを最近のものに保ちながら視界か
}
}
```
2. マニフェストは被害者のパッケージを`taskAffinity`にコピーするだけで済みます:
2. マニフェストは被害者のパッケージを`taskAffinity`にコピーするだけで済みます:
```xml
<activity android:name=".HackActivity"
android:exported="true"
@ -70,26 +70,65 @@ android:taskAffinity="com.caller.id.phone.number.block" >
3. ユーザーが悪意のあるアプリを**一度**インストールして開くと、被害者パッケージと等しいアフィニティを持つタスクが存在します(ただしバックグラウンドにあります)。
4. 本物のコーラーIDアプリケーションが起動されると、Androidはそのタスクを再利用し、`HackActivity`をフォアグラウンドに持ってきます → フィッシングウィンドウ/権限の悪用。
> 注:**Android 11API 30**以降、システムは*デフォルトで*同じUIDに属さない2つのパッケージを同じタスクに配置しないため、この特定のバリアントを軽減します。古いバージョンは依然として脆弱です。
> 注:**Android 11 (API 30)** 以降、システムはデフォルトで同じUIDの一部でない2つのパッケージを同じタスクに配置しないため、この特定のバリアントを軽減します。古いバージョンは依然として脆弱です。
---
### StrandHogg 2.0 (CVE-2020-0096) リフレクションベースのタスクハイジャック
Googleの2020年5月のセキュリティ速報は、**StrandHogg 2.0**と呼ばれるより高度なバリアントを修正しました。このエクスプロイトは**`taskAffinity`に全く依存せず**、代わりに*リフレクション*を使用して、*すべての*実行中のタスクの最上部に攻撃者のアクティビティを動的に挿入し、Android 11によって導入された「共有UID」制限を完全に回避します。
重要なポイント:
* ゼロ権限の悪意のあるアプリは、一度開かれると、実行中のタスクを反復処理し、隠されたAPIを呼び出して**自分のアクティビティを任意のタスクに再親子化**できます。
* アクティビティが実行時に挿入されるため、`launchMode`や静的マニフェスト分析では事前に攻撃を検出できません。
* **Android 8.0/8.1/9**2020年5月SPLにチェックをバックポートすることで修正されました。**Android 10以降は影響を受けません。**
パッチが適用されていないデバイスでの検出は、`adb shell dumpsys activity activities`を使用して、タスクの*アフィニティ*と異なるパッケージ名を持つ疑わしいアクティビティを監視することで行えます。
レガシーデバイスの軽減策は、クラシックなタスクハイジャックと同じで、**さらに**実行時検証(例:[`ActivityManager#getRunningTasks`](https://developer.android.com/reference/android/app/ActivityManager#getRunningTasks(int))を呼び出し、自分のパッケージ名を検証する)を行います。
---
## 検出と悪用チェックリスト
1. ターゲットAPKから`AndroidManifest.xml`を引き出し、各`<activity>`(またはグローバル`<application>`要素)が`android:taskAffinity=""`(空)**または**カスタマイズされた値を含んでいるか確認します。
2. そうでない場合、悪意のあるアプリを作成します:
- `android:taskAffinity` = 被害者パッケージ名。
- ユーザーが一度開けるように`MAIN/LAUNCHER`インテントを提供します。
- 必要に応じて、すぐに隠すために`moveTaskToBack(true)`を呼び出します。
3. 被害者に正当なアプリケーションを開かせる → ハイジャック。
1. **静的レビュー** ターゲットAPKから`AndroidManifest.xml`を引き出し、各`<activity>`(またはグローバル`<application>`要素)が`android:taskAffinity=""`(空)**または**カスタマイズされた値を含んでいることを確認します。ツールは次の通りです:
```bash
# apkanalyzerを使用してAndroid SDK
apkanalyzer manifest print app.apk | grep -i taskaffinity
## 緩和策
# AXMLPrinter2を使用して
java -jar AXMLPrinter2.jar AndroidManifest.xml | grep taskAffinity
```
2. **動的レビュー** デバイス上でターゲットアプリを開き、タスクをリストします:
```bash
adb shell dumpsys activity activities | grep -A3 "TASK" | grep -E "Root|affinity"
```
ルートアフィニティが被害者パッケージと等しいが、最上部のアクティビティが*異なる*パッケージに属しているタスクは赤信号です。
3. 上記のように悪意のあるアプリを作成するか、**[Drozer](https://github.com/WithSecureLabs/drozer)**を使用します:
```bash
drozer console connect
run app.activity.start --component com.victim/.MainActivity --action android.intent.action.MAIN
run app.activity.info com.victim
```
---
## 軽減策
開発者は以下を行うべきです:
* `<application>`レベルで`android:taskAffinity=""`を明示的に設定する(推奨)**または**各アクティビティにユニークでプライベートなアフィニティを与えます。
* 非常に敏感な画面に対しては、上記を`android:launchMode="singleInstance"`または現代の[`setLaunchMode`](https://developer.android.com/reference/android/content/pm/ActivityInfo#launchMode)保護と組み合わせます。
* アプリの`targetSdkVersion`をアップグレードし、タスクがデフォルトでパッケージ間で共有されない**Android 11**の動作変更を強制します。
* `<application>`レベルで`android:taskAffinity=""`を明示的に設定する(推奨)**または**各アクティビティにユニークでプライベートなアフィニティを与える。
* 非常に敏感な画面に対しては、上記を`android:launchMode="singleInstance"`または現代の[`setLaunchMode`](https://developer.android.com/reference/android/content/pm/ActivityInfo#launchMode)保護と組み合わせる。
* アプリの`targetSdkVersion`をアップグレードし、タスクがデフォルトでパッケージ間で共有されない**Android 11**の動作変更を強制する。
* **Android 12 (API 31) 以上**をターゲットにして、必須の`android:exported`属性が開発者にすべての外部到達可能なコンポーネントを監査させる。
* 実行時の自己防御を考慮する:定期的に`ActivityTaskManager`をクエリして、最上部のアクティビティのパッケージが自分のものであることを確認する。
---
## 関連するUIハイジャック技術
タスクハイジャックは、しばしば**タップジャッキング**オーバーレイベースのUI欺瞞と組み合わされるか、置き換えられます。2025年の**TapTrap**研究は、完全に透明な*アニメーション駆動*アクティビティがAndroid 1214で導入されたオーバーレイタッチ制限を回避し、ユーザーを危険な権限を付与するように騙すことができることを示しました。TapTrapは厳密には*タスク*ハイジャックではありませんが、最終的な目標(フィッシングクリック)は同じであるため、現代の評価では両方の攻撃面をチェックする必要があります。
---
@ -99,5 +138,7 @@ android:taskAffinity="com.caller.id.phone.number.block" >
- [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)
- [Promon StrandHogg 2.0 (CVE-2020-0096) technical write-up](https://promon.io/resources/downloads/strandhogg-2-0-new-serious-android-vulnerability)
- [USENIX 2025 TapTrap: Animation-Driven Tapjacking on Android](https://www.usenix.org/conference/usenixsecurity25/presentation/beer)
{{#include ../../banners/hacktricks-training.md}}