iOS Basics
特権分離とサンドボックス
iOSでは、ユーザーがアクセス可能なアプリケーションとシステムのコアプロセスとの間に特権の区別が存在します。アプリケーションは mobile
ユーザー識別子の下で実行され、重要なシステムプロセスは root
として動作します。この分離は、アプリケーションが実行できるアクションに厳格な制限を課すサンドボックスメカニズムによって強化されています。たとえアプリケーションが同じユーザー識別子を共有していても、お互いのデータにアクセスしたり変更したりすることは禁止されています。
アプリケーションは特定のディレクトリにインストールされます(private/var/mobile/Applications/{ランダムID}
)し、特定のシステム領域や機能(SMSや電話)への読み取りアクセスが制限されています。保護された領域へのアクセスは、ユーザーの許可を求めるポップアップリクエストをトリガーします。
データ保護
iOSは、Secure Enclave Processor(SEP)の上に構築された Data Protection APIs を開発者に提供しています。SEPは、暗号操作とキー管理のための専用コプロセッサであり、デバイス固有のキーであるデバイスUIDが埋め込まれていることにより、データ保護の整合性を確保します。
ファイル作成時には、ユニークな256ビットAES暗号化キーが生成され、ファイルの内容が暗号化されます。この暗号化キーは、クラスキーを使用して暗号化され、ファイルのメタデータ内に保存されます。ファイルを復号化するには、システムキーを使用してメタデータにアクセスし、クラスIDでクラスキーを取得し、ファイルのユニークな暗号化キーを復号化する必要があります。
iOSでは、データセキュリティのために 4つの保護クラス が定義されており、データにいつ、どのようにアクセスできるかが決定されます:
完全保護(NSFileProtectionComplete): データは、ユーザーのパスコードを使用してデバイスがロック解除されるまでアクセスできません。
開かれるまで保護(NSFileProtectionCompleteUnlessOpen): ファイルがデバイスがロックされた後もアクセス可能で、ファイルがデバイスがロック解除された状態で開かれている場合はアクセスが許可されます。
最初のユーザー認証まで保護(NSFileProtectionCompleteUntilFirstUserAuthentication): データは、起動後の最初のユーザーアンロック後にアクセス可能であり、デバイスが再度ロックされてもアクセス可能です。
保護なし(NSFileProtectionNone): データはデバイスUIDによってのみ保護され、迅速なリモートデータ消去を容易にします。
NSFileProtectionNone
を除くすべてのクラスの暗号化には、デバイスUIDとユーザーのパスコードから派生したキーが使用され、正しいパスコードを持つデバイスでのみ復号化が可能であることが保証されます。iOS 7以降、デフォルトの保護クラスは「最初のユーザー認証まで保護」です。
開発者は、iPhone上のファイルのデータ保護クラスを検査するためのツールである FileDP を使用できます。
キーチェーン
iOSにおいて、キーチェーンは、機密情報を安全に保存するための暗号化されたコンテナとして機能し、それを保存したアプリケーションまたは明示的に許可されたアプリケーションのみがアクセスできます。この暗号化は、iOSによって生成された一意のパスワードによって強化され、それ自体がAESで暗号化されます。この暗号化プロセスは、ユーザーのパスコードをデバイスのUIDから派生したソルトと組み合わせるPBKDF2関数を利用して行われ、このUIDはセキュアエンクレーブチップセットのみがアクセスできるコンポーネントです。したがって、ユーザーのパスコードがわかっていても、キーチェーンの内容は、元の暗号化が行われたデバイス以外ではアクセスできません。
キーチェーンデータの管理とアクセスは、securityd
デーモンによって処理され、Keychain-access-groups
やapplication-identifier
などの特定のアプリケーション権限に基づいて行われます。
キーチェーンAPI操作
キーチェーンAPIは、Appleのキーチェーンサービスのドキュメントで詳細に説明されており、安全なストレージ管理のための重要な機能を提供しています:
SecItemAdd
: キーチェーンに新しいアイテムを追加します。SecItemUpdate
: キーチェーン内の既存のアイテムを更新します。SecItemCopyMatching
: キーチェーンからアイテムを取得します。SecItemDelete
: キーチェーンからアイテムを削除します。
キーチェーンのパスワードをブルートフォースするには、暗号化されたキーを直接攻撃するか、デバイス自体でパスコードを推測する必要がありますが、セキュアエンクレーブが失敗した試行の間に遅延を強制するため、大幅に妨げられます。
キーチェーンアイテムデータ保護の設定
キーチェーンアイテムのデータ保護レベルは、アイテムの作成または更新時にkSecAttrAccessible
属性を使用して設定されます。これらのレベルは、Appleによって指定されているように、キーチェーンアイテムがいつ、どのようにアクセス可能かを決定します:
kSecAttrAccessibleAlways
: デバイスのロック状態に関係なくいつでもアクセス可能です。kSecAttrAccessibleAlwaysThisDeviceOnly
: 常にアクセス可能ですが、バックアップに含まれません。kSecAttrAccessibleAfterFirstUnlock
: 再起動後の最初のアンロック後にアクセス可能です。kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly
: 上記と同様ですが、新しいデバイスに移行できません。kSecAttrAccessibleWhenUnlocked
: デバイスがアンロックされているときのみアクセス可能です。kSecAttrAccessibleWhenUnlockedThisDeviceOnly
: アンロックされているときにのみアクセス可能で、バックアップに含まれません。kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly
: デバイスのパスコードが必要で、バックアップに含まれません。
**AccessControlFlags
**は、生体認証やパスコードの使用を許可するなど、アクセス方法をさらに細かく調整します。
Jailbrokenデバイスの警告
Jailbrokenデバイスでは、キーチェーンの保護が妨げられ、重大なセキュリティリスクが発生します。
キーチェーンデータの永続性
アプリのアンインストール時に削除されるアプリ固有のデータとは異なり、キーチェーンデータはデバイスに永続化されます。この特性により、中古のデバイスの新しい所有者がアプリを再インストールするだけで、以前の所有者のアプリケーションデータにアクセスできる可能性があります。このリスクを軽減するために、開発者はアプリのインストール時またはログアウト時にキーチェーンデータを積極的にクリアすることが推奨されています。以下は、最初のアプリ起動時にキーチェーンデータをクリアする方法を示すSwiftのコード例です:
アプリの機能
アプリ開発の世界では、sandboxing がセキュリティを強化する上で重要な役割を果たします。このプロセスにより、各アプリが独自のホームディレクトリ内で動作することが保証され、システムファイルや他のアプリのデータへのアクセスが防止されます。これらの制限は、Trusted BSD (MAC) Mandatory Access Control Framework の一部である sandbox ポリシーによって施行されます。
開発者は、Data Protection や Keychain Sharing などの特定の 機能や権限 をアプリに設定する能力を持っています。これらの権限は、アプリがインストールされるとすぐに適用されます。ただし、特定の保護されたリソースにアクセスするためには、アプリが最初に試みる際にユーザーから明示的な同意を得る必要があります。これは、許可リクエストアラートでユーザーに提示される purpose strings や usage description strings を使用して達成されます。
ソースコードにアクセスできる場合、Info.plist
ファイルに含まれる権限の検証は次のように行うことができます:
Xcode でプロジェクトを開く。
Info.plist
ファイルを見つけて開く。"Privacy -"
で始まるキーを検索し、明確にするために生のキー/値を表示するオプションを選択する。
IPA ファイルを扱う場合、次の手順に従うことができます:
IPA ファイルを解凍する。
Payload/<appname>.app/
内のInfo.plist
ファイルを見つける。必要に応じてファイルを XML 形式に変換して、簡単に検査する。
デバイスの機能
アプリのInfo.plist
ファイルには、デバイスの互換性をフィルタリングするためのデバイスの機能が指定されています。これらは**UIRequiredDeviceCapabilities
**キーの下で定義されています。たとえば:
権限
権限は、iOSアプリの開発におけるもう一つの重要な側面であり、特定の操作を実行するためのアプリの許可を付与するキーと値のペアとして機能します。例えば、アプリでデータ保護を有効にするには、Xcodeプロジェクトに特定の権限を追加し、それがアプリの権限ファイルまたはIPA用の埋め込みモバイルプロビジョンファイルに反映されます。
参考文献
Last updated