🤛🏽

리버싱 툴 탐지 (예시. Frida)

리버스 엔지니어가 일반적으로 사용하는 툴, 프레임워크 및 앱의 존재는 앱을 리버스 엔지니어링하려는 시도를 나타낼 수 있다.
 
도구들 중 일부는 탈옥된 장치에서만 실행될 수 있고, 다른 도구들은 앱을 디버깅 모드로 만들거나 휴대 전화에서 백그라운드 서비스를 시작하는 것에 의존하는 등 다양하며, 따라서 앱이 리버스 엔지니어링 공격을 감지하여 스스로 종료하는 등의 반응을 하기 위해 구현할 수 있는 방법도 다양하다.
 

리버싱 툴 탐지 방법론

장치에 설치된 인기있는 리버싱 툴들은 과련된 앱 패키지, 파일, 프로세스와 아티팩트 등으로 찾을 수 있다.
(탐지를 우회하려고 수정된 도구가 아닌, 일반적으로 도구를 그냥 설치한 상태)
아티팩트 : 운영체제나 애플리케이션을 사용하면서 생성되는 흔적 (파일, 로그 등)
 
다음 예에서는 본 가이드와 실제 세계에서도 광범위하게 사용되는 Frida instrumentation 프레임워크를 검출하는 다양한 방법에 대해 논의한다. Cydia Substrate 또는 Cycript와 같은 다른 도구들도 유사하게 검출할 수 있으며, 이같은 injection, hooking 및 DBI(Dynamic Binary Instrumentation) 도구는 아래에서 설명하는 런타임 무결성 검사를 통해 암시적으로 탐지될 수 있음에 유의하자.
 

1. frida 탐지 - Jailbroken

예를 들어 탈옥 장치에서 frida를 설치하면 default 설정으로 frida-server라는 이름으로 돌아가고 있다.
여기서 frida-trace 혹은 Frida CLI를 통해 타겟 앱에 attach 하면 Frida는 frida-agent를 앱의 메모리에 inject하므로, 이 점을 이용하여 탐지에 활용할 수 있다.
 
1. 안드로이드 : /proc/<pid>/maps 메모리 맵핑 현황 확인
안드로이드는 꽤나 직관적이다. pid에 해당하는 메모리 맵핑 정보를 확인하고 frida 문자열을 grep 하면 된다
2. 아이폰 : _dyld_image_count 등의 함수 활용
아이폰은 proc 디렉토리를 이용할 수 없으므로, 대신에 로드된 동적 라이브러리 리스트 검사를 통해 식별한다.
 

2. frida 탐지 - Non-Jailbroken

Frida는 비탈옥 장치에서도 동작하는 소위 "embedded mode"라고 불리는 모드를 통해서도 동작 가능하다.
이 경우는 IPA에 frida-gadget를 포함시키며, 실행 시 하나의 네이티브 라이브러리로써 메모리에 올라오도록 강제한다.
 
어플리케이션의 정적 데이터, 실행 바이너리(ARM), 외부 라이브러리들은 <앱.app> 디렉토리 안에 저장된다.
ls -al 해보면 FridaGadget.dylib을 찾을 수 있다.
iPhone:/var/containers/Bundle/Application/AC5DC1FD-3420-42F3-8CB5-E9D77C4B287A/SwiftSecurity.app/Frameworks root# ls -alh total 87M drwxr-xr-x 10 _installd _installd 320 Nov 19 06:08 ./ drwxr-xr-x 11 _installd _installd 352 Nov 19 06:08 ../ -rw-r--r-- 1 _installd _installd 70M Nov 16 06:37 FridaGadget.dylib -rw-r--r-- 1 _installd _installd 3.8M Nov 16 06:37 libswiftCore.dylib -rw-r--r-- 1 _installd _installd 71K Nov 16 06:37 libswiftCoreFoundation.dylib -rw-r--r-- 1 _installd _installd 136K Nov 16 06:38 libswiftCoreGraphics.dylib -rw-r--r-- 1 _installd _installd 99K Nov 16 06:37 libswiftDarwin.dylib -rw-r--r-- 1 _installd _installd 189K Nov 16 06:37 libswiftDispatch.dylib -rw-r--r-- 1 _installd _installd 1.9M Nov 16 06:38 libswiftFoundation.dylib -rw-r--r-- 1 _installd _installd 76K Nov 16 06:37 libswiftObjectiveC.dylib
 
블랙박스 형식으로 "FridaGadget.dylib"을 필터링 하거나, 파일시스템 검사로 파일존재여부를 확인하면 된다.
 
벌써 느꼈을테지만 Frida를 탐지하는 것 뿐만아니라 관련 libraries 등을 탐지하는 것은 정말 쉬운 일이다.
하지만 이러한 탐지는 역시 우회 또한 정말 쉽게 가능하다.
툴 탐지는 이처럼 고양이와 쥐의 게임이고 상황은 훨씬 더 복잡해질 수 있다.
 

Frida 탐지 방법론

다음 표는 몇 가지 전형적인 프리다 검출 방법의 집합과 그 효과에 대한 짧은 논의를 간략히 제시한다.
 

1. 관련 아티팩트(흔적)이 있는지 환경 검사

아티팩트는 패키지 파일, 이진 파일, 라이브러리, 프로세스 및 임시 파일일 수 있다.
Frida의 경우
  • 탈옥된 타겟 시스템에서는 Frida-server (TCP를 통해 Frida를 노출시키는 데몬)
  • 앱에 의해 로드된 Frida 라이브러리일 수 있다. (FridaGadget.dylib) (탈옥, 비탈옥 둘 다 가능)
 
- iOS에서는 실행중인 서비스를 조사하는 것은 허용되지 않는다.
- Swift의 메소드인 CommandLine도 실행중인 프로세스의 정보를 얻기위한 쿼리는 사용할 수 없다.
- 비공식적인 방법으로 NSTask를 통해 정보를 얻어올 순 있으나, 앱스토어 리뷰에서 걸러진다.
- 이외에 실행 중인 프로세스에 쿼리하거나 시스템 명령을 실행하는 데 사용할 수 있는 다른 공용 API는 없다.
 
- 가능하다고 할 지라도 그냥 아티팩트와 관련 파일의 이름만 바꾸면 되는 등 아주 쉽게 우회가 가능할 것이다.
예시 : (frida-server/ frida-gadget/ frida-agent ⇒ 각각 다른 이름으로 변경)
 
- 다른 방법으로 Frida를 탐지해야하는데, 로드된 라이브러리 목록을 보고 수상한 점을 탐지하는 방법이 있다.
예시 : _dyld_get_image_name
 

2. 열린 TCP 포트를 확인한다.

frida-server 프로세스는 default로 TCP의 27042 포트로 연결된다.
따라서 27042 포트가 열렸는지 여부를 판단하여 서비스를 탐지할 수 있다.
[우회]
포트는 argument만 다르게 주어도 바꿀 수 있으므로, 포트 감지로 탐지한다는 점만 인지하게 된다면 정말 쉽게 우회가 가능하다.
 

3. D-Bus 인증에 응답하는 포트 확인

frida-server는 D-Bus 프로토콜을 사용하여 통신하므로 D-Bus AUTH에 응답할 것으로 기대할 수 있다.
따라서 모든 열린 포트D-BUS AUTH 메세지를 보내고 응답이 오는지 확인하자.
(응답이 온다면 frida-server로 추측 가능)
 
이 방법은 frida-server를 탐지하는 데 아주 아주 효과적인 방법이지만, Frida는 operation에 frida-server를 필요로 하지 않는 대안 모드도 제공하고 있다.
 

4. named pipes 검사 (이건 뭔 말이지?)

frida-server에서 외부와 통신하기 위해 사용하는 named pipes를 검사한다.
 
결론 : 위의 방식들도 절대 완벽한 방법은 아니다. 알고있다면 쉽게 우회가 가능한 방법들이며, 작정한 공격자를 절대 막을순 없다. 이러한 각 탐지 방법의 성공 여부는 탈옥 장치를 사용하는지, 탈옥의 구체적인 버전 및 방법 및/또는 도구 자체의 버전에 따라 결정된다는 점도 기억해야 하며, 결국 통제되지 않는 환경(최종 사용자의 장치)에서 처리되고 있는 데이터를 보호하는 고양이와 쥐 게임과 같다.
 

평가 및 검증

먼저 앱을 각종 리버싱 도구들로 열어보자.
적어도 대표적인 툴인 frida, Cydia Substrate, Cycript, SSL Kill Switch 등으로 열어봐라.
 
앱은 리버싱 도구의 발견 시 아래 방법들로 반응해야 한다.
  • 유저에게 알림 창을 띄우고 법적책임을 받아들일 건지 알린다.
  • 그냥 꺼버림으로써 실행을 막는다.
  • 티 안나게 바로 민감 정보와 데이터를 다 지운다.
  • 백엔드 서버에 보고한다. (이상 행위 탐지)
 
다음으로는 위 탐지 방법들을 다 우회해보고 아래 질문에 답하자.
  • 탐지 매커니즘은 쉽게 우회가 가능한가? (API 하나만 우회하면 되는 것 처럼)
  • 정적,동적 분석을 통해 안티 리버싱 코드를 식별하는데 얼마나 어려웠나?
  • defense를 해제하기 위해 커스텀 코드를 작성해야하는지? 그렇다면 시간은 어느정도 걸리는지?
  • 검수자의 개인적인 느낌으로 얼마나 어려웠나?
 
우회 방법
  • radare2/Cutter, Ghidra 등의 도구를 이용해 함수 수정, 원하지 않는 부분 NOP 처리 등 코드 패칭.
  • Frida, Cydia Substrate 등의 도구로 Native layers에 있는 file system APIs 후킹하기
    • ⇒ 결과 값을 수정된 파일로 반환하지 않고, original file로 보내기