가. 탈옥(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강 - 진단 도구 설치
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강 - 진단 도구 설치
바. 탈옥 탐지 우회 실습
[Mobile App 취약점 진단/iOS App 진단] - [iOS App 진단] 12강 - 탈옥 탐지 우회(실습1)
[Mobile App 취약점 진단/iOS App 진단] - [iOS App 진단] 12강 - 탈옥 탐지 우회(실습 2)
[Mobile App 취약점 진단/iOS App 진단] - [iOS App 진단] 12강 - 탈옥 탐지 우회(실습3)
사. 참고 사이트
https://www.trustwave.com/en-us/resources/blogs/spiderlabs-blog/jailbreak-detection-methods/
'Mobile App 취약점 진단 · 모의해킹 > iOS App 취약점 진단 · 모의해킹' 카테고리의 다른 글
[iOS App 진단] 12강 - 탈옥 탐지 우회(실습1) (0) | 2023.10.15 |
---|---|
iOS 애플리케이션 무결성 점검 및 대응 방법(앱 위변조 대응) (0) | 2023.10.07 |
프리다(Frida) 문법 및 후킹에 사용되는 함수 설명 (0) | 2023.10.03 |
바이너리 ASLR 적용유무 확인방법 - otool (0) | 2023.10.03 |
[iOS App 진단] 11강 - 애플리케이션 패칭(앱 위·변조) 실습 4 (0) | 2023.09.10 |