취약점 개요

사용자가 안드로이드 모바일 앱의 기능을 이용하면서 입력했던 인증 정보(아이디, 비밀번호 등), 앱의 구조, 중요 정보, 민감 정보 등이 백업 파일에 저장된다.


백업 기능은 개발자의 편의성을 위해 AndroidManifest.xml에 android:allowBackup 속성이 "true"로 설정되어 있다. "true"로 설정되어 있으면 백업이 가능하고, "false"로 설정되어 있으면 백업이 불가능하다.

 

기본적으로 백업 속성이 활성화되어 있다.

개발자가 개발 완료 후 백업 속성을 비활성화화지 않고 앱을 배포하면 제 3자가 획득한 단말기에 존재하는 백업 취약점을 이용해 사용자의 중요 정보, 인증 정보, 민감한 정보 등을 획득할 수 있게 된다.


취약점 진단

안드로이드 API(Application Programming Interface)에 BackupManager 클래스가 존재한다.


클래스는 AndroidManifest.xml에 구현되어 있는 <application> 태그 내의 android:allowBackup 속성에 따라 백업 및 복구가 결정된다.


AndroidManifest.xml을 보면 android:allowBackup 속성이 "true"로 설정되어 있으며 이 상태에서 앱을 배포 시 정보 유출이 발생할 수 있다.


백업 속성


앱을 실행하지 않거나 이용하지 않으면 백업 파일에 데이터가 존재하지 않는다. 취약점 진단을 위한 선행 작업(앱 실행, 계정 정보 입력, 계좌 이체, 계좌 정보 보기, 비밀번호 변경 등)부터 진행한다.


로그인


앱을 백업할 때 사용하는 명령어는 adb이다. adb에 backup 옵션을 지정하여 백업을 진행한다.


○ adb backup -f insecurebank.ad com.android.inseucrebankv2


백업


옵션 설명
-f 파일명 저장할 백업 파일명
확장자는 ad(Android Data)로 지정
(예) -f insecurebank.ad
패키지명 백업할 앱의 패키지명
(예) com.android.insecurebankv2
-apk apk파일명 앱의 전체를 백업
(예) -apk insecurebankv2.apk

adb backup 명령어를 입력하면 단말기에 백업 유무 메시지와 비밀번호 입력 창이 출력된다.


비밀번호를 입력하지 않고 백업 수락 버튼(Back up my data)을 클릭하면 암호화 된 백업 파일이 로컬 시스템에 insecurebank.ad 파일로 저장된다.


백업 유무


백업 파일을 텍스트 편집기로 열면 암호화 되어 있으므로 글자가 깨져서 출력된다. 안드로이드 백업 추출 라이브러리(abe-all.jar)를 사용하면 백업 파일을 볼 수 있도록 복호화하여 압축 파일로 저장된다.


○ java -jar abe-all.jar unpack insecureback.ad insecurebank.tar


백업 파일 변환


변환된 압축 파일을 해제하면 apps 디렉토리 하위에 db, sp, _manifest 디렉토리가 존재한다.


db 디렉토리 : 데이터베이스 테이블 정보

sp 디렉토리 : Shared Preferences(앱의 기능 이용 시 저장된 파일) 정보

_manifest 파일 : 앱 복구 시 필요한 정보


압축 해제 된 파일 목록


mySharedPreferences.xml을 열어보면 로그인 시 입력한 아이디와 비밀번호가 Base64 인코딩 되어 저장되어 있다.


아이디와 비밀번호를 복잡한 암호화 알고리즘을 적용하지 않고, 간단한 인코딩 기법만 적용하면 디코딩을 하여 해당 사용자 계정 정보를 획득할 수 있다.


계정 정보


⊙ APK 전체 백업하고, 해당 APK 파일을 다른 단말기에서 복원 방법


1. adb backup –f insecurebank.ad –apk com.android.insecurebankv2

- 제 3자가 해당 앱이 설치되어 있는 다른 사용자의 모바일 단말기를 획득했다고 가정한다.

- 해당 앱의 백업이 활성화되어 있는 것을 확인한 제 3자는 APK 파일(com.android.insecurebankv2) 전체를 백업한다.

- 백업이 완료되면 현재 디렉토리에 insecurebank.ad 파일이 생성된다.


2. adb restore insecurebank.ad

- 제 3자의 모바일 단말기는 현재 해당 앱이 설치되어 있지 않다.

- 암호화 된 백업 파일(insecurebank.ad)을 가지고 데이터 복원 기능을 이용하면 자신의 모바일 단말기에 해당 앱이 설치된다.

- 설치 완료 후 앱을 실행하면 자동으로 로그인이 되어 있으며 앱의 주요 정보를 확인하거나 변경 등이 가능하다.


대응 방안 및 검증

백업 취약점은 AndroidManifest.xml에 android:allowBackup 속성이 "true"로 설정되어 있어 중요 정보, 인증 정보 등 유출이 발생한다.


민감한 정보가 유출되지 않게 하려면 android:allowBackup 속성을 "false"로 변경하면 변환한 백업 파일에 데이터가 존재하지 않으므로 정보 유출을 막을 수 있다.


백업 취약점
AndroidManifest.xml에 구현되어 있는 <application> 태그 내의 android:allowBackup="true" 속성을 "false"로 변경하여 외부 노출 금지

AndroidManifest.xml 파일에 구현되어 있는 <application> 태그 내의 android:allowBackup="true" 속성을 "false"로 변경하고, 프로젝트를 다시 빌드한다.


백업 속성 변경


앱을 실행하여 계정 정보를 입력한 후 백업 및 압축 파일로 변환한다. android:allowBackup 속성을 "true"로 설정했을 때 압축 파일과 비교하면 파일 용량에서 큰 차이가 나타난다.


"true"로 설정한 압축 파일의 용량은 91KB이지만 "false"로 설정한 압축 파일은 1KB이다. 또한, 해당 압축 파일을 해제하려고 시도하면 손상된 파일이므로 해제가 되지 않는다.


속성 변경 전∙후 파일


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

▶ 안드로이드 환경구축 ( 취약점 분석)

▶ Android Drozer 설치 및 사용법

▶ AndroidManifest Oncreate 메소드 분석

▶ 안드로이드 메모리 노출 취약점 (메모리 덤프)

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

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

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

▶ 안드로이드 로컬 암호화 취약점 (Android Local Encryption)

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

▶ 안드로이드 디컴파일 방지 우회 (APK Protect)

▶ 안드로이드 웹뷰 취약점 (Android Webview)

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

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