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 33bc232cb..0d24de735 100644 --- a/src/mobile-pentesting/android-app-pentesting/android-task-hijacking.md +++ b/src/mobile-pentesting/android-app-pentesting/android-task-hijacking.md @@ -2,52 +2,102 @@ {{#include ../../banners/hacktricks-training.md}} -## 작업, 백 스택 및 포그라운드 활동 +## Task, Back Stack and Foreground Activities -Android에서 **작업**은 사용자가 특정 작업을 완료하기 위해 상호작용하는 활동의 집합으로, **백 스택** 내에 조직됩니다. 이 스택은 활동이 열린 순서에 따라 정렬되며, 가장 최근의 활동이 가장 위에 표시되어 **포그라운드 활동**이 됩니다. 언제든지 이 활동만 화면에 표시되어 **포그라운드 작업**의 일부가 됩니다. +안드로이드에서 **task**는 사용자가 특정 작업을 완료하기 위해 상호작용하는 활동의 집합으로, **back stack** 내에 조직됩니다. 이 스택은 활동이 열린 순서에 따라 정렬되며, 가장 최근의 활동이 **foreground activity**로 화면 상단에 표시됩니다. 언제든지 이 활동만 화면에 보이므로 **foreground task**의 일부가 됩니다. -활동 전환에 대한 간단한 설명은 다음과 같습니다: +활동 전환에 대한 간단한 요약은 다음과 같습니다: -- **활동 1**은 포그라운드에서 유일한 활동으로 시작됩니다. -- **활동 2**를 시작하면 **활동 1**이 백 스택으로 밀려나고, **활동 2**가 포그라운드로 옵니다. -- **활동 3**을 시작하면 **활동 1**과 **활동 2**가 스택에서 더 뒤로 밀려나고, **활동 3**이 앞에 오게 됩니다. -- **활동 3**을 닫으면 **활동 2**가 다시 포그라운드로 돌아와 Android의 간소화된 작업 탐색 메커니즘을 보여줍니다. +- **Activity 1**은 foreground에서 유일한 활동으로 시작됩니다. +- **Activity 2**를 시작하면 **Activity 1**이 back stack으로 밀려나고, **Activity 2**가 foreground로 올라옵니다. +- **Activity 3**을 시작하면 **Activity 1**과 **Activity 2**가 스택에서 더 뒤로 밀리고, **Activity 3**이 이제 앞에 위치합니다. +- **Activity 3**을 닫으면 **Activity 2**가 다시 foreground로 돌아와 안드로이드의 간소화된 작업 탐색 메커니즘을 보여줍니다. ![https://developer.android.com/images/fundamentals/diagram_backstack.png](<../../images/image (698).png>) -## 작업 친화성 공격 +--- -### 작업 친화성 및 시작 모드 개요 +## Task affinity attacks -Android 애플리케이션에서 **작업 친화성**은 활동의 선호 작업을 지정하며, 일반적으로 앱의 패키지 이름과 일치합니다. 이 설정은 공격을 시연하기 위한 개념 증명(PoC) 앱을 만드는 데 중요합니다. +`taskAffinity`는 안드로이드에 `Activity`가 *선호하는* 작업을 알려줍니다. 두 활동이 동일한 affinity를 공유할 경우 **안드로이드는 서로 다른 APK에서 온 경우에도 동일한 back-stack 내에서 이를 병합할 수 있습니다**. -### 시작 모드 +공격자가 그 스택의 **root**에 악성 활동을 배치할 수 있다면, 피해자가 합법적인 애플리케이션을 열 때마다 악성 UI가 사용자가 가장 먼저 보는 것이 됩니다 – 피싱이나 악용 권한 요청에 완벽합니다. -`launchMode` 속성은 작업 내에서 활동 인스턴스의 처리를 지시합니다. **singleTask** 모드는 이 공격에 중요한 역할을 하며, 기존 활동 인스턴스와 작업 친화성 일치에 따라 세 가지 시나리오를 지시합니다. 이 익스플로잇은 공격자의 앱이 대상 앱의 작업 친화성을 모방할 수 있는 능력에 의존하여, Android 시스템이 의도된 대상을 대신하여 공격자의 앱을 시작하도록 오도합니다. +공격 표면은 많은 개발자들이 생각하는 것보다 넓습니다. 왜냐하면 **모든 활동은 자동으로 애플리케이션 패키지 이름과 동일한 affinity를 상속받기 때문입니다** (개발자가 `android:taskAffinity=""`를 설정하지 않는 한). 따라서 *아무것도 하지 않는 것*만으로도 안드로이드 11 이전 버전에서 작업 하이재킹에 노출됩니다. -### 상세 공격 단계 +### Classic "singleTask / StrandHogg" scenario -1. **악성 앱 설치**: 피해자가 공격자의 앱을 자신의 장치에 설치합니다. -2. **초기 활성화**: 피해자가 처음으로 악성 앱을 열어 공격을 위한 장치를 설정합니다. -3. **대상 앱 실행 시도**: 피해자가 대상 앱을 열려고 시도합니다. -4. **하이재킹 실행**: 어느 시점에서 앱이 **singleTask** 뷰를 열려고 합니다. 일치하는 작업 친화성으로 인해 악성 앱이 대상 앱 대신 실행됩니다. -5. **기만**: 악성 앱이 대상 앱과 유사한 가짜 로그인 화면을 표시하여 사용자가 민감한 정보를 입력하도록 속입니다. +1. 공격자는 다음과 같이 활동을 선언합니다: +```xml + + + + + + +``` +2. 악성 앱이 한 번 시작되어 (스푸핑된 affinity를 가진) 작업이 최근 작업에 존재하게 됩니다. +3. 사용자가 나중에 실제 애플리케이션을 열면, 안드로이드는 이미 **root affinity가 패키지와 일치하는 작업**이 있음을 찾아 그 작업을 foreground로 가져옵니다. +4. 공격자의 UI가 먼저 표시됩니다. -> [!TIP] -> 이 공격이 작동하려면 취약한 뷰가 **exported to true**일 필요는 없으며, 메인 활동일 필요도 없습니다. +### Default–Affinity (no `singleTask`) variant – Caller ID case study -이 공격의 실용적인 구현에 대해서는 GitHub의 Task Hijacking Strandhogg 리포지토리를 참조하십시오: [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. 사용자가 악성 앱을 **한 번** 설치하고 열면, 피해자 패키지와 동일한 affinity를 가진 작업이 존재하게 됩니다 (하지만 백그라운드에 위치). +4. 실제 Caller ID 애플리케이션이 실행되면, 안드로이드는 그 작업을 재사용하고 `HackActivity`를 foreground로 가져옵니다 → 피싱 창/권한 남용. -이러한 공격을 방지하기 위해 개발자는 다음을 수행할 수 있습니다: -- **`**taskAffinity`**를 **singleTask** 뷰에 대해 빈 문자열로 설정 (`android:taskAffinity=""`) -- **`singleInstance`** 시작 모드를 선택하여 자신의 앱이 다른 앱과 격리되도록 합니다. -- **`onBackPressed()`** 함수를 사용자 정의하여 작업 하이재킹에 대한 추가 보호를 제공합니다. +> NOTE: **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) +## Detection & Exploitation checklist + +1. 대상 APK에서 `AndroidManifest.xml`을 가져와 각 `` (또는 전역 `` 요소)가 `android:taskAffinity=""` (비어 있음) **또는** 사용자 정의 값을 포함하는지 확인합니다. +2. 그렇지 않은 경우, 악성 앱을 제작합니다: +- `android:taskAffinity` = 피해자 패키지 이름. +- 사용자가 한 번 열 수 있도록 `MAIN/LAUNCHER` 인텐트를 제공합니다. +- 선택적으로 즉시 숨기기 위해 `moveTaskToBack(true)`를 호출합니다. +3. 피해자가 합법적인 애플리케이션을 열도록 합니다 → 하이재킹. + +## Mitigation + +개발자는 다음을 수행해야 합니다: + +* `` 수준에서 `android:taskAffinity=""`를 명시적으로 설정합니다 (권장) **또는** 각 활동에 고유하고 개인적인 affinity를 부여합니다. +* 매우 민감한 화면의 경우, 위의 내용을 `android:launchMode="singleInstance"` 또는 현대적인 [`setLaunchMode`](https://developer.android.com/reference/android/content/pm/ActivityInfo#launchMode) 보호와 결합합니다. +* 앱의 `targetSdkVersion`을 업그레이드하고 기본적으로 패키지 간에 작업이 공유되지 않는 **Android 11** 동작 변경 사항을 적용합니다. + +--- + +## 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) {{#include ../../banners/hacktricks-training.md}}