주제: 정적 분석 및 취약점 식별
해야할 것: APK 구조 및 취약점 파악
정적분석이란?
앱을 실행하지 않고 소스코드, 리소스 파일, 설정 파일을 뜯어보면서 보안상 문제를 찾는 방법
* 소스코드(smali/) → “앱이 어떻게 동작하는가”
* 리소스 파일(res/)→ “앱이 어떻게 보이는가”
* 설정 파일(AndroidManifest.xml)→ “앱이 어떤 권한·환경에서 실행되는가”
APK의 기본 뼈대
* APK: ZIP처럼 압축되어 있는 실행 가능한 앱 패키지 파일
.apk
│
├── AndroidManifest.xml ← 앱의 설정 및 권한 정의
├── classes.dex ← Java(개발자가 작성한 소스코드)가 컴파일된 후 Dex(안드로이드 VM에서 실행가능한 코드)로 변환된 실행 코드
├── META-INF/ ← APK 서명 관련 정보
│ ├── CERT.RSA
│ ├── CERT.SF
│ └── MANIFEST.MF
└── res/ ← 리소스 파일 (UI, 이미지, 문자열 등)
├── drawable/
├── layout/
├── values/
└── mipmap/
a) apktool.jar 다운로드
* 분석할 APK 파일이 있는 위치에 설치
* apktool은 Java 프로그램을 압축해 놓은 실행 파일(.jar)로 배포함.
b) InsecureBankv2.apk 디컴파일 실행
apk가 설치된 위치로 이동 후
java -jar apktool_2.12.1.jar d InsecureBankv2.apk -o insecurebankv2_src : InsecureBankv2.apk 파일을 풀어서, insecurebankv2_src 폴더에 디컴파일 결과를 저장
c) 디컴파일 후 생성된 폴더 구조 확인

insecurebankv2_src/
original/: APK를 apktool로 디컴파일할 때 변환하지 않고 그대로 두는 원본 파일들res/smali/ : apktool로 디컴파일하면 classes.dex가 smali 언어로 변환-> 실제 앱 로직 확인 가능AndroidManifest.xmlapktool.yml: apktool이 디컴파일한 APK를 다시 빌드할 때 필요한 정보가 들어 있음.* smali 언어 = 안드로이드 VM이 실행하는 어셈블리 스타일 언어.
(.smali 파일: smali 언어로 작성된 코드가 들어있는 파일)
cf) 디컴파일전
AndroidManifest.xml (바이너리 XML -> 사람이 직접 읽기 어려움)
res/layout/*.xml (바이너리 XML -> 사람이 직접 읽기 어려움)
res/values/*.xml (바이너리 XML -> 사람이 직접 읽기 어려움)
classes.dex (Dalvik/ART-안드로이드 vm 바이트코드 —> 직접 해석 불가)
=> 디컴파일 후
AndroidManifest.xml (사람이 읽을 수 있는 평문 XML로 변환됨)
res/values/*.xml (사람이 읽을 수 있는 평문 XML로 변환됨)
res/layout/*.xml (사람이 읽을 수 있는 평문 XML로 변환됨)
smali/ (classes.dex가 smali 언어로 변환되어 사람이 읽고 분석 가능)
jadx-gui 설치하여 apk파일 열기
* jadx는 컴파일된 코드를 사람이 읽기 쉬운 Java 코드 형태로 디컴파일 해준다.
cf) apktool vs jadx
단순 정적 분석(앱의 로직 파악, 하드코딩 값-키/URL/토큰 등 탐색): jadx만으로 충분
심화 분석(정확한 실행 로직 확인, 패치/재빌드): apktool병행 필요
❓실습할 때는...
jadx로 먼저 전체 로직 파악 -> apktool로 실제 취약점 재현/패치
Apktool과 jadx를 이용해 APK 파일을 디컴파일했지만, 수많은 폴더와 코드 앞에서 어디서부터 분석을 시작해야 할지 막막했다. 이럴 때 자동 분석 도구를 활용해볼 수 있다.
자동 분석 도구는 앱의 설정 파일과 소스 코드를 빠르게 스캔하여 보안 취약점이나 위험 요소를 찾아내고, 우리가 집중해야 할 부분을 알려주는 고마운 존재이다.
나는 가장 대표적인 자동 분석 도구인 MobSF (Mobile Security Framework)를 활용해보겠다.
1) Docker 설치
* Docker란? 소프트웨어를 "컨테이너"라는 표준화된 상자에 담아 어디서든 동일하게 실행될 수 있도록 해주는 기술-> MobSF 프로그램과 그 실행에 필요한 모든 환경을 하나의 "컨테이너"에 통째로 담아버린다.
2) MobSF Docker image 다운로드
* Docker image란? 컨테이너를 만드는 데 필요한 모든 것을 담고 있는 "설계도"
docker pull opensecurity/mobile-security-framework-mobsf:latest:도커 허브에 있는 opensecurity팀의 mobsf 최신 버전 이미지를 내 컴퓨터로 다운로드해줘.
3) MobSF 컨테이너 실행하기
docker run -it --rm -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest: mobsf 이미지 설계도를 사용해서 컨테이너를 생성하고 실행하는데, 내 컴퓨터 8000번 포트랑 컨테이너 8000번 포트를 연결하고, 컨테이너가 꺼지면 자동으로 삭제해줘.
4) 웹브라우저에서 접속
http://127.0.0.1:8000 주소로 접속
5) 로그인하기
docker ps: 실행 중인 도커 컨테이너의 목록을 보여준다. 컨테이너 ID를 확인할 수 있다.
docker logs <컨테이너 ID> --tail 200: 특정 컨테이너가 실행되면서 출력한 기록(로그)을 확인하는 데 사용된다 -> 자동으로 생성된 초기 관리자 비밀번호를 찾을 수 있다.
Default Credentials: 아이디/비번 로그를 통해 아이디와 비번 확인이 가능하다.
❗MANIFEST ANALYSIS (매니페스트 분석)
앱의 설계도인 AndroidManifest.xml 파일을 집중 분석한 결과이다. debuggable, exported 컴포넌트 등 구조적인 취약점을 여기서 보여준다.
❗POSSIBLE HARDCODED SECRETS (하드코딩된 민감정보)
코드나 설정 파일 안에 직접 적어놓은 비밀번호, API 키, 서버 주소 등 숨겨진 비밀 정보들을 찾아낸 결과이다. 만약 여기서 무언가 발견된다면, 그것은 거의 항상 심각한 보안 문제이다.
❗APPLICATION PERMISSIONS (애플리케이션 권한)
앱이 내 휴대폰에서 어떤 권한(카메라, 주소록, 인터넷 등)을 요구하는지 보여준다. 만약 앱이 필요 이상의 권한을 요구한다면 개인정보 침해 뿐만 아니라 해킹을 당했을 때 피해 범위가 훨씬 커진다. 따라서 보안 분석 시 위험한 권한들이 앱의 기능에 꼭 필요한 것인지 확인하는 것이 중요하다.
❗CODE ANALYSIS (코드 분석)
소스 코드 자체의 잠재적인 약점을 알려준다.
SIGNER CERTIFICATE (서명 인증서)
앱을 누가 만들었는지 증명하는 디지털 서명 정보이다. 이 서명이 있어야 안드로이드 폰에 설치될 수 있다.
CERTIFICATE ANALYSIS (인증서 분석)
위에서 본 디지털 서명(인증서) 자체에 보안상 문제는 없는지, 예를 들어 너무 약한 암호화 방식을 사용했는지 등을 정밀 분석한 결과이다.
APKiD ANALYSIS (APKiD 분석)
이 앱이 어떤 개발 도구(컴파일러, 패커 등)로 만들어졌는지 식별하는 분석이다. 악성코드가 종종 자신을 숨기기 위해 특정 패커를 사용하기 때문에, 이를 탐지하는 데 도움이 된다.
ABUSED PERMISSIONS (오남용 권한)
전체 권한 목록 중에서, 특히 악성코드가 자주 악용하는 위험한 권한들만 따로 뽑아서 보여주는 섹션이다.
ACTIVITIES, RECEIVERS, PROVIDERS (컴포넌트)
* Activities: 앱의 화면(UI)
* Receivers: 특정 상황(예: 부팅 완료, 문자 수신)을 감지하고 반응
* Providers: 다른 앱과 데이터를 공유하는 창구
-> 각 컴포넌트가 exported=true 로 설정되어 외부 앱에 노출되어 있는지 등을 자세히 확인할 수 있다.
앱의 근본적인 설정 문제 (1, 2, 3번)

1번. 오래된 안드로이드 버전 지원 (Vulnerable OS Version)
이 앱은 보안 업데이트가 끊긴 아주 오래된 안드로이드 버전(4.0.3)에서도 설치될 수 있다.
-> 앱 자체는 안전하더라도, 운영체제(OS)가 취약해서 해킹당하기 매우 쉽다.
2번. 디버깅 모드 활성화 (Debug Enabled)
android:debuggable="true" 로 설정되어 있다.
-> 해커가 앱의 내부를 실시간으로 들여다보고 조작할 수 있는 뒷문을 열어둔 것과 같다.
3번. 앱 데이터 백업 허용 (Application Data can be Backed up)
android:allowBackup="true" 로 설정되어 있다.
-> USB 디버깅이 허용된 PC에 연결하면, 앱의 모든 데이터(로그인 정보, 거래 내역 등)를 쉽게 빼낼 수 있다.
컴포넌트 노출 문제 (5, 7, 9, 10, 11, 13번)
앱의 핵심 기능(컴포넌트)들이 다른 앱에 의해 직접 실행될 수 있도록 문이 열려있는(exported=true) 문제이다.
5, 7, 9, 13번. Activity 노출
PostLogin(로그인 후 화면), DoTransfer(송금), ViewStatement(거래내역 조회), ChangePassword(비밀번호 변경) 등 매우 민감한 화면들이 외부에 노출되어 있다.
-> 악성 앱이 로그인 과정을 건너뛰고 바로 '송금' 화면이나 '비밀번호 변경' 화면을 사용자에게 띄워서 피싱 공격을 하거나 정보를 훔칠 수 있다.
10번. Content Provider 노출
사용자 데이터를 관리하는 창구(TrackUserContentProvider)가 외부에 노출되어 있다.
-> 다른 앱이 이 창구를 통해 앱의 데이터를 훔쳐보거나 조작할 수 있다.
11번. Broadcast Receiver 노출
외부 신호를 받는 컴포넌트(MyBroadCastReceiver)가 노출되어 있다.
-> 다른 앱이 가짜 신호를 보내 앱이 의도치 않은 동작을 하도록 만들 수 있다.
태스크 하이재킹 공격 (4, 6, 8, 12번)
여러 Activity가 '스트랜드호그(StrandHogg) 2.0' 이라는 태스크 하이재킹 공격에 취약하다.
-> '태스크 하이재킹'은 화면 가로채기 공격이다. 사용자가 정상적인 은행 앱을 켰다고 생각하는 순간, 악성 앱이 그 위에 똑같이 생긴 가짜 로그인 화면을 몰래 덮어씌운다. 사용자는 가짜 화면인 줄 모르고 아이디와 비밀번호를 입력하게 되고, 정보가 그대로 해커에게 넘어간다. 매우 정교하고 위험한 피싱 공격이다.
"loginscreen_password" : "Password:"
"loginscreen_username" : "Username:"
3oIDJEetfykDk8YoOpv5sOi1YNQ0s4lEIre7qVmQXm2HQzlUqU6cNsaZxD6S8UMW
3mNwt4SZ3Etv5TIhUa/RqouLnZPiat8RAS1ApJt5MxhvfIYxahkXg2hSNsePN+7M
Fych2TPIScbLJxRIDoDvUow7d3sVUDiaLAvtmgpWr8g7e+3+ib/JMLjt3rf841gO
ir8bk+FXNtfVxQqTx81BUFTZKH1YNLABcK0MWI1xDng=
MU3VGnFcvu612xTEKnGZFJFOwurNoeRHlUpI0GCgSFQ=
SxPdgyHHu8QFxBqcknBJfZgRiWxxWH3utf4/9iPAviI=
qfDkyRZiTZGguvBzojuWMEqfI8Qqw5CcMB2eo7wr2iH9X2v+qlFOYNd9v9ffS1x0
cs4+HQqNuLJCSjPmayUCjMLdoEEgnhD+nTAnE4ooENEnhW/TpxD13dq38SjFLmkW
gcr/blkg3lQG930U0ghKqsUNHy1ZHgL5GjwbOVxLHrc=
KglVFfxGq7C7ko+bqcJ8DTs8uzcctZAmlSX4/fuAvTk=
FaKwm3zfk+Dhq4JqMMBs2A+ODqwwgRuoVIqzQMyOaB4=
w41pUAmd6TXdoU2/Z72GoKBjAyNw4B9JmpSTu2qFRaDsI7+5gLrSInCAebksSHto
M/9MnPtaDnNpsJGLBqvtFaALld0qI4JyMOfQfSncPhI=
4xZN7GqinxNwVj4iMqrRi7x6pRkbvrTHS+6N7nioqQ4QK45BALEp7VFtIp3TGnIt
VECoKGlOd10uMKpiLFkK46zikCIkVy7m5Sv4INe3KRY=
eRIYZ7vwE2B0WWejblqyBziYzuBt9JW024X3YOHX2vY=
AK+A2I0KMMcK37UYcOExFBrt2JDYu9VIuAHdYuT1VPLHst51ZSG89jehZq7ujXyH
Z17lzPChrfQy4VaYpiQXo0k7JJBjQR06QL2GGTFiGqU=
6NX7jQU62u42sQ6Bcog9+pwW2loP1J/qqDKEENUU4ZU=
EwZMQOzAsSbCW+73vnMc0IIAOIXmhdEPDWA4pBmTQFs=
PrVDFjRPs1s5jwZQRK3+ZFXo9PTi3zDMlRzL0PE43M8=
2RUillTqy9QCgJa1LFspH1z+fWwdgPAByGujcpTf13CMmYA3W3Y+TBVqeDwkRNkY
Y6D/YxzOCnVSZVsavLV5KYCoa8QyT30GvMdLessm7RE=
UI 텍스트
"loginscreen_password" : "Password:"
"loginscreen_username" : "Username:"
이것들은 전혀 위험하지 않다.
-> MobSF는 'username'이나 'password' 같은 키워드가 코드나 설정파일 안에 있으면 일단 의심하고 보여준다. 하지만 이 경우, 값(Value)을 보면 실제 비밀번호가 아니라 화면에 표시되는 단순 텍스트인 "Username:" 과 "Password:" 이다.
하드코딩된 비밀 키
3oIDJEetfykDk8YoOpv5sOi1YNQ0s4lEIre7qVmQXm2HQzlUqU6cNsaZxD6S8UMW 등등
이것들은 이 앱의 가장 심각하고 치명적인 취약점이다.
-> 이 복잡한 문자열들은 암호화 및 복호화에 사용되는 비밀 키(Secret Key)이다. 즉, 중요한 데이터를 암호로 잠그고 풀 때 사용하는 마스터키!
❓해커가 만약 이 키들을 찾아낸다면... 모든 데이터를 해독할 수 있게 되어 암호화가 완전히 무용지물이 된다😱
cf) 하드코딩이란? 편의성을 위해 프로그램 안에 값을 직접 문자열이나 상수로 박아 넣는 것을 말한다.
네트워크 및 계정 정보
INTERNET (일반): 인터넷에 연결할 수 있는 가장 기본적인 권한이다.
ACCESS_NETWORK_STATE (일반): 휴대폰이 와이파이나 데이터에 연결되어 있는지 네트워크 상태를 확인하는 권한이다.
GET_ACCOUNTS (위험): 휴대폰에 등록된 모든 계정 목록(구글, 페이스북 등)을 확인할 수 있는 위험한 권한이다. 개인정보 유출에 사용될 수 있다.
USE_CREDENTIALS (위험): 위에서 얻은 계정 정보를 사용해 인증을 요청할 수 있는 권한으로, 계정 탈취 등에 악용될 수 있다.
사용자 개인 데이터
ACCESS_COARSE_LOCATION (위험): GPS가 아닌 네트워크(기지국 등)를 통해 사용자의 대략적인 위치(도시 수준)를 파악할 수 있다.
READ_CONTACTS (위험): 스마트폰에 저장된 모든 연락처(주소록)를 읽을 수 있다.
READ_PROFILE (위험): 사용자가 설정한 개인 프로필 정보(이름, 사진 등)를 읽을 수 있다.
SEND_SMS (위험): 사용자가 모르게 SMS 메시지를 발송할 수 있다.
기기 및 저장소 접근
WRITE_EXTERNAL_STORAGE (위험): 스마트폰의 외부 저장 공간(SD카드, 다운로드 폴더 등)에 파일을 쓰거나 수정, 삭제할 수 있다.
MobSF가 알려준 취약점을 바탕으로 jadx(필요하다면 apktool 병행)를 활용해 APK 코드를 훨씬 쉽게 살펴볼 수 있었다. 자동 분석 도구로 우선순위를 정해놓으니 어떤 파일을 열어봐야 할지 명확해져서, 핵심 취약점 분석에 집중할 수 있어서 좋았다.
cf) jadx에서 텍스트 검색 기능과 ctrl +F 를 활용해 원하는 코드를 간편하게 살펴볼 수 있다.