[안드로이드 모의해킹] 단말기 내 중요정보 저장

직접 연구하여 작성한 자료입니다. 공식 출처가 명시되지 않은 자료의 무단 복제, 사용을 금지합니다.
공격 기법은 학습용, 허가된 환경에서 실습 바랍니다. 실 운영망 대상 공격은 처벌받습니다. (정보통신망법 제48조 1항)

개요

앱이 설치되는 경로와 사용자 데이터가 분리되면, 앱과 사용자 데이터 간에 격리된 환경을 유지할 수 있다. 앱 간의 서로에 데이터에 접근하지 못하도록 방지하고, 민감한 정보의 유출을 예방할 수 있다. 하지만 앱의 사용자 데이터는 루트 사용자는 경로에 관계없이 접근할 수 있으며, 앱 업데이트나 제거와 무관하게 유지되는 경우가 있기 때문에 민감정보가 보관되어 있는 경우 보안에 취약해질 수 있다.

동적 분석에서의 중요정보 저장 취약점 진단은 정적분석과는 다르게 기능을 직접 실행하면서 쌓이는 데이터들을 보호하는 대책이 잘 마련되어 있는지 확인하는 과정이다.

단말에 저장되는 데이터를 관찰하는 방법에는 다양한 방법이 있다. 안드로이드 스튜디오의 ‘Device File Explorer’를 사용할 수 있으며, adb shell을 통해 쉘에 접근 후 직접 경로 탐색 명령(cd, ls )을 이용하여 디렉터리 및 파일 목록을 나열할 수 있다.

단말기 내 중요정보 저장의 취약여부를 판단할 때에는 정보기능두 가지 유형의 보호 대상이 안전하게 다루어지는지 살펴본다. 저장되는 정보 뿐만 아니라 정보를 참조하거나 변경할 수 있는 기능에 인가된 사용자만이 접근가능한지 여부도 확인해야 한다. 안드로이드 앱의 정보는 인텐트를 통해 전달되거나, 파일에 기록되거나, Shared Preferences 등을 통해 공유될 수 있다. 이 모든 과정에서 민감한 정보의 안전한 저장 및 전송이 필요하다.

진단방법

1)     앱 별 저장소(App-specific Storage)

시스템 기본 설치 앱은 ‘/system/app’ 경로 하위에 위치하고 사용자가 설치한 앱은 기본적으로 ‘/data/app’ 하위 경로에 저장된다. 설치 이후 사용자 데이터가 저장되는 위치는 ‘/data/data/[패키지명]’ 하위 경로에 저장된다.

APK 및 설치 시 디렉터리 구조

 

설치한 실습 앱이 위치하는 경로에 직접 접근하여 어떤 종류의 파일이 존재하는 지 확인한다. 아래에서 설명하는 API를 사용하는 것이 취약을 의미하는 것이 아님에 유의한다. 안드로이드에서는 사용하는 API에 대해 데이터를 저장할 위치를 문서화하여 제공하며, 앱 별로 어떤 데이터를 저장할 것인지에 대한 선택은 개발자가 결정한다. 루트권한을 가진 사용자나 다른 앱에서 저장한 데이터를 볼 수 있는 곳에 민감한 데이터를 평문으로 저장하도록 앱이 구성되어 있는 경우 취약하다고 진단한다. 따라서 아래에서 설명하는 경로 또한 개발자가 선택하는 것이므로 모든 경로가 존재하지 않을 수 있다. 앱을 진단할 때에는 런타임에 민감정보를 사용하고 사용 후에 잘 폐기되는지 확인한다.

 

(1) /data/data/[패키지명]/cache

  - 앱의 캐시파일, 임시파일이나 빠른 데이터 접근을 위한 캐시파일이 저장된다.

  - 별도의 권한없이 파일의 생성, 삭제가 가능하다. 다른 앱이나 사용자가 접근할 수 없으며 추가 디스크 공간이 필요할 때 캐시 폴더 내의 데이터부터 삭제된다. 다음은 캐시 파일을 생성하는 코드 예제이다.

(2) /data/data/[패키지명]/databases

  - 데이터베이스 관련 파일, 주로 SQLite 데이터베이스 파일이 저장된다.

  - 안드로이드는 SQLite를 내장형 데이터베이스로 사용하여 데이터를 저장하고 관리할 수 있다.

(3) /data/data/[패키지명]/files

- 앱이 생성한 파일, 주로 사용자가 생성한 파일이나 다운로드한 파일, 앱 설정 등을 포함한다.

- 별도의 권한 없이 파일의 생성, 삭제가 가능한다. 앱이 설치되어 있는 동안만 파일을 저장하고 유지한다. 앱이 삭제되면 경로 내 파일도 삭제된다.

(4) /data/data/[패키지명]/lib

- 앱의 네이티브 코드 라이브러리가 저장된다.

(5) /data/data/[패키지명]/shared_prefs

- SharedPreferences에는 앱의 설정이나 사용자 데이터, 상태 정보 등이 저장된다.

- 앱에서 간단한 데이터를 키-(key-value) 쌍의 형태로 저장하고 관리하는데 사용된다. 앱이 실행될 때 언어, 테마, 알림 설정 등 사용자가 기억하도록 설정한 값으로 실행하기 위한 값이 저장된다.

- 사용자 세션 상태나 로그인 정보를 저장해서 자동로그인에 사용할 수 있어 앱을 종료 후 재실행할 때 로그인 상태를 유지하도록 할 수 있다.

- SharedPreferences에 저장된 데이터는 복잡한 설정이 필요하지 않고 불러올 때 메모리에 캐시되기 때문에 속도가 빠르다는 장점이 있다.

[실습]

DIVA 앱으로 직접 데이터를 저장하는 방법과 위치를 확인할 수 있다. 코드와 기능을 비교하며 실행하여 취약점이 발생할 수 있는 위치를 분석할 수 있도록 한다. 각 문제별로 다루고 있는 저장소 위치는 다음과 같다.

- 3. Insecure Data Storage – Part 1 (SharedPreferences)

- 4. Insecure Data Storage – Part 2 (Databases)

- 5. Insecure Data Storage – Part 3 (Internal Storage)

 

2)     외부 저장소(External Storage)

SD카드와 같은 외부 저장소에 파일을 저장할 때에는 더 주의해야 한다. 외부 저장소 파일은 사용중인 앱 뿐만 아니라 ‘android.permission.WRITE_EXTERNAL_STORAGE’ 권한을 사용하도록 선언된 다른 모든 앱에 대해서도 읽기와 쓰기 권한이 허용된다. 개발의 용이성을 이유로 해당 권한을 선언한 이후 외부 저장소에 닷파일(.)[1]이나, 임의의 폴더를 생성하여 파일을 저장하고 활용하기도 한다.

외부 메모리의 파일은 악성코드나 다른 앱에 의해 쉽게 변조되거나 삭제될 수 있다.

val externalFile = File(context.getExternalFilesDir({Environment Type}, "file.txt")

코드. 외부저장소 파일 생성 코드

💡 안드로이드 API 29 이후 변경점

외부 저장소에 저장된 파일에 대해 더 세밀하게 제어하도록 ‘범위 지정 저장소(Scoped Storage)’ 개념이 도입되었다. 외부 저장소에 저장되는 파일에도 앱 별 디렉터리와 앱에서 만든 특정 유형의 미디어만 접근할 수 있도록 제한할 수 있다.

개발 반영 유예기간이 적용된 이후 API Level 30이상이 적용된 앱은 매니페스트에 선언된 WRITE_EXTERNAL_STORAGE 권한은 무시되며 ‘범위 지정 저장소’ 정책을 따라야 한다.
 

[실습]

DIVA 앱으로 직접 외부 저장소에 데이터를 저장하는 방법과 위치를 확인할 수 있다.

- 6. Insecure Data Storage – Part 4 (External Storage)

 

 

 

반응형