안녕하세요! 오늘은 '안전하지 않은 SD 카드 저장소' 취약점에 대하여 실습과 함께 알아보겠습니다.
['안전하지 않은 SD카드 저장소' 란?]
> 애플리케이션이 SD 카드 저장소에 중요한 정보나 파일을 저장하여 발생하는 취약점으로 "OWASP Mobile Top 10 M2: Insecure Data Storage"에 해당합니다. 안드로이드는 데이터를 저장할 때 크게 내부 저장소 , 외부저장소로 나눌수 있습니다. 내부 저장소에 파일을 저장하는 것까지는 문제가 없지만 파일 저장시 암호화를 제대로 안하게 되면 중요 정보가 누출될 수 있고, 외부 저장소에 중요 정보를 저장하게 되면 어느 어플이던지 외부 저장소에 접근이 가능하기 때문에 이 또한 민감한 정보가 유출될 수 있습니다.
- 내부 저장소
> 안드로이드 플랫폼, 시스템 등에서 사용되는 공간으로 안드로이드 API에 의해 권한이 통제됩니다. 쉽게말하자면 어플 마다 가지고있는 내부저장소 폴더가 있습니다.
- 외부 저장소
> 애플리케이션 간 데이터 공유가 가능하고 , WRITE_EXTERNAL_STORAGE 권한을 갖고 있는 애플리케이션은 설정에 따라 데이터를 읽고 쓰는 것이 가능합니다!
↓ 안드로이드 데이터를 저장하는 방법
항목 | 설명 |
Shared Preferences | 원시 데이터를 저장하는 XML 파일, boolean , float , int , long , string 을 지원 |
내부 저장소 | 각 앱이 가지고 있는 고유 공간.디렉터리 명이 본인의 패키지 이름과 같음 |
외부 저장소 | 앱 간의 데이터 공유가 가능한 디렉토리, 어디서든 읽고 쓰기가 가능 |
SQLite 데이터베이스 | 로컬 데이터베이스로 .DB 로 끝나는 팔일. /data/data"애플리케이션 패키지명"/databases경로에 생성됨. 실제 디바이스의 경우 보안상의 이유로 접근이 불가능하며 , 주로 서버와 통신하지 않는 간단한 앱을 만들때 사용 |
Network Connection | 네트워크로 데이터를 저장하거나 불러오는 방법으로 , SQLite 데이터베이스와 간단한 텍스트 파일 등을 보낼 수 있음 |
1. 취약점 진단 과정
1.1 sdcard(외부저장소) 진단
1. 우선 adb를 사용하여 NOX기기에 명령어창을 접속을 합니다.
2. sdcard 디렉토리에 접근후 ls 명령어를 통해 파일들을 살펴보자 기본 설치파일 이외에 Statements_dinesh.html 이라는 낯선 파일이 보입니다. 이 파일을 열어보겠습니다.
3. 보아하니 이 파일은 송금 내역을 저장하는 파일인 것 같습니다. 해당 파일엔 제가 송금했던 내역과 xss 공격을 시도했던 흔적들이 그대로 남아있습니다. sdcard 디렉토리는 외부앱에서도 접근이 가능하기 때문에 이런 정보를 저장해서는 절대 안됩니다.
1.2 내부 저장소 진단
1. 인시큐어 뱅크의 패키지명인 디렉토리 경로로 접근해주세요. 해당 디렉토리 폴더는 다음과 같습니다.
** cache , code_cache , databases , files , no_backup , shared_prefs
> cd /data/data/com.android.insecurebankv2
2. SharedPreferences 파일 확인을 위해 shared_prefs 폴더로 이동했습니다. 보아하니 xml 파일 두개가 존재하는데 저는 mySharedPreferences.xml 파일이 열어보고 싶네요. cat 명령어로 살펴보겠습니다.
3. mySharedPreferences.xml 파일은 계정의 아이디와 비밀번호를 암호화하여 저장한 파일이였습니다. 이 암호화같은 경우는 하드코딩 취약점이나 로컬 암호화 취약점 이슈로 복호화가 가능하다는 것을 지난번 포스팅에서 보여드렸습니다.
1.3 SQLite DB 진단
1. /data/data/com.android.insecurebankv2 경로로 오셔서 databases 폴더에 들어가시면 mydb , mydb-journal 이라는 DB파일 두개가 보일 것입니다. 저는 mydb 를 살펴보겠습니다.
2. db 파일이 있는 경로에서 sqlite3 [살펴볼 DB 명] 명령어를 사용해서 SQLite를 실행해줍니다.
> sqlite3 mydb
3. 사진을 보시면 아래의 명령어들을 순차적으로 입력하여 DB명 , 테이블 명 , DB내용 까지 추출한 것을 보실 수 있습니다. 보니깐 로그인한 내역을 저장하는 db인것 같습니다. 물론 기기에서 직접적으로 database 디렉토리에 접근이 불가능해서 이 자체로는 문제가 안되겠지만 앞서 배웠던 콘텐츠 프로바이더 취약점 과 연계가 된다면 충분히 위험할 수 있는 사항이니 DB에 비밀번호나 아이디 저장시 반드시 암호화를 진행한 후 저장해야 합니다.
> .database (DB명 출력)
> .tables (테이블 명 출력)
> select * from names; (names라는 테이블의 내용 출력)
2. 대응방안
1. "setStroageEncryption" API 이용
> 내부 저장소에 저장할 때 "setStroageEncryption" API 를 이용하면 내부 저장소에 저장되는 파일을 강제로 암호화 할 수 있습니다.
2. 암호화 알고리즘 사용
> SD카드에 저장해야 할 경우 반드시 AES같은 대칭키 암호화 알고리즘을 이용해 암호화 해야합니다.
3. SharedPreferences 모드설정
> SharedPreferneces 를 사용할때 모드를 설정해 줄 수 있습니다. 총 3가지의 모드가 있으며 다음과 같습니다. 특별한 경우가 없다면 보통 MODE_PRIVATE 를 사용하시는게 좋습니다.
MODE_PRIVATE | 앱 내부에서만 접근 할 수 있는 권한 |
MODE_WORLD_READABLE | 다른 앱에서의 접근을 허용 (읽기 권한) |
MODE_WORLD_WRITEABLE | 다른 앱에서의 접근을 허용 (쓰기 권한) |
긴 글 읽어주셔서 감사합니다!
'모바일 앱해킹(Android) > Insecure Bank' 카테고리의 다른 글
[Insecure Bank] 하드코딩 취약점 & 개발자 백도어 (0) | 2024.12.15 |
---|---|
[Insecure Bank] 안전하지 않은 HTTP 통신 & 파라미터 조작 (0) | 2024.12.14 |
[Insecure Bank] 안드로이드 백업 취약점 (0) | 2024.12.12 |
[Insecure Bank] 디버깅 취약점 & 런타임 조작 취약점 (0) | 2024.12.11 |
[Insecure Bank] 안드로이드 키보드 캐시 이슈 (0) | 2024.12.10 |