リングプロテクションとは
リングプロテクション(Ring Protection)は、コンピュータアーキテクチャにおける権限の階層構造で、複数の特権レベルを用いてデータや機能を保護する仕組みです。単に「リング」とも呼ばれ、階層保護ドメインとも称されます。この技術は、システムのフォールトトレランス(耐障害性)を高め、悪意のある行為からシステムを保護することを目的としています。リングプロテクションは、capability-based securityとは対照的なアプローチを採用しています。
概要
オペレーティングシステム(OS)は、コンピュータのリソースに対して様々なアクセスレベルを提供します。リングプロテクションは、これらのアクセスレベルを円形の階層構造として表現し、各階層が異なる権限レベルに対応します。最も高い特権レベル(リング0)は、最も信頼性が高く、ハードウェアに直接アクセスできます。一方、最も低い特権レベル(大きな番号のリング)は、信頼性が低く、直接的なハードウェアアクセスは制限されます。リング間にはゲートが設けられ、外側のリングから内側のリングのリソースへ、あらかじめ決められた方法でのみアクセス可能です。
この仕組みにより、あるリングで動作するプログラムが、別のリングで動作するプログラムのリソースを不正に利用することを防ぎ、セキュリティを強化できます。例えば、ハードウェアアクセスは通常、リング1の
デバイスドライバで行われます。そのため、リング3で動作するユーザープログラムが、ユーザーの許可なくWebカメラを起動することはできません。Webブラウザなど、より大きな番号のリングで動作するプログラムが、ネットワークなどより小さい番号のリングでのみアクセス可能なリソースを利用するには、所定の手続きを踏む必要があります。
実装
リングプロテクションは、ハードウェアによって実装されることが多く、
CPUアーキテクチャによって複数の
CPUモードが提供されます。Multics
オペレーティングシステムは、このリングプロテクションの概念を初めて導入した先進的なシステムの一つでした。しかし、現在の一般的なOSの多くは、ハードウェアが提供するすべての
CPUモードを活用しておらず、2つのリングレベルのみを使用していることが多いです。
例えば、Windows XP以降のOSでは、
カーネルモードに対応するリング0と、ユーザーモードに対応するリング3の2つのリングしか使用していません。OS/2では、リング0が
カーネルと
デバイスドライバ、リング2が特権コード、リング3が非特権コードに対応していました。一方、DOSでは、
カーネル、ドライバ、アプリケーションが同じリング3で動作することが多く、メモリマネージャがリング0で動作していました。また、
DR-DOSのEMM386では、一部モジュールをリング1で動作させることもできました。
OpenVMSは4つのモードを使用し、それぞれ
カーネル、エグゼクティブ、スーパーバイザ、ユーザーと呼んでいます。最近では、XenのVMMソフトウェア、マイクロソフトのNGSCB、Intel VT-xなどの
ハイパーバイザがリングプロテクションに関する新しい動きとして注目されています。
Multicsでは8つのリングレベルを使用していましたが、最近のシステムではより少ないリング数で実装されています。ハードウェアは、実行中のスレッドが動作するリングレベルを監視し、メモリアクセスをリングレベルに応じて制限します。リング間の制御の移動は、特別なゲート命令やコール命令を通して、予め定義されたエントリポイントを経由する必要があります。これにより、偶発的または意図的なセキュリティ侵害からシステムを保護できます。
AArch64アーキテクチャでは、リングに相当する機能として例外レベル(Exception Level)が4レベル定義されています。EL3は
ファームウェア、EL2は
ハイパーバイザ、EL1はOS
カーネル、EL0はユーザーモードに対応しています。これらのレベルをすべて利用することで、より安全なシステムを構築できます。
スーパーバイザモード
スーパーバイザモードは、システムレベルのソフトウェアが動作する際に設定されるハードウェアフラグを指します。このフラグが設定されていると、特権命令を実行したり、制御レジスタを変更したり、割り込みをマスクしたりすることが可能になります。スーパーバイザモードは、
オペレーティングシステムの
カーネルが動作する際に使用されます。一方、ユーザーモードでは、アプリケーションが実行され、特権命令は制限されます。
モノリシック
カーネルのOSでは、
カーネルがスーパーバイザモードで動作し、アプリケーションがユーザーモードで動作します。マイクロ
カーネルでは、必ずしもこのようにはなりません。
LinuxやWindowsなどのOSでは、ユーザーモードのコードが特別な機能を利用したい場合、システムコールによってスーパーバイザモードに移行し、
カーネル空間で処理を行い、結果をユーザー空間に返します。
一部のプロセッサは、4層のリングプロテクションを持っており、リング0で動作するプログラムはあらゆる操作を実行できます。リング3で動作するコードでエラーが発生しても、システム全体には影響しません。リング1とリング2はあまり使用されませんが、異なるアクセスレベルを提供できます。
ユーザーモードから
カーネルモードへの切り替えは、システムにとってコストがかかる処理です。モード切り替え自体は短時間で完了しますが、システムコール全体の処理には多くの時間がかかります。マイクロ
カーネルは、このオーバーヘッドを最小限に抑えようとしています。
近年の
CPUは、
ハイパーバイザのための仮想化命令を提供しており、
ハイパーバイザがリング0のハードウェアアクセスを制御できます。Intel VT-xやAMD-Vなどの技術は、リング0よりも高い特権レベルを提供し、ゲストOSがリング0の命令を実行しても、ホストOSや他のゲストOSに影響を与えないようにできます。
CPUとOSの抽象化レベルの間の相互運用
多くの
CPUアーキテクチャは、
オペレーティングシステムが利用する以上の柔軟性を提供しています。しかし、複雑な
CPUモード群を最大限に活用するには、OSと
CPUの密接な協力が必要です。OSが複数のプラットフォームで動作するように設計されている場合、
CPUモード機能の多くは無視されることがあります。例えば、Windowsが2つのリングしか使わないのは、かつてx86以外のアーキテクチャもサポートしていたためです。
Multicsは、特定の
CPUアーキテクチャ向けに設計され、その
CPUアーキテクチャもMultics用に設計されたため、利用可能なすべての
CPUモードを活用していました。しかし、これは例外的なケースです。今日では、OSとハードウェアが密接に相互依存することは、セキュリティと安定性の観点からは望ましいことですが、費用対効果の面では課題があります。
マイクロ
カーネルは、特権モードで実行するコード量を最小限に抑えることで、セキュリティと簡潔さを追求しますが、性能が犠牲になることが多いです。
まとめ
リングプロテクションは、コンピュータシステムのセキュリティを確保するための重要な技術です。複数の特権レベルを設け、アクセス権を制限することで、不正な操作やマルウェアの侵入を防ぎます。スーパーバイザモードや
ハイパーバイザモードなどの概念と併せて理解することで、より深くコンピュータアーキテクチャを理解することができます。
リングプロテクションは、システムのセキュリティを確保する上で不可欠な要素であり、その仕組みを理解することは、コンピュータシステムを安全に利用する上で重要な知識となります。