
WindowsおよびUEFI向けの最小限のIntel VT-xハイパーバイザーで、ライブホストを仮想化してイントロスペクションを行い、動的ハイパージャッキング、アンハイパージャッキング、EPT、VPIDをサポートします。
SimpleVisorは、シンプルでポータブルなIntel x64/EM64T VT-x専用ハイパーバイザであり、2つの明確な目標を持っています。それは、アセンブリコードの使用量を最小限に抑えること(10行)と、動的なハイパージャッキングおよびアンハイパージャッキング(つまり、ホスト内部からホスト状態を仮想化すること)をサポートするためのVMX関連コードを最小限に抑えつつ、EPTやVPIDといった高度な機能もサポートすることです。現在、WindowsとUEFI環境の両方で動作します。
ハイパーバイザの構築方法に常々興味をお持ちではありませんか?Intelのドキュメント(数百ページにも及ぶ膨大な量)に辟易していませんか?オンラインで見つけたサンプルがかえって混乱を招いたり、何万行ものコードを何週間もかけて読む必要があったりしませんか?もしそうなら、SimpleVisorはあなたにぴったりのプロジェクトかもしれません。
すべてのコード行を説明する網羅的なコメントや、Windows固有またはIntel固有の特異な事項を除けば、SimpleVisorは約500行のCコードと10行のx64アセンブリコードで構成されており、最近の64ビットWindowsのすべてのバージョンで動作し、実行時の動的なロード/アンロードもサポートしています。
さらに、SimpleVisorはWindows固有の機能のために軽量なOSライブラリを利用しており、ハイパーバイザ部分とWindows固有部分を分離しています。このポータブルな設計を活用し、UEFI版のSimpleVisorも利用可能になりました。ただし、UEFIの問題によりMP環境を堅牢にサポートしているわけではなく、オペレーティングシステムをロードすると、プロセッサリソースの再構成により未実装のコードパスに到達するため、最終的にクラッシュする点に注意してください。UEFIからのオペレーティングシステムの起動全体を仮想化することは、このプロジェクトの範囲外です。
SimpleVisorはVisual Studio 2015 Update 3でビルドできます。古い/新しいコンパイラはテストされておらずサポートされていませんが、同様にプロジェクトをビルドできる可能性は高いです。ただし、各種コンパイラおよびリンカの設定は表示されている通りに維持することが重要です。
SimpleVisorは現在、以下のプラットフォームで正常にテストされています:
現時点ではBochsでのテストは行われていませんが、SimpleVisorがそのような環境で動作しない理由はありません。ただし、お使いのマシンがすでにHyper-VやXenなどのハイパーバイザ上で動作している場合、SimpleVisorはロードされません。
x86版のWindowsは明示的にサポートされておらず、Nehalemマイクロアーキテクチャより前のプロセッサやWindows 7も同様にサポートされていないことに注意してください。後者2つのサポートは追加が容易であり、一部のフォークに存在します。
世の中のハイパーバイザプロジェクトの多くは、非常に複雑(Xen、KVM、VirtualBox)であったり、クローズドソース(VMware、Hyper-V)であったり、Linuxベースの開発やシステムに強く焦点を当てていたりします。さらに、それらのほとんど(Hyper-Vを除く)は、仮想マシンの実行を可能にする目的で明示的に構築されており、稼働中のシステムを仮想化してイントロスペクションやその他のセキュリティ関連タスクを実行するためのものではありません。
しかし、いくつかのプロジェクトは際立っています。例えば、JoannaによるオリジナルのBlue Pillや、VirtDbg、HyperDbgなどです。残念ながら、これらのほとんどは今ではかなり古くなっており、一部はx86プロセッサでのみ動作し、Windows 10のような新しいオペレーティングシステムをサポートしていません。もう1つのかなりシンプルな例として、Blue Pillと一部の側面で似ていますが、「Split-TLB」のためのEPT使用の良い例を実際に提供しているのは、Jacob Torrey/AISによるMoREです。
Windows中心でモダン、かつサポートされているハイパーバイザを実際に提供している最も近いプロジェクトはHyperPlatformであり、より広く利用可能な研究タイプのハイパーバイザ開発の出発点としてその使用を強く推奨します。しかし、より広く堅牢な汎用「プラットフォーム」を作成しようとする試みの中で、HyperPlatformもまた多少の肥大化に悩まされており、ハイパーバイザの真の基本的なニーズは何か、そしてそれをどのように初期化するかを理解するのが難しくなっています。同様の方向性で、STL/C++を等しく愛用しつつ、ELFローダーやUEFI/Linuxサポート、ユニットテスト、さらなる堅牢性も含んでいるのが、同じくAISによるBareflankです。それを超えると、おそらくXenレベルの複雑さに突入することになります。
上記で述べたように、このプロジェクトの明確な目標は、負の副作用を引き起こすことなく、あらゆる方法でコードを最小化し、「ベアメタル」のニーズに焦点を当てることでした。これには以下が含まれます:
もう1つの暗黙の目標は、最新のハードウェア機能をサポートすることでした。なぜなら、Bochsでさえ常に最新のIntel VMX命令や定義を持っているわけではないからです。これらはしばしば「vmcs.h」や「vmx.h」といったヘッダファイルにあり、さまざまなプロジェクトがさまざまな定義レベルで持っています。例えば、Xen masterには未リリースのVM Exit理由がいくつかありますが、特定のリリース済みのものはありません。Bochsにはそれがありますが、未リリースのものはありません!その一例が1GB EPTエントリの使用であり、例えばVMWareはこれを正しく仮想化しません。
最後に、SimpleVisorは教育ツールとなることを意図しています -- コードの各行の背後にあるすべてのロジックを説明する網羅的なコメントと、目的の結果を達成するための特定のWindowsまたはIntel VMXのヒントやトリックがあります。さまざまなバグや文書化が不十分な動作が明示的に指摘されています。
x64 Windowsではすべてのドライバが署名されている必要があるため、SimpleVisorバイナリをテスト署名する必要があります。Visual Studioプロジェクトファイルは、「Driver Signing」オプションを使用し、独自の証明書で「Test Sign」を有効にすることで、そうするように設定できます。UIから独自の証明書を生成することもできます。
次に、マシンでテスト署名モードを有効にする必要があります。そのためには、まずUEFIに入って「Secure Boot」をオフにしてください。そうしないとテスト署名モードを有効にできません。あるいは、有効なKMCS証明書をお持ちであれば、この要件を回避するためにドライバを「Production Sign」することができます。
テスト署名モードを設定するには、次のコマンドを使用できます:
bcdedit /set testsigning on
再起動後、次のコマンドでレジストリにSimpleVisorに必要なService Control Managerエントリを設定できます:
sc create simplevisor type= kernel binPath= "<PATH_TO_SIMPLEVISOR.SYS>"
その後、次のコマンドでSimpleVisorを起動できます:
sc start simplevisor
そして次のコマンドで停止できます:
sc stop simplevisor
これらのコマンドのいずれを使用するにも、管理者権限が必要です。
私の研究や仕事についてもっと知りたい方は、私のブログ http://www.alex-ionescu.com や、私のトレーニング&コンサルティング会社であるWinsider Seminars & Solutions Inc.(http://www.windows-internals.com)をぜひご覧ください。
https://github.com/upring/virtdbg
http://xenbits.xen.org/gitweb/?p=xen.git;a=summary
https://github.com/svn2github/bochs
https://github.com/rmusser01/hyperdbg
http://invisiblethingslab.com/resources/bh07/nbp-0.32-public.zip
https://github.com/tandasat/HyperPlatform
https://github.com/ainfosec/MoRE
https://github.com/Bareflank/hypervisor
SimpleVisorはコードサイズと複雑さを最小化するように設計されています -- これは堅牢性を犠牲にしています。例えば、SimpleVisorによって実行される多くのVMX操作は「決して失敗しないはず」ですが、メモリ破損、CPUエラッタ、無効なホストOS状態、潜在的なバグなど、特定の操作を失敗させる未知の理由が常に存在します。真に堅牢な商用グレードのソフトウェアでは、これらの可能性を考慮に入れ、それらをサポートするためのエラー処理、例外処理、チェックを追加する必要があります。さらに、世の中に存在する膨大な種類のBIOS、および異なるCPUやチップセットの世代は、それぞれチェックが必要な特定の非互換性や回避策を持つ可能性があります。SimpleVisorはそのようなエラーチェック、検証、例外処理を一切行いません。本番環境での使用を目的とした堅牢なソフトウェアではなく、むしろ参照コードベースです。
Copyright 2016 Alex Ionescu. All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided
that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this list of conditions and
the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions
and the following disclaimer in the documentation and/or other materials provided with the
distribution.
THIS SOFTWARE IS PROVIDED BY ALEX IONESCU ``AS IS'' AND ANY EXPRESS OR IMPLIED
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ALEX IONESCU
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
The views and conclusions contained in the software and documentation are those of the authors and
should not be interpreted as representing official policies, either expressed or implied, of Alex Ionescu.