https://github.com/OWASP/owasp-mstg/blob/master/Document/0x06a-Platform-Overview.md
iOS Platform Overview
iOS는 iPhone, iPad 및 iPod Touch를 포함한 Apple 모바일 장치에 사용되는 모바일 운영 체제입니다. 또한 iOS의 많은 기능을 상속하는 Apple tvOS의 기반이기도합니다.
Apple 데스크톱 운영 체제 macOS (이전 OS X)와 마찬가지로 iOS는 Apple에서 개발한 오픈 소스 Unix 운영 체제인 Darwin을 기반으로합니다. 다윈의 커널은 Mach와 FreeBSD 커널의 구성 요소를 결합한 하이브리드 커널인 XNU ( "X is Not Unix")입니다.
하지만 iOS앱은 데스크탑 앱보다 제한된 환경에서 실행됩니다. iOS앱은 파일 시스템 수준에서 서로 분리되어 있으며, 시스템 API액세스 측면에서 상당히 제한적입니다.
악의적인 애플리케이션으로부터 사용자를 보호하기 위해 Apple은 iOS기기에서 실행할 수 있는 앱에 대한 액세스를 제한하고 제어합니다. AppleAppStore는 유일한 공식 애플리케이션 배포 플랫폼입니다. 그곳에서 개발자들은 그들의 앱을 제공할 수 있고 소비자들은 앱을 구매, 다운로드, 설치할 수 있습니다.이러한 배포 스타일은 여러 앱 스토어 및 sideloading(공식 App Store를 사용하지 않고 iOS 기기에 앱을 설치)를 지원하는 Android와 다릅니다.
과거에는 탈옥 또는 복잡한 해결 방안을 통해서만 사이드로딩(sideloading)을 할 수 있었습니다. iOS 9이상을 사용하는 경우 Xcode를 사이드 로드할 수 있습니다.
iOS앱은 Apple샌드 박스(과거에는 seated belt라고 함)의 필수 액세스 제어(MAC)메커니즘을 통해 서로 격리됩니다. Android의 다양한 바인더 IPC시설과 비교하면, iOS는 IPC옵션을 거의 사용하지 않으며, 공격 위험을 최소화합니다.
균일한 하드웨어 및 하드웨어/소프트웨어 통합은 또 다른 보안 이점을 제공합니다. 모든 iOS 장치는 시큐어 부트(secure boot), 하드웨어 지원 키 체인(hardware-backed keyhain) 및 파일 시스템 암호화(file system encryption)와 같은 보안 기능을 제공합니다. iOS 업데이트는 많은 사용자에게 신속하게 배포되기 때문에 보호되지 않은 이전 iOS 버전을 지원할 필요가 줄어듭니다.
하지만 이런 iOS의 수많은 장점에도 불구하고 iOS 앱 개발자는 여전히 보안에 대해 걱정할 필요가 있습니다. 다음 장에서는 iOS 보안 아키텍처에 대해 설명하고 기본 보안 테스트 방법을 설명하며 리버스 엔지니어링 방법을 제공합니다.
iOS Security Architecture
iOS보안 아키텍처는 다음과 같은 6가지 핵심 기능으로 구성되어 있습니다.
- Hardware Security
- Secure Boot
- Code Signing
- Sandbox
- Encryption and Data Protection
- General Exploit Mitigations
Hardware Security
iOS 보안 아키텍처는 전반적인 성능을 향상시키는 하드웨어 기반 보안 기능을 잘 활용합니다. 각 iOS 장치에는 제조 과정에서 응용 프로그램 프로세서와 보안 인클로저로 융합되고 컴파일되는 2 개의 내장 AES (Advanced Encryption Standard) 256 비트 키 (GID 및 UID)가 함께 제공됩니다. 소프트웨어 나 JTAG 같은 디버깅 인터페이스로 이러한 키를 읽는 직접적인 방법은 없습니다. 암호화 및 암호 해독 작업은 이러한 키에 독점적으로 액세스할 수있는 하드웨어 AES 암호 엔진에 의해 수행됩니다.
--------------------------------- to do ---------------------------------
Software Development on iOS
다른 플랫폼과 마찬가지로 Apple은 개발자가 네이티브 iOS앱을 개발, 설치, 실행 및 테스트하는 데 도움이 되는 SDK(SoftwareDevelopmentKit)를 제공합니다. Xcode는 Apple개발을 위한 통합 개발 환경(IDE)입니다. iOS 애플리케이션은 Objective-C 또는 Swift를 이용하여 개발합니다.
Objective-C는 Smalltalk 스타일의 메시징을 C 프로그래밍 언어에 추가하는 객체 지향 프로그래밍 언어입니다. 이 기능은 macOS에서 데스크탑 애플리케이션을 개발하고 iOS에서 모바일 애플리케이션을 개발하는 데 사용됩니다. Swift는 Objective-C의 후계자이며 Objective-C와의 상호 운용성을 지원합니다.
Swift는 2014 년 Xcode 6에서 소개되었습니다.
non-jailbroken 장치에서 App Store없이 응용 프로그램을 설치하는 두 가지 방법이 있습니다.
- 엔터프라이즈 모바일 장치 관리(Enterprise Mobile Device Management)를 사용합니다. 이를 위해서는 Apple이 서명한 회사 전체 인증서가 필요합니다.
- 사이드 로딩(sideloading)을 사용합니다. 개발자의 인증서로 앱에 서명하고 Xcode를 통해 기기에 설치합니다. 동일한 인증서로 제한된 수의 디바이스에 설치할 수 있습니다.
Apps on iOS
iOS앱은 IPA(iOSAppStorePackage)아카이브로 배포됩니다. IPA파일은 ZIP 압축 아카이브이며, 앱을 실행하는 데 필요한 모든 코드 및 리소스를 포함합니다.
IPA파일은 내장 디렉토리 구조를 포함합니다. 아래의 예를 통해 이 구조를 파악해봅시다.
- /Payload/ 폴더는 모든 응용 프로그램 데이터를 포함합니다. 이 폴더의 내용으로 다시 돌아가겠습니다.
- /Payload/Application.app 응용 프로그램 데이터 자체 (ARM 컴파일 코드) 및 관련된 정적 리소스가 포함되어 있습니다.
- /iTunesArtwork 512x512 픽셀 PNG 이미지, 응용 프로그램의 아이콘으로 사용됩니다.
- /iTunesMetadata.plist 개발자의 이름 및 ID, 번들 ID, 저작권 정보, 장르, 앱 이름, 릴리즈 날짜, 구매 날짜 등을 포함한 다양한 정보가 포함되어 있습니다.
- /WatchKitSupport/WK 확장 번들의 예입니다. 이 특정 번들에는 인터페이스를 관리하고 Apple watch에서 사용자 상호 작용에 응답하기 위한 확장 프로그램 대리인과 컨트롤러가 포함되어 있습니다.
IPA Payloads - A Closer Look
IPA 컨테이너의 여러 파일을 자세히 살펴 보겠습니다. Apple은 디스크 공간을 절약하고 파일 액세스를 단순화하기 위해 비교적 평평한 구조를 사용합니다. 최상위 번들 디렉토리에는 애플리케이션의 실행 파일과 애플리케이션에서 사용하는 모든 리소스(예:애플리케이션 아이콘, 다른 이미지 및 지역화된 컨텐츠)가 포함됩니다.
- MyApp : 컴파일 된 응용 프로그램 소스 코드가 들어있는 실행 파일입니다.
- Application : 어플리케이션 아이콘들
- info.plist : 번들 ID, 버전 번호 및 애플리케이션 표시 이름과 같은 구성 정보입니다.
- Launch images : 특정 방향에서 초기 애플리케이션 인터페이스를 보여주는 이미지. 시스템은 애플리케이션이 완전히 로드될 때까지 제공된 시작 이미지 중 하나를 임시 배경으로 사용합니다.
- MainWindow.nib : 애플리케이션을 시작할 때 로드되는 기본 인터페이스 개체입니다. 그러면 다른 인터페이스 개체가 다른 nib파일에서 로드되거나 애플리케이션에 의해 프로그래밍 방식으로 생성됩니다.
- Settings.bundle : 애플리케이션 관련 기본 설정은 Settings(설정)앱에서 표시됩니다.
- Custom resource files : 지역화되지 않은 리소스는 최상위 디렉터리에 배치되고 지역화 된 리소스는 애플리케이션 번들의 언어 별 하위 디렉터리에 배치됩니다. 리소스에는 Nib파일, 이미지, 사운드 파일, 구성 파일, 문자열 파일 및 애플리케이션에서 사용하는 기타 모든 사용자 지정 데이터 파일이 포함됩니다.
애플리케이션이 지원하는 각 언어에 대한 language.lproj폴더가 있습니다. 스토리 보드와 문자열 파일이 들어 있습니다.
- 스토리 보드는 iOS애플리케이션의 사용자 인터페이스를 시각적으로 표현한 것입니다. 화면과 이러한 화면 사이의 연결을 보여 줍니다.
- 문자열 파일 형식은 하나 이상의 Key-Value 쌍과 선택적 주석으로 구성됩니다.
App Structrue on the iOS File System
iOS 8 부터 기기에 애플리케이션을 저장하는 방법이 변경되었습니다. 이전에는 응용 프로그램이 /var/mobile/applications/ 디렉토리의 폴더에 압축 해제되었습니다. 애플리케이션은 128비트 숫자인 UUID(Universal Unique Identifier)로 식별됩니다. 이 번호는 애플리케이션 자체가 저장된 폴더의 이름입니다. 정적 번들 및 애플리케이션 데이터 폴더가 이제 다른 곳에 저장됩니다. 이러한 폴더에는 애플리케이션 보안 평가 중에 면밀히 검사해야 하는 정보가 들어 있습니다.
- /var/mobile/Containers/Bundle/Application/[UUID]/Application.app 에는 앞서 언급 한 application.app 데이터를 포함하며 애플리케이션의 ARM 컴파일 바이너리뿐만 아니라 정적 내용도 저장합니다. 이 폴더의 내용은 코드 서명의 유효성을 검사하는 데 사용됩니다.
- /var/mobile/Containers/Data/Application/[UUID]/Documents 에는 사용자가 생성한 모든 데이터를 담고 있습니다. 애플리케이션 최종 사용자가 이 데이터 생성을 시작합니다.
- /var/mobile/Containers/Data/Application/[UUID]/Library 에는 캐시, 환경 설정, 쿠키 및 속성 목록 (plist) 구성 파일과 같이 사용자 별이 아닌 모든 파일이 들어 있습니다.
- /var/mobile/Containers/Data/Application/[UUID]/tmp 에는 애플리케이션 실행 사이에 필요하지 않은 임시 파일이 포함되어 있습니다.
다음 그림은 응용 프로그램 폴더 구조를 나타냅니다.
The Installation Process
iOS기기에 IPA패키지를 설치하는 데는 다른 방법이 있습니다. 가장 쉬운 방법은 Apple의 기본 미디어 플레이어인 iTunes입니다. MacOS 및 Windows에서 iTunes를 사용할 수 있습니다. 아이튠즈를 통해 사용자는 앱 스토어에서 애플리케이션을 다운로드 받아 iOS기기에 설치할 수 있습니다. 또한 iTunes를 사용하여 IPA파일을 기기에 설치할 수도 있습니다.
Linux에서는 iOS 장치와의 기본 통신을위한 플랫폼 간 소프트웨어 프로토콜 라이브러리이자 도구 모음인 libimobiledevice를 사용할 수 있습니다. ideviceinstaller를 통해 USB 연결을 통해 패키지를 설치할 수 있습니다. 연결은 USB 멀티플렉싱 데몬 usbmuxd로 구현되며 USB를 통한 TCP 터널을 제공합니다.
iOS 기기에서 실제 설치 프로세스는 애플리케이션의 압축을 풀고 설치하는 install 데몬에 의해 처리됩니다.앱 서비스를 통합하거나 iOS기기에 설치하려면 Apple에서 발급한 인증서로 모든 애플리케이션에 서명해야 합니다. 이는 코드 서명 검증이 성공한 경우에만 애플리케이션을 설치할 수 있음을 의미합니다. 그러나, 탈옥된 전화기에서는 Cydia스토어에서 이용할 수 있는 패키지인 AppSync를 사용하여 이 보안 기능을 우회할 수 있습니다.
Cydia는 대안 앱 스토어입니다. 여기에는 고급 기능을 실행하기 위해 탈옥에서 제공하는 루트 권한을 활용하는 수많은 유용한 애플리케이션이 포함되어 있습니다. AppSync는 가짜 서명 IPA 패키지의 설치를 허용하는 installd 패치의 개조입니다.
$ ipainstaller App_name.ipa
App Permissions
Android 앱과 달리 iOS 앱에는 사전 할당 된 권한이 없습니다. 대신, 앱이 중요한 API를 처음 사용하려고 시도할 때 런타임에 권한을 부여하라는 메시지가 표시됩니다. 권한이 부여된 앱은 설정>개인 정보 메뉴에 나열되므로 사용자가 앱 관련 설정을 수정할 수 있습니다.
iOS개발자가 직접 요청한 사용 권한을 설정할 수 없습니다. 이들은 중요한 API를 사용하여 간접적으로 요청합니다. 예를 들어 사용자의 연락처에 액세스 할 때 CNContactStore에 대한 모든 호출은 사용자에게 액세스 권한을 부여하거나 거부하라는 메시지가 표시되는 동안 앱을 차단합니다.
다음 API는 사용자 권한이 필요합니다.(https://www.apple.com/business/docs/iOS_Security_Guide.pdf)
- Contacts
- Microphone
- Calendars
- Camera
- Reminders
- HomeKit
- Photos
- Health
- Motion activity and fintess
- Speech recognition
- Location Services
- Bluetooth sharing
- Media Library
- Socical media accounts
'Hacking > iOS Hacking' 카테고리의 다른 글
iOS# Reverse-Engineering-and-Tampering (0) | 2018.02.01 |
---|---|
iOS# Data Storge on iOS (0) | 2018.01.15 |