1. Local Data Storage 개요
- IOS 애플리케이션은 임시 데이터와 영구 데이터를 저장하기 위해 로컬 시스템과 상호작용함
- 애플리케이션이 중요한 정보를 임시/영구 형식으로 안전하지 않은 상태로 저장하면 위험이 발생함
- 내부에 저장하기 위한 다양한 형식이 존재
2. Local Data Storage의 종류 및 실습
1. Plist
- Plist 파일
- 애플리케이션 데이터 및 설정 정보를 저장하는데 사용되는 XML 파일
- 저장된 정보는 암호화가 되지 않아 중요 정보를 저장하면 안됨
- Info.plist에는 버전 정보, 실행가능한 바이너리 이름, 지원되는 IOS 버전 및 디바이스 모델 등의 정보가 저장(Bundle Container)
- 이 외에도 plist 형식을 사용해 앱에서 필요한 데이터를 내부 저장소에 저장(Data Container)
Plist 항목에서 아이디, 패스워드 저장
데이터가 저장되는 경로
1. /var/containers/Bundle/Application/$uuid/DVIA-v2.app/Info.plist (Bundle Container)
2. /private/var/mobile/Containers/Data/Application/$uuid/ (Data Container)
번들 컨테이너에 있는 info.plist에서 아이디를 검색 시 발견되지 않음
데이터 컨테이너로 접근 시 입력한 아이디와 비밀번호가 저장되어 있음을 확인
2. UserDefaults
- UserDefault 취약점에서 NSUserDefaults 클래스를 사용하여 저장
- NSUserDefaults 클래스
- 사용자 기본 설정 및 속성을 저장하는 가장 일반적인 방법 중 하나
- 애플리케이션을 종료하고 재시작해도 정보는 계속 유지
- 로그인 상태 저장에 사용될 때도 있음 (계정정보, 접근 토큰 등)
- 해당 클래스로 저장한 데이터는 암호화되지 않은 상태로 plist 파일에 저장
'Save in NSUserDefaults' 버튼을 클릭해서 데이터 저장
해당 경로에 입력한 문자열이 평문으로 저장
3. Keychain
- IOS 키체인은 암호화 키와 세션 토큰과 같은 짧고 민감한 데이터 비트를 안전하게 저장할 수 있는 암호화된 데이터베이스
- 키체인은 API를 통해 접속할 수 있고 SQLite 데이터베이스로 구현
- macOS에서는 모든 애플리케이션이 원하는 만큼 키체인을 만들 수 있으며, 로그인 계정마다 키체인이 존재하지만, IOS의 키체인은 모든 앱에서 하나의 키체인만 사용할 수 있음
- kSecAttrAccessGroup 속성의 접근 그룹 기능을 통해 동일한 개발자가 서명한 앱 간 항목에 대한 접근 공유 가능
- 키체인에 대한 접근은 securityd 데몬에 의해 관리됨
- 앱의 키체인 액세스 그룹, 애플리케이션 식별자 및 애플리케이션 그룹 사용 권한에 따라 관리됨
- /pirvate/var/Keychains/keychain-2db에 키체인 데이터가 저장됨
- 키체인 항목을 확인하기 위해 keychain_dumper 도구 사용 (키체인은 암호화된 DB)
- Keychain_dumper 도구를 사용하면 탈옥된 디바이스의 키체인 내용을 덤프 가능
'Save in Keychain' 버튼을 클릭해서 입력한 문자열 저장
키체인 덤퍼 압축파일을 해제 후 해당 파일에서 권한 변경
keychain_dumper 실행파일 권한을 변경 후 실행 시 해당 결과를 텍스트파일에 저장
kw.txt 파일 생성 확인
입력한 값이 저장되어 있는 것을 확인 또한 가장 위의 bundle 아이디를 통해서도 검색이 가능하다
4. Core Data
- Core Data는 애플리케이션의 모델 객체를 관리(MVC)하기 위한 프레임워크
- Core Data는 SQLite를 영구 저장소로 사용할 수 있지만, 프레임워크 자체는 데이터베이스가 아님
- SQLite는 관계형 데이터베이스로 모바일 디바이스와 같은 시스템에 적합한 경량 데이터베이스 엔진을 구현
- Core Data는 모델을 만들고, 서로 다른 유형의 개체 간의 관계를 관리하고, 데이터를 로컬로 저장하고, 쿼리를 원할 때마다 로컬 캐시에서 가져오는 기능을 함
- SQLite와 다른 점은 데이터베이스 테이블명 앞에 Z 문자가 추가
- Core Data에 저장된 데이터는 암호화되지 않아서 중요한 정보를 저장하면 안됨
- 중요한 정보를 저장하려면 암호화된 데이터 저장을 할 수 있는 라이브러리를 사용해야 함
- 사용자가 입력한 데이터가 평문으로 노출
- /private/var/mobile/Containers/Data/Application/$uuid/Library/Application Support/Model.sqlite
데이터 입력 후 'Save in Core Data' 버튼 클릭
SQLite 관련 파일들 export
Model.sqlite 파일을 DB Browser for SQLite로 db 구조 확인
5. Realm
- Realm 데이터베이스는 IOS 또는 안드로이드에서 사용되는 작은 데이터베이스
- 설정에 암호화가 활성화되어 있지 않으면 암호화되지 않은 상태로 저장
- /private/var/mobile/Containers/Data/Application/$uuid/Documents/default.realm
아이디, 패스워드 입력 후 'Save in Realm database' 버튼 클릭
해당 파일들 export
Realm DB 설치 후 default.realm 파일 열기
데이터가 암호화되지 않는다면 해당 계정정보는 평문으로 노출
3. 대응방안
- 개인정보, 인증정보와 같은 중요 정보는 디바이스 내에 저장하지 않아야함
- 디바이스에 데이터를 저장해야할 경우 암호화하여 저장
[도움 및 출처]
보안프로젝트 김태영 팀장 해커를 위한 iOS 앱 모의 해킹 전문 과정
'IOS 모의해킹' 카테고리의 다른 글
6. Runtime Manpulation(2) (0) | 2023.03.13 |
---|---|
5. Runtime Manpulation(1) (0) | 2023.03.12 |
4. Excessive Perimssions (0) | 2023.03.11 |
3. Jailbreak Detection (2) (0) | 2023.03.09 |
2. Jailbreak Detection (1) (0) | 2023.03.09 |