본문 바로가기
Previous Research

안드로이드 루팅 탐지 및 우회 기법 연구 (2)

by _Jay_ 2021. 5. 17.
반응형

 

 

이전 글에서는 안드로이드 루팅에 대한 배경지식과 Java 레벨에서의 안드로이드 루팅 탐지 및 우회 기법에 대해 서술했습니다. 이번 글에서는 안드로이드에서 NDK(Native Development Kit)을 이용한 네이티브 레벨에서 루팅을 탐지하는 기법에 대해 소개해보죠.

 

지금 생각해보면 당연한 것이였는데 처음 연구를 했을 때는 이를 구현하고 엄청난 발견을 한 것 마냥 굉장히 들떴던 기억이 나는데요. 하지만 옛날로 다시 돌아가서 에뮬레이터를 통해 안드로이드 구조를 확인하고, 실제 안드로이드 디바이스를 루팅하고 성능을 확인하기 위한 과정을 다시 연구하라고 하면 할 수 있을지 모르겠습니다.

 

그래서 오늘 글에서는 루팅 탐지를 위한 전체적인 시스템에 대해 설명하고, 다음 글에서 이를 구현하여 그 당시의 기존 시스템과 성능을 비교한 결과에 대해 언급하도록 하겠습니다.

 

 

NDK를 이용한 안드로이드 루팅 탐지 모듈 시스템

 

Xposed 프레임워크를 통한 메소드 후킹 및 디컴파일이 가능하여 분석 및 우회가 쉬웠던 기존 Java 기반의 루팅 탐지 기법의 단점을 보완하기 위해, C/C++ 언어와 같은 네이티브 코드 기반의 안드로이드 루팅 탐지 기법을 이용하여 좀 더 정확한 탐지 시스템을 제안한다

 

NDK를 이용한 안드로이드 루팅 탐지 시스템은 에뮬레이터 탐지 프로세스와 실제 루팅 탐지 및 이를 우회하는 행위를 탐지하는 프로세스로 구성되어 있으며, 해당 시스템의 전체 프로세스는 아래의 그림과 같고 게임사 및 금융권 앱에서 해당 프로세스를 적용할 수 있다.

 

 

NDK를 통해 구현된 라이브러리인 SO(Shared Object)를 사용한 게임사 또는 금융권의 앱에서 루팅 탐지 프로세스가 실행되면, 첫 번째로 에뮬레이터 환경 탐지 모듈이 로드되어 동작한다. SO 파일의 경우 암호화되어 APK 내부에 존재하다가 실행 시 복호화되어 동작하거나, 금융권 및 게임사 서버에서 런타임에 다운로드 받아 실행시킬 수 있다.

 

에뮬레이터 환경 탐지 모듈에 의해 에뮬레이터로 판별되는 경우 탐지 모듈이 분석되는 것을 방지하기 위해 로드된 SO 파일을 삭제하고 앱을 종료한다. 실제 디바이스로 판단된 경우 다시 루팅 탐지 모듈을 로딩하여 루팅 탐지를 수행하고, 루팅된 디바이스인 경우 로드된 SO 파일을 삭제하여 앱을 종료시키고 루팅된 디바이스가 아닌 경우 본 서비스를 실행할 수 있도록 한다.

 

 

에뮬레이터 환경 탐지 모듈

 

일반적인 AVD(Android Virtual Device)와 BlueStack, Nox 같은 에뮬레이터의 경우 기본적으로 루팅이 되어 있는 상태이므로 ro.secure 및 ro.debuggable 등의 빌드 설정값을 통해 에뮬레이터 환경임을 알 수 있다.

 

제안한 시스템에서는 안드로이드 루팅 탐지를 수행하기 전에 에뮬레이터 탐지 모듈을 구동하여 실제 디바이스가 아닌 가상 환경에서의 동작을 사전에 차단할 수 있다. 더 나아가 에뮬레이터 탐지를 통해 게임사 및 금융권 앱이 가상 환경에서 동작하지 않도록 함으로써 이후 루팅 탐지 모듈 자체가 분석될 수 있는 가능성을 줄일 수 있다.

 

 

안드로이드 이미지를 구동시킬 수 있는 대표적인 3가지 가상 환경은 구글에서 제공하고 있는 QEMU 기반의 안드로이드 에뮬레이터인 AVD와 안드로이드를 인텔 CPU 기반에서 동작할 수 있도록 개발한 운영체제인 Andorid-x86, 미국에서 개발한 모바일 게임 전용 에뮬레이터인 BlueStack 등이 존재한다

 

표 2와 같이 실제 안드로이드 디바이스와 에뮬레이터에서의 빌드 설정값을 비교하여 에뮬레이터 환경임을 판별하였으며, 탐지 결과가 실제 디바이스가 아니라고 판단하는 경우 에뮬레이터 탐지 모듈을 삭제한 뒤 앱을 종료한다.

 

 

루팅 탐지 모듈

 

제안한 시스템에서의 루팅 탐지 모듈은 에뮬레이터 탐지 모듈과 마찬가지로 안드로이드의 NDK를 통해 C언어 기반으로 구현된다.

 

루팅 탐지 모듈에서는 아래의 표 3과 같이 SU 관련 프로세스의 실행 여부 및 다양한 파일 및 디렉토리에서의 키워드 기반 탐지, 원터치 루팅 앱 관련 파일 탐지, 루트 권한이 필요한 앱을 탐지하는 방법 등을 사용한다.

 

 

SU 관련 프로세스의 실행 여부를 탐지하는 방법은 리눅스의 ps 명령어를 통해 수행하며, 안드로이드 4.4 버전 이후에서는 SU 바이너리의 동작을 위해 커널에서 수행하는 daemonsu 프로세스가 필요하다. 이를 기반으로 daemonsu 프로세스의 실행 여부를 탐지 요소에 추가하고, SuperSU, kingroot 등 루트 권한을 사용하는 앱과 Xposed 프레임워크의 RootCloak 등 루팅 탐지를 우회하는 앱의 프로세스 실행 여부 또한 추가하였다.

 

루팅과 관련된 키워드 기반의 탐지 방법은 안드로이드 운영체제의 다양한 명령어를 통해 확인할 수 있다. 예를 들어 안드로이드 패키지 매니저인 pm 명령어로 설치된 앱의 패키징 명 리스트를 활용하거나, ls 명령어를 통해 /system/app 디렉토리에 파일 존재 여부를 확인할 수 있다. 이를 위해 사용되는 키워드는 안드로이드에서 루트 권한과 관련된 키워드 및 루팅 원터치 앱과 관련된 키워드, 루트 권한을 요구하는 앱과 관련된 키워드로 구성된다.

 

루팅 앱 관련 파일을 탐지하는 방법은 루팅 앱의 설치 여부를 기반으로 루팅 앱이 실행되면서 생성하는 다양한 파일 및 디렉토리의 존재 유무로 확인할 수 있다. 루팅 원터치 앱이 동작하면서 생성하는 임시 파일 및 설정 파일 등을 탐지 요소에 추가하였다. 루트 권한이 필요한 앱 탐지 방법의 경우 루트 권한을 필요로 하는 앱의 설치 유무를 기반으로 확인이 가능하다. 제안한 시스템에서는 구글 플레이 스토어에서 다운로드 수를 기준으로 루트 권한이 필요한 앱 중 보편적으로 사용하는 앱을 선정하여 패키지 명을 탐지 요소에 추가하였다.

 

 

반응형

댓글