この方法は、ハードウェアメモリ仮想化の技術に基づいています(英語のネストされたページングまたはハードウェアアシストページング、一般に受け入れられているロシア語はありません)。 このテクノロジーは、IntelおよびAMDプロセッサーの最新モデルに登場しています。 IntelバージョンはIntel Extended Page Table (EPT)と呼ばれ、Nehalemファミリー(Intel Core i3、i5、i7)以降のプロセッサーでサポートされています。 AMDに相当するものはAMD Rapid Virtualization Indexing (RVI)と呼ばれ、AMD K10世代以降のプロセッサーに存在します。 テクノロジーは類似しているため、Intel EPTについて以下で説明するすべてがAMD RVIに適用されます。
理論
そのため、ハイパーバイザーとその制御下で動作するゲストオペレーティングシステム(ゲスト)があります。
ハイパーバイザーからゲストOSへの制御の移行はVMエントリと呼ばれ、逆の移行はVM終了と呼ばれます。 すべての作業は、VMエントリとVM出口が相互に置き換えられるシーケンスです。 ハイパーバイザーは隔離されたアドレス空間で実行され、ゲストOSからは「見えません」。 同時に、ゲストOSの状態(仮想プロセッサ、メモリ、仮想ハードウェアなど)を変更できます。
読者は、シャドウページテーブル(シャドウページング)に基づく方法を扱った以前の記事に精通していることは理にかなっています。 ここで説明する方法は、さらに論理的に発展したものです。
シャドウページングのソフトウェア仮想化とは対照的に、ハードウェアメモリの仮想化は、ハイパーバイザーを劇的に簡素化し、その結果、ハイパーバイザーの信頼性を高めます。 さらに、パフォーマンスが大幅に向上し、メモリ消費が削減されます。
プロセッサの通常の動作中、物理アドレスへのアクセスは、すぐにプロセッサアドレスバスに露出します(APICへのアクセスなどの場合を除き、表示を簡単にするために省略します)。 ネストされたページングの場合、物理アドレスへのゲストアクセス(名前は「ゲスト物理アドレス」になります)は、最初に特別なページテーブルを介してブロードキャストされます。 ゲストの物理アドレスから取得した物理アドレスがアドレスバスに設定され、その後メモリがアクセスされます。
Intel EPTのゲスト物理アドレス変換は、通常のページ変換に似ています:
ページテーブルは4レベルで、64ビットIntel 64モードで仮想アドレスを変換するためのページテーブルに似ていますが、主な違いはテーブルエントリの構造です。 この図は、テーブル(PTE)の下位レベルのレコードの構造を示しています。
物理メモリへのアクセスを決定するレコードの最下位3ビットに関心があります。 R、W、Xビットがクリアされている場合(ビット0 ... 2)、読み取り、書き込み、実行のためにそれぞれ説明されているPTEメモリにアクセスすると、ハイパーバイザーにアクセスします(Intelの用語によるとEPT違反)。
これにより、プロセッサでのコードの実行を制御し、コードを使用してメモリに書き込むことができます。
メソッドの本質
完全仮想化は目標ではありません。 コードの実行と変更を制御するには、メモリとプロセッサを仮想化するだけです。
メモリ仮想化では、ゲストの物理アドレスを実際の1対1の物理アドレスにマッピングする(IDマッピング)EPTページテーブルを構築する必要があります。 同時に、テーブル(PTE)の下位レベルのレコードでは、WビットとXビットをリセットし、各レコードは4 KBのメモリページへのアクセスを記述します。
次に、EPT違反でハイパーバイザー(VM Exit)にアクセスするための2つのオプションがあります。
- 記録用のメモリページへのアクセス。 この場合、ハイパーバイザーはネットワークに入り、その後ページへの書き込みを許可します(Wビットを設定します)が、実行を禁止します(Xビットをリセットします)。
- 実行のためのメモリページへのアクセス。 この場合、ハイパーバイザーはページでの実行を許可しますが(Xを設定)、ページへの書き込みを禁止します(Wをリセットします)。
したがって、メモリページは実行可能または記録のみ可能です。 記録と実行はそれぞれ、ハイパーバイザーへのアクセス(VM Exit)を伴い、ページをある状態から別の状態に転送します。
これらのイベントを処理することにより、ハイパーバイザーはダウンロードできないコードのレコードを傍受し、システムモジュールの外部で実行することができます。 各イベントが発生すると、その原因となったコードを分析できます。
実用的な実装
上記の方法を使用して、Hypersight Rootkit Detectorルートキット検出器を実装しました。 ユーザーの要求に応じてロードおよびアンロードできるように設計されています。 これにより、VMwareやVirtualBoxなどの仮想化プログラムと組み合わせて使用できます。
ルートキット検出器は、カーネル内の次のアクティビティを検出できます。
- ハイパーバイザーモードへの切り替えを試みます。
- カーネルおよびHALの外部のコードによる制御レジスタの変更。
- 非ページカーネルコードの変更、メモリ内のHALおよびドライバー、SSDTの変更。 仮想メモリを表示して変更を含める。
- ドライバー、カーネル、およびHALの実行可能セクション外でのコード実行。 ルートキットの切り札である、いわゆる「隠しコード」は簡単に検出されます。
監視がオンのときのパフォーマンスの低下は1%以内で、ほとんど目に見えないほど「目で」見えます。 クアッドコアプロセッサの場合、ハイパーバイザーのメモリ消費量は約40 MBです。 これにより、オフィスタスクや開発用の1 GB以上のメモリを搭載したコンピューターでこのメソッドを使用できます。
さらなる仕事
ハイパーバイザーの機能は、ルートキットの検出に限定されません。 悪意のある活動をブロックすることも可能です。 私たちはこの分野で研究を行っており、近い将来に結果を発表したいと考えています。 64ビットアーキテクチャとAMD RVIプロセッサへの移植も議題に含まれています。
おわりに
最近、ウイルス対策企業はハイパーバイザーに注目し、開発者を雇い始めました。 ただし、「ゼロから」ハイパーバイザーを開発することは、外見が単純であるにもかかわらず、かなり時間がかかり、高価なプロセスであることは注目に値します。 当社は、この分野での経験と実用的なソリューションを提供できます。
文学
Intelプロセッサのドキュメント: www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html
AMDプロセッサのドキュメント: developer.amd.com/documentation/guides/Pages/default.aspx