なぜ以下の命令を仮想化する必要があるのですか?これを仮想化できないと問題を引き起こす可能性があります。これらの命令を仮想化する理由は何ですか?
- sgdt、SLDT、SIDT、SMSW
- fcall、longjump、SRT
- LAR、VERR、VERW、LSL
- PUSHF、POPF、IRET
なぜ以下の命令を仮想化する必要があるのですか?これを仮想化できないと問題を引き起こす可能性があります。これらの命令を仮想化する理由は何ですか?
マシン状態を変更します(セグメントのベース/リミット、割込みのディスエーブルなど)は明らかに許されないか、またはゲストがVMから抜け出すか、少なくともハングアップする可能性があります。 (例えば無効割り込みと無限ループを実行することによって)
pushf
/popf
はわずかに微妙である:EFLAGSにおけるビットのうちの1つであるIF
(cli
/sti
フリップ割り込みイネーブルビット)ことを思い出します。
ゲストが割り込みを無効にしている間は、物理マシンに割り込みを有効にします。しかし、実行中の仮想x86で割り込みが無効になっている場合は、ゲストにIF=0
が表示されるようにすることもできます。したがって、pushf
とpopf
を仮想化する必要があります。
Intelプラットフォーム上の現在の仮想化ソリューションの場合のように、Intel VMXモードが仮想化に使用されている場合、これらの命令は保護されたマシン状態にアクセスしたり変更したりしないため、VMMによって仮想化する必要はありません。
VMMは、sgdt、sldt、sidt、およびstrのVM出口を要求することはできますが、必須ではありません。それ以外の命令では、これまでにリストされた命令のどれもがVMの終了を引き起こしません。
プロセッサ自体は、これらの命令の2のマイナーな仮想化を実行します。ゲストは、VMMは、それが望んでいる 値を見ているよう
SMSWの振る舞いは、ゲストに変更されます。
NMIブロッキングをクリアするために、ゲストでIRET命令の動作が変更されています。
lgdt、sgdt、lidt、sidtなどのVM出口を要求する機能は、旧バージョンのVMXでは利用できませんでした。後で追加されました。それが追加されたとき、私はそれが何の役に立つのか分かっていましたが、私は思い出しません。 – prl
クライアントが例えば 'sgdt'を実行するとどうなるか想像してみてください。 –
私は 'srt'が' str'であると仮定しました。 1のリストは特権状態を決定する命令です。彼らは実際に状態を変えることはありませんが、彼らはそれにアクセスできます。 2のリストは、コールおよび割り込みゲート命令です。 3のリストはディスクリプタ情報にアクセス(読み出し)でき、最後のグループはVMMからのフラグへのアクセスを許可します。したがって、これらの指示が仮想化されていない場合、情報漏洩が許されます。 OSは、仮想化された環境で動作していることを検出できます。 VMMがリング0で実行され、OSがユーザー・リング内で実行されている場合、これはすべて問題になります。 –