iOS Basics

htARTE (HackTricks AWS Red Team Expert)를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요!

HackTricks를 지원하는 다른 방법:

Privilege Separation and Sandbox

iOS에서는 사용자 접근 가능한 애플리케이션과 시스템의 핵심 프로세스 간에 권한 분리가 존재합니다. 애플리케이션은 mobile 사용자 ID로 실행되고, 중요한 시스템 프로세스는 **root**로 작동합니다. 이러한 분리는 애플리케이션이 수행할 수 있는 작업에 엄격한 제한을 부과하는 샌드박스 메커니즘에 의해 강화됩니다. 예를 들어, 애플리케이션이 동일한 사용자 ID를 공유하더라도 다른 애플리케이션의 데이터에 액세스하거나 수정하는 것은 금지됩니다.

애플리케이션은 특정 디렉토리 (private/var/mobile/Applications/{random ID})에 설치되며, SMS 및 전화와 같은 일부 시스템 영역과 기능에 대한 제한된 읽기 액세스 권한을 갖습니다. 보호된 영역에 대한 액세스는 사용자 권한 요청 팝업을 트리거합니다.

Data Protection

iOS는 데이터 보호 API를 제공하며, 이는 암호 작업 및 키 관리를 위한 전용 보안 엔클레이브 프로세서 (SEP) 위에 구축되어 있습니다. SEP는 장치 고유의 키인 장치 UID를 내장하여 데이터 보호 무결성을 보장합니다.

파일 생성 시 고유한 256비트 AES 암호화 키가 생성되어 파일의 내용을 암호화합니다. 이 암호화 키와 클래스 ID는 클래스 키로 암호화된 후 파일의 메타데이터에 저장됩니다. 파일을 복호화하려면 시스템 키를 사용하여 메타데이터에 액세스하고, 클래스 ID로 클래스 키를 검색한 다음 파일의 고유한 암호화 키를 복호화해야 합니다.

iOS는 데이터 보안을 위해 네 가지 보호 클래스를 정의하며, 데이터에 언제와 어떻게 액세스할 수 있는지를 결정합니다:

  • Complete Protection (NSFileProtectionComplete): 사용자의 패스코드를 사용하여 장치가 잠긴 상태에서 데이터에 액세스할 수 없습니다.

  • Protected Unless Open (NSFileProtectionCompleteUnlessOpen): 장치가 잠긴 상태에서도 파일이 열린 채로 있으면 파일에 액세스할 수 있습니다.

  • Protected Until First User Authentication (NSFileProtectionCompleteUntilFirstUserAuthentication): 부팅 후 첫 번째 사용자 잠금 해제 이후에 데이터에 액세스할 수 있으며, 장치가 다시 잠겨도 액세스할 수 있습니다.

  • No Protection (NSFileProtectionNone): 데이터는 장치 UID로만 보호되며, 원격 데이터 삭제를 빠르게 수행할 수 있습니다.

NSFileProtectionNone를 제외한 모든 클래스의 암호화는 장치 UID와 사용자의 패스코드에서 파생된 키를 사용하여 수행되므로, 올바른 패스코드가 있는 장치에서만 복호화가 가능합니다. iOS 7부터는 기본 보호 클래스가 "Protected Until First User Authentication"입니다.

개발자는 iPhone의 파일 데이터 보호 클래스를 검사하는 FileDP 도구를 사용할 수 있습니다.

# Example code to use FileDP for checking file protection class
# Note: Ensure your device is jailbroken and has Python installed to use FileDP.
# Installation and usage of FileDP:
git clone https://github.com/abjurato/FileDp-Source
cd FileDp-Source
python filedp.py /path/to/check

키체인

iOS에서 **키체인(Keychain)**은 민감한 정보를 안전하게 저장하기 위한 암호화된 컨테이너로, 저장한 애플리케이션이나 명시적으로 허가된 애플리케이션만이 접근할 수 있습니다. 이 암호화는 iOS에서 생성된 고유한 비밀번호에 의해 보호되며, 이 비밀번호 자체도 AES로 암호화됩니다. 이 암호화 과정은 사용자의 패스코드와 장치의 UID에서 파생된 솔트를 결합하는 PBKDF2 함수를 사용합니다. 이 솔트는 보안 엔클레이브 칩셋만이 액세스할 수 있는 구성 요소입니다. 따라서 사용자의 패스코드가 알려져 있더라도, 키체인 내용은 원래 암호화된 장치 이외의 장치에서는 액세스할 수 없습니다.

키체인 데이터의 관리 및 액세스Keychain-access-groupsapplication-identifier와 같은 특정 앱 권한에 기반하여 securityd 데몬이 처리합니다.

키체인 API 작업

키체인 API는 애플의 키체인 서비스 문서에서 자세히 설명되어 있으며, 안전한 저장소 관리를 위한 필수 기능을 제공합니다:

  • SecItemAdd: 새로운 항목을 키체인에 추가합니다.

  • SecItemUpdate: 키체인의 기존 항목을 업데이트합니다.

  • SecItemCopyMatching: 키체인에서 항목을 검색합니다.

  • SecItemDelete: 키체인에서 항목을 제거합니다.

키체인 비밀번호의 무차별 대입 공격은 암호화된 키를 직접 공격하거나 장치 자체의 패스코드를 추측하는 것을 의미합니다. 그러나 보안 엔클레이브는 실패한 시도 사이에 지연을 강제하므로 이러한 공격은 크게 어렵습니다.

키체인 항목 데이터 보호 구성

키체인 항목의 데이터 보호 수준은 항목 생성 또는 업데이트 중 kSecAttrAccessible 속성을 사용하여 설정됩니다. 이러한 수준은 애플에서 지정한대로 키체인 항목의 액세스 가능 시기와 방법을 결정합니다:

  • kSecAttrAccessibleAlways: 장치 잠금 상태와 관계없이 언제든지 액세스 가능합니다.

  • kSecAttrAccessibleAlwaysThisDeviceOnly: 항상 액세스 가능하지만 백업에 포함되지 않습니다.

  • kSecAttrAccessibleAfterFirstUnlock: 재시작 후 첫 번째 잠금 해제 이후에 액세스 가능합니다.

  • kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly: 위와 동일하지만 새로운 장치로 이전할 수 없습니다.

  • kSecAttrAccessibleWhenUnlocked: 장치가 잠금 해제된 경우에만 액세스 가능합니다.

  • kSecAttrAccessibleWhenUnlockedThisDeviceOnly: 잠금 해제된 경우에만 액세스 가능하며 백업에 포함되지 않습니다.

  • kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly: 장치 패스코드가 필요하며 백업에 포함되지 않습니다.

**AccessControlFlags**는 생체 인증 또는 패스코드 사용을 허용하여 액세스 방법을 더욱 세분화합니다.

탈옥된 장치 경고

탈옥된 장치에서는 키체인의 보호 기능이 손상되어 중대한 보안 위험을 초래할 수 있습니다.

키체인 데이터의 지속성

앱 제거 시 삭제되지 않는 앱별 데이터와 달리, 키체인 데이터는 장치에 지속됩니다. 이 특성은 중고 장치의 새로운 소유자가 앱을 다시 설치함으로써 이전 소유자의 애플리케이션 데이터에 액세스할 수 있게 할 수 있습니다. 개발자는 이러한 위험을 완화하기 위해 앱 설치 시 또는 로그아웃 중에 키체인 데이터를 적극적으로 지우는 것이 좋습니다. 다음은 첫 번째 앱 실행 시 키체인 데이터를 지우는 방법을 보여주는 Swift 코드 예시입니다:

let userDefaults = UserDefaults.standard

if userDefaults.bool(forKey: "hasRunBefore") == false {
// Remove Keychain items here

// Update the flag indicator
userDefaults.set(true, forKey: "hasRunBefore")
userDefaults.synchronize() // Forces the app to update UserDefaults
}

앱 기능

앱 개발의 영역에서 샌드박싱은 보안을 강화하는 데 중요한 역할을 합니다. 이 과정은 각 앱이 고유한 홈 디렉토리 내에서 작동하도록 보장하여 다른 앱의 시스템 파일이나 데이터에 접근하지 못하도록 합니다. 이러한 제한은 신뢰할 수 있는 BSD(MAC) 강제 접근 제어 프레임워크의 일부인 샌드박스 정책을 통해 시행됩니다.

개발자는 데이터 보호 또는 키체인 공유와 같은 특정 기능 또는 권한을 앱에 구성할 수 있습니다. 이러한 권한은 앱이 설치된 직후에 즉시 적용됩니다. 그러나 특정 보호된 리소스에 액세스하기 위해서는 앱이 첫 번째 시도 시 사용자로부터 명시적인 동의를 얻어야 합니다. 이는 퍼미션 요청 알림에서 사용자에게 제시되는 목적 문자열 또는 _사용 설명 문자열_을 통해 달성됩니다.

소스 코드에 액세스할 수 있는 경우, Info.plist 파일에 포함된 권한을 확인할 수 있습니다. 다음 단계를 따릅니다:

  1. Xcode에서 프로젝트를 엽니다.

  2. Info.plist 파일을 찾아 엽니다.

  3. "Privacy -"로 접두사가 붙은 키를 검색하고, 명확한 키/값을 확인할 수 있는 옵션을 선택합니다.

IPA 파일을 다룰 때는 다음 단계를 따를 수 있습니다:

  1. IPA 파일을 압축 해제합니다.

  2. Payload/<앱이름>.app/ 내에서 Info.plist 파일을 찾습니다.

  3. 필요한 경우 파일을 XML 형식으로 변환하여 쉽게 검사합니다.

예를 들어, Info.plist 파일의 목적 문자열은 다음과 같을 수 있습니다:

<plist version="1.0">
<dict>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Your location is used to provide turn-by-turn directions to your destination.</string>

장치 기능

앱의 Info.plist 파일은 장치 호환성을 위해 앱 스토어에서 앱을 필터링하는 데 도움이 되는 장치 기능을 지정합니다. 이러한 기능은 UIRequiredDeviceCapabilities 키 아래에 정의됩니다. 예를 들어:

<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>

이 예제는 앱이 armv7 명령어 집합과 호환되는 것을 나타냅니다. 개발자는 또한 앱이 NFC를 지원하는 기기에만 사용 가능하도록 하기 위해 nfc와 같은 기능을 지정할 수도 있습니다.

권한

권한은 iOS 앱 개발의 또 다른 중요한 측면으로, 앱이 런타임 검사를 넘어서 특정 작업을 수행할 수 있는 권한을 부여하는 키-값 쌍입니다. 예를 들어, 앱에서 **데이터 보호(Data Protection)**를 활성화하려면 Xcode 프로젝트에 특정 권한을 추가하고, 이는 앱의 권한 파일 또는 IPAs의 포함된 모바일 프로비전 파일에 반영됩니다.

참고 자료

htARTE (HackTricks AWS Red Team Expert)를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요!

HackTricks를 지원하는 다른 방법:

Last updated