保護キー
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2020/12/24 06:47 UTC 版)
保護キー機構では、メモリはある一定のサイズのかたまりに分割される(例えば、4Kバイト)。そして、それぞれに保護キー (protection key) と呼ばれる数値が対応付けられる。また、プロセスもひとつの保護キーを割り当てられている。メモリにアクセスする際、ハードウェアは現在のプロセスの保護キーとアクセスしようとしているメモリの保護キーが合っているかをチェックする。もし合っていない場合、例外が発生する。この機構はSystem/360アーキテクチャで使用されている。これは最近のメインフレーム System z でも利用可能で、そのOSやサブシステムがよく使用している。 今日のメインフレームは本質的に、PCやミッドレンジのサーバ(Windows、Linux、UNIXなど)に見られる欠陥である特権エスカレーション(英語版)に耐性がある。これはメインフレームにおけるメモリ保護機構が、ハードウェアで実装された複数のCPU保護リングや暗号機構で支えられた保護キーなどを使っているためである。そういった機構により、ユーザープロセスが直接ハードウェアにアクセスすることが防がれ、カーネルレベルのサービスもほとんど不要となっている。例えばアプリケーションの脆弱性を利用してシェルコードを実行させようとしても、より高い特権レベルのプロセス(ドライバやカーネル)に影響を及ぼすことはできないし、保護キーの異なる他のプロセスにも影響を及ぼせない。CPU保護リングはPCやミッドレンジサーバのOSでは限定的にしか使われておらず(例えば、x86ではカーネルがリング0、ユーザーがリング3だけを使用することが多い)、結果としてオールオアナッシング的な設計になっている。すなわち、ハードウェアにアクセスするにはカーネルが必須であり、その中で何か悪さをしようとすると悪意あるコードでシステム全体を乗っ取ることになる。 上述のSystem/360の保護キーは物理アドレスと対応している。インテルのItaniumやヒューレット・パッカードのPA-RISCなどでは、それとは異なる保護キー機構が使われており、仮想アドレスと保護キーが対応付けられていて、プロセスに複数の保護キーを割り当て可能である。 ItaniumやPA-RISCのアーキテクチャでは、論理アドレスから物理アドレスへの変換(TLBエントリ)にキー (Itanium) またはプロテクションID (PA-RISC) が付属している。ある時点で動作中のプロセスには保護キーレジスタ群がある(Itaniumでは16本、PA-RISCでは4本)。物理アドレスへの変換で選ばれたTLBエントリにあるキーはそれらレジスタ群にある保護キーと比較される。他のチェックと同時にキーが一致しないとアクセスは許可されない。キーがどのレジスタとも一致しない場合、例外が発生する。その例外処理では、必要に応じて実行中プロセスが他に保護キーを持っていないかチェックする。すなわち、保護キーレジスタ群はソフトウェアが管理するキャッシュのように扱われる。 PA-RISCの保護キーは15ビットから18ビットで、Itaniumでは最小でも18ビットである。保護キーは保護領域 (protection domain) に対応しており、一般的にはライブラリやモジュールなどに対応する。
※この「保護キー」の解説は、「メモリ保護」の解説の一部です。
「保護キー」を含む「メモリ保護」の記事については、「メモリ保護」の概要を参照ください。
- 保護キーのページへのリンク