들어가기 앞서
이번 포스팅부터는 모바일 데이터 위·변조 목적 및 분석 도구로 사용되는 후킹 도구인 Frida를 탐지하는 방안과 우회 기법에 대해서 다뤄보도록 하겠다.
실습 진행에 사용되는 ANDITER 앱은 아래의 GitHub에서 다운로드 가능하다.
Frida란?
먼저 프리다(Frida)란, Ole에서 개발한 DB(Dynamic Binary Instrumentation) 프레임워크로 Windows, MacOS, Linux, Android, iOS 등의 다양한 플랫폼 기반의 네이티브(Native) 애플리케이션을 대상으로 메모리 인젝션 기능을 제공하는 파이썬(Python) 라이브러리이다. 대표적으로 모바일 플랫폼에서 많이 사용되며, 스크립트 작성 시 Js, C, Swift 언어에 대한 API를 지원한다. 또한, 오픈 소스 프로젝트로 여러 모바일 분석 도구들의 기반이 되었으며 잘 알려진 도구로는 MobSF, Drozer가 있다.
Frida의 기능으로는 실습에서 탐지를 우회하기 위해 사용했던 후킹 기능 외에도 디버그, 트래픽 스니핑, 암호 해독 등의 강력한 기능을 제공하고 있으며 루팅되지 않은 디바이스에서도 동작될 수 있도록 공유 라이브러리 Gadget을 지원한다.
Frida의 기능을 십분 활용한다면 보안적인 측면에서 모바일 취약점 진단 시 유용하게 사용될 수 있는 도구이다. 다만, 어렵지 않게 데이터 위·변조를 가능케해 공격자에게 있어서도 필수로 사용되는 도구이기도 하다. 사용자의 숙련도에 따라서, 활용도가 천지차이지만 잘 만들어진 Frida 코드는 대다수의 애플리케이션 보안 탐지 기법을 무력화 시킬 수 있으며 개발자가 의도한 정상적인 흐름을 벗어나 비정상 행위를 가능케 만든다. 일례로 유료 구독 서비스 이용과 게임 핵 제작 및 로그 정보 수집을 통한 데이터 탈취 등이 있다. 때문에 Frida는 루팅과 더불어 반드시 도구 사용자를 사전에 탐지하고 차단해야 한다.
개요
일반적으로 Frida의 구성은 명령어 입·출력을 처리하는 CLI 클라이언트 도구(Frida-Tools)와 해당 도구와 소켓 통신을 하며 사용자가 요청한 명령어를 수행하는 에이전트(Frida-Server)로 구성된다. CLI 클라이언트는 사용자의 로컬 PC에서 동작하고 에이전트는 모바일 디바이스 내에 설치되어 실행되는데 이때, 에이전트의 경우 실행 시 [그림 2]와 같이 /data/local/tmp/re.frida.server 디렉터리 내에 Frida에서 사용하는 모듈 및 소켓 파일을 생성한다.
Bypass File & Path 탐지 항목은 이러한 특징을 이용해 Frida 실행 시 자동으로 생성되는 관련 파일들이 디바이스에 존재하는 검사하고 파일 존재 시 Frida가 동작 중인 것으로 판단해 탐지하게 된다.
분석
[그림 4]의 isCheckFridaBinary() 함수는 Bypass File & Path 탐지 결과를 반환해주는 역할을 한다. 코드를 보면 ①에서 File 클래스를 사용해 /data/local/tmp 디렉터리 객체를 생성하고 maxDepath() 함수를 통해 깊이 2만큼의 하위 디렉터리 및 파일 정보를 가지고 온다. ②, ③에서는 ①에서 가지고 온 디렉터리 및 파일 이름에 Frida와 linjector 라는 문자열이 포함되어 있는지 검사하고 파일 존재 시 Frida 사용자로 탐지하게 된다.
Bypass File & Path 탐지를 우회하기 위한 후킹 포인트는 세 가지가 있다. 첫 번째는 함수 결과 상관없이 무조건 false를 반환하도록 isCheckFridaBinary() 함수를 재 작성하는 방법이고 두 번째는 File 클래스 객체 생성 시 전달되는 인자를 더미 값으로 변조하는 방법이다. 그리고 세 번째는 contains() 함수 사용 시 들어오는 비교 문자열의 매개 변수 값을 변조하는 방법이다. 여기서는 두 번째 방법과 권한 설정을 통해 탐지를 우회해 보는 방안을 다뤄보도록 하겠다.
우회 실습
[그림 4]는 File() 클래스 생성자를 후킹하기 위해 필자가 작성한 Frida 스크립트이다. 코드를 보면 ①에서 File 클래스 객체를 생성하고 isCheckFridaBinary() 함수에서 File 객체를 생성할 때 전달되는 인자의 데이터 타입에 맞춰 생성자를 오버로딩으로 구현했다. ②에서는 File 객체 생성 시 들어오는 매개 변수 값이 /data/local/tmp와 같다면 임의의 경로로 변조하고 변조한 값을 인자로 원본 File 클래스 객체를 생성해 결과 값을 반환하게 된다.
Frida를 통해 작성한 스크립트를 ADITER 애플리케이션에 어태치 한다. 그 후 Bypass File & Path 탐지 항목을 체크하면 Success! 가 출력되며 탐지가 우회된 것을 볼 수 있다.
추가적인 우회 기법
추가로 권한 설정을 통한 탐지 우회 방법도 다뤄보도록 하겠다. 디바이스에 설치된 모든 애플리케이션들은 각 자신만의 고유한 UID를 할당 받게 되고 실행 시 일반 사용자의 권한으로 동작하게 된다. 이는 애플리케이션 내에서 수행되는 코드 단의 권한도 동일해 디렉터리 및 파일 열람 시 일반 사용자 권한이 존재하지 않는다면 데이터를 읽어 올 수 없게 된다. Android OS 9.0 이하의 버전에서는 Java API를 이용한 방법을 통해 몇몇 디렉터리에 한해 권한 부여가 가능했었지만, Android OS 10.0 이후 버전부터는 Scoped Mode 개념이 도입되며, 이것 또한 불가능해졌다. 권한 설정을 통한 탐지 우회 방법은 이러한 방안을 착안해 우회하는 방법이다.
/data/local/tmp 디렉터리의 경우 모바일 분석 도구 및 기타 도구 이용 시 사용되는 디렉터리로 일반적으로 일반 사용자에게 읽기 권한이 제한되어 있다. 다만, 특정 도구 사용을 위해 해당 디렉터리에 읽기 및 쓰기 권한을 부여해야 할 경우가 생기는데 이 경우 애플리케이션에서 해당 디렉터리에 접근할 수 있게 된다. 따라서, 애플리케이션에서 탐지를 위해 디렉터리 정보를 읽어 올 때, 일반 사용자 읽기 권한을 제거하면 우회할 수 있게 된다.
chmod는 Linux/Unix 환경에서 파일 및 디렉터리 권한 변경에 사용되는 명령어로 ①에서 chmod를 통해 /data/local/tmp 디렉터리 권한을 771로 변경한다. ②를 보면 일반 사용자 권한의 읽기 및 쓰기 권한이 제거된 것을 볼 수 있다.
Bypass File & Path 탐지 항목을 체크하면 Success! 가 출력되며 탐지가 우회된 것을 볼 수 있다.
마무리
지금까지 Frida 개요와 Frida 실행 시 생성되는 파일 검사를 통한 Frida 탐지 방안과 또 이를 공격자의 관점에서 어떻게 우회할 수 있는지 살펴봤다. 다음 포스팅에서는 Frida 서버와 클라이언트가 통신 시 사용하는 포트를 검사하여 Frida를 탐지하는 방법과 우회 기법을 다뤄보도록 하겠다.
'안드로이드 탐지 및 우회 > Frida 탐지 및 우회' 카테고리의 다른 글
라이브러리 모듈 검사를 통한 Frida 탐지 방안과 우회 기법 (2) | 2023.08.31 |
---|---|
통신 포트 검사를 통한 Frida 탐지 방안과 우회 기법 (0) | 2023.08.21 |