아이폰·아이패드·iOS 취약점진단/모의해킹 무료 강의
가. 로컬 인증 우회 취약점이란?
1. 로컬 인증(Local Authentication) 정의
- 로컬인증(Local Authentication)은 디바이스 내부에 저장된 *자격증명을 기준으로 사용자를 인증하는 것을 말한다.
* 자격증명: 암호, 지문(Touch ID), 얼굴(Face ID) 등
- 로컬 인증을 앱에서 사용하기 위해 로컬 인증 프레임워크를 사용하여야 한다.
2. 로컬 인증 프레임워크(LocalAuthentication.framework) 정의
- 생체인식(Touch ID/Face ID) 또는 설정한 암호를 사용하여 사용자를 인증한다.
- 보안을 위해 앱은 인증 데이터인 지문 등에 접근할 수 없으며, 인증성공 여부만 확인이 가능하다.
- 프레임워크는 Secure Enclave에게 인증하려는 이유를 알려주는 메시지을 제공해 주고, 인증 성공 또는 실패를 나타내는 bool 결과를 받게 된다.
3. 로컬 인증 프레임워크 취약점
- 로컬 인증 프레임워크를 사용하면 애플에서 제공하는 LAContext 클래스의 evaluatePolicy 인스턴스 메소드를 사용하게 된다.
- evaluatePolicy 인스턴스 메소드는 성공 또는 실패를 나타내는 Boolean만 반환하기 때문에 쉽게 우회가 가능하다.
※ 앱은 로컬인증에서 회신하여주는 bool 값으로 인증여부를 판단하기 때문에, 로컬인증을 우회만으로 취약점을 말하기는 어렵다. 대신 디버깅 탐지, 탈옥 탐지, 무결성 검증을 하지 않았을 경우 이러한 문제가 발생할 수 있다고 예시를 들어줄 수는 있다.
나. 대응방법
- 아래의 글을 참고하여 탈옥 된 디바이스 실행 및 디버깅을 이용한 런타임 조작이 불가능하도록 디버깅 방지 기능을 적용한다.
[Mobile App 취약점 진단/iOS App 진단] - [iOS App 진단] 12강 - 탈옥 탐지 우회(이론 및 대응방법)
- 아래의 글을 참고하여 바이너리 파일이 변조되었을 경우 앱이 실행이 안되도록 한다.
[Mobile App 취약점 진단/iOS App 진단] - [iOS App 진단] 11강 - 애플리케이션 패칭(앱 위·변조) 실습 1
다. DVIA-v2 앱을 통한 실습
1. Touch ID 등록
- 실습을 위해 디바이스에 Touch ID를 등록한다.
※ 만약 암호가 설정되어 있지 않다면 반드시 '암호 켜기'를 클릭하여 암호를 등록해 주어야 한다.
2. 분석 대상 앱 설치 및 실행
- 실습을 위해 DVIA-v2 앱을 설치한다.
※ DVIA-v2 어플이 설치되어있지 않은 사람은 아래의 글을 참고하여 앱을 설치하길 바란다.
2022.07.01 - [Mobile App 취약점 진단/iOS App 진단] - [iOS App 진단] 04강 - 진단 대상 설치
- 메인메뉴 좌측 상단 메뉴 클릭 → 'Touch/Face ID Bypass' 클릭 → 'START CHALLENGE' 클릭
- 화면 우측 "Swift Implementation", "Objective-C implementation"의 지문모양을 클릭한다.
- 지문인식 화면이 출력되며, 지문을 등록한 손가락이 아닌 다른 손가락으로 인증을 시도하면 인증실패 화면이 출력된다.
- 본글에서는 지문을 등록한 손가락이 아닌 다른 손가락으로 인증을 시도해도 인증이 성공하도록 해볼 것이다.
※ 만약 '암호 켜기', '지문 등록'을 모두 수행하였는데도 불구하고 아래와 같은 *오류가 계속 발생한다면 앱을 재실행하면 된다.
*오류 : Touch ID not available, Your device doesn't support Touch ID or you haven't configured Touch ID authentication on your device.
3. 프리다 코드 작성
- 아래의 링크에 접속하여 로컬인증을 우회하는 코드를 복사한 뒤 자바스크립트(javascript) 파일로 만든다.
- 파일 명 : hagsig_touchid.js
* 메모장에 아래의 코드를 입력한 뒤 확장자명을 .js로 저장하면 자바스크립트 파일이 만들어진다.
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]);
const appCallback = block.implementation;
block.implementation = function (error, value) {
const result = appCallback(1, null);
return result;
};
},
});
} else {
console.log("Objective-C Runtime is not available!");
}
4. 로컬인증 우회 시도
- PC의 프리다 클라이언트를 이용하여 탈옥탐지 기능을 우회하고자 하는 앱의 이름을 알아낸다.
- 명령어 : frida-ps -Ua
* 앱의 이름 : DVIA-v2
frida-ps -Ua
- PC의 프리다 클라이언트를 이용하여 위에서 작성한 코드를 실행한다.
- 명령어 : frida -U -l [코드경로] [바이너리 파일 이름]
frida -U -l hagsig_touch.js DVIA-v2
- 화면 우측 "Swift Implementation", "Objective-C implementation"의 지문모양을 클릭한다.
- 지문인식 화면이 출력되며, 지문을 등록한 손가락이 아닌 다른 손가락으로 인증을 시도하면 인증성공 화면이 출력된다.
※ 인증 실패 화면이 출력되어도 계속해서 인증을 시도하면 성공했다는 알림이 출력된다.
라. 참고 URL
- evaluatePolicy 인스턴스 메소드에 관한 애플 공식 문서
evaluatePolicy(_:localizedReason:회신:) | Apple 개발자 문서
- 로컬 인증 프레임워크에 관한 애플 공식 문서
https://developer.apple.com/documentation/localauthentication/
'Mobile App 취약점 진단 · 모의해킹 > iOS App 취약점 진단 · 모의해킹' 카테고리의 다른 글
[iOS 취약점 진단] 16강 - Web View 종류 및 취약점 (0) | 2023.11.04 |
---|---|
스마트폰 와이어샤크 네트워크 패킷 캡처 방법 정리 (0) | 2023.11.03 |
[iOS 취약점 진단] 14강 - IPC 취약점(URL Schemes) (0) | 2023.10.27 |
[iOS App 진단] 13강 - 런타임 조작(무차별대입공격)_실습4 (0) | 2023.10.20 |
[iOS App 진단] 13강 - 런타임 조작(로그인/인증 우회)_실습3 (0) | 2023.10.20 |