사용자가 입력한 값이 plist file에 저장되는데, 앱 샌드박스 내 어디에 위치하는지 찾아야 한다.
DIVA-v2 앱 - Local Data Storage - Plist 항목 선택 후 아이디/패스워드 입력한다.
아이폰에 SSH로 접근하여 AppName.app(앱과 모든 리소스를 포함하는 디렉토리)을 검색했다.
찾은 디렉토리 내부에서 Info.plist 파일을 찾았다.
그러나 해당 파일 내에는 입력했던 값이 존재하지 않았다.
분명히 문제에서는 입력한 값이 plist 파일에 저장된다고 했는데, .app 디렉토리 내부에 있는 .plist 파일을 다 확인해봤지만 값이 존재하지 않았다.
찾아보니 iOS의 파일시스템은 아래와 같이 샌드박스 구조로 되어 있다고 한다.
내가 확인한 .app 디렉토리는 샌드박스 내 Bundle Container로, 실행 가능 파일, info.plist, Resources 등을 함께 그룹화한다.
그리고 읽기 전용이므로, 수정이 필요한 경우 Data Container로 옮겨서 작업한다고 한다.
Data Container 경로는 /var/mobile/Containers/Data/Application/$uuid 이다.
해당 디렉토리로 들어가보면 디렉토리 이름들이 한 눈에 알아보기 어려운 구조로 되어 있다.
따라서 수정된 날짜가 가장 최근인 디렉토리에 접근했다.
디렉토리는 이런 구조로 되어 있다.
각 디렉토리마다 다음과 같은 역할을 한다.
Documents
사용자가 생성한 문서, 데이터와 외부 앱에서 받은 파일들이 저장되는 공간Library
유저 데이터 파일 및 임시파일을 제외한 모든 파일을 관리Tmp
임시파일들을 위한 저장소
Document 디렉토리 내부에 userInfo.plist 파일이 있는데, 이를 확인해보면 앱에서 입력한 값이 저장되어 있음을 알 수 있다.
따라서 계정 정보와 같은 중요 정보는 파일시스템 내부에 저장되지 않도록 해야 한다.
입력값이 NSUserDefaults에 저장된다고 한다.
이 값이 앱 샌드박스 내 어디에 저장되어 있는지 찾아야 한다.
NSUserDefaults는 앱이 실행되는 동안 Key-Value 형태로 데이터를 저장하는 사용자의 기본 데이터베이스에 대한 인터페이스라고 한다.
쉽게 말해서 앱이 삭제되기 전까진 샌드박스 내 영구적으로 저장되는 Preferences 데이터들을 말한다.
기본 데이터베이스는 Property List를 기반으로 .plist 확장자 파일에 xml 형식으로 저장되며,
샌드박스 내부 Data Container > Library > Preferences > .plist에 저장된다.
위 경로에서 .plist 파일을 찾을 수 있고, 파일 내부를 확인해보면 입력했던 값이 저장되어 있음을 알 수 있다.
UserDefaults에 저장되는 데이터 역시 key-value 형태의 평문으로 저장되므로, 노출되지 않아야 하는 데이터가 저장되지 않아야 한다.
입력값이 keychain 이라는 곳에 저장되고, 이를 찾아 dump 하여 저장된 값을 알아내야 한다.
Keychain은 앱에서 사용하는 계정 정보, 토큰 값 등 민감한 정보를 저장하는데 사용하는 안전한 저장소라고 한다.
이는 암호화된 sqlite 데이터베이스 파일로, /private/var/Keychain/keychain-2.db 에 저장된다.
https://github.com/ptoomey3/Keychain-Dumper/releases/tag/1.0.0
위 url에서 keychain dumper를 다운로드 받아 아이폰 내부에 파일을 이동시킨다.
그 후, 깃허브에 있는 가이드대로 해당 파일에 실행 권한을 부여하여 실행한다.
결과를 확인해보면 입력했던 값이 keychain data에 저장되어 있음을 알 수 있다.
keychain에 데이터를 저장할 때도 암호화를 하지 않는다면 위와 같은 프로그램으로 간단하게 추출하여 평문으로 확인이 가능하다.
입력값이 Core Data 프레임워크에 저장되며, 장치 내 해당 데이터를 찾아야 한다.
Core Data는 데이터를 저장하고 관리하기 위한 프레임워크로, SQLite 데이터베이스 기반이라고 한다.
CoreData를 사용하면 Library/Application Support에 .sqlite파일이 생성되고, 이를 통해 내부에 저장된 데이터를 읽고/수정하는 것이 가능하다.
해당 디렉토리에 접근하면 Model.sqlite 파일이 존재하는데, 해당 파일을 SQLite DB Brower로 열어보았다.
네이밍이 Z로 시작하는 테이블로 구성되어 있고,
그 중 ZUSER 테이블 내에 입력했던 값들이 평문으로 노출되고 있다.