Simpleator( "Simple-ator")は、Windows 10 Spring Update(1803)に追加されたいくつかの新機能をレバレバルする革新的なWindows中心のX64ユーザーモードアプリケーションエミュレータであり、「Redstone 4」とも呼ばれ、Windows 10 10月更新(1809)、AKA「Redstone 5」で追加された追加の改善があります。
つまり、Simpleatorは次のことに依存しています。
これは、ゲストオペレーティングシステムを必要とせずにサーバーレスワークロード(AWSラムダ /紺nure関数)を実行できる、よりシンプルで高速なサンドボックス爆発環境を構築できることに関する概念実証として意図されています。
Simpleatorは、Visual Studio 2017および最新のWindows SDK(1809)で構築できます。古いSDKは、新しいWHVP定義をサポートしていないため、使用できないことに注意してください。Simpleator自体は、17763以上のビルドを実行している64ビットWindows 10システムのみをサポートしています(Redstone 5/1809)。
テストゲストアプリケーションからのコンソール出力を表示するここに示されているシステムコールを追跡するメインモニターウィンドウ:
登録ウィンドウ。これは、エミュレータにアサーション/問題がある場合に使用できます(UIスレッドはフリーズします。
そして最後に、PEBでFLG_SHOW_LDR_SNAPSフラグを有効にすると、デバッグウィンドウにローダーからのDbgPrintへの呼び出しが表示されます(それ以外の場合、他のdbgprint呼び出しは関係なく表示されます):
TBD TBDリンクを追加します
開発者は何十年もエミュレーションテクノロジーを執筆し、活用してきたので、なぜさらに別のエミュレータを書くのですか?
まず、Windowsの中心に実際の仮想化APIを導入することは、Hyper-Vプラットフォームの以前の閉じた性質への劇的な劇的な(前向きな)シフトです。仮想化インフラストラクチャデバイス(VID)ライブラリを介して文書化されていないAPIとIOCTLSがありましたが、サポートされた安定したWin32レイヤーは歓迎されます。すでに、QEMUはWHVPの加速をサポートしており、VirtualBox 6.0もこのサポートで出荷される可能性があります(リポジトリに既に実装されています)。 VMwareのみが単独で反抗的です。このトピックでは、この新しいAPIを活用する方法を学ぶことは必ずしも簡単なトピックではないので、これらの新しいインターフェイスがどのように機能するかを学び、他の人と共有したかったのです。
第二に、エミュレーション技術を見ると、通常、その使用のための3つの最新の推進力があります。
私の主な関心は、3番目の弾丸を見ることでした。これは、過剰なサブスクリプションモデルを使用するが、多くの複雑さをもたらすいくつかのカスタム実装を使用して、これまでに完全なシステムエミュレーションで達成されてきましたが、Windows Defenderで実装されたものなど、ほとんどのウイルス対策エミュレーターなどがあります(ここで[こちら]と[こちら]を参照)。さらに、QILINに精通した研究者は、QEMUをフルシステムエミュレータとしてレバレバリングしているが、プライマリOS画像を使用しないことにより、スピンアップ過剰サブスクリプションモデルを迅速に「スピンアップ」するために、それを簡単に構築する多数の単純なPythonバインディングをすでに見ているでしょう。
ゲストアドレススペースにマッピングされたバイナリがホストのOSローダー(ntdll.dll)とターゲットバイナリであり、256 GBアドレススペースが、ゲストの仮想マッピングとホストの仮想マッピングの間にネイティブ1:1のアクセスがあり、ホストのプロセスを備えていないため、256 GBのアドレススペースが提供される256 GBアドレススペースが提供される別の「ユーザーモードウィンドウ」の実装である別の手段を追求することにしました。サンドボクシング)。エミュレータがローダーとシステムDLLの基本的なカーネル構造データ構造を提供する限り、ホストはネイティブ速度で実行でき、特権的なリング遷移のみが出口を引き起こします。
次に、簡単にするために、システムコールプロバイダーは、ゲストVMによって作成されているシステムコールをインターセプトし、3つの方法のいずれかで動作できます。
パフォーマンス、複雑さ、互換性、セキュリティの間のニーズがどこにあるかに応じて、上記の弾丸1と2を十分に実装するには、500行未満のコードが必要です。コードベースを2倍にすると、システム呼び出しのセキュリティ問題のほとんどが現実的に軽減される可能性があります(サンドボックスが緩和できるホストOSカーネルの実際の脆弱性を除く)。
しかし、1000行のコードでさえ、すべてのシステム呼び出しが最終的にオペレーティングシステムにネイティブに送信されるため、Simpleatorは、今日見られるはるかに複雑なエミュレーターではなく、Linux上のCgroupの上に「SecComp」の実装のように動作します。
最後に、Amazon LambdasやAzure関数などのワークロードを実行するために必要なリソースを最小限に抑えるために、クラウドコンピューティング/コンテナ化スペースに新たな関心があることを指摘する価値があります。 Simpleatorが提供するセキュリティ境界をより厳しく制御することで、完全なゲストOSを必要とせずに専用アプリケーションとしてJVMまたは.NETコアを実行する機能を想像できます。
TBD TBD
Windowsアプリケーションを実行するのをはるかに簡単にするユニークなゲスト実行環境をSimpleatorがどのように達成するかについて、3つの主要な興味深い部分があります。
カーネルのMiCreatePebOrTebブ関数が設定されるのと同じ種類のデータを使用したPEBとTEBの作成。
ゲストとホストアドレスの間に1:1のマッピングを作成し、新しい「アドレス要件」機能を活用して、その範囲への割り当てをロックダウンします。現時点では、Simpleatorは0x7FFE0000の本物のKUSER_SHARED_DATA領域をマッピングすることに注意してください。これは、ホストが最新の状態に維持されているSystemTimeおよびInterruptTimeフィールドの更新により、ゲストVMによって時間の経過が「見られる」ことを意味します。この地域を分離するには、この値の更新をエミュレートするために定期的なタイマーが必要です。
Authentic Ntdll.dllイメージをマッピングし、ホストOSシステムコールをレバレッジして、ほとんどのロードプロセスをネイティブに実行し、 INT 2E 、 SYSCALL 、 INT 2Cリング遷移へのアクセスを提供します。
さらに、モジュール性ベースから、Simpleatorは3つのバイナリで構成されています。
Simpleator.exe 。このコンポーネントは、モニター、デバッグ、および登録ウィンドウのUIを表示し、エミュレーターが通信できる名前のパイプをホストし、エミュレータに適切な環境をロードすることを担当します(今日、これは将来256 GBアドレススペース予約を設定することを意味します。これはサンドボックスを意味します)。Provider.dllは、サポートされています。Emulator.exe 。主に、パイプを介したデバッグモニターと通信し、システムコールプロバイダーと通信するリング遷移コードを処理し、 Ntdll.dllローダーライブラリとターゲットアプリケーションバイナリの初期アドレススペースのセットアップとPEロードを実行する責任があります。 まず、Windows Hypervisorプラットフォームをインストールする必要があります。これには、Hyper-Vをインストールして有効にする必要があります。次のコマンドラインを使用して、次のことを行うことができます。
Dism /Online /Enable-Feature /FeatureName:HypervisorPlatform
または以下のようにGUIを起動することによって:
OptionalFeatures.exe
次に、以下のスクリーンショットに示すように、「Hyper-V」と「Windows Hypervisor Platform」チェックボックスをチェックします。
これらのコマンドのいずれかを使用するための管理権が必要です。
明らかに、ハードウェアがハードウェア仮想化テクノロジー(Intel VT-Xなど)をサポートしていることを確認してください。
私の研究や仕事についてもっと知りたい場合は、http://www.alex-ionescu.comで私のブログをチェックしてください。
TBD TBD
Simpleatorは、コードのサイズと複雑さを最小限に抑えるように設計されています。これは、堅牢性と最も重要なことにセキュリティのコストで提供されます。たとえば、現在の実装では、 NtCreateFile 、 NtOpenFile 、およびNtWriteFileホストOSカーネルに完全に渡されます。つまり、ホストのエミュレータがアクセスできる「悪意のある」ペイロードは、ホストの周りに追加のサンドボックスがないため、ディスク上のファイルを上書きできます。
さらに、 Testapp.exeアプリケーションを取得してテキストを起動、印刷し、終了するために、厳密な最小システムコールのみが実装されたことに注意してください。 Cmd.exeなどのより複雑なアプリケーションを実行するには、特に特定のAPIがLPCを介してCSRSSへの接続が行われ、特定のデータが返されることを期待しているため、大幅に多くの作業が必要になります。現在、Simpleatorは、それが安全なVTL-1保護プロセスであると見せかけています。これにより、Guest APIの一部がやろうとしていることを大幅に制限しているため、特定の呼び出しは完全にクラッシュします(たとえば、ロケール周辺の一部など)。
このようなAPI使用量のブロックを解除するには、ゲストのアドレススペースのより複雑なエミュレーションと変更が必要です。
Simpleatorは、エラーチェック、検証、例外処理をあまり実行しません。生産用に設計された堅牢なソフトウェアではなく、参照コードベースです。
Copyright 2018 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.