オペレーティングシステムの整合性
Appleのオペレーティング・システム・ソフトウェアはセキュリティを中核として設計されています。この設計には、セキュアブートを可能にするために活用できるハードウェア信頼ルートと、迅速かつ安全なソフトウェア・アップデート・プロセスが含まれます。Appleのオペレーティングシステムでは、オペレーティングシステムの実行時の悪用を防ぐため、専用のシリコンベースのハードウェア機能も使用されます。これらの実行時の機能により、オペレーティングシステムの実行時に信頼できるコードの整合性が保護されます。つまり、Appleのオペレーティング・システム・ソフトウェアでは、悪質なアプリケーション、Web、またはその他のチャネルから実行される攻撃や悪用テクニックによる影響を軽減できます。ここに記載されている保護機能は、Appleが設計したSoCがサポートされているデバイスで利用できます。これにはiOS、iPadOS、tvOS、watchOSが含まれ、Appleシリコン搭載Mac上のmacOSも含まれるようになりました。
機能 | A10 | A11、S3 | A12、S4 | A13、S5 | A14、A15、S6、S7 | M1ファミリー |
---|---|---|---|---|---|---|
| ||||||
|
| |||||
|
| |||||
| 以下の注記を参照。 |
注記: ページ保護レイヤー(PPL)では、プラットフォームが署名済みの信頼できるコードのみを実行する必要があります。このセキュリティモデルは、macOSには該当しません。
カーネル整合性保護
オペレーティングシステムのカーネルで初期化が完了すると、カーネルおよびドライバのコード改ざんを防ぐために、カーネル整合性保護(KIP)が有効になります。メモリコントローラは保護された物理メモリ領域を割り当て、iBootはこれを使用してカーネルおよびカーネル拡張機能を読み込みます。起動が完了したあとは、メモリコントローラによって、この保護された物理メモリ領域への書き込みが拒否されます。アプリケーションプロセッサのメモリ管理ユニット(MMU)が構成され、保護メモリ領域外の物理メモリからの特権コードのマッピング、およびカーネルメモリ領域内での物理メモリの書き込み可能なマッピングが禁止されます。
構成変更を防ぐため、KIPの有効化に使用されるハードウェアはブートプロセス完了後にロックされます。
高速許可制限
Apple A11 BionicおよびS3 SoCから、新しいハードウェアプリミティブが導入されました。このプリミティブ、高速許可制限には、スレッドごとに権限を素早く制限するCPUレジスタが採用されています。高速許可制限(APRRレジスタとも呼ばれます)により、サポートされているオペレーティングシステムは、システムコールおよびページテーブルのウォーク/フラッシュのオーバーヘッドを発生させずに実行権限をメモリから削除できます。これらのレジスタは、Webからの攻撃、特に実行時にコンパイル(ジャストインタイムコンパイル)されたコードによる攻撃による影響を軽減するもう1つの手段となります。これは、メモリが読み取りおよび書き込みされているときにメモリを効果的に実行できないためです。
システムコプロセッサ整合性保護
コプロセッサのファームウェアによって、Secure Enclave、イメージ・センサー・プロセッサ、モーションコプロセッサなどの多数の重要なシステムタスクが処理されます。したがって、そのセキュリティはシステム全体のセキュリティを大きく左右します。コプロセッサファームウェアの変更を防ぐために、Appleはシステムコプロセッサ整合性保護(SCIP)と呼ばれるメカニズムを使用しています。
SCIPはカーネル整合性保護(KIP)と同様に機能します。起動時に、iBootによって、KIP領域とは別の予約済み保護メモリ領域に各コプロセッサのファームウェアが読み込まれます。また、各コプロセッサのメモリユニットが構成され、以下の操作が禁止されます:
保護メモリ領域の該当部分外での実行可能なマッピング
保護メモリ領域の該当部分内での書き込み可能なマッピング
また、ブート時に、Secure EnclaveのSCIPを構成するためにSecure Enclaveオペレーティングシステムが使用されます。SCIPの有効化に使用されるハードウェアはブートプロセス完了後にロックされます。これは構成変更を防ぐためです。
ポインタ認証コード
ポインタ認証コード(PAC)は、メモリ破壊バグの悪用を防ぐために使用されます。システムソフトウェアおよび内蔵Appは、PACを使用して関数ポインタとリターンアドレス(コードポインタ)の改ざんを防止します。PACでは、5つの128ビットシークレット値を使用してカーネル命令とデータに署名し、ユーザ領域プロセスごとに固有のBキーが生成されます。項目は以下のようにソルト化され、署名されます。
項目 | キー | ソルト |
---|---|---|
関数のリターンアドレス | IB | ストレージアドレス |
関数ポインタ | IA | 0 |
ブロック呼び出し関数 | IA | ストレージアドレス |
Objective-Cメソッドキャッシュ | IB | ストレージアドレス + クラス + セレクタ |
C++ Vテーブルエントリ | IA | ストレージアドレス + ハッシュ(マングルされたメソッド名) |
計算済みGotoラベル | IA | ハッシュ(関数名) |
カーネルスレッドの状態 | GA | • |
ユーザスレッドの状態レジスタ | IA | ストレージアドレス |
C++ Vテーブルポインタ | DA | 0 |
署名値は、64ビットポインタの最上位にある未使用のパディングビットに格納されます。署名は使用される前に検証され、ポインタアドレスが機能するようにパディングが復元されます。検証に失敗すると、中止されます。この検証によって、ROP(Return-Oriented Programming)攻撃などの多くの攻撃の難易度が高まります。ROP攻撃は、スタックに格納された関数のリターンアドレスを改ざんすることによって既存のコードを不正に実行させようとするものです。
ページ保護レイヤー
iOS、iPadOS、およびwatchOSのページ保護レイヤー(PPL)は、コード署名の検証が完了したあと、ユーザ領域のコードが改ざんされるのを防ぐように設計されています。PPLは、カーネル整合性保護および高速許可制限を基盤として、ページテーブルへのアクセス権の無効化を管理し、ユーザコードとページテーブルを含む保護されたページをPPLのみが変更できるようにします。このシステムでは、カーネルが侵害された場合でもシステム全体でのコードの整合性が確保されるため、攻撃対象領域が大幅に狭まります。PPLは実行されるすべてのコードが署名されている必要があるシステムにのみ適用されるため、この保護はmacOSでは提供されていません。