データ保護用のキーバッグ
iOS、iPadOS、tvOS、およびwatchOSでは、ファイルとキーチェーンの両方のデータ保護クラスの鍵がキーバックに収集されて管理されます。これらのオペレーティングシステムで使用されるキーバッグは、ユーザ、デバイス、バックアップ、エスクロー、およびiCloudバックアップです。
ユーザキーバッグ
ユーザキーバッグには、デバイスの通常の操作に使用されるクラスキーがラップされて保存されています。例えば、パスコードが入力されると、NSFileProtectionCompleteがユーザキーバッグから読み込まれ、アンラップされます。これはNo Protectionクラスに保存されているバイナリ形式のプロパティリスト(.plist)ファイルです。
A9より前のSoCを搭載したデバイスでは、この.plistファイルの内容は、Effaceable Storageに保存された鍵で暗号化されています。キーバッグに前方秘匿性を追加するために、この鍵はユーザがパスコードを変更するたびにワイプされ再生成されます。
A9以降のSoCを搭載したデバイスでは、この.plistファイルに、Secure Enclaveが制御するアンチリプレイ値によって保護されたロッカーにキーバッグが保存されていることを示す鍵が含まれます。
ユーザキーバッグはSecure Enclaveが管理しており、デバイスのロック状態に関してはSecure Enclaveに照会できます。ユーザキーバッグ内のすべてのクラスキーがアクセスできる状態になっていて、正しくアンラップされている場合にのみ、デバイスがロック解除されていると報告されます。
デバイスキーバッグ
デバイスキーバッグは、デバイス固有のデータを扱う操作で使用する、ラップされているクラスキーの保存に使用されます。共有して使用できるよう構成されているiPadOSデバイスでは、ユーザのログイン前に資格情報へのアクセスが必要な場合があるため、ユーザのパスコードで保護されていないキーバッグが必要になります。
iOSとiPadOSでは、ユーザごとのファイルシステムコンテンツを個別に暗号化することがサポートされていないため、システムはデバイスキーバッグのクラスキーを使用してPer Fileキーをラップすることになります。ただし、キーチェーンはユーザキーバッグからのクラスキーを使用して、ユーザキーチェーン内の項目を保護します。単一ユーザが使用するように構成されているiPhoneデバイスやiPadデバイス(デフォルト構成)では、デバイスキーバッグとユーザキーバッグは同じものとなり、これはユーザのパスコードによって保護されます。
バックアップキーバッグ
バックアップキーバッグは、Finder(macOS 10.15以降)またはiTunes(macOS 10.14以前)による暗号化されたバックアップが行われたときに作成され、デバイスのバックアップ先となるコンピュータに保存されます。新しいキーバッグには新しい鍵のセットも作成され、バックアップデータはこれらの新しい鍵で再度暗号化されます。前述の通り、移行不可のキーチェーン項目はUID由来の鍵でラップされたままになっているため、これらはオリジナルのバックアップ元のデバイスには復元できますが、別のデバイスに復元した場合はアクセスできなくなります。
設定したパスワードで保護されたこのキーバッグに、鍵導出関数PBKDF2が1000万回反復して適用されます。反復回数はこれだけ多く設定されていますが、特定のデバイスには関連付けられません。そのため理論上は、バックアップキーバッグは多数のコンピュータから同時並行的に総当たり(ブルートフォース)攻撃される可能性があります。こうした脅威は、十分に強いパスワードを使用することで軽減できます。
ユーザがバックアップを暗号化しない場合は、データ保護クラスにかかわらずファイルは暗号化されません。ただし、この場合でもキーチェーンはUID由来の鍵で保護されます。このため、キーチェーン項目を新しいデバイスに移行できるのは、バックアップパスワードが設定されている場合のみです。
エスクローキーバッグ
エスクローキーバッグは、USB経由でのFinder(macOS 10.15以降)またはiTunes(macOS 10.14以前)との同期と、モバイルデバイス管理(MDM)で使用されます。このキーバッグにより、FinderまたはiTunesがバックアップや同期をするときにユーザによるパスコードの入力が不要になるほか、MDMソリューションがユーザのパスコードをリモートで消去することが可能になります。エスクローキーバッグは、FinderまたはiTunesとの同期に使用されるコンピュータか、デバイスをリモート管理するMDMソリューションに保存されます。
エスクローキーバッグにより、すべてのクラスのデータへのアクセスが必要になる場合があるデバイス同期でのユーザ体験が向上します。パスコードでロックされたデバイスが初めてFinderまたはiTunesに接続されると、ユーザはパスコードの入力を求められます。その後、デバイスで使用されているものと同じクラスキーを含むエスクローキーバッグがデバイスによって作成されます。エスクローキーバッグは、新たに生成された鍵で保護されます。エスクローキーバッグとそれを保護する鍵は、デバイスとホストまたはデバイスとサーバに分けて保存され、デバイスに保存されているデータにはProtected Until First User Authenticationクラスが割り当てられます。このため、デバイスの再起動後に初めてFinderまたはiTunesでバックアップを作成するときに、デバイスのパスコードの入力が必要になります。
ワイヤレス(OTA)でのソフトウェアアップデートの場合、ユーザはアップデート開始時にパスコードの入力を求められます。このパスコードを使用して、アップデート後にユーザキーバッグをロック解除するためのワンタイムロック解除トークンが安全に作成されます。このトークンは、ユーザのパスコードを入力しないと生成できません。また、ユーザのパスコードが変更された場合、以前に生成されたトークンはすべて無効になります。
ワンタイムロック解除トークンは、ソフトウェアアップデートの手動インストールおよび自動インストールの両方で使用されます。このトークンは、Secure Enclaveのモノトニックカウンタの現在値、キーバッグのUUID、およびSecure Enclave UIDから導出された鍵で暗号化されます。
A9以降のSoCでは、ワンタイムロック解除トークンはカウンタやEffaceable Storageに依存しなくなりました。代わりに、Secure Enclaveが制御するアンチリプレイ値によって保護されています。
手動ソフトウェアアップデートのワンタイムロック解除トークンは20分後に無効になります。iOS 13以降とiPadOS 13.1以降では、このトークンは、Secure Enclaveによって保護されたロッカーに保存されます。iOS 13より前では、このトークンはSecure Enclaveから書き出され、Effaceable Storageに書き込まれました。または、Secure Enclaveのアンチリプレイメカニズムによって保護されました。デバイスが20分以内に再起動しなかった場合は、ポリシータイマーによってカウンタが増分されました。
自動ソフトウェアアップデートは、入手可能なアップデートが検出され、以下のいずれかの条件を満たしたときに実行されます:
iOS 12以降で自動アップデートが設定されている。
アップデートの通知時にユーザが「あとでインストール」を選択した。
ユーザがパスコードを入力すると、ワンタイムロック解除トークンが生成され、Secure Enclave内で最大8時間有効な状態になります。アップデートが実行されない限り、このワンタイムロック解除トークンは、ロックするたびに破棄され、次のロック解除時に再作成されます。また、ロック解除のたびに8時間の有効期間が再開されます。8時間が経過すると、ポリシータイマーによってワンタイムロック解除トークンが無効にされます。
iCloudバックアップキーバッグ
iCloudバックアップキーバッグは、バックアップキーバッグに似ています。このキーバッグ内のすべてのクラスキーは非対称鍵です(Protected Unless Openデータ保護クラスと同様にCurve25519を使用)。iCloudキーチェーンの復元でのバックアップキーチェーンを保護するのにも、非対称キーバッグが使用されます。