6. DVIA 앱 진단 (1) - Local Data Storage
[목차]
# Local Data Storage 설명
1. Plist
2. UserDefaults
3. Keychain
4. Core Data
5. Webkit Caching (사라진 취약점)
6. Realm
7. Couchbase Lite
8. YapDatabase
9. 요약
- Local Data Storage 항목별 확인 경로
# Local Data Storage 설명
(내부 데이터 저장소)
: iOS 애플리케이션은
임시 데이터와 영구 데이터를 저장하기 위해
로컬 시스템과 상호작용함
: 애플리케이션이 중요한 정보를 임시/영구 형식으로
안전하지 않은 상태로 저장하면(평문형태) 위험이 발생함
(ex. 자동 로그인 기능이 있어 체크하는 경우
내부 저장소에 로그인 정보가 평문 형태로
저장되는 경우가 있음)
: DVIA 앱에서는 여덟 가지 데이터 저장소에 대해 진단함
내부에 저장하기 위한 형식 종류
• XML & Plist
• SQLite files
• Keychain data
• Core data
• NSUserDefaults class
• Temporary File (data cache)
•...
![](https://blog.kakaocdn.net/dn/Srxn8/btrQuI15smk/tVKwuqkDVK8yrA2VG5r6dk/img.png)
하나씩 살펴본다.
1.Plist
![](https://blog.kakaocdn.net/dn/kIh7O/btrQrsMUjGc/Az6JaOw8hEDOBsEQycE1bk/img.png)
# 실습
![](https://blog.kakaocdn.net/dn/n4tTG/btrQuI15sle/jKKP2C6dwtnnMiI7zcVwF0/img.png)
0) Plist 항목에 들어간 후 아이디/비번 저장
![](https://blog.kakaocdn.net/dn/nCaRy/btrQq4laUSP/dFKcLX4XWk12QxgBKDWfkk/img.png)
어딘가에 저장이 되었고
확인해 봐야하는 저장소는
ㄱ. 번들 컨테이너
Applications(User)
/var/containers/Bundle/Application/진단앱
ㄴ. 데이터 컨테이너
/private/var/mobile/Containers/Data
이상 두 군데이다.
1) 번들 컨테이너 확인
Applications(User)
/var/containers/Bundle/Application/
> 수정된 날짜 가장 최신순으로 정렬 (DVIA-v2)
![](https://blog.kakaocdn.net/dn/bhfHw2/btrQsFEIXIz/yj3RkKPKgVZ0a0Igo2KIp1/img.png)
/DVIA-v2.app 접속
![](https://blog.kakaocdn.net/dn/R7bwk/btrQsFSinRH/L7X7dVcQ8754nkn1uIQlP1/img.png)
Info.plist 파일 더블클릭
![](https://blog.kakaocdn.net/dn/Zr5mU/btrQuIuf0r7/w7ZJFUQnfqpUz7YVsfXIUk/img.png)
내용 확인이 가능하며
Export 또는 복사 후 노트패드로 옮긴 후
아이디/비번이 저장되어 있는지 확인
![](https://blog.kakaocdn.net/dn/AGuTR/btrQrtZo1R7/sDMjmqVxIZkQFvkHBXb7Kk/img.png)
![](https://blog.kakaocdn.net/dn/eekSB4/btrQruqsB42/SuP7tlgfwLFXksP1LPlcfK/img.png)
없음!
2) 데이터 컨테이너 확인
/private/var/mobile/Containers/Data/Application/
: 수정된 날짜 가장 최신순으로 정렬
![](https://blog.kakaocdn.net/dn/kNkrX/btrQqjC7sax/kjshQTudr90KlcKpyzp2k1/img.png)
이후 /Documents 폴더 내
userInfo.plist 를 열어보면
![](https://blog.kakaocdn.net/dn/bxVFFo/btrQsFLu4cM/dTUlU6I9G1d33gn9fjJE0K/img.png)
중요정보가 저장되어 있음
![](https://blog.kakaocdn.net/dn/5Lagd/btrQvZP0G2H/RCPKhUg3D8vQUUMRg60eRK/img.png)
실제 진단 시에는
모든 디렉터리를 하나씩 다 확인해야 한다.
2. UserDefaults
![](https://blog.kakaocdn.net/dn/bHvD7B/btrQsGjlzDC/89t4Aik8U9Ge1TDG5PKEPK/img.png)
# 실습
![](https://blog.kakaocdn.net/dn/cVllSv/btrQuIHMBwj/2p5kd3ZokKaxm9bswtCED1/img.png)
0) UserDefaults 항목에 들어간 후 데이터 저장
![](https://blog.kakaocdn.net/dn/d1JG0J/btrQsDfVnKZ/DtnT8KARUoBCn4X0uFouX1/img.png)
1) 파일 경로 진입
/private/var/mobile/Containers/Data/Application/UUID/Library/Preferences
![](https://blog.kakaocdn.net/dn/nIMik/btrQqIWX7S4/MhbkEKOH7V52deF25yWKMk/img.png)
UserDefaults 역시 Plist 파일로 저장됨
2) 파일 확인
![](https://blog.kakaocdn.net/dn/crHvyF/btrQrr8i2br/iYyFuQKMEIaXzsBca37yaK/img.png)
입력 데이터가 평문으로 저장된다!
3. KeyChain
![](https://blog.kakaocdn.net/dn/ww1JN/btrQrFysJKX/z2UjWkCwNCBkFEOtZd0P70/img.png)
iOS 키체인은 암호화된 데이터베이스!
키체인은 SQLite DB로 구현되어 있음!
보안상 안전해 보이지만 복호화 도구(keychain_dumper)가
존재함
# KeyChain 덤프 실습
– DVIA-v2 앱의 [Local Data Storage > Keychain] 항목에서 테스트 가능
– /private/var/Keychains/keychain-2.db 에 키체인 데이터가 저장됨
– 키체인 항목을 확인하기 위해 keychain_dumper 도구 사용 (키체인은 암호화된 데이터베이스)
– Keychain_dumper 도구를 사용하면 탈옥된 디바이스의 키체인 내용을 덤프 가능
1) keychain_dumper 다운
https://github.com/ptoomey3/Keychain-Dumper/releases
![](https://blog.kakaocdn.net/dn/0Ij0G/btrQqKUPY1b/ezdXyVUbT1qaKpW0kMNg20/img.png)
zip 파일 다운
2) 디바이스에 저장
압축 해제하지 않은 상태로
간단히 드래그&드롭으로
디바이스 내 아무곳에나 던져 넣기
![](https://blog.kakaocdn.net/dn/UWM6u/btrQq3fuYnW/yGbRb8xzZIkVifXF6xOCl1/img.png)
> 압축 해제해서 넣어도 상관 없고
ssh로 붙어서 unzip 후 실행 권한 주고
실행!
3) putty 접속 후 unzip > 권한 주고 실행
![](https://blog.kakaocdn.net/dn/DnwxS/btrQr6WTuje/1oa51L6Cd8gQczYMsSGSJ0/img.png)
* 특정 버전에서는 에러 나서 정상 수행 안됨
4) DVIA 키체인 데이터 입력 후 keychain 덤프 실행
![](https://blog.kakaocdn.net/dn/bURycu/btrQvYKY4Hz/wPzS2YF4nF3RQz6CAsHtgk/img.png)
# keychain-2.db 파일을 SQLite 브라우저 설치 후 확인해보기
https://sqlitebrowser.org/dl/
![](https://blog.kakaocdn.net/dn/bx8dPu/btrQyvn3vAd/ixbxOTCVf6GbNVNW3Ku75k/img.png)
![](https://blog.kakaocdn.net/dn/7BY3w/btrQvPgjfxk/oSIgIDEjg8zbq5n4yRNYPk/img.png)
4. Core Data
![](https://blog.kakaocdn.net/dn/FPbKm/btrQAxly14o/SuGn24jmdOvgD2J4zzxuJK/img.png)
MVC 모델 : 디자인 패턴
Model View Controller
![](https://blog.kakaocdn.net/dn/bfnUAS/btrQw11Nt2N/mwqdKUXZTsHvKoH0HmcOB0/img.png)
# 실습
1) 데이터 입력
![](https://blog.kakaocdn.net/dn/b8dHR7/btrQr3GFXtR/dlfkYdeTKsqUKfK5mqKhHK/img.png)
2) Core Data 경로 접근 후 sqlite 파일 export
/private/var/mobile/Containers/Data/Application/BEE532A2-5DCF-40B3-8C8F-DE3D425103FA/Library/Application Support
![](https://blog.kakaocdn.net/dn/nqEzj/btrQvY5ijAL/pKt7bkjqkid25Aks8IiXUK/img.png)
3) sqlite 브라우저로 확인
![](https://blog.kakaocdn.net/dn/W8848/btrQyW0cNLT/PWLogttBC0ZSbEnqn6VniK/img.png)
코어 데이터는 테이블 이름 앞에
Z가 붙고 데이터를 확인해보면
![](https://blog.kakaocdn.net/dn/b24k3D/btrQrEUxVS1/cnbUgeObZ2H0cRmPjm4Cm1/img.png)
입력 데이터 평문 노출 확인!
5. Webkit Caching
**Web View는 2020년 4월 이후로 사라진 취약점!**
![](https://blog.kakaocdn.net/dn/opq9g/btrRcGQ4rNQ/WxG7E1InhTnwYM7KZusvr0/img.png)
![](https://blog.kakaocdn.net/dn/biY9sr/btrRcFq8jIv/uK8RujmkuLOCr6SkT9Erkk/img.png)
# 실습
1) 확인 경로
/priavate//var/mobile/Containers/Data/Application/AppUUID/Library/Caches
![](https://blog.kakaocdn.net/dn/ODXXm/btrRcQ6ZIWM/GIGg5vJY7iwC4kkCrZxPvK/img.png)
사진 설명을 입력하세요.
![](https://blog.kakaocdn.net/dn/bbQ2rG/btrRb7IdnPo/09c2haw05HaHpYZKqAwqQk/img.png)
추출 후 확인 가능!
![](https://blog.kakaocdn.net/dn/dpf5pw/btrRdBO0nwh/iLvN6wh30C8pbA1BrKtYo1/img.png)
6. Realm
진단 수행 대상이
realm DB를 사용하는 경우
해당 취약점 확인!
![](https://blog.kakaocdn.net/dn/IkfFA/btrReKY1n38/1JLZmMPILNU7JdSGk1xeeK/img.png)
![](https://blog.kakaocdn.net/dn/bgUrPC/btrRfJr1YLq/NCd8TsXWb4HDH8m8AfK3NK/img.png)
# 실습
1) 데이터 입력
![](https://blog.kakaocdn.net/dn/cteD3E/btrRa3zgn8M/RkLYFBdtY69KuXjHIOMvf1/img.png)
2) 파일 확인 후 export
/private/var/mobile/Containers/Data/Application/APPUUID/Documents/file.realm
![](https://blog.kakaocdn.net/dn/bxz9Zx/btrRb8NTHuL/IiJ50Wli7uRVAgzGsDW63k/img.png)
3) realm studio 설치 후 파일 확인
https://www.mongodb.com/docs/realm-legacy/kr/products/realm-studio.html
![](https://blog.kakaocdn.net/dn/dL49IO/btrRcQFUpAM/D3iVxKJNKUrbMV44V6Dfa1/img.png)
데이터가 출력되지 않지만
실무에서 realm DB를 사용하는 경우
realm studio를 통해 이상없이 데이터 확인 가능
7. Couchbase Lite
![](https://blog.kakaocdn.net/dn/cCxWJ3/btrRaEsJJql/50yeAfGXRMJyI7ccjFSk01/img.png)
# 실습
1) 데이터 입력
![](https://blog.kakaocdn.net/dn/n9Zx7/btrRdw1gcRV/Xv9aTkrxiakzkNmw6UZd61/img.png)
2) 파일 경로 확인 후 export
/private/var/mobile/Containers/Data/Application/UUID/Library/Application Support
![](https://blog.kakaocdn.net/dn/bEw8x5/btrRdCUHXBT/A1k4FPyfXQvwQ4mjlVnkC1/img.png)
![](https://blog.kakaocdn.net/dn/eEiQXQ/btrQ8HJXDUC/UiaUAR6aPRfCmWKn2zTaJk/img.png)
3) SQLite 브라우저로 확인
![](https://blog.kakaocdn.net/dn/bwZqZg/btrRebJiXtq/GRGeuBcbgM3kxhU0sNfjx0/img.png)
8. YapDatabase
![](https://blog.kakaocdn.net/dn/mK2kI/btrRb8mNdII/bU8EKpupk3ia6Tp0imH3A1/img.png)
# 실습
1) 데이터 입력
![](https://blog.kakaocdn.net/dn/cbfjKR/btrRcPUxmhF/hPgpkU183viKp7B9zrMvVk/img.png)
2. 파일 경로 확인
/private/var/mobile/Containers/Data/Application/APPUUID/Library/Application Support
![](https://blog.kakaocdn.net/dn/VwkTn/btrRbZi48eL/B79R5YnD3kf2j6WZmzKLHK/img.png)
3. 파일 확인
![](https://blog.kakaocdn.net/dn/7aPec/btrQ8IozSJu/bWIkbxuKWMK7SvoPGrozKk/img.png)
데이터가 출력되지 않지만
실무에서 yap DB를 사용하는 경우
이상없이 데이터 확인 가능
10. 요약
Local Data Storage 항목별 확인 경로
(1) plist (file.plist 파일 확인)
ㄱ. 번들 컨테이너 - Applications(User) : /var/containers/Bundle/Application/진단앱
ㄴ. 데이터 컨테이너 - /private/var/mobile/Containers/Data
(2) UserDefault (info.plist 파일 확인)
/private/var/mobile/Containers/Data/Application/UUID/Library/Preferences/파일.plist
(3) Keychain (keycahin_dumper로 확인)
/private/var/Keychains/keychain-2.db
keychain_dumper로 확인
(4) CoreData (sqlite 브라우저로 확인)
/private/var/mobile/Containers/Data/Application/APPUUID/Library/Application Support
(5) Webkit Caching (2020년 4월 이후로 사라진 취약점) (sqlite 브라우저로 확인)
/private/var/mobile/Containers/Data/Application/AppUUID/Library/Caches
(6) Realm (realm DB 사용하는 곳이라면 realm studio로 확인 가능)
/private/var/mobile/Containers/Data/Application/APPUUID/Documents/file.realm
(7) Couchbase Lite (sqlite 브라우저로 확인)
/private/var/mobile/Containers/Data/Application/APPUUID/Library/Application Support
(8) YapDatabase.sqlite (yap DB를 사용하는 곳인지 먼저 확인)
/private/var/mobile/Containers/Data/Application/APPUUID/Library/Application Support
# 대응방안
![](https://blog.kakaocdn.net/dn/dtqORS/btrRcElqSti/kxoUaZsAkZBAA4wag6OItk/img.png)
# 내용 및 일부 이미지 출처
: 보안프로젝트 김태영 팀장 iOS 모바일 앱 모의해킹(기초) 강의 PDF