본문 바로가기
4. 모바일 앱 취약점 진단/iOS

[iOS] 1.3. 디바이스 임의 개조 탐지 취약점

by Robert8478 2024. 6. 19.

점검 방법

iOS 단말기 또한 Android와 비슷하게 앱 접근 시 탈옥 탐지 로직이 구현되어 앱 접근이 정상적으로 되지 않으면 양호한 것으로 본다.

iOS 단말기의 경우 보통 탈옥 탐지 로직이 존재하면 우회하기가 Android에 비해 어렵다.

탈옥 탐지 로직이 존재할 경우 아래의 2가지 방식을 통해 우회를 할 수 있다.

 

1. 디컴파일러를 통한 우회

Ghidra, IDA 등의 툴을 활용하여 탈옥 탐지 로직을 확인하고 해당 함수의 분기 위치를 확인해서 함수 인자값을 반대로 변경하여 우회할 수 있다.

이처럼 Jailbroken과 같은 문자열을 검색하면 탈옥 탐지 코드를 확인할 수 있다.

해당 함수를 확인하고 나면 탈옥 탐지 부분으로 분기되는 함수 위치를 확인하고 인자 값을 변조하면 우회가 가능할 수 있다. 보통 이 방법은 쉽지 않으므로 2번째 방법인 Frida를 주로 이용한다.

 

2. Frida를 사용한 우회

Frida는 기본적으로 안드로이드와 우회 방법이 유사하지만 Frida Script 코드의 수정이 필요할 수 있다. Frida CodeShare에 가면 기본적으로 탈옥 탐지 우회가 가능한 코드가 공개되어 있다.

Frida CodeShare Jalibreak Bypass - https://codeshare.frida.re/@liangxiaoyi1024/ios-jailbreak-detection-bypass/

코드를 보면 iOS도 마찬가지로 /bin/su, /bin/bash 등을 포함하여 iOS 탈옥 시 발견되는 파일인 /Applications/Cydia 등의 파일을 우회하는 것을 확인할 수 있다.

 

대응 방안

1. File-based Checking

탈옥 관련 파일에는 /Applications/Cydia.app, /bin/bash, /usr/sbin/frida-server 등이 존재하는데

이러한 파일의 존재 여부를 확인하는 방식으로 진행한다.

 

2. /private 디렉터리 권한 확인

※ Swift

do {
    let pathToFileInRestrictedDirectory = "/private/jailbreak.txt"
    try "This is a test.".write(toFile: pathToFileInRestrictedDirectory, atomically: true, encoding: String.Encoding.utf8)
    try FileManager.default.removeItem(atPath: pathToFileInRestrictedDirectory)
    // 탈옥된 디바이스입니다. 출력
} catch {
    // 정상 디바이스입니다. 출력
}

※ Objective-C

NSError *error;
NSString *stringToBeWritten = @"This is a test.";
[stringToBeWritten writeToFile:@"/private/jailbreak.txt" atomically:YES
         encoding:NSUTF8StringEncoding error:&error];
if(error==nil){
    // 탈옥된 디바이스입니다. 출력
   return YES;
} else {
    // 정상 디바이스입니다. 출력
   [[NSFileManager defaultManager] removeItemAtPath:@"/private/jailbreak.txt" error:nil];
}

 

위 코드와 같이 /private 디렉터리의 권한을 Check하여 탈옥 여부를 검증할 수 있다.

 

3. 프로토콜 핸들러 확인 로직 추가

※ Swift

if let url = URL(string: "cydia://package/com.example.package"), UIApplication.shared.canOpenURL(url) {
    // 탈옥된 디바이스입니다. 출력
}

※ Objective-C

if([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"cydia://package/com.example.package"]]){
    // 탈옥된 디바이스입니다. 출력
}

프로토콜 핸들러를 확인하는 로직을 추가하여 대응하는 방안도 존재한다.