728x90
반응형
코드 난독화 적용
- 안드로이드 앱은 자바를 기반으로 개발되어 APK 형태로 배포된다.
- C언어의 경우 일반적으로 EXE나 DLL 형태로 개발되기 때문에 앱에 대한 역공학이 어렵지만, 자바로 개발된 앱은 자바라는 언어의 특성상 클래스 파일로부터 바이트코드를 추출해 원본 코드로 디컴파일이 가능하다.
- 이런 구조적 문제로 인해 금융 앱과 같이 보안에 민감한 앱의 경우 보안상 치명적인 문제점을 드러낼 수 있다.
- 문제점을 해결하기 위해 애플리케이션 위변조 방지 기술 중 하나로 코드 난독화 기술이 존재한다.
- 코드 난독화는 역공학 시 프로그램 로직을 쉽게 판단하기 어렵게 코드를 꼬아 놓는 기술로, 앱에 대한 역공학을 수행하는 공격자가 역공학을 통해 원본 소스 코드를 유추하기 어렵게 만든다.
- 자바에서 주로 사용하는 난독화 기술로는 식별자 변환, 제어 흐름 변환, 문자열 암호화, API 은닉, 클래스 암호화 등이 있다.
- 식별자 변환 기법 : 클래스 필드 혹은 메소드의 이름을 의미 없는 값으로 치환하여 코드 분석을 어렵게 하는 기법
- 흐름 제어 : 클래스나 메소드의 실행 순서를 변환하여 역공학 시 쉽게 코드 흐름을 따라가지 못하게 방해하는 기법
- 문자열 암호화 기술과 클래스 암호화 : 개발 시 사용된 문자열과 클래스를 암호화하여 치환하고, 앱 내부에 복호화하는 영역을 추가하여 쉽게 노출될 수 있는 민감한 데이터나 클래스 파일을 보호
- API 은닉 기법 : 앱 개발 시 사용된 라이브러리를 감추는 기술로, 개발된 자바의 버전이나 안드로이드 API 버전 등을 쉽게 노출되지 않게 보호하는 기법
- 난독화는 암호화와 달리 앱에 대한 분석을 어렵게 하는 기술일 뿐, 완벽한 보호 기술은 아니다.
- 난독화와 암호화의 차이점
- 암호화 : 키 값을 통해 복호화를 수행
- 난독화 : 키 값 없이 코드 안에 값을 치환하거나 순서를 어지럽혀 역공학은 하는 분석가로 하여금 분석하기 어렵게 방해하는 기술
- ⇒ 분석가 역량에 따라 얼마든지 분석 가능한 기술이므로 맹신X
- 난독화와 암호화의 차이점
프로가드 난독화 적용 방법
- 프로가드(ProGuard)
- 자바로 만들어진 앱의 디컴파일을 통한 소스 코드 유출을 방지하기 위해 개발된 오픈소스 코드 난독화 도구
- 소프트웨어 개발 시 앱 배포 과정에서 사용함
- DashOPro, Allatori, DexGuard 등 상용 난독화 도구에 비해서는 부족하지만, 오픈소스이므로 무료 사용이 가능하다는 장점
- 프로가드에서 사용된 난독화 기법은 식별자 변환이다.
- 프로가드를 통해 변환된 문자열이나 메소드들은 기존 이름이 치환되어 식별을 어렵게 하지만, 실행 흐름에는 영향을 미치지 않기 때문에 역공학을 하는 분석가가 비교적 분석하기 쉬운 도구다.
프로가드 난독화 활용 방법
- 아래 링크에서 다운로드
- https://github.com/Guardsquare/proguard?__hstc=95661891.4f1bb66bd97982d96fda85f486d89c7a.1641756592627.1641756592627.1644079437287.2&__hssc=95661891.1.1644079437287&__hsfp=3515469825&hsCtaTracking=c57149bc-1229-4b5c-b33e-da145f4c2a56|5712ef3a-d76c-4dfb-99c9-96274b4ee077
- 다운로드 후 lib 경로로 들어가면 proguard.jar 파일과 proguardgui.jar 파일이 존재한다.
- 커맨드 모드와 그래픽 모드를 지원함
- 위 화면에서 Next를 눌러 넘어가면 아래 화면을 보게 된다.
- 해당 메뉴에서는 난독화할 파일을 선택하고 난독화가 적용된 파일 생성 경로 등을 선택할 수 있다.
- 중요 옵션은 다음과 같다.
옵션 설명 Add input 난독화할 처리 대상(jar, war, ear, zip, apk 등)을 선택 Add output 난독화가 적용된 파일의 출력 위치 선택 Eit 추가한 파일의 경로 수정 Filter 난독화 처리하고 싶지 않은 문자 설정
- 다음과 같이 설정하여 진행한다.
- 옵션 설정을 마친 후 “Process!” 버튼을 클릭하면 다음과 같이 난독화된 샘플 파일을 출력한다.
난독화된 코드와 일반 코드 비교
- 프로가드 적용 전의 코드를 자바 디컴파일러를 이용해 코드를 추출했을 때 기존 코드가 그대로 추출된다.
- 하지만 프로가드를 사용하여 난독화 후 코드를 확인해보면 클래스 이름이 의미 없는 값들로 변환되었고, 문자열이나 메소드의 이름이 한눈에 알아보기 힘들게 변환된 것을 확인할 수 있다.
- 아쉬운점은 실행 흐름이나 사용된 라이브러리 또는 개발 시 사용된 API 등은 그대로 노출되는 것을 확인할 수 있다.
- 하지만 프로가드를 사용하여 난독화 후 코드를 확인해보면 클래스 이름이 의미 없는 값들로 변환되었고, 문자열이나 메소드의 이름이 한눈에 알아보기 힘들게 변환된 것을 확인할 수 있다.
인시큐어뱅크에 적용한 사례
- 인시큐어뱅크 취약점 앱의 소스 코드에 프로가드로 난독화 솔루션을 적용한다.
- 인시큐어뱅크의 소스 코드를 안드로이드 스튜디오를 실행하여 Import 한다.
- 소스코드를 난독화시키기 위해서는 gradle.build 설정 파일에 있는 minifyEnabled 옵션을 true로 바꿔주어야 한다.
- minifyEnabled 옵션은 안드로이드 앱 개발 시 proguard 난독화를 적용시킬 때 사용하는 옵션이다.
- 이 옵셔은 gradle 빌드 관리 도구에 의해 실행되며, 만약 minifyEnabled 옵션이 true로 설정되어 있다면 gadel 빌드 관리 도구가 안드로이드 소스 코드를 proguard로 난독화하게 된다.
- 위와 같이 수정 후 APK 파일을 jadx 툴로 열어보면 난독화되어 있는 것이 확인된다.
728x90
반응형