취약점 개요
애플리케이션 사용 폴더 및 외부 저장소에 존재하는 파일 내 중요정보 저장 여부를 점검한다.
외부저장소에는 어떤 정보이든 서비스에 중요한 역할을 하는 정보를 저장해서는 안되며, 내부 저장소에 저장이 되더라도 암호화되어 안전하게 저장되어야 한다.
내부저장소와 외부저장소
안드로이드는 데이터를 저장할 때 내부 저장소와 내부 저장소로 나눌 수 있다.
내부 저장소
- 안드로이드 플랫폼, 시스템 등에서 사용되는 공간
- 안드로이드 API에 의해 권한이 통제
외부 저장소
- 애플리케이션 간 데이터 공유 가능
- WRITE_EXTERNAL_STROAGE 권한을 갖고 있는 애플리케이션은 설정에 따라 데이터를 읽고 쓰는 것이 가능
데이터를 저장하는 방법
1) Shared Preferences
- 원시 데이터를 저장하는 XML 파일로, bollean, float, int, long, string을 지원
2) 내부 저장소
- 안드로이드 플랫폼, 시스템 도구, 앱, 앱에서 사용하는 데이터가 저장되는 공간
- 안드로이드 보안 모델에 따라 보호받는 공간
- 일반사용자 권한으로 내부 저장소에 접근할 수 없음
- 각 앱은 자신의 패키지 이름과 일치하는 디렉터리를 생성하여 해당 디렉터리 안의 파일을 읽고 쓸 수 있음
- 영역에 저장된 데이터는 애플리케이션이 삭제될 때 함께 삭제
/ | - 읽기 권한만 있는 루트 파일 시스템 디렉터리 - 부트와 관련된 설정 파일들을 참고한 초기 프로세스 정보가 포함 |
/system | - 안드로이드 OS의 읽기 권한만 있는 홈 디렉터리 - HAL과 프레임워크가 포함되어 있는 라이브러리 파일, 데몬과 관련된 실행 파일, 폰트, 미디어, 시스템 앱들이 포함 |
/data | - 쓰기, 읽기 권한이 있고 세팅과 설정을 할 수 있는 사용자 앱들과 상태 정보들이 포함된 파일 시스템 디렉터리 |
/cache | - 쓰기, 읽기 권한이 있고 브라우저 캐시와 같이 일시적인 사용자의 상태정보가 포함 |
/system/app/앱 이름.apk | - 시스템 앱들의 공간 - 최적화된 dex 코드는 /system/app/앱 이름.odex에 저장 - 세이프 모드로 부팅될 경우 이 파일 디렉터리에 있는 시스템들이 실행 |
/data/app/앱 이름.apk | - 미리 등록되는 사용자 앱들의 공간 - 최적화된 dex 코드는 /data/dalvik-cache/앱 이름.odex에 저장 |
/data/app/<app-package-name>-1.apk | - 사용자가 다운로드한 앱들의 공간 - 최적화된 dex코드는 /data/dalvik-cahce/data@app@<app-package-name>-1.apk@classes.dex로 저장 |
/mnt/secure/asec/<app-package-name>-1.asec | - SD 카드에 숨어 있는 앱들의 공간 - 최적화된 dex 코드는 /data/dalvik-cacge.nbt@asec@<app-package-nam>-1@pkg.apk@classes.dex로 저장 |
3) 외부 저장소(SD 카드)
- /mnt/sdcard
- 앱 간 데이터 공유가 가능
- 저장되는 파일들은 어디서든 읽고 쓰기 가능
1) (애플리케이션)고유 영역
2) 공용 영역
- 사진, 비디오 등의 파일을 저장할 때 사용
- 삭제 시 애플리케이션에 영향을 받지 않음
4) SQLite 데이터베이스
- 안드로이드에서 사용하는 로컬 데이터베이스
- 확장자가 .DB로 끝나는 파일 기반 데이터베이스
- 파일은 /data/data/"애플리케이션 패키지명"/databases 경로에 생성
- 가상 디바이스를 사용할 경우 DDMS를 이용해 파일 구조 확인 가능, 실제 디바이스의 경우 보안상의 이유로 접근이 불가능
- 주로 서버와 통신하지 않는 간단한 앱을 만들 경우 SQLite를 사용
5) Network Connection
- 네트워크로 데이터를 저장하거나 불러오는 방법
- SQLite 데이터베이스, 간단한 텍스트 파일 등을 보낼 수 있음
/data/data/"앱 이름"
- 앱에 대한 정보를 가장 많이 획득할 수 있는 디렉터리는 "/data/data/앱이름"
root@shamu:/ # ls -ld /data/data/com.android.insecurebankv2
drwxr-x--x u0_a38 u0_a38 2020-10-22 22:15 com.android.insecurebankv2
앱의 대략적인 디렉터리 구조
root@shamu:/data/data/com.android.insecurebankv2 # ls -l
drwxrwx--x u0_a38 u0_a38 2020-10-22 22:15 app_textures
drwx------ u0_a38 u0_a38 2020-10-22 22:15 app_webview
drwxrwx--x u0_a38 u0_a38 2020-10-22 22:15 cache
drwxrwx--x u0_a38 u0_a38 2020-10-22 20:54 databases
lrwxrwxrwx install install 2020-10-22 20:54 lib -> /data/app-lib/com.android.insecurebankv2
drwxrwx--x u0_a38 u0_a38 2020-10-22 22:15 shared_prefs
files | - 관리자가 내부적으로 사용하는 파일 저장 (so, data, init 파일 등) |
lib | - 애플리케이션에 요청하는 라이브러리 파일 (so 파일) |
databases | - 설정 파일, 콘텐츠 파일 등의 쿼리 정보가 포함된 SQLite 데이터베이스 파일 (db 파일) * sqlite db파일은 안드로이드에서 사용하는 로컬 데이터베이스 |
cache | - 쓰기, 읽기 권한이 있고 브라우저 캐시와 같이 일시적인 사용자의 상태정보가 포함 |
share_prefs | - XML 파일로 저장되며, 앱에 공유되는 설정 파일 * 디렉터리 내 OOO_preferences.xml에 앱의 설정 파일들이 포함되어 있음(암호화된 패스워드, IP주소) |
SDCard stroage 확인
1. 외부저장소에 접근하여 어떤 디렉터리, 파일이 존재하는지 확인
C:\Program Files (x86)\Nox\bin>adb -e shell
root@shamu:/ # cd /mnt/sdcard
root@shamu:/mnt/sdcard # ls -l
drwxrwx--- root sdcard_r 2020-10-22 20:46 Alarms
drwxrwx--x root sdcard_r 2020-10-22 20:46 Android
drwxrwx--- root sdcard_r 2020-10-22 20:54 Apps
drwxrwx--- root sdcard_r 2020-10-22 20:46 DCIM
drwxrwx--- root sdcard_r 2020-10-22 22:18 Download
drwxrwx--- root sdcard_r 2020-10-22 20:46 Movies
drwxrwx--- root sdcard_r 2020-10-22 20:46 Music
drwxrwx--- root sdcard_r 2020-10-22 20:46 Notifications
drwxrwx--- root sdcard_r 2020-10-22 20:51 Pictures
drwxrwx--- root sdcard_r 2020-10-22 20:46 Podcasts
drwxrwx--- root sdcard_r 2020-10-22 20:46 Ringtones
-rw-rw---- root sdcard_r 60 2020-10-22 22:17 Statements_jack.html
root@shamu:/mnt/sdcard # cat Statements_jack.html
Message:Success From:999999999 To:555555555 Amount:777
<hr>root@shamu:/mnt/sdcard #
- 사용자의 거래 아이디와 거래한 금액이 평문으로 저장되어 있는 것을 확인할 수 있다.
Local stroage 확인
1. 취약점 도출 가능성이 있는 파일 추출
root@shamu:/data/data/com.android.insecurebankv2/shared_prefs # ls
WebViewChromiumPrefs.xml
com.android.insecurebankv2_preferences.xml
mySharedPreferences.xml
root@shamu:/data/data/com.android.insecurebankv2/shared_prefs #
C:\Program Files (x86)\Nox\bin>adb pull /data/data/com.android.insecurebankv2/shared_prefs/mySharedPreferences.xml
[100%] /data/data/com.android.insecurebankv2/shared_prefs/mySharedPreferences.xml
2. 추출한 파일 확인
3. 복호화 및 디코딩
- apk-tool을 이용하여 smali코드를 확인했더니 키 값이 하드코딩되어 있는 것을 확인하였다. 이를 이용하여 복호화하였다.
AES : aesencryption.net/devglan.com/online-tools/aes-encryption-decryption
Base64 : www.base64decode.org/