オペレーティングシステムの整合性
Appleのオペレーティングシステムソフトウェアはセキュリティを中核として設計されています。この設計には、セキュアブートを可能にするために活用できるハードウェア信頼ルートと、迅速かつ安全なソフトウェアアップデートプロセスが含まれます。Appleのオペレーティングシステムでは、オペレーティングシステムの実行時の悪用を防ぐため、専用のシリコンベースのハードウェア機能も使用されます。これらの実行時の機能により、オペレーティングシステムの実行時に信頼できるコードの整合性が保護されます。つまり、Appleのオペレーティングシステムソフトウェアでは、悪質なアプリ、Web、またはその他のチャネルから実行される攻撃や悪用テクニックによる影響を軽減できます。ここに記載されている保護機能は、Appleが設計したSoCがサポートされているデバイスで利用できます。これにはiOS、iPadOS、tvOS、watchOSが含まれ、Appleシリコン搭載Mac上のmacOSも含まれるようになりました。
機能 | A10 | A11、S3 | A12、A13、A14 S4–S9 | A15、A16、A17 | M1、M2、M3 |
以下の注記1を参照。 | |||||
以下の注記2を参照。 |
注記1: ページ保護レイヤー(PPL)では、プラットフォームが署名済みの信頼できるコードのみを実行する必要があります。このセキュリティモデルは、macOSには該当しません。
注記2: SPTM(Secure Page Table Monitor)はA15、A16、およびA17で対応していて、対応するプラットフォームでページ保護レイヤーに代わるものです。
カーネル整合性保護
オペレーティングシステムのカーネルで初期化が完了すると、カーネルおよびドライバのコード改ざんを防ぐために、カーネル整合性保護(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)は、メモリ破壊バグの悪用を防ぐために使用されます。システムソフトウェアおよび内蔵アプリは、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では提供されていません。
Secure Page Table MonitorとTrusted Execution Monitor
Secure Page Table Monitor(SPTM)とTrusted Execution Monitor(TXM)は、攻撃者がカーネル書き込み機能を持っていて、制御フロー保護をバイパスできる場合でも、ユーザとカーネルプロセスの両方のページテーブルを改ざんから保護するために連携するよう設計されています。SPTMは、カーネルより高い権限レベルを利用し、権限がより低いTXMを利用してコード実行を統治するポリシーを実際に適用することで、これを実行します。このシステムは、この権限分離と両者の間の信頼の統治によって、TXMの侵害がSPTMバイパスに自動的に変換されないように設計されています。 A15、A16、およびA17 SOCでは、SPTM(とTXM)がPPLに置き換わり、攻撃対象領域を小さくして防御しやすく、初期ブート時でもカーネルの信頼性に依存しないようになっています。また、SPTMは、PPLが利用する高速許可制限を進化させた、新しいシリコンプリミティブに依存します。