본문 바로가기

IOS 모의해킹

1. Local Data Storage

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 구조 확인

이름 앞에 Z가 추가되었으며, 입력한 데이터가 평문으로 저장되고 있는 것을 확인

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