취약점 개요

PC와 동일하게 안드로이드 어플리케이션은 사용할 메모리(RAM) 영역을 할당 받는다.


메모리는 어플리케이션의 실행 코드, 사용할 자원(사용자 계정, 실행하는데 필요한 값, 사용하는 함수 등)이 저장된다.


메모리에 올라가게 되면 복호화되어 평문으로 저장하게 되는데, 이런 점을 이용하여 어플리케이션에서 사용하는 중요한 정보들은 암호화되어 서버로 전송된다.

 

하지만, 메모리에 올라가게 되면 평문으로 노출되어 중요한 정보 또는 민감한 정보들이 노출되는 취약점이다.


취약점 진단

안드로이드 스튜디오에서 Android Device Monitor(Tools > Android > Android Device Monitor)를 실행하면 로컬 PC와 연결되어 있는 모바일 단말기의 실행 중인 앱 목록이 나타난다.


○ emulator-5554 : 로컬PC와 연결되어 있는 안드로이드 단말기

○ com.android.~ : 안드로이드 단말기에서 구동되고 있는 프로세스 목록

○ Heap : 어플리케이션이 사용중이거나 메모리에서 사용되거나 업데이트 되면 Heap탭에 이런 정보들을 출력


Android Device Monitor


분석 대상 앱인 com.android.insecurebankv2를 선택하고, 상단의 Update Heap을 선택한다. Update Heap은 앱에서 메모리를 사용하는지 확인해주는 기능이다.


앱을 실행하여 중요 정보를 사용하는 기능(로그인, 비밀번호 변경 등)을 사용하면 Heap에 메모리 정보가 출력된다.


메모리 정보


메모리 정보를 파일로 저장하기 위해 해당 페키지를 선택 후 상단의 Dump HPROF File 아이콘을 클릭해서 로컬PC로 저장한다.


메모리 덤프


strings 파일을 이용해 메모리 덤프 파일(com.android.insecurebankv2.hprof)에서 텍스트 문자열만 추출한다.


검색할 문자열에 jack을 입력하면 서버의 패킷 정보에 사용자가 입력한 아이디, 비밀번호 정보가 들어있다. 비밀번호는 소스 코드 상에서 암호화 되어 있으므로 이 역시 암호화되어 서버로 전송된다.


메모리 덤프 분석


서버로 전송하는 과정에서 메모리에 공개키와 비밀번호가 복호화되어 평문으로 노출된다.


메모리 덤프 분석


안드로이드 메모리 덤프를 수행하는 방법은 adb, ddms, frida 등이 존재한다. ddms는 앞서 취약점 진단 시 수행한 Android Device Monitor이다. 가장 간편하게 수행할 수 있는 것은 ddms, frida이다.


⊙ adb를 이용한 메모리 덤프

1. adb -e shell am dumpheap 3855 /sdcard/sg.hprof

2. adb pull /sdcard/sg.hprof

3. strings.exe sg.hprof > memory.txt

- 3855 : 실행되고 있는 앱의 PID

- /sdcard/sg.hprof : 덤프 파일을 저장할 경로


⊙ ddms를 이용한 메모리 덤프

1. ddms.bat 실행

2. 분석할 앱 선택 후 hprof 파일로 저장


⊙ frida를 이용한 메모리 덤프

1. adb shell

2. /data/local/tmp/frida-server & (frida-server 실행)

3. frida-ps -U (실행되고 있는 앱의 패키지명 확인)

4. python fridump.py -U -s 패키지명 (메모리 덤프)


대응 방안 및 검증

메모리 노출 취약점은 소스 코드 상에서 중요 정보를 저장할 때 암호화하지 않고 저장해서 메모리에 평문으로 노출될 때 발생한다. 이를 해결하려면 중요 정보를 저장하는 모든 변수에 암호화를 해야 한다.

백업 취약점
메모리(변수)에 중요정보를 저장할 때는 반드시 암호화해서 저장
AndroidManifest.xml 파일에 있는 android:debugable 속성을 "false"로 지정
사용자에게 중요 정보를 입력 받을 때, String 객체를 사용하면 암호화를 하기 전 중요 정보가 메모리에 평문으로 저장이 되므로 char[] 형으로 처리해야 한다.

// 메모리 초기화
import java.util.Arrays;

char ch[] = new char[10];
ch[0] = 'P';
ch[1] = 'a';
ch[2] = 's';
ch[3] = 's';
ch[4] = 'w';
ch[5] = 'o';
ch[6] = 'r';
ch[7] = 'd';

Arrays.fill(ch,(char)0x20);

▶ 안드로이드 백업 취약점 (Android Backup)

▶ 안드로이드 컴포넌트 취약점 (Android Activity)

▶ 안드로이드 컴포넌트 취약점 (Android Broadcast Receiver)

▶ 안드로이드 컴포넌트 취약점 (Android Content Provider)

▶ Android Drozer 설치 및 사용법

▶ 안드로이드 키보드캐시 취약점

▶ 안드로이드 난독화 (코드 보호 기법)

▶ 안드로이드 암호화 구현 취약점 (Android AES 복호화)

▶ 안드로이드 루팅 탐지 우회 (Frida Hooking)

▶ 안드로이드 디컴파일 방법 및 jadx 사용법

▶ 안드로이드 인시큐어뱅크 앱 설치 (Android InsecureBankv2)

  • 카카오톡-공유
  • 네이버-블로그-공유
  • 네이버-밴드-공유
  • 페이스북-공유
  • 트위터-공유
  • 카카오스토리-공유