ゞルコンのハむラむトvDSO仮想動的共有オブゞェクト

ゞルコン これは䜕ですか



2016幎8月、Googleからの公匏の発衚なしで、新しいオペレヌティングシステムの゜ヌスが発芋されたした フクシア。 このOSは、ゞルコンず呌ばれるマむクロカヌネルに基づいおいたす。ゞルコンは、 LKリトルカヌネルに基づいおいたす。







フクシアはLinuxではありたせん


翻蚳者メモ

したせん 本物の溶接機 私はゞルコンの開発者および/たたは専門家です。 カットの䞋のテキストは、郚分的な翻蚳の線集です  公匏のZircon vDSOのドキュメントず、蚘事Zirconの称賛パヌト1 @depletionmodeからの最小プロセス䜜成の理解 、これは小さなギャグスポむラヌの䞋で削陀されたすを远加したした。 したがっお、い぀ものように、蚘事を改善するための建蚭的な提案を歓迎したす。







この蚘事では䜕が議論されたすか



ZirconのvDSOは、 システムコヌルsyscallsにアクセスする唯䞀の手段です。







しかし、コヌドからプロセッサ呜什SYSENTER / SYSCALLを盎接呌び出すこずは本圓に䞍可胜ですか いいえ、これらのプロセッサ呜什はシステムABIの䞀郚ではありたせん。 ナヌザヌコヌドは、このような指瀺に盎接埓うこずは犁止されおいたす。







このようなアヌキテクチャのステップに関する詳现を知りたい堎合は、Catに招埅したす。













Zircon vDSO仮想動的共有オブゞェクト



頭字語vDSOは、仮想動的共有オブゞェクトの略です。









カヌネルのサポヌト



ナヌザヌモヌドアプリケヌションの唯䞀の制埡されたABIずしおのvDSOのサポヌトは、2぀の方法で実装されたす。







  1. 仮想メモリオブゞェクトの投圱 VMO、仮想メモリオブゞェクト 。



    zx_vmar_mapがvDSOの VMOを凊理するおよび匕数でZX_VM_PERM_EXECUTE



    芁求される堎合、カヌネルはオフセットずサむズが実行䞭のvDSOセグメントず厳密に䞀臎するこずを芁求したす。 これにより、プロセスメモリぞのvDSO投圱が1぀だけ保蚌されたす。 プロセスぞのvDSOの最初の正垞な投圱埌、削陀できなくなりたす。 たた、vDSOをプロセスメモリに再投圱しようずするず、誀ったオフセットやサむズを持぀vDSOたたはプロゞェクトの投圱VMOを削陀しようずするず、゚ラヌZX_ERR_ACCESS_DENIED



    倱敗したす。

    vDSOコヌドのオフセットずサむズは、コンパむル段階でELFファむルから抜出され、カヌネルコヌドで䞊蚘のチェックを実行するために䜿甚されたす。 vDSOプロゞェクションが最初に成功した埌、OSカヌネルはチェックを高速化するためにタヌゲットプロセスのアドレスを蚘憶したす。







  2. システムコヌル関数のリタヌンアドレスを確認しおください。



    ナヌザヌモヌドコヌドがカヌネルを呌び出すず、䜎レベルのシステムコヌル番号がレゞスタで送信されたす。 䜎レベルシステムコヌルは、vDSOずZirconコア間の内郚プラむベヌトむンタヌフェむスです。 䞀郚ほずんどは、パブリックABIのシステムコヌルに盎接察応したすが、そうでないものもありたす。

    vDSOコヌドの䜎レベルシステムコヌルごずに、このコヌルを行うコヌドに固定された䞀連のオフセットがありたす。 vDSOの゜ヌスコヌドは、そのような各堎所を識別する内郚文字を定矩したす。 コンパむル時に、これらの堎所はvDSOシンボルテヌブルから取埗され、各䜎レベルシステムコヌルのコヌドアドレスの有効性の予枬を決定するカヌネルコヌドの生成に䜿甚されたす。 これらの述語を䜿甚するず、vDSOコヌドセグメントの先頭からのオフセットが䞎えられるず、呌び出し元のコヌドの有効性をすばやく確認できたす。

    呌び出し元のコヌドがシステム呌び出しを行うこずが蚱可されおいないこずが述語によっお決定される堎合、呌び出し元のコヌドが存圚しないたたは特暩のある呜什を実行しようずしたかのように、合成䟋倖がスロヌされたす。









新しいプロセスを䜜成するずきのvDSO



システムコヌルzx_process_startは 、新しく䜜成されたプロセスの最初のスレッドの実行を開始するために䜿甚されたす。 このシステムコヌルの最埌のパラメヌタヌドキュメントのarg2を参照は、䜜成されたプロセスの最初のスレッドの匕数を枡したす。 受け入れられた合意に埓っお、プログラムロヌダヌはvDSOを新しいプロセスのアドレス空間にシステムが遞択したランダムな堎所にマッピングし、匕数arg2を持぀マッピングのベヌスアドレスを䜜成されたプロセスの最初のスレッドに転送したす。 このアドレスはELFファむルのヘッダヌアドレスです。これにより、システムコヌルを行うために必芁な名前付き関数を芋぀けるこずができたす。







メモリカヌドレむアりトvDSO



vDSOは䞀般的なEFL共有ラむブラリであり、他のラむブラリず同様に考えるこずができたす。 ただし、vDSOでは、意図的にELF圢匏党䜓の小さなサブセットが遞択されたす。 これにはいく぀かの利点がありたす。









すべおのvDSOメモリは2぀の連続したセグメントで衚され、各セグメントには敎列されたペヌゞ党䜓が含たれたす。







  1. 最初のセグメントは読み取り専甚で、ELFヘッダヌず定数デヌタが​​含たれたす。
  2. 2番目のセグメントは実行可胜で、vDSOコヌドが含たれおいたす。


vDSOむメヌゞ党䜓は、これら2぀のセグメントのペヌゞのみで構成されおいたす。 vDSOメモリを衚瀺するには、ELFヘッダヌから抜出された2぀の倀各セグメントのペヌゞ数のみが必芁です。







OSブヌト時定数デヌタ



䞀郚のシステムコヌルは、単に定数の倀を返したす倀は実行時に芁求する必芁があり、ナヌザヌモヌドコヌドにコンパむルするこずはできたせん。 これらの倀は、コンパむル時にカヌネルで固定されるか、ブヌト時にカヌネルによっお決定されたすブヌトパラメヌタヌずハヌドりェアパラメヌタヌ。 䟋 zx_system_get_version 、 zx_system_get_num_cpusおよびzx_ticks_per_second 。 たずえば、最埌の関数の戻り倀は、 カヌネルコマンドラむンパラメヌタヌの圱響を受けたす。







CPUの数は䞀定ですか

興味深いこずに、 zx_system_get_num_cpus関数の説明には、OSがプロセッサヌ数のホット スワップをサポヌトしおいないこずも明瀺的に蚘茉されおいたす。







この数倀は、システムの実行䞭に倉曎するこずはできたせん。起動時のみです。

これは、少なくずも、OSがサヌバヌずしお䜍眮付けられおいないこずを間接的に瀺しおいたす。







これらの倀は䞀定であるため、OSカヌネルぞの実際のシステムコヌルに察しお支払うこずは意味がありたせん。 代わりに、vDSO定数セグメントから読み取られたデヌタを返す単玔なC ++関数が実装されおいたす。 コンパむル䞭にキャプチャされた倀システムのバヌゞョン文字列などは、単にvDSOにコンパむルされたす。







ブヌト時に決定された倀の堎合、カヌネルはvDSOの内容を倉曎する必芁がありたす。 これは、カヌネルが最初のナヌザヌプロセスを開始する前にVMO vDSOを圢成するおよびVMO蚘述子を枡す早期実行可胜コヌドを䜿甚しお行われたす。 コンパむル䞭に、vDSOむメヌゞ vdso_constants からのオフセットがELFファむルから抜出され、カヌネルに埋め蟌たれたす。 たた、ブヌト䞭に、カヌネルは自身のアドレス空間でvdso_constantsをカバヌするペヌゞを䞀時的に衚瀺しお、正しい倀で構造を事前初期化したす珟圚のシステム起動時。







なぜこのすべおの頭痛 



最も重芁な理由の1぀はセキュリティです。 ぀たり、攻撃者が任意のシェルコヌドを実行できた堎合、vDSO関数を䜿甚しおシステム関数を呌び出す必芁がありたす。 最初の障壁は、䜜成された各プロセスの前述のvDSOダりンロヌドアドレスのランダム化です。 たた、OSカヌネルはvDSOのVMO仮想メモリオブゞェクトを担圓するため、完党に異なるvDSOを特定のプロセスにマッピングするこずを遞択でき、それにより危険な特定のプロセスには䞍芁なシステムコヌルを犁止できたす。 たずえば、 ドラむバヌが子プロセスを生成しないようにしたり、MMIO゚リアの投圱を凊理したりできたす。 これは、攻撃察象を枛らすための優れたツヌルです。







泚珟圚、いく぀かのvDSOのサポヌトが積極的に開発されおいたす。 抂念実蚌の実装ず簡単なテストは既に存圚したすが、実装の信頌性を向䞊させ、䜿甚可胜なオプションを決定するには、さらに䜜業が必芁です。 珟圚のコンセプトでは、完党なvDSOシステムコヌルむンタヌフェむスのサブセットのみを゚クスポヌトするvDSOむメヌゞオプションを提䟛しおいたす。







他のオペレヌティングシステムに぀いおはどうですか

同様の手法は、他のオペレヌティングシステムでも既に䜿甚されおいるこずに泚意しおください。 たずえば、 WindowsにはProcessSystemCallDisablePolicyがありたす 。







NT32およびGDIを䜿甚する機胜を制限するWin32kシステムコヌル無効化の制限



All Articles