{{#include ../../banners/hacktricks-training.md}} # 特権の分離とサンドボックス iOSでは、ユーザーがアクセス可能なアプリケーションとシステムのコアプロセスとの間に特権の区別があります。アプリケーションは**`mobile`**ユーザーIDの下で実行され、重要なシステムプロセスは**`root`**として動作します。この分離はサンドボックスメカニズムによって強化されており、アプリケーションが行えるアクションに厳しい制限を課しています。たとえば、アプリケーションが同じユーザーIDを共有していても、お互いのデータにアクセスしたり、変更したりすることは禁じられています。 アプリケーションは特定のディレクトリ(`private/var/mobile/Applications/{random ID}`)にインストールされ、SMSや電話通話などの特定のシステム領域や機能への読み取りアクセスが制限されています。保護された領域へのアクセスは、ユーザーの許可を求めるポップアップリクエストを引き起こします。 # データ保護 iOSは、暗号操作とキー管理のための専用コプロセッサであるSecure Enclave Processor(SEP)を基盤とした**データ保護API**を開発者に提供しています。SEPは、デバイス固有のキーであるデバイスUIDを埋め込むことによって、データ保護の整合性を確保します。 ファイル作成時に、ユニークな256ビットAES暗号化キーが生成され、ファイルの内容が暗号化されます。この暗号化キーは、クラスIDと共にクラスキーを使用して暗号化され、ファイルのメタデータ内に保存されます。ファイルの復号化は、システムのキーを使用してメタデータにアクセスし、クラスIDでクラスキーを取得し、その後ファイルのユニークな暗号化キーを復号化することを含みます。 iOSはデータセキュリティのために**4つの保護クラス**を定義しており、データにアクセスできるタイミングと方法を決定します: - **完全保護 (NSFileProtectionComplete)**: デバイスがユーザーのパスコードでロック解除されるまでデータにアクセスできません。 - **オープンでない限り保護 (NSFileProtectionCompleteUnlessOpen)**: デバイスがロックされていても、デバイスがロック解除されたときにファイルが開かれていた場合はファイルにアクセスできます。 - **最初のユーザー認証まで保護 (NSFileProtectionCompleteUntilFirstUserAuthentication)**: ブート後の最初のユーザーのロック解除後にデータにアクセスでき、デバイスが再度ロックされてもアクセス可能です。 - **保護なし (NSFileProtectionNone)**: データはデバイスUIDによってのみ保護され、迅速なリモートデータ消去を可能にします。 `NSFileProtectionNone`を除くすべてのクラスの暗号化は、デバイスUIDとユーザーのパスコードの両方から導出されたキーを含み、正しいパスコードを持つデバイスでのみ復号化が可能です。iOS 7以降、デフォルトの保護クラスは「最初のユーザー認証まで保護」となります。 開発者は、iPhone上のファイルのデータ保護クラスを検査するためのツールである[**FileDP**](https://github.com/abjurato/FileDp-Source)を使用できます。 ```python # 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では、**キーチェーン**は**機密情報**を保存するための安全な**暗号化コンテナ**として機能し、それを保存したアプリケーションまたは明示的に許可されたアプリケーションのみがアクセスできます。この暗号化は、iOSによって生成されたユニークな**パスワード**によって強化されており、それ自体は**AES**で暗号化されています。この暗号化プロセスは、ユーザーのパスコードとデバイスの**UID**から派生したソルトを組み合わせる**PBKDF2関数**を利用しています。このUIDは、**セキュアエンクレーブチップセット**のみがアクセスできるコンポーネントです。そのため、ユーザーのパスコードが知られていても、キーチェーンの内容は元々暗号化されたデバイス以外のどのデバイスでもアクセスできません。 キーチェーンデータの**管理とアクセス**は、`Keychain-access-groups`や`application-identifier`などの特定のアプリ権限に基づいて**`securityd`デーモン**によって処理されます。 ### **キーチェーンAPI操作** キーチェーンAPIは、[Appleのキーチェーンサービスのドキュメント](https://developer.apple.com/library/content/documentation/Security/Conceptual/keychainServConcepts/02concepts/concepts.html)で詳述されており、安全なストレージ管理のための基本的な機能を提供します: - **`SecItemAdd`**: キーチェーンに新しいアイテムを追加します。 - **`SecItemUpdate`**: キーチェーン内の既存のアイテムを更新します。 - **`SecItemCopyMatching`**: キーチェーンからアイテムを取得します。 - **`SecItemDelete`**: キーチェーンからアイテムを削除します。 キーチェーンパスワードのブルートフォース攻撃は、暗号化されたキーを直接攻撃するか、デバイス上でパスコードを推測しようとすることを含みますが、セキュアエンクレーブによる失敗した試行間の遅延の強制によって大きく妨げられます。 ### **キーチェーンアイテムデータ保護の設定** キーチェーンアイテムのデータ保護レベルは、アイテムの作成または更新時に`kSecAttrAccessible`属性を使用して設定されます。これらのレベルは、[Appleによって指定された](https://developer.apple.com/documentation/security/keychain_services/keychain_items/item_attribute_keys_and_values#1679100)もので、キーチェーンアイテムがいつどのようにアクセス可能かを決定します: - **`kSecAttrAccessibleAlways`**: デバイスのロック状態に関係なく、常にアクセス可能。 - **`kSecAttrAccessibleAlwaysThisDeviceOnly`**: 常にアクセス可能ですが、バックアップには含まれません。 - **`kSecAttrAccessibleAfterFirstUnlock`**: 再起動後の最初のロック解除後にアクセス可能。 - **`kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly`**: 上記と同じですが、新しいデバイスに移行できません。 - **`kSecAttrAccessibleWhenUnlocked`**: デバイスがロック解除されているときのみアクセス可能。 - **`kSecAttrAccessibleWhenUnlockedThisDeviceOnly`**: ロック解除時にアクセス可能で、バックアップには含まれません。 - **`kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly`**: デバイスのパスコードが必要で、バックアップには含まれません。 **`AccessControlFlags`**は、バイオメトリック認証やパスコードの使用を許可することで、アクセス方法をさらに細かく調整します。 ### **脱獄デバイスの警告** > [!WARNING] > **脱獄デバイス**では、キーチェーンの保護が侵害されており、重大なセキュリティリスクを引き起こします。 ### **キーチェーンデータの持続性** アプリがアンインストールされると削除されるアプリ固有のデータとは異なり、**キーチェーンデータは**デバイス上に持続します。この特性により、中古デバイスの新しい所有者がアプリを再インストールするだけで前の所有者のアプリケーションデータにアクセスできる可能性があります。開発者は、このリスクを軽減するために、アプリのインストール時またはログアウト時にキーチェーンデータを積極的にクリアすることを推奨します。以下は、アプリの初回起動時にキーチェーンデータをクリアする方法を示すSwiftコードの例です: ```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 } ``` # **アプリの機能** アプリ開発の領域において、**サンドボックス**はセキュリティを強化する上で重要な役割を果たします。このプロセスは、各アプリが独自のホームディレクトリ内で動作することを保証し、他のアプリのシステムファイルやデータにアクセスすることを防ぎます。これらの制限の施行は、**Trusted BSD (MAC) Mandatory Access Control Framework**の一部であるサンドボックスポリシーを通じて行われます。 開発者は、**データ保護**や**キーチェーン共有**など、アプリに対して特定の**機能や権限**を設定することができます。これらの権限は、アプリがインストールされた直後に適用されます。ただし、特定の保護されたリソースにアクセスするためには、アプリが最初の試行時にユーザーから明示的な同意を得る必要があります。これは、ユーザーに権限リクエストアラートで提示される_目的文字列_や_使用説明文字列_を使用することで実現されます。 ソースコードにアクセスできる場合、`Info.plist`ファイルに含まれる権限の確認は以下の手順で行えます: 1. Xcodeでプロジェクトを開く。 2. `Info.plist`ファイルを見つけて開く。 3. `"Privacy -"`で始まるキーを検索し、明確にするために生のキー/値を表示するオプションを選択します。 IPAファイルを扱う場合、以下の手順を実行できます: 1. IPAを解凍する。 2. `Payload/.app/`内にある`Info.plist`ファイルを見つける。 3. 必要に応じて、ファイルをXML形式に変換し、より簡単に検査できるようにします。 例えば、`Info.plist`ファイル内の目的文字列は次のように見えるかもしれません: ```xml NSLocationWhenInUseUsageDescription Your location is used to provide turn-by-turn directions to your destination. ``` ## デバイスの機能 アプリの `Info.plist` ファイルは、App Store がデバイスの互換性のためにアプリをフィルタリングするのに役立つ **デバイスの機能** を指定します。これらは **`UIRequiredDeviceCapabilities`** キーの下で定義されています。例えば: ```xml UIRequiredDeviceCapabilities armv7 ``` この例は、アプリがarmv7命令セットと互換性があることを示しています。開発者は、アプリがNFCをサポートするデバイスのみに利用可能であることを保証するために、nfcのような機能を指定することもできます。 ## Entitlements **Entitlements**は、iOSアプリ開発のもう一つの重要な側面であり、アプリがランタイムチェックを超えて特定の操作を実行するための権限を付与するキーと値のペアとして機能します。たとえば、アプリで**Data Protection**を有効にするには、Xcodeプロジェクトに特定の権限を追加する必要があり、これがアプリの権限ファイルまたはIPAの埋め込まれたモバイルプロビジョンファイルに反映されます。 # References - [https://mas.owasp.org/MASTG/iOS/0x06d-Testing-Data-Storage](https://mas.owasp.org/MASTG/iOS/0x06d-Testing-Data-Storage) - [https://github.com/OWASP/owasp-mastg/blob/master/Document/0x06h-Testing-Platform-Interaction.md](https://github.com/OWASP/owasp-mastg/blob/master/Document/0x06h-Testing-Platform-Interaction.md) - [https://mas.owasp.org/MASTG/tests/ios/MASVS-PLATFORM/MASTG-TEST-0069/](https://mas.owasp.org/MASTG/tests/ios/MASVS-PLATFORM/MASTG-TEST-0069/) - [https://mas.owasp.org/MASTG/iOS/0x06h-Testing-Platform-Interaction/](https://mas.owasp.org/MASTG/iOS/0x06h-Testing-Platform-Interaction/) {{#include ../../banners/hacktricks-training.md}}