SVMまたはVT-xの場合、仮想マシンモニターに対してvmexit
をトリガーする条件のセットはかなり複雑です。権限のないプロセスは、カーネルの支援なしにこれらのいずれかをトリガーできますか? VMMCALL
とVMCALL
のドキュメントはどちらもリング0でしか機能しないと言っているので、大丈夫だと思います。
これは、先日のNinefingerの優れた response へのフォローアップ質問です。そこには非常に詳細があり、私が同化するのにしばらく時間がかかりました。 :)
手順を理解するために必要なものは インテルソフトウェア開発者マニュアル です。それが価値があるものについて、私は時々それらを少し不透明に感じることがあります-それで私は私がグーグルで読んだものとAMDマニュアルで読んだものと対照的です、どちらもx86/x64アーキテクチャを実装しています。
具体的には、これには Vol 3C:Virtualization が必要です。現在のマニュアルでは、293ページ(「VMCALL-VM Monitorへの呼び出し)」が必要です。)には、次の役立つ式があります。
IF not in VMX operation
THEN #UD;
ELSIF in VMX non-root operation
THEN VM exit;
ELSIF (RFLAGS.VM = 1) or (IA32_EFER.LMA = 1 and CS.L = 0)
THEN #UD;
ELSIF CPL > 0
THEN #GP(0);
...
英語への翻訳:#GP
は一般的な保護例外であり、CPL
は現在の特権レベルです。 VMX非ルート操作は次のとおりです。
VMX操作には、VMXルート操作とVMX非ルート操作の2種類があります。一般に、VMMはVMXルート操作で実行され、ゲストソフトウェアはVMX非ルート操作で実行されます。
したがって、これは、VMCall
命令がguestの任意の特権レベルから発行できることを意味します。リング0の要件は、ホストシステムにのみ適用されます。しかし、私は免責事項を付けて警告します-すぐに私の意味の箇条書きを参照してください。
狂ったように狂った私は知っています。どうやら、しかし、それは本当です。 this thread を読んでください。ここでKVM=カーネル開発者はこれについて正確に説明しています。KVMパッチは問題を解決しました:
kvm_get_segment(vcpu,&cs, VCPU_SREG_CS);
if (cs.dpl != 0) {
ret = -KVM_EPERM;
goto out;
}
ゲストリング0から行われていない場合、「ハイパーコール」は無効と見なされます。
含意:
VMCall
を発行できます。しかし、私が行った非常に予備的な読みから、それはそれが何らかの方法で有用であるためにそれが(might)不可能であるかもしれないようです-リング3アドレスはおそらくゲストオペレーティングシステムの仮想WRT(したがって、ホストには何も意味しません)。私はこれが事実であると強く疑っていますが、(まだ)それを確認することはできません。だから、本当にそれを掘り下げたいならあなたがする必要があるのは検証です:
VMCall
がゲストリング0のみに制限されることを期待しています。VMCall
et alがリング0からのみ意味のある方法で実行できる場合は、クライアント側のゲストコードもリング0で実行できるか、既存のコードの一部に何かを実行させる必要があります。すべきではない。例えば:
VMCall
を含む任意のコードを実行して、やりたいことをすべて実行することができます。VMCall
を使用する既存のドライバーを説得して、通常使用するドライバーではなく、引数を使用して独自の方法で呼び出します。エクスプロイトの成功は、ハイパーバイザーと、それらのVMCallが脆弱かどうかに完全に依存します。そうでない場合、なんとかそれらを呼び出すことができたかどうかは関係ありません。ハイパーバイザーはそれらを適切に拒否できます。この時点で、私はこのエクスプロイトルート(VMCall
経由)が可能性が高いとは正直に思いません(もちろん、存在する場合、結果はかなり深刻です)。
ここで見逃した2つのこと:
はい、権限のないゲストコードがVM出口をトリガーする可能性があります。
ただし、これはnotは、権限のないゲストコードがVMから抜け出す可能性があることを意味します。 VM出口がトリガーされると、仮想マシンモニターのコードに制御が移ります。 VMMコードが正しく記述されている場合、VMMコードはVM出口を安全に処理する責任があります。特に、悪意のあるゲストコードがVMから抜け出せないようにする方法です。
「VM出口」は技術用語であり、VMMに制御を移すことを意味することに注意してください。 Wordの「exit」を使用しているにもかかわらず、ゲストコードがVMから抜け出すことを意味するものではありません。これは、VMMを呼び出す方法を指しており、何らかのセキュリティ違反ではありません。 VMMにセキュリティの脆弱性がない場合、VMMがリング0(ゲスト内)で実行されているか、非特権モードで実行されているかに関係なく、ゲストコードはVMから抜け出すことができません。
したがって、あなたの質問に対する答えは「はい」ですが、最初に表示されるよりもはるかに危険性が低くなります。