앱 서버를 사용한 향상된 탈옥 탐지
향상된 탈옥 탐지 방법의 개요 및 필요성
Section titled “향상된 탈옥 탐지 방법의 개요 및 필요성”DoveRunner Mobile App Security SDK 내의 주요 기능 중 하나는 탈옥된 기기의 환경을 감지하고 앱을 강제로 종료하는 것입니다. 그러나 이러한 탐지 기능은 더 정교한 공격 방법에 의해 우회될 가능성이 있습니다. 이는 iOS 운영 체제의 특성상 앱이 실행될 때 로드된 동적 라이브러리(dylib)의 코드가 먼저 실행되기 때문입니다. 공격자는 이러한 동적 라이브러리에서 실행 파일의 특정 영역을 패치하는 코드를 배포할 수 있습니다.
이 코드 패치가 DoveRunner Mobile App Security의 탐지 로직이 실행되기 전에 발생하면 앱을 종료하는 코드가 제거되므로 탈옥이 감지되더라도 앱이 계속 실행됩니다.
물론 누구나 이런 유형의 공격을 쉽게 수행할 수 있는 것은 아니지만, 전문적인 해킹 지식을 가진 해커 그룹에 의해 이런 유형의 공격이 확인되었기 때문에 DoveRunner Mobile App Security는 이러한 공격 상황을 극복하기 위한 추가적인 탈옥 탐지 방법을 제공합니다.
이 공격 방법의 특징은 실행 중인 앱의 코드를 미리 변경하는 것이므로 DoveRunner Mobile App Security 라이브러리 자체에 아무리 강력한 탐지 로직을 추가하더라도 동적 라이브러리에 의해 코드가 패치되는 상황은 피할 수 없습니다. 따라서 새로 제공되는 탈옥 탐지 기능은 앱에서 탐지하는 것이 아니라 앱과 연결된 서버에서 탈옥이 의심되는 단말기의 경우 로그인이나 API 호출 수락 등 모든 서비스와 액션을 거부하는 방식입니다.
기본 방법은 DoveRunner Mobile App Security 인터페이스를 통해 앱에서 서버 자격 증명을 얻어서 기존 인증 매개변수에 추가하여 서버로 전송하는 것입니다.
이 방법은 서버와 연동하지 않는 클라이언트 전용 앱에는 적용할 수 없습니다.
다음 섹션에서는 서버 자격 증명을 얻고 검증하는 방법을 예제 코드와 함께 설명합니다.
iOS 앱 코드
Section titled “iOS 앱 코드”서버 자격 증명 문자열을 얻어 기존 인증 매개변수와 함께 서버로 전송하기 위해 DoveRunner Mobile App Security SDK에서 사용합니다.
서버와 연동하는 대부분의 앱은 사용자 인증 또는 로그인 프로세스를 거치며, 이 프로세스에서 사용자가 입력한 계정 정보가 서버로 전송됩니다. 서버로 전송하는 매개변수에 서버 자격 증명 문자열을 추가할 수 있습니다.
서버 자격 증명 문자열은 다음과 같은 방법으로 얻습니다:
Swift 프로젝트용 ‘ViewController.swift’에 넣을 간단한 UI 코드
func userLogin( userID: String, password: String ) -> Bool{ let inst: AppSealingInterface = AppSealingInterface(); let appSealingCredential = String.init( cString: inst._GetEncryptedCredential() ); // credential 값을 인증 정보와 함께 서버로 전송한다 let loginResult = processLogin( user: userID, pwd: password, credential: appSealingCredential ); // ... // ...}
Objective-C 프로젝트용 ‘ViewController.mm’에 넣을 간단한 UI 코드
- (BOOL)userLogin:(NSString*)userID withPassword:(NSString*)password{ char _appSealingCredential[290] = { 0, }; ObjC_GetEncryptedCredential( _appSealingCredential ); // credential 값을 인증 정보와 함께 서버로 전송한다 BOOL loginResult = processLogin( userID, password, _appSealingCredential ); // ... // ...}
서버가 자격 증명 검증에 실패하면 로그인도 실패하도록 하고 앱이 더 이상 진행되지 않도록 해야 합니다. 그러나 로그인 결과를 확인하고 앱을 종료하는 것과 같은 코드는 공격자에 의해 변조될 가능성이 높으므로 서버에서 자격 증명 검증에 실패한 후 해당 클라이언트의 모든 요청에 대해 서비스나 응답을 거부하도록 구성하는 것이 모범 사례입니다.
이는 다음 섹션에서 다시 논의됩니다.
앱 서버에서의 검증
Section titled “앱 서버에서의 검증”DoveRunner Mobile App Security 모듈에 대한 인터페이스 호출에서 반환된 자격 증명 데이터(16진 문자열)는 DoveRunner Mobile App Security 내부의 보안 로직이 정상적으로 수행되고 기기에서 위험한 상황이 감지되지 않을 때만 유효합니다.
동적 라이브러리를 통해 코드 패치 공격이 이루어지거나 다른 방법으로 보안 로직이 우회되면 유효한 자격 증명 데이터가 생성되지 않으므로 서버에서 이 값을 검증하여 기기의 공격 상황을 차단해야 합니다.
앱 서버는 클라이언트(앱)에서 전송한 자격 증명 값이 올바른지 확인해야 하며, 올바르지 않으면 인증(로그인)을 거부한 다음 해당 클라이언트가 요청하는 모든 서비스(API 호출)를 거부해야 합니다.
서버에서 자격 증명 데이터를 검증하려면 클라이언트에서 전송된 데이터를 복호화하는 AES 키와 IV, 그리고 비교 검증할 원본 자격 증명 데이터가 필요합니다.
이 모든 값은 ADC의 프로젝트에서 “자격 증명 확인” 버튼을 통해 얻을 수 있습니다. 여기에 표시된 16진 문자열을 복사하여 예제 코드에 붙여넣고 사용하면 됩니다. 먼저 아래 화면과 같이 ADC에 연결하고 프로젝트 상자에서 “자격 증명 확인” 버튼을 클릭합니다.
버튼을 클릭하면 다음 창이 표시되며, 여기서 자격 증명 값과 복호화에 사용할 IV 및 AES 키를 확인할 수 있습니다. 문자열 왼쪽의 복사 버튼을 사용하여 이 값을 그대로 복사하고 서버 측 검증 코드에 붙여넣어 사용할 수 있습니다.
버튼을 클릭하면 다음 창이 표시되며, 여기서 자격 증명 값과 복호화에 사용할 IV 및 AES 키를 확인할 수 있습니다. 문자열 왼쪽의 복사 버튼을 사용하여 이 값을 그대로 복사하고 서버 측 검증 코드에 붙여넣어 사용할 수 있습니다.
서버 구현 예제
Section titled “서버 구현 예제”다음 언어들에 대한 완전한 서버 구현 예제를 포함합니다:
- Java - AES 복호화를 포함한 완전한 구현
- ASP.NET/C# - 사용자 정의 AES CTR 모드 구현 포함
- Python - PyCrypto 라이브러리 사용
- Ruby - OpenSSL 라이브러리 사용
- C++ - AES 라이브러리를 사용한 네이티브 구현
이러한 언어의 완전한 서버 구현 예제는 다운로드와 함께 포함된 SDK 파일을 참조하세요:
appsealing_credential.java
appsealing_credential.cs
appsealing_credential.py
appsealing_credential.rb
appsealing_credential.cpp
각 구현은 동일한 패턴을 따릅니다:
- UTC 타임스탬프를 복호화하고 현재 시간에서 10초 이내인지 확인
- 복호화된 타임스탬프를 사용하여 보조 AES 키 생성
- 보조 키를 사용하여 자격 증명 데이터 복호화
- ADC 콘솔의 원본 자격 증명과 비교
중요: ADC 콘솔의 프로젝트 “자격 증명 확인” 기능에서 얻은 값으로 ORG_CREDENTIAL
, AES_IV
, AES_KEY
상수를 교체하세요.