모바일 취약점 점검/iOS

[iOS] 안티 디버깅(Anti-Debugging) 코드

서쪽곰 2023. 5. 15. 16:53

목 차

     

    안티 디버깅(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변조(루팅/탈옥), 무결성 검증, 디버깅 탐지 프로젝트 파일

     

    [Android, iOS] OS변조(루팅/탈옥), 무결성 검증, 디버깅 탐지 프로젝트 파일

    1. 프로젝트 실행결과 Android_Integrity.zip - Android 프로젝트 파일 iOS_Integrity.zip - iOS 프로젝트 파일 Integrity.apk - Android 프로젝트 빌드 파일 Integrity.ipa - iOS 프로젝트 빌드 파일 1) Android Android 프로젝트

    seo-security.tistory.com

     

    반응형