tip
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
特権の分離とサンドボックス
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-groups
やapplication-identifier
などの特定のアプリ権限に基づいて**securityd
デーモン**によって処理されます。
キーチェーンAPI操作
キーチェーンAPIは、Appleのキーチェーンサービスのドキュメントで詳述されており、安全なストレージ管理のための基本的な機能を提供します:
SecItemAdd
: キーチェーンに新しいアイテムを追加します。SecItemUpdate
: キーチェーン内の既存のアイテムを更新します。SecItemCopyMatching
: キーチェーンからアイテムを取得します。SecItemDelete
: キーチェーンからアイテムを削除します。
キーチェーンパスワードのブルートフォース攻撃は、暗号化されたキーを直接攻撃するか、デバイス上でパスコードを推測しようとすることを含みますが、セキュアエンクレーブによる失敗した試行間の遅延の強制によって大きく妨げられます。
キーチェーンアイテムデータ保護の設定
キーチェーンアイテムのデータ保護レベルは、アイテムの作成または更新時にkSecAttrAccessible
属性を使用して設定されます。これらのレベルは、Appleによって指定されたもので、キーチェーンアイテムがいつどのようにアクセス可能かを決定します:
kSecAttrAccessibleAlways
: デバイスのロック状態に関係なく、常にアクセス可能。kSecAttrAccessibleAlwaysThisDeviceOnly
: 常にアクセス可能ですが、バックアップには含まれません。kSecAttrAccessibleAfterFirstUnlock
: 再起動後の最初のロック解除後にアクセス可能。kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly
: 上記と同じですが、新しいデバイスに移行できません。kSecAttrAccessibleWhenUnlocked
: デバイスがロック解除されているときのみアクセス可能。kSecAttrAccessibleWhenUnlockedThisDeviceOnly
: ロック解除時にアクセス可能で、バックアップには含まれません。kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly
: デバイスのパスコードが必要で、バックアップには含まれません。
**AccessControlFlags
**は、バイオメトリック認証やパスコードの使用を許可することで、アクセス方法をさらに細かく調整します。
脱獄デバイスの警告
warning
脱獄デバイスでは、キーチェーンの保護が侵害されており、重大なセキュリティリスクを引き起こします。
キーチェーンデータの持続性
アプリがアンインストールされると削除されるアプリ固有のデータとは異なり、キーチェーンデータはデバイス上に持続します。この特性により、中古デバイスの新しい所有者がアプリを再インストールするだけで前の所有者のアプリケーションデータにアクセスできる可能性があります。開発者は、このリスクを軽減するために、アプリのインストール時またはログアウト時にキーチェーンデータを積極的にクリアすることを推奨します。以下は、アプリの初回起動時にキーチェーンデータをクリアする方法を示す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
ファイルに含まれる権限の確認は以下の手順で行えます:
- Xcodeでプロジェクトを開く。
Info.plist
ファイルを見つけて開く。"Privacy -"
で始まるキーを検索し、明確にするために生のキー/値を表示するオプションを選択します。
IPAファイルを扱う場合、以下の手順を実行できます:
- IPAを解凍する。
Payload/<appname>.app/
内にあるInfo.plist
ファイルを見つける。- 必要に応じて、ファイルを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
ファイルは、App Store がデバイスの互換性のためにアプリをフィルタリングするのに役立つ デバイスの機能 を指定します。これらは UIRequiredDeviceCapabilities
キーの下で定義されています。例えば:
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>
この例は、アプリがarmv7命令セットと互換性があることを示しています。開発者は、アプリがNFCをサポートするデバイスのみに利用可能であることを保証するために、nfcのような機能を指定することもできます。
Entitlements
Entitlementsは、iOSアプリ開発のもう一つの重要な側面であり、アプリがランタイムチェックを超えて特定の操作を実行するための権限を付与するキーと値のペアとして機能します。たとえば、アプリでData Protectionを有効にするには、Xcodeプロジェクトに特定の権限を追加する必要があり、これがアプリの権限ファイルまたはIPAの埋め込まれたモバイルプロビジョンファイルに反映されます。
References
- 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://mas.owasp.org/MASTG/tests/ios/MASVS-PLATFORM/MASTG-TEST-0069/
- https://mas.owasp.org/MASTG/iOS/0x06h-Testing-Platform-Interaction/
tip
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。