web-dev-qa-db-ja.com

x86でのDPLとRPLの違い

Intel x86 Manualやその他のソースを読んで、DPL(記述子特権レベル)とRPL(要求特権レベル)の違いを理解していませんでした。なぜ両方が必要なのですか?どうもありがとうございます

14
dlbp

良い質問。

CPL対DPL対RPL

これを簡単にするために、最初にCPLとDPLについて考えてみましょう。

  • CPLは、現在の特権レベルです。
  • DPLは、セグメントの特権レベルです。最小値を定義します1 セグメントにアクセスするために必要な特権レベル。
  • 特権レベルの範囲は0〜3です。小さい数字はもっと特権があります
  • したがって、セグメントにアクセスするには、CPLがセグメントのDPL以下である必要があります

RPLは、セグメントセレクターに関連付けられた特権レベルです。セグメントセレクターは、セグメントを参照する16ビット値です。すべてのメモリアクセス(暗黙的に2 またはそれ以外の場合)アクセスの一部としてセグメントセレクターを使用します。

セグメントにアクセスする場合、実際には2つのチェックを実行する必要があります。セグメントへのアクセスは、次のbothの両方が当てはまる場合にのみ許可されます。

  • CPL <= DPL
  • RPL <= DPL

したがって、CPLがセグメントにアクセスするのに十分な特権を持っている場合でも、そのセグメントを参照するセグメントセレクターに十分な特権がない場合は、アクセスが拒否されます。

RPLの背後にある動機

これの目的は何ですか?さて、推論は少し古くなっていますが、Intelのドキュメントは次のようなシナリオを提供しています:

  • オペレーティングシステムが、呼び出し元から論理アドレス(セグメントセレクター+オフセット)を受け取り、そのアドレスに書き込むシステムコールを提供するとします。
  • 通常のアプリケーションは、CPLが3で実行されます。システムコールはCPL0で実行されます
  • あるセグメント(これをXと呼びます)のDPLが0であるとしましょう。

通常、アプリケーションはセグメントXのメモリにアクセスできません(CPL> DPLのため)。ただし、システムコールの実装方法によっては、アプリケーションがセグメントX内のアドレスのパラメーターを使用してシステムコールを呼び出すことができる場合があります。システムコールには特権があるため、代わりにセグメントXに書き込むことができます。アプリケーションの。これにより、オペレーティングシステムに 特権昇格の脆弱性 が導入される可能性があります。

これを軽減するために、公式の推奨事項は、特権ルーチンが非特権コードによって提供されるセグメントセレクターを受け入れる場合、最初にセグメントセレクターのRPLを非特権コードのRPLと一致するように設定する必要があることです。3。このように、オペレーティングシステムは、特権のない呼び出し元がまだ作成できないセグメントにアクセスできなくなります。これは、オペレーティングシステムとアプリケーションの間の境界を強制するのに役立ちます。

当時と現在

セグメント保護は、ページングがx86ファミリのプロセッサに存在する前に、286で導入されました。当時、セグメンテーションは、ユーザーモードコンテキストからカーネルメモリへのアクセスを制限する唯一の方法でした。 RPLは、異なる特権レベル間でポインターを渡すときにこの制限を適用するための便利な方法を提供しました。

最新のオペレーティングシステムでは、ページングを使用してメモリへのアクセスを制限しているため、セグメンテーションが不要です。セグメンテーションは必要ないため、 フラットメモリモデル を使用できます。これは、セグメントレジスタCSDSSS、およびESがすべてゼロを底とし、アドレス空間全体に拡張されることを意味します。実際、64ビットの「ロングモード」では、これら4つのセグメントレジスタの内容に関係なく、フラットメモリモデルが強制されます。セグメントはまだ時々使用されます(たとえば、WindowsはFSGSを使用して スレッド情報ブロック と0x23と0x33を 2ビットと64ビットのコードを切り替える を指します。 Linuxも同様です)が、セグメントを渡す必要はもうありません。したがって、RPLはほとんどが昔の未使用の残り物です。

RPL:これまで必要でしたか

DPLとRPLの両方が必要な理由を尋ねました。 286のコンテキストでも、RPLを持つことは実際には必要性ではありませんでした。上記のシナリオを考慮すると、特権プロシージャは常にLAR命令を介して提供されたセグメントのDPLを取得し、これを呼び出し元の特権と比較し、呼び出し元の特権がセグメントにアクセスするのに不十分な場合は先制的に救済することができます。ただし、私の意見では、RPLを設定することは、さまざまな特権レベルにわたるセグメントアクセスを管理するためのよりエレガントで簡単な方法です。

特権レベルの詳細については、 インテルのソフトウェア開発者マニュアル の第3巻、特に「特権レベル」および「発信者アクセス特権の確認」というタイトルのセクションを確認してください。

1 技術的には、DPLは、アクセスされているセグメントまたはゲートのタイプに応じて異なる意味を持つ可能性があります。簡単にするために、私が説明するすべては、特にデータセグメントに適用されます。詳細については、Intelのドキュメントを確認してください
2 たとえば、命令ポインタは、命令をフェッチするときにCSに格納されているセグメントセレクタを暗黙的に使用します。ほとんどのタイプのデータアクセスは、DSなどに格納されているセグメントセレクターを暗黙的に使用します。
3 ARPL命令を参照してください(16ビット/ 32ビットプロテクトモードのみ)

20
user1354557