[Android] 2. APK 정적/동적 분석

APK 분석
- APK 정적 분석
- APK 동적 분석
1. APK 정적 분석

소스코드 상에서 결함을 찾아내는 분석 기법
Smali, AndroidManifest.xml 등 소스코드 단에서 취약점 발생 가능성 확인하는 기법
OS 변조 탐지 기능 적용 여부
OS가 변조(루팅, 탈옥)된 단말 이용 시 보안 위협이 증대됨이 따라, OS 변조 시 서비스 이용가능 여부를 점검
su 명령어 확인
- 루트 명령어(su) 실행 여부로 루팅 및 탈옥 확인
파일 이름 기반 확인
- 루팅 시 설치되는 파일 이름을 기반으로 탐지
- /sbin/su, /system/su, /system/sbin/su, /system/xbin/su, /system/app/Superuser.apk
시스템 설정 파일 확인
- 루팅 후 변경이 가능한 시스템 설정 파일 확인
- ro.debuggable, service.adb.root
프로그램 무결성 검증
변조된 프로그램이 정상 실행될 경우, 악성코드가 포함된 재 배포되는 파일 등의 보안 위협이 존재함에 따라,
변조 프로그램 정상 실행 가능 여부 점검
메모리 내 중요정보 노출 여부
이용자 단말기 메모리 영역에서 이용자 중요정보의 평문 노출 여부를 점검
단말기 내 중요정보 저장 여부
애플리케이션 사용 폴더 및 외부 저장소에 존재하는 파일 내 중요정보 저장 여부 점검
SharedPreferences
- 애플리케이션 폴더 내 데이터를 파일로 저장
- /data/data/<패키지이름>/shared_prefs/ → cat 명령어로 파일 열람패키지이름>
SQLite
- 애플리케이션 폴더 내 데이터를 DB 파일로 저장
- /data/data/<패키지이름>/databases/ → DB Browser for SQLite 프로그램으로 확인 가능패키지이름>
화면 강제 실행에 의한 인증단계 우회
화면 강제 실행, 인증관련 파일 조작 등을 통해 인증단계 우회 가능 여부 점검
AndroidManifest.xml 내 exported 속성 존재 여부 확인
AndroidManifest.xml 내 별도 명시가 없는 경우 false로 간주
- android:exported=true → 다른 앱이나 시스템에서 해당 서비스 직접 접근 가능
- android:exported=false → 앱 내부에서만 접근 가능
adb shell am start -n <android:name 강제 실행하고자하는 페이지>
2. APK 동적 분석

앱 실행중인 환경에서 결함을 찾아내는 기법이다.
사용자 입/출력 및 실행 흐름 변조 등을 통해 취약점 발생 가능성 확인하는 기법이다.
IDA를 통해 DEX, SO파일들을 동적 분석할 수 있다.
동적 분석을 하기 위해서는 2가지 조건 중 하나가 만족해야 한다.
- AndroidManifest.xml 파일 내 android.debuggable=true 설정
- 모바일 기기의 ro.debuggable=1 설정
DEX
Android 런타임에서 궁극적으로 실행하는 코드가 포함되어있는 파일
기계어로 설정되어있으며, 디컴파일 시 smali 코드로 변환된다.
SO
Android 에서 Native Library 단에서 사용하는 C/C++로 작성된 시스템과의 연계를 위해 사용하는 파일
/lib/arm64-v8a. armeabi-v7a, x86에 위치
loadLibrary
Static{
System.loadLibrary(“so file name”);
}
MultiDex
Dex 사이즈 제한으로 큰 앱 같은 경우 여러개의 Dex를 사용하는데,
이러한 Dex들을 동적으로 로드하기 위해 MultiDex를 사용한다.
Dex 파일을 획득한다면, 원본 소스코드에 가깝게 복호화가 가능하다.
따라서, APP 소스코드가 담긴 Dex파일을 숨기는 것은 매우 중요하다고 할 수 있다.
취약점
악성 소스코드 및 솔루션 소스코드를 원본 Dex를 숨겨놓은 위치에서 정상적인 Dex인 것처럼 보여주고,
실제 원본 Dex같은 경우는 따로 숨겨놓는 취약점이 있다.
Dex파일 동적 호출
File에서 호출
Dalvik.system.DexFile.loadDex deprecated after API 26Dalvik.system.DexClassLoaderDalvik.system.PathClassLoader
Memory에서 호출
Dalvik.system.InMemoryDexClassLoader
ro.debuggable
루팅이 되면 System Property 변경을 값을 통해서 디버그 기본 설정 변경(루팅 탐지)한다.
- ro.debuggable=1 : 앱 실행 시, debug 모드로 실행
- ro.debuggable=0 : 앱 실행 시, 앱에 명시된 debuggable 속성으로 실행(default는 false)
- ro.secure=1 : adb 유저 권한 실행
- ro.secure=0 : adb 루트 권한 실행