목 차
안티 디버깅(Anti-Debugging)
앱 안티 디버깅은 특정 모바일 앱의 디버깅을 감지하고 방지하기 위한 기술 및 메커니즘의 사용을 의미합니다. 앱을 디버깅하면 실행 중 동작을 분석하고 이해할 수 있으므로 문제 해결, 테스트 및 리버스 엔지니어링 목적에 도움이 될 수 있습니다. 그러나 공격자가 앱의 코드와 동작을 분석하여 취약성을 발견하거나 중요한 데이터를 훔치거나 익스플로잇을 개발하는 데 사용할 수도 있습니다.
앱 디버깅을 방지하기 위해 앱 개발자는 코드 난독화, 함수 포인터 조작, 중단점 감지 및 제어 흐름 난독화와 같은 다양한 디버깅 방지 기술을 구현할 수 있습니다. 이러한 기술은 공격자가 앱의 코드와 동작을 이해하기 어렵게 만들 수 있으므로 성공적인 공격을 개발하는 데 필요한 시간과 노력이 증가합니다.
모바일 앱 개발에 사용되는 몇 가지 일반적인 안티 디버깅 기술에는 디버거 또는 디버거 관련 시스템 기능의 존재 여부 확인, 디버깅이 감지될 때 충돌 또는 예측할 수 없는 동작을 유발하도록 앱 코드 수정, 민감한 코드 및 데이터 암호화 등이 포함됩니다. 리버스 엔지니어링이 더 어렵습니다.
앱 안티 디버깅은 모바일 앱의 보안을 강화하는 데 도움이 될 수 있지만 어떤 단일 기술도 완벽하지 않으며 숙련된 공격자가 고급 방법을 사용하여 우회할 수 있다는 점에 유의해야 합니다. 따라서 앱 개발자는 모바일 앱의 보안을 보장하기 위해 코드 검토, 위협 모델링 및 보안 코딩 관행과 같은 여러 계층의 보안 조치를 구현해야 합니다.
안티 디버깅 코드
// sysctl() 함수를 통해 현재 프로세스에 대한 정보를 검색 하고 attach를 했다면 P_TRACED 플래그가 설정
func isDebuggerAttached() -> Bool {
var info = kinfo_proc()
var mib : [Int32] = [CTL_KERN, KERN_PROC, KERN_PROC_PID, getpid()]
var size = MemoryLayout.stride(ofValue: info)
let junk = sysctl(&mib, UInt32(mib.count), &info, &size, nil, 0)
assert(junk == 0, "sysctl failed")
return (info.kp_proc.p_flag & P_TRACED) != 0
}
sysctl() 함수를 통해 현재 프로세스에 대한 정보를 검색하고 attach를 했다면 P_TRACED 플래그가 설정되며 확인 시 true를 리턴합니다.
안티 디버깅 코드는 쓰레드를 통해 계속 확인하여 확인 시 앱을 종료시키도록 구현해야 합니다.
최근 앱 점검에서 자주 쓰이는 Frida(후킹)의 경우 탐지 로직이 별도로 존재합니다.
2023.05.15 - [보안/모바일 취약점 점검] - [Android, iOS] OS변조(루팅/탈옥), 무결성 검증, 디버깅 탐지 프로젝트 파일
'모바일 취약점 점검 > iOS' 카테고리의 다른 글
[iOS] 아이폰 탈옥 & 복구 (checkra1n) (0) | 2023.06.18 |
---|---|
[iOS] 무결성(앱 위변조) 검증 코드 (0) | 2023.05.15 |
[iOS] OS변조(탈옥) 탐지 코드 (3) | 2023.05.15 |