본문으로 바로가기

가. 탈옥(Jailbreak) 이란?

iOS의 샌드박스 제한을 풀어 서명되지 않은 코드를 실행할 수 있게 하는 것을 말함.

 

나. 탈옥된 기기에서 앱 실행을 차단해야하는 이유

탈옥된 기기에서의 사용자는 최고 권한을 얻기때문에 앱(App)을 분해하여 정밀분석할 수 있고, 분석한 내용을 토대로 보안기능을 우회할 수 있음.

보안기능이 우회될 경우 기기에 저장된 사용자 개인정보부터 시스템의 접근 권한까지 획득할 수 있음.

때문에 탈옥된 기기에서는 반드시 앱이 실행되지 않도록 탈옥 여부를 탐지하여야함.

또한 리버스 엔지니어링을 통해 탈옥 탐지 기능을 우회할 수 있으므로 쉽게 탈옥탐지 기능을 우회하지 못하도록 리버스 엔지니어링 방어 기능을 추가해야함.

 

다. 탈옥 탐지 방법(Jailbreak Detection) 

1. 파일기반 체크(File-based Checks)

- 파일 또는 디렉터리 존재여부로 탈옥 여부를 판단하는 방법.

- 탈옥되지 않은 기기에서는 존재할 수 없는 파일 또는 디렉터리이기 때문.

- 아래의 파일 또는 디렉터리가 존재하는지 확인하고, 존재한다면 탈옥된 기기라고 판단.

 

※ 파일기반 탈옥 탐지 체크리스트

/private/var/stash /usr/sbin/sshd
/private/var/lib/apt /usr/libexec/ssh-keysign
/private/var/tmp/cydia.log /usr/sbin/sshd
/private/var/lib/cydia /usr/bin/sshd
/private/var/mobile/Library/SBSettings/Themes /usr/libexec/sftp-server
/Library/MobileSubstrate/MobileSubstrate.dylib /etc/ssh/sshd_config
/Library/MobileSubstrate/DynamicLibraries/Veency.plist /etc/apt
/Library/MobileSubstrate/DynamicLibraries/LiveClock.plist /Applications/Cydia.app
/System/Library/LaunchDaemons/com.ikey.bbot.plist /Applications/RockApp.app
/System/Library/LaunchDaemons/com.saurik.Cydia.Startup.plist /Applications/Icy.app
/var/cache/apt /Applications/WinterBoard.app
/var/lib/apt /Applications/SBSettings.app
/var/lib/cydia /Applications/MxTube.app
/var/log/syslog /Applications/IntelliScreen.app
/var/tmp/cydia.log /Applications/FakeCarrier.app
/bin/bash /Applications/blackra1n.app
/bin/sh  

 

2. 파일 권한 기반 체크(Checking File Peremissions)

- Application 샌드박스 외부의 위치에 파일 생성을 시도하는 것으로 탈옥 여부를 판단하는 방법.
- 탈옥된 기기가 아니라면 Application이 샌드박스 외부에 파일을 생성하는 것은 불가능하기 때문.

- /private 디렉터리에 파일을 생성하도록 하여 성공적으로 생성된다면 디바이스가 탈옥된 것으로 판단.

 

※ 파일 권한 기반 탈옥 탐지 샘플 소스

NSError *error;
NSString *stringToBeWritten = @"This is a test.";
[stringToBeWritten writeToFile:@"/private/jailbreak.txt" atomically:YES encoding:NSUTF8StringEncoding error:&error];

if(error==nil)
{
	//Device is jailbroken
	return YES;
} 
else 
{
	//Device is not jailbroken
	[[NSFileManager defaultManager] removeItemAtPath:@"/private/jailbreak.txt" error:nil];
}

 

3. 프로토콜 핸들러 기반 체크(Checking Protocol Handlers)

- 프로토콜 핸들러 사용여부를 기반으로 탈옥 여부를 판단하는 방법.

- 프로토콜 핸들러란 특별한 URL을 처리하는 프로그램으로 "cydia://설치할 패키지 이름"과 같이 사용할 수 있다.

- 탈옥된 기기에 거의 모두 설치되어 있는 cydia 앱을 이용한 프로토콜 핸들러가 가능할 경우 탈옥된 기기라 판단.

 

※ 프로토콜 핸들러 기반 체크 샘플 소스

if([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"cydia://package/com.example.package"]])
{
	//Device is jailbroken
	return YES;
}
else
{
	//Device is not jailbroken
	return No;
}

 

4. 시스템 API 호출 기반 체크(Calling System APIs)

- 시스템 API를 호출하는 것으로 탈옥 여부를 판단하는 방법.

 

※ 시스템 API 호출 기반 체크 예시
- 탈옥된 기기에서만 system() 함수를 통해 /bin/sh에 접근할 수 있음.

- NULL을 인수로 system() 함수를 호출하면 0이 반환되고, 탈옥된 기기에서는 1이 반환됨.

 

5. OpenSSH 서비스 기반 체크(OpenSSH Service Detection)

- OpenSSH 서비스가 동작중인지를 확인하는 것으로 탈옥 여부를 판단하는 방법.

- 탈옥되지 않은 기기에서는 OpenSSH 서비스를 실행할 수 없기때문.

- SSH 연결 시간이 초과될때까지 기다려야하므로 이 탐지 기법은 매우 느릴 수 있음.

- OpenSSH 서비스용 포트를 변경하여 해당 탐지기법을 쉽게 우회할 수 있으므로 추천하지 않음.

 

라. 디버깅 방지 방법(Anti debugging)

위와 같은 방법을 통해 탈옥탐지 기술을 적용하더라도 프리다와 같은 디버깅 툴을 이용하여 탈옥탐지 기능을 우회할 수 있음.
디버깅 툴을 이용한 탈옥탐지 기능 우회를 방지하기 위해 아래와 같은 안티 디버깅 기능을 적용.


1.ptrace함수를 이용하여 디버거 연결 방지

- ptrace는 프로세스 디버깅에 사용되는 함수로, 프로세스 실행을 관찰 및 제어하고 메모리와 레지스터를 검사하고 변경할 수 있는 수단을 제공한다.
- ptrace 함수의 PT_DENY_ATTACH 옵션을 사용하여 디버거가 앱에 연결되는 것을 방지할 수 있음.
- 공식 iOS API가 아니므로 App Store 등록 심사에서 거부당할 수 있으므로, 코드에서 직접 호출하지 않고 dlsym을 통해 ptrace 함수 포인터를 가져와 호출하는 방식으로 사용.

 

※ ptrace 함수의 PT_DENY_ATTACH 옵션을 이용한 샘플 소스

#import <dlfcn.h>
#import <sys/types.h>
#import <stdio.h>
typedef int (*ptrace_ptr_t)(int _request, pid_t _pid, caddr_t _addr, int _data);
void anti_debug() {
ptrace_ptr_t ptrace_ptr = (ptrace_ptr_t)dlsym(RTLD_SELF, "ptrace");
ptrace_ptr(31, 0, 0, 0); // PTRACE_DENY_ATTACH = 31
}

* 위 코드가 적용되었는데 디버거가 연결될 경우 "Process OOO exited with status = 45 (0x0000002d)"와 같은 오류 메시지가 출력된다.

 

2.sysctl 함수를 이용한 연결된 디버거 탐지

- sysctl은 시스템 정보를 가져오거나 설정할 수 있게 해주는 함수임.

-  sysctl함수를 이용하여 디버거 프로세스가 올라오면 이를 탐지하고 앱을 종료시킬 수 있음.
- P_TRACED 플래그가 활성화되면 디버깅이라고 판단.

※ 코드 예시

#include <assert.h>
#include <stdbool.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/sysctl.h>

static bool AmIBeingDebugged(void){
int junk;
int mib[4];
struct kinfo_proc info;
size_t size;

info.kp_proc.p_flag = 0;

mib[0] = CTL_KERN;
mib[1] = KERN_PROC;
mib[2] = KERN_PROC_PID;
mib[3] = getpid();

size = sizeof(info);
junk = sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, NULL, 0);
assert( junk == 0);

return ( (info.kp_proc.p_flag & P_TRACED) != 0 ); }

 

3.프리다 아티팩트(Artefacts)를 통한 디버거 탐지

- 프리다가 설치 또는 동작하면서 생성한 파일, 서비스 포트 등을 검사하여 디버거를 탐지하는 방법,
- 프리다 서버 프로세스는 기본적으로 TCP 27047 포트를 사용하므로 해당 포트가 열려 있는지 확인.
- 프리다 관련 로드된 라이브러리 목록 탐지 (frida-gadget*.so / frida-agent*.so 등)
- 디버깅에 사용되는 파일 검사 (frida-server 등)
- D-Bus 프로토콜을 사용하여 통신하므로 열린 모든 포트에 D-Bus AUTH 메시지를 전송하여 응답 확인

 

마. 탈옥 탐지 우회 방법(Jailbreak Detection Bypass)

탈옥 탐지 우회는 두 단계로 나눠서 진행됨.
step1). Ghidra 도구로 탈옥 탐지 로직 파악.
step2). 파악된 로직을 기드라(Ghidra) 또는 프리다(FRIDA)를 이용하여 탈옥 탐지 기능 우회.

 

1. 기드라(Ghidra)

- 미국 국가 안보국(NSA)에서 자바로 개발한 디스어셈블러 프레임워크.
- 리버스 엔지니어링 시장에서 유명한 IDA Pro를 대신하여 사용할 수 있는 무료 오픈소스 도구.

 

기드라 설치 방법은 아래의 글을 참고.

2022.06.28 - [Mobile App 취약점 진단/iOS App 진단] - [iOS App 진단] 03강 - 진단 도구 설치

 

[iOS App 진단] 03강 - 진단 도구 설치

1. Cydia(시디아) - 탈옥을 성공하면 자동으로 설치되며, 앱 스토어에서 지원하지 않는 앱을 다운로드할 수 있다. - iOS가 지원하지 못하는 기능을 Cydia를 이용하여 설치할 수 있는데 이를 Tweak(트윅)

hagsig.tistory.com

 

 

2. 프리다(FRIDA)

- DBI(Dynamic Binary Instrumentation) 프레임 워크로 무료 오픈소스 도구.
- 다양한 플랫폼에서 프로세스에 대한 인젝션이 가능해 큰 확장성을 가짐.
- 윈도우(Windows), 맥(MAC)OS, GNU/Linux, iOS, Android 및 QNX에서 자바스크립트를 네이티브 앱에 삽입 가능.

 

※ Instrumentation이란?

앱이 실행 중인 상태에서 코드 명령어를 삽입해 프로세스를 추적, 분석, 디버깅하는 도구.

FRIDA 특징
- Scriptable (스크립트 가능) 
• 사용자 정의 스크립트를 Black-box 프로세스에 주입하여 사용자 정의 디버깅 로직을 실행 가능
• 소스 코드가 없어도 암호화 API를 감시하거나 애플리케이션 코드를 추적할 수 있음

 

- Multi-platform (멀티 플랫폼) 
• 윈도우, 맥OS, GNU/Linux, iOS, Android 및 QNX에서 작동

 

- Battle-tested 
• 종합적인 test-suite를 가지고 있고 광범위한 사용 사례에서 수년간의 엄격한 테스트를 거침

 

- Free and open-source (무료 및 오픈소스) 
• 프리다는 항상 무료 소프트웨어

 FRIDA 주요 기능
- AppMon과 Needle 등의 도구에서 프리다를 기반으로 사용
• AppMon : 맥OS, Ios 및 Android에서 기본 앱의 시스템 API 호출을 모니터링하고 변경하는 자동화된 프레임워크
• Needle : iOS 앱의 보안 평가 프로세스를 간소화하는 오픈 소스 모듈식 프레임워크로 안드로이드 드로저와 비슷

 

- 함수 후킹 (특정 함수에 연결하여 반환 값 변경, 함수 재작성 등)
- 애플리케이션 디버깅 가능
- 힙 메모리 내 객체 인스턴스 검색 및 사용
- 실시간 트래픽 스니핑 또는 암호 해독
- 탈옥 또는 루팅되지 않은 단말기에서도 사용 가능

 

프리다 설치 방법은 아래의 게시글 참고.

2022.06.28 - [Mobile App 취약점 진단/iOS App 진단] - [iOS App 진단] 03강 - 진단 도구 설치

 

[iOS App 진단] 03강 - 진단 도구 설치

1. Cydia(시디아) - 탈옥을 성공하면 자동으로 설치되며, 앱 스토어에서 지원하지 않는 앱을 다운로드할 수 있다. - iOS가 지원하지 못하는 기능을 Cydia를 이용하여 설치할 수 있는데 이를 Tweak(트윅)

hagsig.tistory.com

 

바. 탈옥 탐지 우회 실습

[Mobile App 취약점 진단/iOS App 진단] - [iOS App 진단] 12강 - 탈옥 탐지 우회(실습1)

 

[iOS App 진단] 12강 - 탈옥 탐지 우회(실습1)

가. 탈옥(Jailbreak) 이란? - iOS의 샌드박스 제한을 풀어 서명되지 않은 코드를 모바일 디바이스에서 실행되게 하도록 하는 것을 말함. - 탈옥된 기기에서의 사용자는 최고 권한을 얻기 때문에 앱(App

hagsig.tistory.com

[Mobile App 취약점 진단/iOS App 진단] - [iOS App 진단] 12강 - 탈옥 탐지 우회(실습 2)

 

[iOS App 진단] 12강 - 탈옥 탐지 우회(실습 2)

가. 탈옥(Jailbreak) 이란? - iOS의 샌드박스 제한을 풀어 서명되지 않은 코드를 모바일 디바이스에서 실행되게 하도록 하는 것을 말함. - 탈옥된 기기에서의 사용자는 최고 권한을 얻기 때문에 앱(App

hagsig.tistory.com

[Mobile App 취약점 진단/iOS App 진단] - [iOS App 진단] 12강 - 탈옥 탐지 우회(실습3)

 

[iOS App 진단] 12강 - 탈옥 탐지 우회(실습3)

가. 탈옥(Jailbreak) 이란? - iOS의 샌드박스 제한을 풀어 서명되지 않은 코드를 모바일 디바이스에서 실행되게 하도록 하는 것을 말함. - 탈옥된 기기에서의 사용자는 최고 권한을 얻기 때문에 앱(App

hagsig.tistory.com

 

사. 참고 사이트

https://www.trustwave.com/en-us/resources/blogs/spiderlabs-blog/jailbreak-detection-methods/

 

Jailbreak Detection Methods

This post concludes our three-part series about mobile security. Today's post will outline some options for detecting jailbroken devices, should you choose to do so. Yesterday, we asked whether blocking an app's execution on jailbroken devices was worth it

www.trustwave.com