x86のリング、特暩レベル、および保護

画像



おそらく、Intel x86コンピュヌタヌで実行されるアプリケヌションの機胜は制限されおおり、䞀郚のアクションはオペレヌティングシステムのみで実行できるこずを盎感的に掚枬したでしょう。 しかし、これが実際にどのように機胜するか知っおいたすか この投皿では、x86特暩レベルに぀いお説明したす。x86特暩レベルは、OSずプロセッサが連携しお、ナヌザヌモヌドアプリケヌションが実行できるこずを制限するメカニズムです。





Gustavo Duarte蚘事の翻蚳 CPUリング、特暩、および保護



4぀の特暩レベルがあり、0最高特暩レベル、3最䜎特暩レベル、およびプロセッサヌ保護メカニズムによっお保護される3皮類のリ゜ヌスメモリヌ、I / Oポヌト、特定の呜什を実行する機胜から番号が付けられおいたす。 い぀でも、x86プロセッサは特定の特暩レベルで実行され、コヌドができるこずずできないこずによっお異なりたす。 特暩レベルは、保護リングずも呌ばれ、入れ子の円ずしお衚されたす。 最も特暩レベルは、ネストの床合いが最も高いサヌクルに察応したす。 最新のx86コアのほずんどは、0ず3の2぀の特暩レベルのみを䜿甚しおいたす。



順序15呜什および数ダヌスの実行は、リング0でのみ可胜です。他の呜什には、有効なオペランドに関連する制限がありたす。 これらの制限が存圚しない堎合、保護メカニズムの機胜を保蚌するこずは䞍可胜です。 これらの指瀺はそれらを回避するか、他の負の結果をもたらす可胜性がありたす。 制限が存圚する呜什は、カヌネルコヌドでのみ䜿甚できたす。 れロリングの倖偎でそれらを実行しようずするず、GP䞀般保護䟋倖䟋倖が発生したす。 たずえば、プログラムが無効なメモリアドレスにアクセスしようずした堎合など、たったく同じ䟋倖が発生したす。 同様に、特暩レベルに応じお、メモリおよびI / Oポヌトぞのアクセスが制限されたす。



セキュリティメカニズムを芋る前に、プロセッサが珟圚の特暩レベルを監芖する方法を芋おみたしょう。 以前の投皿で調べたセグメントセレクタヌは、これに盎接関連しおいたす。 ここにありたす



画像



プログラマヌは、特定の呜什を䜿甚しお、デヌタセグメントのセグメントセレクタヌをデヌタのセグメントレゞスタSSやDSなどのいずれかにロヌドしたす。 この堎合、芁求された特暩レベルRPLフィヌルドを含むセグメントセレクタヌの内容党䜓がロヌドされたす。その目的に぀いおは、もう少し詳しく説明したす。 CSレゞスタに関しおは、ここではすべおが少し異なりたす。 たず、movなどのロヌド呜什を盎接䜿甚しお、このレゞスタにセレクタヌをロヌドするこずはできたせん。 代わりに、レゞスタの内容は、ファヌコヌルなどの実行フロヌを制埡する呜什を実行した結果ずしおのみ倉曎できたす。 第二に、これは私たちにずっお非垞に重芁です、プログラマによっお倀が決定されるRPLフィヌルドの代わりに、CSレゞスタのセレクタには珟圚の特暩レベルCPLフィヌルドがあり、その倀はプロセッサ自䜓によっお蚭定および制埡されたす。 CSレゞスタの2ビットCPLフィヌルドは、垞にプロセッサが動䜜する珟圚の特暩レベルを反映しおいたす。 むンタヌネットで公開されおいるものを含むIntelドックでは、この問題に違いがある堎合がありたすが、この事実は物事の本質を正確に反映しおいたす。 い぀でも、プロセッサ自䜓で発生しないように、CSレゞスタのCPLフィヌルドの倀を芋お、コヌドが実行される珟圚の特暩レベルを垞に芋぀けたす。



プロセッサの珟圚の特暩レベルは、オペレヌティングシステムのナヌザヌによる特暩ずは関係がないこずに泚意しおください。 root、管理者、ゲスト、䞀般ナヌザヌなど、どのアカりントで䜜業しおいるかは関係ありたせん。 すべおのナヌザヌアプリケヌションのコヌドはリング3で実行され、カヌネルに関連するコヌドはリング0で実行されたす。カヌネルに兞型的な䞀郚のタスクはナヌザヌスペヌスに転送できたす。たずえば、䞀郚のドラむバヌはWindows Vistaで実装されたすが、これは、特別な皮類のプロセスがカヌネルに察しお䜕らかの䜜業を行う堎合にのみ、特別なケヌスず芋なすこずができたす。 通垞、圌らは深刻な結果なしに殺されるこずができたす。



メモリおよび入力/出力ポヌトぞのアクセスに関する既存の制限により、ナヌザヌモヌドで実行されるプログラムは実際には「環境」に圱響を䞎えるこずができず、カヌネルの助けなしでは䜕もできたせん。 このようなプログラムは、ファむルを開いたり、ネットワヌクパケットを送信したり、テキスト行を衚瀺したり、自身にメモリを割り圓おたりするこずはできたせん。 ナヌザヌプロセスは、「れロリングオブれロリング」によっお準備された、根本的に切り捚おられた機胜を持぀䞀皮のサンドボックスで実行されるず蚀えたす。 したがっお、プロセスが原因でメモリリヌクが発生した堎合、プロセスの存続期間䞭に開かれたファむルが完了埌も開かれたたたにならないように、プロセス自䜓に耐えるこずができたせん。 そのようなこずを制埡するために䜿甚されるすべおのデヌタ構造割り圓おられたメモリ、開いおいるファむルは、ナヌザヌコヌドでは䜿甚できたせん。 プログラムの実行が完了するずすぐに、その「サンドボックス」はカヌネルによっお砎壊されたす。 これが、最新のサヌバヌが600時間の皌働時間を持぀こずができる理由です-ハヌドりェアたたはカヌネルに障害がなければ、すべおが氞久に機胜したす。 ずころで、これがWindows 95/98が頻繁にクラッシュする理由です。いいえ、「M $が悪い」ずいう理由ではありたせん。䞋䜍互換性を確保するためだけに、重芁なデヌタ構造がナヌザヌモヌドアプリケヌションで䜿甚可胜です。 圓時、これはおそらく劥圓な劥協案でしたが、非垞に高䟡です。



プロセッサは、2぀の戊略的なポむントでメモリを保護したす。セグメントセレクタをレゞスタにロヌドしようずしたずき、およびメモリペヌゞにアクセスしたずきです。 したがっお、保護メカニズムは、アドレス倉換の䞻芁な段階を反映しおおり、セグメンテヌションずペヌゞングも含たれたす。 セグメントセレクタヌをロヌドしようずするず、次のチェックが行われたす。



画像



数倀が倧きいほど、それが瀺す特暩レベルは䜎くなりたす。 したがっお、MAX関数は、最小特暩レベルCPLたたはRPLを衚す倀を遞択し、タヌゲット蚘述子DPLの特暩レベルず比范したす。 DPLが以䞊の堎合、アクセスが蚱可されたす。 この匏でRPLを䜿甚する党䜓のポむントは、必芁に応じおカヌネルが意図的に䜎い特暩レベルでセグメントにアクセスできるようにするこずです。 たずえば、䞀郚の操䜜をナヌザヌモヌドのデヌタセグメントでのみ機胜するように制限するために、RPLが3に蚭定されおいるセレクタヌを䜿甚できたす。 セレクタをSSレゞスタにロヌドするずきのチェックは異なりたす。ここでは、正垞に通過するには、CPL、RPL、およびDPLの3぀の倀がすべお䞀臎する必芁がありたす。

実際には、セグメントレベルでの保護は特別な圹割を果たしたせん。これは、最新のカヌネルが、ナヌザヌモヌドセグメントが利甚可胜なすべおの物理アドレス空間をカバヌする「フラットな」メモリ構成モデルを䜿甚するためです。 線圢アドレスを物理アドレスに倉換するずきに、ペヌゞングナニットでいく぀かの有甚なメモリ保護が提䟛されたす。 メモリの各ペヌゞは䞀連のバむトであり、ペヌゞテヌブルの゚ントリによっお蚘述されたす。 この゚ントリでは、2぀のフィヌルド、぀たりスヌパヌバむザフラグず読み取り/曞き蟌みフラグがセキュリティメカニズムに関連しおいたす。 スヌパヌバむザフラグは、最新のカヌネルで䜿甚される䞻芁な防埡メカニズムです。 このフラグをクリアするず、リング3からペヌゞにアクセスできなくなりたす。読み取り/曞き蟌みフラグは特暩のチェックには䜕の圹割も果たしたせんが、それでも興味深いアプリケヌションを芋぀けたす。 プログラムが実行のためにメモリにロヌドされるず、プログラムの実行可胜むメヌゞを栌玍するメモリペヌゞは読み取り専甚ずしおマヌクされたす。 これにより、ポむンタヌを䜿甚するずきに゚ラヌをキャッチできたす。゚ラヌを䜿甚するず、これらのペヌゞぞの曞き蟌みが詊行されたす。 読み取り/曞き蟌みフラグは、Unixラむクなオペレヌティングシステムでforkシステムコヌルを䜿甚しお子プロセスを䜜成するずきに、コピヌオンラむトメカニズムを実装するためにも䜿甚されたす。 フォヌクが䜜成されるず、芪プロセスのメモリペヌゞは読み取り専甚ずしおマヌクされたす。 子プロセスは、最初は芪プロセスず同じメモリペヌゞを䜿甚したす。 それらのいずれかがメモリペヌゞに曞き蟌もうずするず、プロセッサがフォヌルトを開始し、カヌネルは次のようにそれを実行したす-ペヌゞの独自のコピヌを曞き蟌もうずしたプロセス甚に䜜成し、このペヌゞの読み取り/曞き蟌み暩限も蚭定したす。



どうぞ CPUが異なる特暩レベルを切り替えるこずができるメカニズムが必芁です。 リング3で実行されおいるコヌドがカヌネル内の任意の堎所に制埡を転送できる堎合、間違ったたたは正しいアドレスでjmpを実行するだけで、オペレヌティングシステムの保護メカニズムを簡単にバむパスできたす。 これを防ぐには、実行フロヌの制埡された転送を提䟛するメカニズムが必芁です。 いわゆるに基づいお実装されたす。 ゲヌト蚘述子たたはsysenter呜什。 ゲヌト蚘述子は、タむプ「システム」のセグメント蚘述子です。 コヌルゲヌト、割り蟌みゲヌト、トラップゲヌト、タスクゲヌト蚘述子の4皮類がありたす。 コヌルゲヌト蚘述子を介しお、カヌネルは、ファヌコヌルやファヌゞャンプなどの通垞の呜什で䜿甚できる゚ントリポむントを提䟛できたす。 呌び出しゲヌト蚘述子はあたり䜿甚されないため、それらに぀いおは説明したせん。 タスクゲヌト蚘述子もあたり関心がありたせんLinuxでは、通垞はカヌネルたたはハヌドりェアの問題が原因で発生する二重障害を凊理する堎合にのみ䜿甚されたす。



さらに2぀の興味深いタむプの蚘述子が残りたす。ハヌドりェア割り蟌みキヌボヌド、タむマヌ、ディスクず䟋倖ペヌゞ違反、れロ陀算を凊理するために䜿甚される割り蟌みゲヌトずトラップゲヌト。 これらのタむプのメカニズムの䞡方は、私が勝手に「割り蟌み」ず呌びたす。 このタむプの蚘述子は、割り蟌み蚘述子テヌブルIDTに栌玍されたす。 各割り蟌みには、ベクトルず呌ばれる0〜255の識別番号が割り圓おられたす。 割り蟌みの凊理に䜿甚する蚘述子を決定する必芁がある堎合、プロセッサはIDTの蚘述子ぞのポむンタずしおベクトルを䜿甚したす。 割り蟌みゲヌトおよびトラップゲヌト蚘述子の圢匏は実質的に同じです。 この圢匏ず、割り蟌みが発生したずきに実行される特暩チェックを図に瀺したす。 いく぀かの蚘述子フィヌルドに、Linuxカヌネルが仕様を远加するために䞀般的に䜿甚する倀を入力したした。



画像



アクセスは、タヌゲットセグメントの珟圚のCPLずDPLに基づいお制埡され、゚ントリポむントは、ゲヌト蚘述子のセレクタずオフセットフィヌルドに基づいお決定されたす。 珟代のカヌネルでは、通垞、ゲヌト蚘述子の察応するフィヌルドに含たれるセグメントセレクタヌがカヌネルのコヌドセグメントを遞択したす。 割り蟌みメカニズムは、より特暩のあるリングから特暩の䜎いリングに制埡を転送するために䜿甚できないように蚭蚈されおいたす。 特暩レベルは同じたたにするか、増やす必芁がありたすたずえば、アプリケヌションのナヌザヌモヌドが䞭断された堎合に発生したす。 いずれの堎合でも、新しいCPL倀はタヌゲットコヌドセグメントのDPLず等しくなりたす。 CPLが倉曎される状況では、スタックセグメントも自動的に切り替わりたす。 割り蟌みがプログラム的な堎合たずえば、INT n呜什の実行により、さらに1぀のチェックが実行されたす。ゲヌトDPLは元のCPL以䞊である必芁がありたす。 このテストは、ナヌザヌコヌドがアクセスできない割り蟌みハンドラヌを呌び出すように蚭蚈されおいたす。 Linuxでは、すべおの割り蟌みハンドラヌはリング0で実行されたす。



初期化䞭に、Linuxカヌネル関数setup_idtは、蚘述子に特定の゚ントリポむントを指定せずにIDTテヌブルを䜜成したす。 次に、/ asm-x86 / desc.hおよびarch / x86 / kernel / traps_32.cなどのファむルの内容に埓っお、蚘述子にデヌタが曞き蟌たれたす。 Linuxの甚語では、名前に「システム」ずいう語が含たれる蚘述子は、ナヌザヌモヌドコヌドで䜿甚できたす。たた、DPLゲヌトは3に蚭定されたす。「システムゲヌト」は、ナヌザヌモヌドコヌドで䜿甚できるむンテリゞェントトラップゲヌトです。 さらに、甚語の違いはもうありたせん。 ハヌドりェア割り蟌みはここではなく、察応するドラむバヌで構成されたす。



ナヌザヌモヌドでは3぀のゲヌトを䜿甚できたす。ベクタヌ3ず4は、それぞれ数倀オヌバヌフロヌのデバッグずチェックに䜿甚されたす。 次に、SYSCALL_VECTOR定数の倀に等しいIDを持぀システムゲヌトがありたす。x86アヌキテクチャの堎合は0x80です。 以前は、これはシステムコヌルを行うずきにカヌネルに制埡を移すための䞻芁なメカニズムでした。 「int 0x80」ずいう文字の凶悪犯番号も必芁なずきがありたした。 Pentium Proから、システムコヌルを高速化するために蚭蚈された新しいsysenter呜什が远加されたした。 この呜什は、コヌドセグメント、゚ントリポむントなどに関する情報を栌玍する特殊レゞスタを䜿甚したす。 sysenter呜什が実行されるず、特暩レベルはチェックされず、プロセッサはすぐにCPL 0に切り替わり、察応する倀をコヌドずスタックCS、EIP、SS、およびESPに関連するレゞスタにロヌドしたす。 sysenter呜什が䜿甚するレゞスタヌぞの倀のロヌドは、リング0からのみ可胜であり、enable_sep_cpu関数によっお実行されたす。



最埌に、リング3に戻るずき、カヌネルはIRETたたはSYSEXIT呜什を䜿甚しお、割り蟌みたたはシステムコヌルをそれぞれ凊理した埌に制埡を取り戻したす。 その結果、リング0のたたになり、CPLが3のナヌザヌモヌドコヌドが再開されたす。Vimは、単語数が既に1900に近いこずを教えおくれたす。 ご枅聎ありがずうございたした



All Articles