From fd36012dc6c1af58ff4a65611fe15116d0642574 Mon Sep 17 00:00:00 2001 From: Translator Date: Wed, 23 Jul 2025 06:10:58 +0000 Subject: [PATCH] Translated ['src/mobile-pentesting/android-app-pentesting/android-task-h --- .../android-task-hijacking.md | 100 +++++++++++++----- 1 file changed, 75 insertions(+), 25 deletions(-) diff --git a/src/mobile-pentesting/android-app-pentesting/android-task-hijacking.md b/src/mobile-pentesting/android-app-pentesting/android-task-hijacking.md index 777032d53..b01943e3a 100644 --- a/src/mobile-pentesting/android-app-pentesting/android-task-hijacking.md +++ b/src/mobile-pentesting/android-app-pentesting/android-task-hijacking.md @@ -4,50 +4,100 @@ ## Завдання, стек назад та активності на передньому плані -В Android, **завдання** - це, по суті, набір активностей, з якими користувачі взаємодіють для виконання конкретної роботи, організованих у **стек назад**. Цей стек упорядковує активності на основі того, коли вони були відкриті, причому найновіша активність відображається вгорі як **активність на передньому плані**. У будь-який момент часу лише ця активність видима на екрані, що робить її частиною **завдання на передньому плані**. +У Android, **завдання** - це, по суті, набір активностей, з якими користувачі взаємодіють для виконання конкретної роботи, організованих у **стек назад**. Цей стек упорядковує активності на основі того, коли вони були відкриті, причому найновіша активність відображається вгорі як **активність на передньому плані**. У будь-який момент часу лише ця активність видима на екрані, що робить її частиною **завдання на передньому плані**. Ось швидкий огляд переходів між активностями: - **Активність 1** починається як єдина активність на передньому плані. - Запуск **Активності 2** переміщує **Активність 1** у стек назад, виводячи **Активність 2** на передній план. -- Запуск **Активності 3** переміщує **Активність 1** та **Активність 2** далі назад у стеці, з **Активністю 3** тепер попереду. -- Закриття **Активності 3** повертає **Активність 2** на передній план, демонструючи спрощений механізм навігації завданнями в Android. +- Запуск **Активності 3** переміщує **Активність 1** та **Активність 2** далі назад у стеку, з **Активністю 3** тепер попереду. +- Закриття **Активності 3** повертає **Активність 2** на передній план, демонструючи спрощений механізм навігації завдань Android. ![https://developer.android.com/images/fundamentals/diagram_backstack.png](<../../images/image (698).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 + + + + + + +``` +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 + + + + + + +``` +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 і перевірте, що кожна `` (або глобальний елемент ``) містить `android:taskAffinity=""` (порожній) **або** налаштоване значення. +2. Якщо ні, створіть шкідливий додаток: +- `android:taskAffinity` = назва пакета жертви. +- Надати намір `MAIN/LAUNCHER`, щоб користувач міг відкрити його один раз. +- За бажанням викликати `moveTaskToBack(true)`, щоб відразу сховати. +3. Дайте жертві відкрити їх легітимний додаток → захоплення. + +## Пом'якшення + +Розробники повинні: + +* Явно встановити `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}}