保護リング

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ

プロテクトモードで使用可能なx86の特権リング

コンピュータサイエンスでは階層型保護ドメイン[1] [2]は、しばしば保護リングと呼ばれ、データと機能をフォールト(フォールトトレランスを改善することによって)および悪意のある動作(コンピュータセキュリティを提供することによって)から保護するメカニズムです。

コンピュータオペレーティングシステムは、リソースへのさまざまなレベルのアクセスを提供します。保護リングは、コンピュータシステムのアーキテクチャ内の2つ以上の階層レベルまたは特権のの1つですこれは通常、ハードウェアまたはマイクロコードレベルでさまざまなCPUモードを提供する一部のCPUアーキテクチャによってハードウェアで強制されます リングは、最も特権のある(最も信頼できる、通常はゼロの番号が付けられる)から最も特権の低い(最も信頼できない、通常は最大のリング番号を持つ)までの階層に配置されます。ほとんどのオペレーティングシステムでは、リング0は最も多くの特権を持つレベルであり、CPUやメモリなどの物理ハードウェアと最も直接対話します。

リング間に特別なコールゲートが用意されており、任意の使用を許可するのではなく、事前定義された方法で外部リングが内部リングのリソースにアクセスできるようになっています。リング間のアクセスを正しくゲーティングすると、あるリングまたは特権レベルのプログラムが別のリングのプログラム用のリソースを悪用するのを防ぐことで、セキュリティを向上させることができます。たとえば、リング3でユーザープログラムとして実行されているスパイウェアは、ハードウェアアクセスがデバイスドライバー用に予約されたリング1機能である必要があるため、ユーザーに通知せずにWebカメラをオンにしないようにする必要があります番号の大きいリングで実行されているWebブラウザなどのプログラムは、ネットワークへのアクセスを要求する必要があります。これは、番号の小さいリングに制限されているリソースです。

実装

複数の保護リングは、今日のUnixファミリのオペレーティングシステムの非常に安全な前身であるMulticsオペレーティングシステムによって導入された最も革新的な概念の1つでした。GE 645メインフレームコンピュータにはハードウェアアクセス制御がありましたが、ハードウェアのリングを完全にサポートするには不十分だったため、Multicsはソフトウェアのリング遷移をトラップすることでそれらをサポートしました。[3]後継のHoneywell6180は、8つのリングをサポートするハードウェアでそれらを実装しました。[4]ただし、ほとんどの汎用システムは、それらが実行されているハードウェアがより多くのCPUモードを提供している場合でも、2つのリングしか使用しません。それより。たとえば、Windows7とWindowsServer 2008(およびその前身)は2つのリングのみを使用し、リング0はカーネルモードに対応し、リング3はユーザーモードに対応します[5]。これは、以前のバージョンのWindowsが2つの保護レベルのみをサポートするプロセッサで実行されていたためです。 。[6]

多くの最新のCPUアーキテクチャ(一般的なIntel x86アーキテクチャを含む)には、何らかの形式のリング保護が含まれていますが、UnixなどのWindowsNTオペレーティングシステムはこの機能を十分に活用していません。OS / 2は、カーネルコードとデバイスドライバー用リング0、特権コード用のリング2(I / Oアクセス許可を持つユーザープログラム)、および非特権コード用のリング3(ほぼすべてのユーザー)の3つのリングを使用してある程度機能します。プログラム)。DOSでは、カーネル、ドライバー、およびアプリケーションは通常、リング3で実行されます(ただし、これはプロテクトモードドライバーやDOSエクステンダが使用されている場合に限定されます。リアルモードOSとして、システムは実質的に保護なしで実行されます。 )、一方、EMM386はリング0で実行されます。これに加えて、DR-DOSのEMM386 3.xxは、オプションで、代わりにリング1でいくつかのモジュール(DPMSなど)を実行できます。ActiveXは、カーネル、エグゼクティブ、スーパーバイザー、およびユーザーと呼ばれる(特権の降順で)4つのモードを使用します。

この設計構造への新たな関心は、Xen VMMソフトウェアの急増、モノリシックカーネルとマイクロカーネル(特にUsenetニュースグループとWebフォーラム)に関する継続的な議論、 NGSCBイニシアチブの一部としてのMicrosoftのRing-1設計構造、およびIntel VT-x(以前のVanderpool) などのx86仮想化に基づくハイパーバイザー。

元のMulticsシステムには8つのリングがありましたが、最近の多くのシステムにはそれより少ないリングがあります。ハードウェアは、特別なマシンレジスタの助けを借りて、実行中の命令スレッドの現在のリングを常に認識しています。一部のシステムでは、代わりに仮想メモリの領域にハードウェアでリング番号が割り当てられます。1つの例は、Data General Eclipse MV / 8000で、プログラムカウンター(PC)の上位3ビットがリングレジスタとして機能します。したがって、たとえば、仮想PCを0xE200000に設定して実行するコードは、自動的にリング7になり、メモリの別のセクションでサブルーチンを呼び出すと、自動的にリング転送が発生します。

ハードウェアは、あるリングから別のリングに制御を渡す方法を厳しく制限し、リング間で実行できるメモリアクセスのタイプにも制限を適用します。例としてx86を使用すると、特別な[明確化が必要] ゲート構造があります。これは、下位レベル(より信頼できる)リングの事前定義されたエントリポイントに向けて安全な方法で制御を転送する呼び出し命令によって参照されます[明確化が必要] 。これはスーパーバイザーコールとして機能しますリングアーキテクチャを使用する多くのオペレーティングシステムで。ハードウェアの制限は、偶発的または悪意のあるセキュリティ違反の機会を制限するように設計されています。さらに、最も特権のあるリングには、特別な機能(仮想メモリハードウェアをバイパスする実メモリアドレス指定など)が与えられる場合があります。

ARMバージョン7アーキテクチャは、アプリケーション(PL0)、オペレーティングシステム(PL1)、およびハイパーバイザー(PL2)の3つの特権レベルを実装します。異常なことに、レベル0(PL0)は最小特権レベルであり、レベル2は最大特権レベルです。[8] ARMバージョン8は、AArch64 [9] :D1-2454 およびAArch32に対して、アプリケーション(EL0)、オペレーティングシステム(EL1)、ハイパーバイザー(EL2)、およびセキュアモニター/ファームウェア(EL3)の4つの例外レベルを実装します。[9] :G1-6013 

一部のシステムでは、リングプロテクションをプロセッサモード(マスター/カーネル/特権/スーパーバイザーモードとスレーブ/非特権/ユーザーモード)と組み合わせることができます。両方をサポートするハードウェアで実行されているオペレーティングシステムは、両方の形式の保護を使用することも、1つだけを使用することもできます。

リングアーキテクチャを効果的に使用するには、ハードウェアとオペレーティングシステム間の緊密な協力が必要です[なぜですか?]複数のハードウェアプラットフォームで動作するように設計されたオペレーティングシステムは、サポートされているすべてのプラットフォームにリングが存在しない場合、リングの使用を制限することができます。多くの場合、ハードウェアがリングを介してより細かい粒度を提供する場合でも、セキュリティモデルは「カーネル」と「ユーザー」に単純化されます。

モード

スーパーバイザーモード

コンピューター用語では、スーパーバイザーモードはハードウェアを介したフラグであり、システムレベルのソフトウェアで実行されているコードによって変更できます。システムレベルのタスクまたはスレッドでは、実行中にこのフラグが設定されますが、ユーザーレベルのアプリケーションでは設定されません。このフラグは、さまざまな記述子テーブルのレジスタの変更などのマシンコード操作を実行できるかどうか、または割り込みの無効化などの操作を実行できるかどうかを決定します。2つの異なるモードで動作するという考えは、「より多くの制御がより多くの責任を伴う」ことから生まれました。障害が発生するとコンピュータシステム全体がクラッシュする可能性があるため、スーパーバイザーモードのプログラムは失敗しないと信頼されています。

スーパーバイザーモードは、「特権命令を含むすべての命令の実行を可能にする一部のプロセッサの実行モードです。また、異なるアドレススペース、メモリ管理ハードウェア、およびその他の周辺機器へのアクセスを提供する場合があります。これは、オペレーティングシステムが実行するモードです。通常は実行されます。」[10]

モノリシックカーネルでは、オペレーティングシステムはスーパーバイザーモードで実行され、アプリケーションはユーザーモードで実行されます。エクソカーネルマイクロカーネルを備えたオペレーティングシステムなど、他の種類のオペレーティングシステムは、必ずしもこの動作を共有するわけではありません。

PCの世界からのいくつかの例:

  • LinuxmacOS、およびWindowsは、スーパーバイザー/ユーザーモードを使用する3つのオペレーティングシステムです。特殊な機能を実行するには、ユーザーモードコードはスーパーバイザーモードまたはカーネルスペースへのシステムコールを実行する必要があります。カーネルスペースでは、オペレーティングシステムの信頼できるコードが必要なタスクを実行し、実行をユーザースペースに戻します。追加のコードは、ロード可能なカーネルモジュールを使用してカーネル空間に追加できますが、このコードはユーザーモードのアクセス制御と安全性の制限を受けないため、必要な権限を持つユーザーのみが追加できます。
  • DOS ( EMM386などの386メモリマネージャがロードされていない限り)、およびその他の単純なオペレーティングシステムと多くの組み込みデバイスは、スーパーバイザモードで永続的に実行されます。つまり、ドライバをユーザープログラムとして直接書き込むことができます。

ほとんどのプロセッサには、少なくとも2つの異なるモードがあります。x86プロセッサには、4つの異なるリングに分割された4つの異なるモードがあります。リング0で実行されるプログラムはシステムで何でも実行でき、リング3で実行されるコードは、コンピューターシステムの他の部分に影響を与えることなく、いつでも失敗できるはずです。リング1とリング2はめったに使用されませんが、異なるレベルのアクセスで構成できます。

ほとんどの既存のシステムでは、ユーザーモードからカーネルモードに切り替えると、パフォーマンスに高いコストがかかります。getpid基本的な要求に応じて、ほとんどのマシンで1000〜1500サイクルのコストが測定されています。これらのうち、約100は実際のスイッチ(ユーザーからカーネルスペースへの70、およびその逆)用であり、残りは「カーネルオーバーヘッド」です。[11] [12] L3マイクロカーネルでは、このオーバーヘッドを最小限に抑えることで、全体のコストを約150サイクルに削減しました。[11]

モーリス・ウィルクスは次のように書いています。[13]

...最終的に、リングが提供する階層的保護がシステムプログラマーの要件に厳密に一致せず、2つのモードしかない単純なシステムではほとんどまたはまったく改善が見られないことが明らかになりました。保護の輪は、ハードウェアでの効率的な実装に役立ちましたが、他に言うことはほとんどありませんでした。[...]保護のリングが答えを提供しなかったことが見られた後でも、きめの細かい保護の魅力は残っていました...これは再び盲目の路地を証明しました...

パフォーマンスと決定論を獲得するために、一部のシステムでは、デバイスドライバーではなく、アプリケーションロジックと見なされる可能性のある関数をカーネルモードで配置します。例として、セキュリティアプリケーション(アクセス制御ファイアウォールなど)とオペレーティングシステムモニターが挙げられます。少なくとも1つの組み込みデータベース管理システムであるeX treme DBカーネルモードは、カーネルモードの展開用に特別に開発されており、カーネルベースのアプリケーション機能用のローカルデータベースを提供し、カーネル機能が相互作用するときに発生するコンテキストスイッチを排除します。データベースシステムをユーザーモードで実行します。[14]

関数は、リングを横切って反対方向に移動することもあります。たとえば、Linuxカーネルは、通常はシステムコール、つまりリング遷移を必要とする関数を含むvDSOセクションをプロセスに挿入します。これらの関数は、syscallを実行する代わりに、カーネルによって提供される静的データを使用します。これにより、リングトランジションが不要になるため、システムコールよりも軽量になります。関数gettimeofdayは、この方法で提供できます。

ハイパーバイザーモード

IntelおよびAMDの最近のCPUは、ハイパーバイザーがリング0ハードウェアアクセスを制御するためのx86仮想化命令を提供します。これらは相互に互換性がありませんが、Intel VT-x(コードネーム「Vanderpool」)とAMD-V(コードネーム「Pacifica」)の両方が新しい「Ring-1」を作成し、ゲストオペレーティングシステムが他に影響を与えることなくRing0操作をネイティブに実行できるようにします。ゲストまたはホストOS。

仮想化を支援するために、VT-xとSVMはリング0の下に新しい特権レベルを挿入します。どちらも、ハイパーバイザーで使用することを目的とした、「リング-1」でのみ機能する9つの新しいマシンコード命令を追加します。[15]

特権レベル

x86命令セット特権レベルは、メモリ領域、I / Oポート、特別な命令などのリソースへの、プロセッサで現在実行されているプログラムのアクセスを制御します。最も特権の高い0から最も特権の低い3までの4つの特権レベルがあります。最新のオペレーティングシステムのほとんどは、カーネル/エグゼクティブにレベル0を使用し、アプリケーションプログラムにレベル3を使用します。レベルnで使用可能なリソースは、レベル0からnでも使用できるため、特権レベルはリングです。特権の低いプロセスが特権の高いプロセスにアクセスしようとすると、一般保護違反の例外がOSに報告されます。

4つの特権レベルすべてを使用する必要はありません。Microsoft WindowsmacOSLinuxiOSAndroidなどの幅広い市場シェアを持つ現在のオペレーティングシステムは、ほとんどの場合、1ビットのみのページングメカニズムを使用して、特権レベルをスーパーバイザーまたはユーザー(U / Sビット)として指定します。Windows NTは、2レベルのシステムを使用します。[16] 8086のリアルモードプログラムはレベル0(最高の特権レベル)で実行されますが、8086の仮想モードはレベル3ですべてのプログラムを実行します。[17]

x86 ISAファミリでサポートされる複数の特権レベルの将来の使用の可能性には、コンテナ化仮想マシンが含まれます。ホストオペレーティングシステムカーネルは、完全な特権アクセス(カーネルモード)を持つ命令を使用できますが、仮想マシンまたはコンテナーのゲストOSで実行されているアプリケーションは、ユーザーモードで最低レベルの特権を使用できます。仮想マシンとゲストOSカーネル自体が、中間レベルの命令特権を使用して、ゲストオペレーティングシステムの観点から、システムコールなどのカーネルモード操作を呼び出して仮想化することができます。[18]

IOPL

IOPL I / O特権レベル)フラグは、すべてのIA-32互換x86CPUにあるフラグですFLAGSレジスタのビット12と13を占有しますプロテクトモードロングモードでは、現在のプログラムまたはタスクのI / O特権レベルが表示されます。タスクまたはプログラムがI / Oポートにアクセスするには、タスクまたはプログラムの現在の特権レベル(CPL)(CPL0、CPL1、CPL2、CPL3)がIOPL以下である必要があります

IOPLは、現在の特権レベルがリング0の場合にのみ 使用POPF(D)して変更できます。IRET(D)

IOPLに加えて、TSSのI / Oポート許可も、タスクがI / Oポートにアクセスする能力を決定することに関与します。

その他

x86システムでは、x86ハードウェア仮想化(VT-xおよびSVM)は「リング-1」と呼ばれ、システム管理モードは「リング-2」と呼ばれ、Intel ManagementEngineおよびAMDプラットフォームセキュリティプロセッサは「リング-2」と呼ばれることもあります。 「リング-3」。[19]

ハードウェア機能の使用

多くのCPUハードウェアアーキテクチャは、通常実行されているオペレーティングシステムで利用されるよりもはるかに高い柔軟性を提供します。複雑なCPUモードを適切に使用するには、オペレーティングシステムとCPUの間の非常に緊密な連携が必要であるため、OSをCPUアーキテクチャに結び付ける傾向があります。OSとCPUが相互に特別に設計されている場合、これは問題ではありませんが(一部のハードウェア機能はまだ活用されていない場合があります)、OSが複数の異なるCPUアーキテクチャと互換性があるように設計されている場合、 CPUモード機能はOSによって無視される場合があります。たとえば、Windowsが2つのレベル(リング0とリング3)のみを使用する理由は、過去にサポートされていた一部のハードウェアアーキテクチャ(PowerPCMIPSなど)が原因です。)2つの特権レベルのみを実装しました。[5]

Multicsは、特別なCPUアーキテクチャ用に特別に設計されたオペレーティングシステムであり(Multics用に特別に設計されたものです)、使用可能なCPUモードを最大限に活用しました。しかし、それは規則の例外でした。今日、OSとハードウェア間のこの高度な相互運用は、セキュリティと安定性の潜在的な利点にもかかわらず、多くの場合、費用効果が高くありません。

最終的に、CPUの個別のオペレーティングモードの目的は、ソフトウェアによるシステム環境の偶発的または意図的な破損(および対応するシステムセキュリティの侵害)に対するハードウェア保護を提供することです。システムソフトウェアの「信頼できる」部分のみが、カーネルモードの無制限の環境で実行でき、パラダイム設計では、絶対に必要な場合にのみ実行できます。他のすべてのソフトウェアは、1つ以上のユーザーモードで実行されます。プロセッサがユーザーモードで障害または例外状態を生成した場合、ほとんどの場合、システムの安定性は影響を受けません。プロセッサがカーネルモードで障害または例外状態を生成した場合、ほとんどのオペレーティングシステムは回復不能なエラーでシステムを停止します。モードの階層が存在する場合(リングベースのセキュリティ)、1つの特権レベルでの障害と例外は、より高い番号の特権レベルのみを不安定にする可能性があります。したがって、リング0(最高の特権を持つカーネルモード)の障害はシステム全体をクラッシュさせますが、リング2の障害は、リング3以降とリング2自体にのみ影響します。

モード間の移行は、高特権レベルから低特権レベルへの移行(カーネルモードからユーザーモードへの移行など)の場合、実行スレッドの裁量に委ねられますが、低レベルから高レベルへの移行は、セキュアを介してのみ実行できます。 、特別な命令を実行することによって、または外部割り込みが受信されたときに通過するハードウェア制御の「ゲート」。

マイクロカーネルオペレーティングシステムは、セキュリティエレガンスの目的で、特権モードで実行されるコードの量を最小限に抑えようとしますが、最終的にはパフォーマンスを犠牲にします。

も参照してください

参考文献

  1. ^ Karger、Paul A。; ハーバート、アンドリューJ.(1984)。「ラティスセキュリティとアクセスのトレーサビリティをサポートする拡張機能アーキテクチャ」。1984年のセキュリティとプライバシーに関するIEEEシンポジウムp。2. doi10.1109 /SP.1984.10001ISBN 0-8186-0532-4S2CID14788823 _
  2. ^ バインダー、W。(2001)。「J-SEAL2モバイルエージェントカーネルの設計と実装」。Proceedings 2001 Symposium on Applications and theInternetpp。35–42。土井10.1109 /SAINT.2001.905166ISBN 0-7695-0942-8S2CID11066378 _
  3. ^ 「保護リングを実装するためのハードウェアアーキテクチャ」2012年9月27日取得
  4. ^ 「Multics用語集-リング」2012年9月27日取得
  5. ^ a b Russinovich、Mark E。; デビッドA.ソロモン(2005)。Microsoft Windows Internals(4版)。MicrosoftPress。pp。16  _ ISBN 978-0-7356-1917-3
  6. ^ ルシノビッチ、マーク(2012)。Windows内部パート1。第6版ワシントン州レドモンド:Microsoft Press p。17. ISBN 978-0-7356-4873-9Windowsが2つのレベルのみを使用する理由は、過去にサポートされていた一部のハードウェアアーキテクチャ(CompaqAlphaSiliconGraphics MIPSなど)が2つの特権レベルのみを実装したためです。
  7. ^ 「OS / 2用のプレゼンテーションデバイスドライバリファレンス-5。OS/ 2プレゼンテーションドライバの概要」2015年6月15日にオリジナルからアーカイブされました2015年6月13日取得
  8. ^ ARMアーキテクチャリファレンスマニュアルARMv7-AおよびARMv7-RエディションArmLtd.pB1-1136。
  9. ^ a b ArmアーキテクチャリファレンスマニュアルArmv8、Aプロファイルアーキテクチャ用アーム株式会社
  10. ^ 「スーパーバイザーモード」FOLDOC1995年2月15日。
  11. ^ a b JochenLiedtkeµ-Kernel Constructionについて、Proc。オペレーティングシステムの原則に関する第15回ACMシンポジウム(SOSP)、1995年12月
  12. ^ Ousterhout、JK1990。オペレーティングシステムがハードウェアほど速くならないのはなぜですか?Usenix Summer Conference、カリフォルニア州アナハイム、247〜256ページ。
  13. ^ モーリスウィルクス(1994年4月)。「変化する世界のオペレーティングシステム」。ACMSIGOPSオペレーティングシステムレビュー28(2):9–21。土井10.1145 /198153.198154ISSN0163-5980_ S2CID254134_  
  14. ^ Gorine、AndreiおよびKrivolapov、Alexander。「カーネルモードデータベース:高性能アプリケーションのためのDBMSテクノロジー」 Dr。Dobb's Journal、2008年5月。
  15. ^ ドーナン、アンディ(2005年11月1日)。「IntelVTとAMDPacifica」CMP。2013年5月30日にオリジナルからアーカイブされました2012年11月11日取得
  16. ^ ルシノビッチ、マークE。; デビッドA.ソロモン(2005)。Microsoft Windows Internals(4版)。MicrosoftPress。pp。16.ISBN978-0-7356-1917-3 _ _ 
  17. ^ Sunil Mathur、「マイクロプロセッサ8086:アーキテクチャ、プログラミング、およびインターフェイス」、Eastern Economy Edition、PHI Learning
  18. ^ アンダーソン、トーマス; ダーリン、マイケル(2014年8月21日)。「2.2」。オペレーティングシステム:原則と実践(第2版)。再帰的な本。ISBN 978-0985673529
  19. ^ Gelas、JohanDe。「ハードウェア仮想化:要点」www.anandtech.com 2021年3月13日取得
  • Intel80386プログラマーズリファレンス

さらに読む