iOS Basics

Support HackTricks

特権の分離とサンドボックス

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を使用できます。

# 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-groupsapplication-identifierなどの特定のアプリ権限に基づいて**securitydデーモン**によって処理されます。

キーチェーンAPI操作

キーチェーンAPIは、Appleのキーチェーンサービスのドキュメントで詳述されており、安全なストレージ管理のための基本的な機能を提供します:

  • SecItemAdd: キーチェーンに新しいアイテムを追加します。

  • SecItemUpdate: キーチェーン内の既存のアイテムを更新します。

  • SecItemCopyMatching: キーチェーンからアイテムを取得します。

  • SecItemDelete: キーチェーンからアイテムを削除します。

キーチェーンパスワードのブルートフォース攻撃は、暗号化されたキーを直接攻撃するか、デバイス上でパスコードを推測しようとすることを含みますが、セキュアエンクレーブによる失敗した試行間の遅延の強制によって大きく妨げられます。

キーチェーンアイテムデータ保護の設定

キーチェーンアイテムのデータ保護レベルは、アイテムの作成または更新時にkSecAttrAccessible属性を使用して設定されます。これらのレベルは、Appleによって指定されたもので、キーチェーンアイテムがいつどのようにアクセス可能かを決定します:

  • 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
}

アプリの機能

アプリ開発の領域において、サンドボックスはセキュリティを強化する上で重要な役割を果たします。このプロセスは、各アプリが独自のホームディレクトリ内で動作することを保証し、他のアプリのシステムファイルやデータにアクセスすることを防ぎます。これらの制限の施行は、Trusted BSD (MAC) Mandatory Access Control Frameworkの一部であるサンドボックスポリシーを通じて行われます。

開発者は、データ保護キーチェーン共有など、アプリのために特定の機能や権限を設定することができます。これらの権限は、アプリがインストールされた直後に適用されます。しかし、特定の保護されたリソースにアクセスするためには、アプリが最初の試行時にユーザーから明示的な同意を得る必要があります。これは、ユーザーに権限リクエストアラートで提示される_目的文字列_や_使用説明文字列_を使用することで達成されます。

ソースコードにアクセスできる場合、Info.plistファイルに含まれる権限の確認は以下の手順で行えます:

  1. Xcodeでプロジェクトを開く。

  2. Info.plistファイルを見つけて開く。

  3. "Privacy -"で始まるキーを検索し、明確にするために生のキー/値を表示するオプションを選択します。

IPAファイルを扱う場合、以下の手順を実行できます:

  1. IPAを解凍する。

  2. Payload/<appname>.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>

Device Capabilities

アプリの Info.plist ファイルは、デバイスの機能を指定し、App Store がデバイスの互換性のためにアプリをフィルタリングするのに役立ちます。これらは UIRequiredDeviceCapabilities キーの下で定義されています。例えば:

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

この例は、アプリがarmv7命令セットと互換性があることを示しています。開発者は、nfcのような機能を指定して、アプリがNFCをサポートするデバイスのみに利用可能であることを保証することもできます。

Entitlements

Entitlementsは、iOSアプリ開発のもう一つの重要な側面であり、アプリがランタイムチェックを超えて特定の操作を実行するための権限を付与するキーと値のペアとして機能します。たとえば、アプリでData Protectionを有効にするには、Xcodeプロジェクトに特定の権限を追加する必要があり、これがアプリの権限ファイルまたはIPA用の埋め込まれたモバイルプロビジョンファイルに反映されます。

References

Support HackTricks

Last updated