분석 정보/모바일 분석 정보

Dynamic Dex Loading을 이용하는 TrickMo

TACHYON & ISARC 2024. 12. 30. 15:46

최근 구글 크롬 앱으로 위장해 유포되는 악성 안드로이드 앱 TrickMo가 발견됐다. 해당 악성 앱은 잘못 구성된APK 파일, Dynamic Dex Loading APK 드롭 등을 이용해 분석을 방해하고 탐지를 회피할 수 있도록 설계됐다. 특히, Dynamic Dex Loading Dex 파일을 동적으로 로딩하는 기법으로 디컴파일 도구에서 원본 데이터에 접근할 수 없도록 한다. 또한, 앱의 리소스에서 실질적인 악성 동작을 수행할 TrickMo APK 데이터를 읽어와 설치하는 방식을 사용하며 최종 설치된 TrickMo는 공격자가 운영하는 C&C 서버에서 명령어를 수신 및 실행해 데이터 수집과 원격 제어 등의 동작을 수행한다.

 

1. 분석 방지 및 탐지 회피

1.1. 잘못 구성된 APK 파일

TrickMo악성 앱은 의도적으로 APK 파일의 구성을 변형시켜 압축 해제 및 정적 분석 툴이 정상적으로 기능할 수 없도록 해 분석을 방해한다. [그림 1]에서 APK 파일의 구성 요소인 “AndroidManifest.xml”, “classes.dex” “resources.arsc” 파일과 동일한 이름의 폴더가 존재하는 것을 확인할 수 있으며 압축 해제 시 폴더가 먼저 추출되고 동일한 이름의 파일이 추출될 때 폴더를 덮어쓸 수 없어 오류가 발생한다. 따라서, 오류가 발생하는 폴더를 제거한 후 APK 파일을 리패키징해 분석을 진행했다.

 

[그림  1]  잘못 구성된  APK  파일

 

1.2. Dynamic Dex Loading

일반적으로 안드로이드 앱이 실행되면 가장 먼저 진입점 액티비티부터 코드가 시작된다. 하지만 TrickMo Application 클래스를 이용한 Dynamic Dex Loading 방식을 사용해 진입점 액티비티가 포함된 Dex 파일을 동적으로 로드한다.

- 진입점 액티비티 : com.mem.installdropsession.InstallDropSession

 

[그림  2]  패키지 목록 및 진입점 액티비티

 

Application 클래스는 실행할 앱의 프로세스가 생성될 때 가장 먼저 인스턴스화되는 기본 클래스로 TrickMoAndroidManifest.xml 파일에 Application을 상속하는 하위 클래스의 이름을 정의하고 있으며 해당 하위 클래스에서 attachBaseContext()onCreate() 메서드가 재정의돼 사용되는 것을 확인할 수 있다.

- Applcation 상속 하위 클래스 : com.venture.nose.Jlawsuitfilter

 

[그림 3] Application 상속 클래스

 

재정의된 Application 클래스의 메서드는 안드로이드 OS에서 앱 실행 시 앱의 전역 상태를 초기화할 때 호출되며 [그림 4]의 애플리케이션 구동 순서에서 확인할 수 있다. 안드로이드 OS에서 앱을 실행하면 먼저 액티비티 매니저는 Zygote 프로세스에 앱을 실행시킬 ActivityThread의 생성을 요청한다. Zygote 프로세스가 ActivityThread를 생성하고 로드하면 해당 스레드는 attachApplciation() 메서드를 호출해 액티비티 매니저에 자기 자신의 등록을 요청하고 등록 과정에서 앱의 Application 클래스의 인스턴스를 생성한다. 이후, Application 클래스는 attachBaseContext()로 실행 컨텍스트를 설정하고 onCreate()로 앱을 시작한다.

- 액티비티 매니저 : 안드로이드 앱의 컴포넌트를 생성하고 생명주기를 관리하는 코어 플랫폼 서비스.

- Zygote 프로세스 : 안드로이드 OS에서 모든 시스템 및 앱 프로세스의 루트 역할을 하는 네이티브 프로세스.

- 컨텍스트(context) : 앱과 액티비티의 현재 상태 정보를 제공하는 추상 클래스.

- ActivityThread : 모든 안드로이드 앱의 메인 스레드로 액티비티 및 서비스의 생성 및 생명 주기를 관리하는 스레드.

 

 

[그림 4] 애플리케이션 구동 순서

 

[그림 3]에서 재정의된 메서드는 Assets에 저장된 Dex 파일을 복호화하고 진입점 액티비티인 InstallDropSession 클래스를 동적으로 로드한다, 이후, Application 클래스의 attach() 메서드를 이용해 로드된 클래스를 실행한다.

 


[그림  5] Dynamic Dex Loading

 

1.3. APK 드롭

동적으로 로드된 진입점 액티비티는 getAssets() 메서드를 이용해 리소스에 저장된 TrickMo APK 데이터를 읽어온 후 PackageInstaller로 앱을 설치한다.

 

[그림  6] APK  드롭 및 설치

 

 

2. TrickMo

TrickMo 앱이 실행되면 먼저 공격자가 운영하는 C&C 서버와 통신해 모델 정보, 빌드 버전 및 설정 정보 등의 기본 정보를 전송한다. 이후 화면 녹화, SMS 데이터 및 통화 기록 등의 민감한 데이터를 수집하고 [ 1]의 목록을 포함한 45개의 명령어를 서버로부터 수신해 추가 동작을 수행한다. , 분석 시점에서 서버가 응답하지 않아 추가 데이터 교환은 발생하지 않았다.

 

[표  1]  명령어 목록

 

또한, 접근성 서비스를 악용해 앱의 리소스 중 clicker.json 파일에 미리 정의된 자동화 작업을 수행한다. 해당 파일에는 알람, 업데이트 및 앱 설치/삭제 등의 이벤트가 발생했을 때의 주체가 되는 패키지 이름과 수행할 작업이 명시돼 있다. [그림 7]은 삼성 업데이트를 차단하는 작업의 예시로 Samsung Update LATER 이벤트에 대해서 자동으로 pressConfirm을 클릭한다.

 

[그림  7]  자동화 작업 실행 코드

 

TrickMo 뱅커는 잘못된 APK 구성, Dynamic Dex Loading APK 드롭 등의 방법을 이용해 주요 코드를 숨겨 분석을 방해한다. 더욱이, 사용자의 단말기에서 민감한 정보를 탈취하고 자동화 서비스를 악용해 다양한 작업을 수행할 수 있어 주의가 필요하다. 따라서 공식 스토어가 아닌 출처가 불분명한 앱의 설치를 지양하고 주기적으로 백신과 OS를 최신버전으로 업데이트 할 것을 권고한다.