Last Updated on 6월 5th, 2023, By
 In AppSealing News, 앱실링 블로그

오늘날과 같이 많은 위협이 존재하는 시대일수록 모바일 앱의 보안이 중요합니다. 최신 기능을 갖춘 앱이라도 보안에 취약할 수 있습니다. 즉 기능 못지 않게 보안이 중요합니다. 데이터 조작 공격의 위험이 높은 가운데 개발자는 앱을 개발, 출시하기 전에 보안을 최우선시해야 합니다. 이것이 안드로이드 앱 난독화가 중요한 이유입니다.

안드로이드 앱 난독화

이는 소스코드를 외부로부터 보호하기 위해 난독화하거나 수정하는 프로세스입니다. 난독화는 실행가능한 내용을 수정하는 동시에 원래 목적을 훼손하지 않고 기능도 유지하는 것이 목적입니다. 해커는 이로 인해 디컴파일링에 큰 어려움을 겪게 됩니다. 이 덕분에 고객의 민감성 데이터도 보호할 수 있습니다. 최근의 디컴파일러들은 손쉽게 앱의 소스코드를 리버스 엔지니어링할 수 있습니다. 여기서 코드 난독화가 힘을 발휘하여 리버스 엔지니어링이나 데이터 조작을 어렵게 만듭니다. 

안드로이드의 코드 난독화 원리

안드로이드의 코드 난독화는 간단합니다. 가장 단순한 방법으로 app/build.gradle 파일에서 minifyEnabled 필드를 true로 설정합니다. 스니펫은 아래와 같은 형태입니다.

android {

     buildTypes {

         release {

             minifyEnabled true

             proguardFiles getDefaultProguardFile(‘proguard-android.txt’)

         }

     }

 …

}

또는 기본값이나 사전에 정해진 규칙을 이용할 수 있습니다. 관련 문서에서 규칙을 확인할 수 있습니다. 규칙은 일반적으로 아래와 같이 호출합니다.

android {

    buildTypes {

        release {

            minifyEnabled true

            proguardFiles getDefaultProguardFile(‘proguard-android.txt’),

            ‘proguard-rules.pro’

        }

    }

}

변수와 메소드 네임을 스트링, 숫자, 문자, 보이지 않는 문자, 출력 불가 문자 등으로 리네이밍하는 방법도 좋습니다. 

제어 흐름 난독화도 로직을 뒤섞거나 뒤섞인 것처럼 보이게 만들 수 있으므로 해커들은 코드의 의미를 파악하기 어려워집니다. 이는 조건부, 반복성, 분기 구조를 통해 유효하면서 이해하기 어려운 실행부를 만들어냅니다. 

더미 코드 삽입은 말 그대로 값을 추가하지 않지만 애플리케이션 및 기능의 로직에 영향을 미치는 추가 코드 세그먼트를 효과적으로 추가하는 방법입니다. 이 방법은 사용하지 않는 코드나 메타데이터가 해킹 시 기능에 대한 힌트를 줄 수 있기 때문에 이를 삭제하는 방식으로 변형할 수 있습니다. ‘복잡한 조건식’을 삽입하는 방법은 조건부 분기와 부정확한 코드를 삽입하면서 앱의 기능은 유지하는 것이 핵심입니다. 

명령어 패턴 변환 방식의 경우 알려진 명령어를 잘 알려지지 않은 명령어로 변환하여 해커를 혼란시킵니다. 

그 외 많이 쓰이는 난독화 기법은 자기 보호형 코드를 삽입하여 코드 조작이 발생할 시 경고를 발동시키거나 조치를 취하는 안티 탬퍼링 및 안티 디버그가 있습니다.

난독화가 보안 사고를 방지하는 원리

코드 난독화를 이용하면 해커가 애플리케이션이나 민감성 데이터를 복제하는 데 이용하는 의사 코드를 파악할 수도 있습니다. 이러한 공격은 정적 분석이라 하며 소스코드에 침입할 시에 주로 이용합니다. 코드 난독화를 이용하면 보안 레이어를 추가하여 해커가 로직을 이해하거나 애플리케이션에 침입하기 어렵게 만드는 것이 가능합니다. 

난독화 도구

다양한 난독화 도구가 있으나 여기서는 가장 많이 쓰이는 것을 소개합니다.

PreEmptive DashO 

이는 다목적성이 장점이며 리네이밍, 스트링 암호화, 조작 감지, 디버그 감지, 워터마킹, 제어 흐름 등 유용한 기능을 제공합니다. UI와 기술지원도 훌륭합니다. 내장된 규칙으로 신속하게 설정을 구성할 수 있습니다. 여러 자바 및 Kotlin 애플리케이션을 지원합니다. 

GuardSquare’s ProGuard

Proguard 라이트 버전은 DexGuard보다 기능이 부족합니다. 장점으로 구성이 용이하며 일부 사전 구성을 제공합니다. 사후 지원이 훌륭하지만 일부 학습이 필요할 수 있습니다. 텍스트 기반 구성을 지원하며 기능 리네이밍에만 도움이 되고 UI는 다소 부족한 면이 있습니다. 

GuardSquare’s DexGuard

자바만 지원하지만 ProGuard 버전보다 기능이 우수합니다. DashO와 유사하게 제어 흐름, 암호화, 런타임 확인 등 기능이 유사하면서 다층 하드닝 접근법을 제공하고 기본 기능 외에 애드온으로 기능을 추가할 수 있습니다. 사후 지원은 ‘베이직’과 ‘골드’로 나뉩니다. 라이트 버전과 동일하게 텍스트 기반 구성만 지원합니다. API 기반 기능을 통해 API 호출을 추가할 수 있습니다. 

마무리하며

앱 개발은 이제 통합적인 프로세스입니다. 기능과 보안 양쪽에서 우수성을 갖추기 위한 안정적 전략을 요구합니다. 코드 난독화를 이용하면 효과적으로 해킹을 방지할 수 있습니다. 위와 같은 스마트한 기법을 이용하면 코드의 침투 가능성을 효과적으로 줄일 수 있습니다. 또한 해커들의 의욕을 저하시킬 수 있습니다. RASP(런타임 애플리케이션 자가 보호)를 통해 정적 및 동적 침투 시도를 막아내는 것이 가능합니다. 이 모든 것이 실시간으로 이루어집니다. 즉 24시간 보안이 가능한 것입니다. 다시 말해 간과한 보안 문제가 있더라도 앱실링(AppSealing)에서 해결할 수 있습니다. 이는 훌륭한 백업 계획을 통해 가능합니다. 지금 바로 문의해서 확인해 보세요!

Dustin Hong
Dustin Hong
Dustin은 잉카엔트웍스의 앱실링 비즈니스 개발을 이끌고 있습니다. 그는 사이버 보안, IT, 컨텐츠 및 애플리케이션 보안 분야의 소프트웨어 개발과 혁신에 많은 관심을 가지고 있습니다. 또한 사이버 보안 세계에서 주요 사건의 대상, 이유 및 방법에 대해 다양한 사람들에게 공유하고 토론하는 것을 좋아합니다. 업계 동향 및 모범 사례에 대한 그의 견해는 기사, 백서에 실려있으며, 여러 보안 행사에서 유사 주제로 발표를 하였습니다.