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
3fcca29c9e
commit
619016f2cc
@ -4,13 +4,13 @@
|
||||
|
||||
## Görev, Geri Yığın ve Ön Planda Olan Aktiviteler
|
||||
|
||||
Android'de, bir **görev**, kullanıcıların belirli bir işi tamamlamak için etkileşimde bulunduğu aktivitelerin bir setidir ve bir **geri yığın** içinde organize edilir. Bu yığın, aktiviteleri açıldıkları zamana göre sıralar; en son açılan aktivite en üstte **ön planda olan aktivite** olarak görüntülenir. Her an, yalnızca bu aktivite ekranda görünür ve bu da onu **ön planda görev** haline getirir.
|
||||
Android'de bir **görev**, kullanıcıların belirli bir işi tamamlamak için etkileşimde bulunduğu aktivitelerin bir setidir ve bir **geri yığın** içinde organize edilmiştir. Bu yığın, aktiviteleri açıldıkları zamana göre sıralar; en son açılan aktivite en üstte **ön planda olan aktivite** olarak görüntülenir. Her an, yalnızca bu aktivite ekranda görünür ve bu nedenle **ön planda olan görev**'in bir parçasıdır.
|
||||
|
||||
Aktivite geçişlerinin hızlı bir özeti:
|
||||
|
||||
- **Aktivite 1**, ön planda tek aktivite olarak başlar.
|
||||
- **Aktivite 2**'yi başlatmak, **Aktivite 1**'i geri yığına iterek **Aktivite 2**'yi ön plana getirir.
|
||||
- **Aktivite 3**'ü başlatmak, **Aktivite 1** ve **Aktivite 2**'yi yığında daha geriye taşır, **Aktivite 3** şimdi ön plandadır.
|
||||
- **Aktivite 3**'ü başlatmak, **Aktivite 1** ve **Aktivite 2**'yi yığında daha geriye taşır; **Aktivite 3** artık ön plandadır.
|
||||
- **Aktivite 3**'ü kapatmak, **Aktivite 2**'yi tekrar ön plana getirir ve Android'in akıcı görev navigasyon mekanizmasını sergiler.
|
||||
|
||||
.png>)
|
||||
@ -19,15 +19,15 @@ Aktivite geçişlerinin hızlı bir özeti:
|
||||
|
||||
## Görev yakınlığı saldırıları
|
||||
|
||||
`taskAffinity`, Android'e bir `Activity`'nin hangi göreve *ait olmayı tercih ettiğini* söyler. İki aktivite aynı yakınlığa sahip olduğunda, **Android bunları farklı APK'lerden gelseler bile aynı geri yığında birleştirmeye izin verir**.
|
||||
`taskAffinity`, Android'e bir `Activity`'nin hangi göreve *tercih ettiğini* söyler. İki aktivite aynı yakınlığa sahip olduğunda, **Android bunları farklı APK'lerden gelse bile aynı geri yığında birleştirmeye izin verir**.
|
||||
|
||||
Eğer bir saldırgan, o yığının **köküne** kötü niyetli bir aktivite yerleştirebilirse, kurban meşru uygulamayı her açtığında, kullanıcıya ilk olarak kötü niyetli arayüz gösterilecektir – bu, kimlik avı veya kötüye kullanım izin talepleri için mükemmeldir.
|
||||
|
||||
Saldırı yüzeyi, birçok geliştiricinin düşündüğünden daha geniştir çünkü **her aktivite otomatik olarak uygulama paket adıyla eşit bir yakınlık miras alır** (geliştirici `android:taskAffinity=""` ayarlamadıkça). Bu nedenle *hiçbir şey yapmamak*, uygulamayı Android 11 öncesi sürümlerde görev ele geçirmeye açık bırakır.
|
||||
Saldırı yüzeyi, birçok geliştiricinin düşündüğünden daha geniştir çünkü **her aktivite otomatik olarak uygulama paket adıyla eşit bir yakınlık miras alır** (geliştirici `android:taskAffinity=""` ayarlamadığı sürece). Bu nedenle *hiçbir şey yapmamak*, Android 11'den önceki sürümlerde uygulamanın görev ele geçirmeye açık kalmasına neden olur.
|
||||
|
||||
### Klasik "singleTask / StrandHogg" senaryosu
|
||||
|
||||
1. Saldırgan bir aktiviteyi şu şekilde tanımlar:
|
||||
1. Saldırgan, aşağıdaki gibi bir aktivite tanımlar:
|
||||
```xml
|
||||
<activity android:name=".EvilActivity"
|
||||
android:exported="true"
|
||||
@ -39,7 +39,7 @@ android:launchMode="singleTask" >
|
||||
</intent-filter>
|
||||
</activity>
|
||||
```
|
||||
2. Kötü niyetli uygulama bir kez başlatılır, böylece (sahte yakınlığa sahip) görev son görevler arasında var olur.
|
||||
2. Kötü niyetli uygulama bir kez başlatılır, böylece (sahte yakınlığa sahip) görev son görevler içinde var olur.
|
||||
3. Kullanıcı daha sonra gerçek uygulamayı açtığında, Android zaten kök yakınlığı paketiyle eşleşen bir görev bulur ve o görevi ön plana getirir.
|
||||
4. Saldırganın arayüzü ilk olarak gösterilir.
|
||||
|
||||
@ -52,7 +52,7 @@ android:launchMode="singleTask" >
|
||||
class HackActivity : AppCompatActivity() {
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
moveTaskToBack(true) // görevi görünmez ama son görevler arasında tut
|
||||
moveTaskToBack(true) // görevi son görevlerde tut ama görünmez yap
|
||||
}
|
||||
}
|
||||
```
|
||||
@ -70,26 +70,65 @@ android:taskAffinity="com.caller.id.phone.number.block" >
|
||||
3. Kullanıcı kötü niyetli uygulamayı **bir kez** yükleyip açtığında, kurban paketine eşit bir yakınlığa sahip bir görev var olur (ama arka planda kalır).
|
||||
4. Gerçek Arayan Kimliği uygulaması başlatıldığında, Android o görevi yeniden kullanır ve `HackActivity`'yi ön plana getirir → kimlik avı penceresi/izin kötüye kullanımı.
|
||||
|
||||
> NOT: **Android 11 (API 30)** ile birlikte sistem, varsayılan olarak aynı UID'nin parçası olmayan iki paketi aynı göreve yerleştirmez, bu da bu belirli varyantı azaltır. Eski sürümler hala savunmasızdır.
|
||||
> NOT: **Android 11 (API 30)** ile birlikte sistem, varsayılan olarak aynı UID'nin parçası olmayan iki paketi aynı göreve yerleştirmez, bu belirli varyantı azaltır. Eski sürümler hala savunmasızdır.
|
||||
|
||||
---
|
||||
|
||||
### StrandHogg 2.0 (CVE-2020-0096) – Yansıma tabanlı görev ele geçirme
|
||||
|
||||
Google’ın Mayıs 2020 güvenlik bülteni, **StrandHogg 2.0** olarak adlandırılan daha gelişmiş bir varyantı düzeltmiştir. Sömürü, **hiçbir şekilde `taskAffinity`'ye dayanmaz**; bunun yerine, saldırganın aktivitesini *her* çalışan görevin en üstüne dinamik olarak eklemek için *yansıma* kullanır ve Android 11 tarafından tanıtılan “paylaşılan-UID” kısıtlamasını tamamen atlar.
|
||||
|
||||
Ana noktalar:
|
||||
|
||||
* Sıfır izinli kötü niyetli bir uygulama, açıldığında çalışan görevler üzerinde yineleme yapabilir ve kendi aktivitesini herhangi bir göreve **yeniden ebeveyn** yapmak için gizli API'leri çağırabilir.
|
||||
* Aktivite çalışma zamanından sonra eklendiği için, ne `launchMode` ne de statik manifest analizi saldırıyı önceden tespit edebilir.
|
||||
* **Android 8.0/8.1/9**'a bir kontrol ekleyerek yamanmıştır (Mayıs 2020 SPL). **Android 10 ve sonrası etkilenmez.**
|
||||
|
||||
Yamanmamış cihazlarda tespit, `adb shell dumpsys activity activities` ile gerçekleştirilebilir ve görevlerin *yakınlığı* ile paket adı farklı olan şüpheli aktiviteleri izleyerek yapılabilir.
|
||||
|
||||
Eski cihazlar için azaltma, klasik Görev Ele Geçirme ile aynıdır **artı** çalışma zamanı doğrulaması (örneğin, [`ActivityManager#getRunningTasks`](https://developer.android.com/reference/android/app/ActivityManager#getRunningTasks(int)) çağrısı yaparak ve kendi paket adınızı doğrulayarak).
|
||||
|
||||
---
|
||||
|
||||
## Tespit & Sömürü kontrol listesi
|
||||
|
||||
1. Hedef APK'den `AndroidManifest.xml` dosyasını çekin ve her `<activity>` (veya global `<application>` öğesi) için `android:taskAffinity=""` (boş) **veya** özelleştirilmiş bir değer içerip içermediğini kontrol edin.
|
||||
2. Eğer değilse, kötü niyetli bir uygulama oluşturun:
|
||||
- `android:taskAffinity` = kurban paket adı.
|
||||
- Kullanıcının bir kez açabilmesi için bir `MAIN/LAUNCHER` niyeti sağlayın.
|
||||
- İsteğe bağlı olarak hemen gizlemek için `moveTaskToBack(true)` çağrısı yapın.
|
||||
3. Kurbanın meşru uygulamasını açmasına izin verin → ele geçirme.
|
||||
1. **Statik inceleme** – Hedef APK'dan `AndroidManifest.xml` dosyasını çekin ve her `<activity>` (veya global `<application>` öğesi) için `android:taskAffinity=""` (boş) **veya** özelleştirilmiş bir değer içerip içermediğini kontrol edin. Araçlar şunlardır:
|
||||
```bash
|
||||
# apkanalyzer (Android SDK) kullanarak
|
||||
apkanalyzer manifest print app.apk | grep -i taskaffinity
|
||||
|
||||
# AXMLPrinter2 kullanarak
|
||||
java -jar AXMLPrinter2.jar AndroidManifest.xml | grep taskAffinity
|
||||
```
|
||||
2. **Dinamik inceleme** – Cihazda hedef uygulamayı açın ve görevleri listeleyin:
|
||||
```bash
|
||||
adb shell dumpsys activity activities | grep -A3 "TASK" | grep -E "Root|affinity"
|
||||
```
|
||||
Kök yakınlığı kurban paketine eşit olan ancak en üstteki aktivitesi *farklı* bir pakete ait olan bir görev, bir kırmızı bayraktır.
|
||||
3. Yukarıda açıklandığı gibi kötü niyetli bir uygulama oluşturun veya **[Drozer](https://github.com/WithSecureLabs/drozer)** kullanın:
|
||||
```bash
|
||||
drozer console connect
|
||||
run app.activity.start --component com.victim/.MainActivity --action android.intent.action.MAIN
|
||||
run app.activity.info com.victim
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Azaltma
|
||||
|
||||
Geliştiriciler şunları yapmalıdır:
|
||||
|
||||
* `<application>` seviyesinde `android:taskAffinity=""` açıkça ayarlamak (önerilir) **veya** her aktiviteye benzersiz, özel bir yakınlık vermek.
|
||||
* `<application>` seviyesinde `android:taskAffinity=""`'yi açıkça ayarlamak (önerilir) **veya** her aktiviteye benzersiz, özel bir yakınlık vermek.
|
||||
* Son derece hassas ekranlar için, yukarıdakileri `android:launchMode="singleInstance"` veya modern [`setLaunchMode`](https://developer.android.com/reference/android/content/pm/ActivityInfo#launchMode) korumaları ile birleştirin.
|
||||
* Uygulamanın `targetSdkVersion`'ını yükseltin ve görevlerin varsayılan olarak paketler arasında paylaşılmadığı **Android 11** davranış değişikliklerini zorlayın.
|
||||
* **Android 12 (API 31) veya daha yüksek** hedefleyin, böylece zorunlu `android:exported` niteliği geliştiricilerin her dışa erişilebilir bileşeni denetlemesini zorlar.
|
||||
* Çalışma zamanı kendini savunma düşünün: periyodik olarak `ActivityTaskManager`'ı sorgulayarak en üstteki aktivitenizin paketinin kendi paketinizle eşleştiğinden emin olun.
|
||||
|
||||
---
|
||||
|
||||
## İlgili UI-Ele Geçirme teknikleri
|
||||
|
||||
Görev ele geçirme genellikle **tapjacking** (overlay tabanlı UI aldatması) ile birleştirilir veya onunla değiştirilir. 2025 **TapTrap** araştırması, tamamen şeffaf *animasyon destekli* aktivitelerin Android 12–14'te tanıtılan overlay dokunma kısıtlamalarını aşabileceğini ve kullanıcıları tehlikeli izinler vermeye ikna edebileceğini göstermiştir. TapTrap kesinlikle *görev* ele geçirme olmasa da, nihai hedef (kimlik avı tıklamaları) aynıdır – bu nedenle modern değerlendirmeler her iki saldırı yüzeyini de kontrol etmelidir.
|
||||
|
||||
---
|
||||
|
||||
@ -99,5 +138,7 @@ Geliştiriciler şunları yapmalıdır:
|
||||
- [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}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user