기본적으로 애플리케이션 데이터에 다른 애플리케이션이 접근할 수 없다. 다른 애플리케이션과 데이터를 공유하고 싶으면, Content Provider를 인터페이스로 애플리케이션 간에 데이터를 공유하는데 사용할 수 있다.
Server Application: 데이터를 제공하는 앱, 서버 앱에서 Content Provider를 정의한다.
Client Application: 데이터를 공유받는 앱으로 Content Resolver를 사용해서 서버 앱의 데이터를 사용한다.
특정 Content Provider의 URI를 알 수 있는 애플리케이션은 provider 애플리케이션의 데이터베이스에 데이터를 insert, update, delete, query 할 수 있다.
즉, content provider을 안다면 information leak이 가능하다.
Permission 사용해서 Content Provider에 접근 제어할 수 있다.
AndroidManifest.xml 파일에 하나의 content provider가 등록되어 있다.
android:exported="true" 로 되어있어 해당 애플리케이션의 content provider는 모든 다른 애플리케이션에 접근할 수 있도록 되어있다.
Content Provider 컴포넌트로 데이터를 공유하는 서버 앱에 강력한 Permission 설정이 이루어지지 않으면 서버 앱의 데이터를 조작할 수 있다.
dex2jar, apktool과 같은 APK Decompiler를 사용하여 앱을 디컴파일하여 AndroidManifest.xml이나 classes.dex 파일에서 Content Provider 정보(DB Schema, URI, Permission)를 추출할 수 있다.
추출한 Content Provider 정보(DB Schema, URI, Permission)를 이용하여 Content Resolver 앱(Resolver APK)을 작성해 데이터를 조작할 수 있다.
Content Provider를 이용해서 데이터를 공유하려면 Java 소스코드에 데이터베이스 정보를 명시해야 한다. dex2jar 디컴파일 툴을 사용하면 Content Provider의 데이터베이스 정보를 추출할 수 있다.
1) dex2jar 디컴파일 툴 이용한 데이터베이스 추출
$ dex2jar-2.0\d2j-dex2jar.bat Android-InsecureBankv2\InsecureBankv2.apk
jar 파일을 JD-GUI로 열면 Java 코드를 확인할 수 있다.
TrackUserContentProvider.class 에서 db 이름(mydb), 생성하는 테이블 이름(names), 테이블 생성 쿼리, names 테이블 schema, Content Provider URI 정보를 확인할 수 있다.
MYDB.NAMES Schema는 다음과 같다.
Field | Type | Null | Key |
id | INTEGER | NOT NULL | PRIMARY KEY |
name | TEXT | NOT NULL |
dex2jar 디컴파일러 이용해서 알 수 있는 Content Provider 정보: DB Schema, URI
2) apktool 디컴파일 툴을 사용한 URI, Permission 추출
apktool d InsecureBankv2.apk
Content Provider의 Permission, URL 정보는 apktool로 디코딩한 AndroidManifest.xml 파일에서 확인 가능하다.
URI (authorities) : com.android.insecurebankv2.TrackUserContentProvider
apktool 이용한 디컴파일로 알 수 있는 Content Provider 정보: URI, Permission
1) 로그인
dinesh 2번 jack 3번 dinesh 2번 로그인 진행
2) android emulator를 실행하고, platform-tools 경로에 InsecureBankv2.apk를 위치시킨다.
adb shell에서 다음 명령어을 실행한다.
content query --uri content://com.android.insecurebankv2.TrackUserContentProvider/trackerusers
johan@DESKTOP-6LRLRFA D:\platform-tools
$ adb devices
List of devices attached
emulator-5554 device
johan@DESKTOP-6LRLRFA D:\platform-tools
$ adb -s emulator-5554 shell
z3q:/ $ content query --uri content://com.android.insecurebankv2.TrackUserContentProvider/trackerusers
Row: 0 id=2, name=dinesh
Row: 1 id=3, name=dinesh
Row: 2 id=7, name=dinesh
Row: 3 id=8, name=dinesh
Row: 4 id=1, name=jack
Row: 5 id=4, name=jack
Row: 6 id=5, name=jack
Row: 7 id=6, name=jack
z3q:/ $
암호화가 되지 않은 사용자의 로그인 기록을 확인 할 수 있다.
Permission이 설정되어 있지 않은 경우 URI를 통해서만 Content Provider을 식별하고 접근 제어할 수 있다. 선언된 Permission에 protectionLevel 속성을 사용하여 강력한 Permission을 선언하도록 한다. (protectionLevel 속성은 필수는 아니다.)
Name | Description |
normal | 기본값. 기능을 사용하기 위한 식별값으로 사용 |
dangerous | 사용자 개인 데이터, 시스템 제어 기능을 식별하는 permission |
signature | 동일한 서명 값으로 컴파일된 앱끼리 해당 기능을 허용 |
system | 안드로이드 시스템 이미지로 설치되는 앱을 허용 |
android:protectionLevel="normal" , android:protectionLevel="dangerous" 속성은 Content Provider의 데이터를 보호할 수 없고, protectionLevel이 signature , system 인 경우 Content Provider의 접근 정보를 알아도 동일한 서명 값으로 컴파일된 앱이 아닌 경우 데이터 접근이 불가능하여 Content Provider의 데이터를 보호할 수 있다.
Android에서 제공하는 Content Provider의 Permission:
Permission | protectionLevel | 데이터 탈취 여부 |
None | None | 탈취 가능 |
WRITE_USER_DICTIONARY | normal | 탈취 가능 |
READ_CONTACTS | dangerous | 탈취 가능 |
ACCOUNT_MANAGER | signature | 탈취 불가능 |
BIND_DIRECTORY_SEARCH | signature|system | 탈취 불가능 |
안드로이드에서 제공하는 permission에서도 permission이 가지는 protectionLevel에 따라 데이터 탈취 여부가 결정된다.
https://developer.android.com/guide/topics/providers/content-provider-basics
[Android Reversing] Weak Cryptography implementation (취약한 암호화 취약점) (0) | 2021.07.06 |
---|---|
[Android Reversing] Insecure Webview implementation (WebView 취약점) (0) | 2021.07.06 |
Drozer 설치 (Windows) (0) | 2021.07.06 |
[Android Reversing] InsecureBankv2 설치 (feat. Bluestacks) (0) | 2021.07.02 |
adb 설치 (Windows) (0) | 2021.07.01 |