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

This commit is contained in:
Translator 2025-07-30 08:13:13 +00:00
parent 0680be2a38
commit 42d5911ebf

View File

@ -4,7 +4,7 @@
## 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**.
U Androidu, **task** je suštinski 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:
@ -19,9 +19,9 @@ Evo brzog pregleda prelaza između aktivnosti:
## Task affinity attacks
`taskAffinity` govori Androidu kojoj grupi zadataka 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**.
`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 zlonamernu aktivnost na **root** tog stoga, svaki put kada žrtva otvori legitimnu aplikaciju, zlonameran UI će biti prva stvar koju korisnik vidi savršeno za phishing ili zlostavljanje zahteva za dozvolama.
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.
@ -39,7 +39,7 @@ android:launchMode="singleTask" >
</intent-filter>
</activity>
```
2. Zlonamerna aplikacija se pokreće jednom kako bi zadatak (sa lažnim afinitetom) postojao u nedavnim zadacima.
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 čiji **root afinitet odgovara paketu** i jednostavno dovodi taj zadatak u foreground.
4. UI napadača se prikazuje prvi.
@ -52,7 +52,7 @@ Ranljivost prijavljena u aplikaciji **Caller ID (caller.id.phone.number.block)**
class HackActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
moveTaskToBack(true) // keep the task in recents but out of sight
moveTaskToBack(true) // drži zadatak u nedavnim, ali van vidokruga
}
}
```
@ -67,29 +67,68 @@ android:taskAffinity="com.caller.id.phone.number.block" >
</intent-filter>
</activity>
```
3. Čim korisnik instalira i otvori zlonamernu aplikaciju **jednom**, zadatak čiji afinitet odgovara paketu žrtve postoji (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.
3. Čim korisnik instalira i otvori zloćudnu aplikaciju **jednom**, postoji zadatak čiji afinitet odgovara paketu žrtve (ali se nalazi u pozadini).
4. Kada se pokrene prava Caller ID aplikacija, 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-a 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 unapred ispravljenim uređajima 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. Izvucite `AndroidManifest.xml` iz ciljanog APK-a i proverite da svaka `<activity>` (ili globalni `<application>` element) sadrži `android:taskAffinity=""` (prazno) **ili** prilagođenu vrednost.
2. Ako ne, kreirajte zlonamernu aplikaciju:
- `android:taskAffinity` = ime paketa žrtve.
- Pružite `MAIN/LAUNCHER` intent kako bi korisnik mogao da je otvori jednom.
- Opcionalno pozovite `moveTaskToBack(true)` da se odmah sakrije.
3. Neka žrtva otvori svoju legitimnu aplikaciju → hijack.
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 čiji 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 u ponašanju gde se zadaci po defaultu ne dele između paketa.
* Za visoko 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 osigurate 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 iz 2025. **TapTrap** pokazalo je da potpuno prozirne *animacije vođene* aktivnosti 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.
---
@ -99,5 +138,7 @@ Programeri bi trebali:
- [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}}