はじめに
こんにちは,morimolymolyです.
皆さん,Hyper-Vの脆弱性報酬プログラムはごぞんじですか?
https://www.microsoft.com/en-us/msrc/bounty-hyper-v
なんとHyper-VのRCE(Remote Code Execution)を発見するだけで$250,000も貰えてしまうのです!!
最近では360 Core Securityの研究者がVMEscapeの脆弱性をみつけて$200,000をゲットしています.
Zhenhao Hong @rthhh17 from 360 IceSword Lab was rewarded $200,000 by Microsoft #Hyper-V for his VM escape #vulnerability – one of the highest MSRC bounties ever @msftsecresponse We will release details after the patch. Congrats to @rthhh17 and @pjf40490912 (Weibo: @rt_hhh, @PJF_) pic.twitter.com/1ilNgIrW7K
— 360 Threat Intelligence Center (@360CoreSec) 2019年1月3日
$250,000も貰えたら働かずに毎日ごろごろしていても数年は余裕で持ちますね.
というわけでHyper-Vの脆弱性を発見する前に,これのアーキテクチャを学ぼうというわけです.
Hypervisor概要
ハイパーバイザにはType-1(Baremetal)とType-2(Host)の2種類あります.
Type-1はハイパーバイザがハードウェア上で直接動作します.
例: Xen,KVM,BitVisor,Bareflank
Type-2はホストOS上のプロセスとして動作するハイパーバイザです.
例: VirtualBox,VMWare,QEMU,Bochs
Hyper-VはType-1ハイパーバイザにあたります.
Hyper-Vのアーキテクチャ概要
上図がHyper-Vのアーキテクチャです.
Hyper-VはAttack Surfaceをなるべくへらすために,コード量を最小限にするという設計理念があります.
そのためデバイス仮想化などの機能はHyper-Vには実装していません.
Hyper-VがインストールされたホストOSがデバイス仮想化などのあらゆるサービスを担当します.
そのおかげでHyper-VはホストOSに実装されているデバイスドライバをそのまま利用できます.
Hyper-VにはPartitionという単位でVMが存在します.
Hyper-VがインストールされたホストOSをRoot Partitionと呼び,これは仮想マシンの管理,ゲストのメモリの操作,デバイスエミュレーションサービスの提供,実デバイス操作を行います.
XenでいうとDom0(特権ドメイン)です.
ゲストマシンはPartitionと呼びます.
ゲストマシンは別のPartitionの物理メモリにアクセスできませんし,ハードウェアの直接アクセスができません.
すべてはRoot Partitionと通信してデバイスの操作などを行ってもらいます.
またこの通信は厳格に定義されたインターフェースを通じてのみ行なえます.
このアーキテクチャから分かる通り,セキュリティ野郎が注目するべきはRoot Partitionです.
詳しくは以下の記事を参照.
docs.microsoft.com
Hyper-Vのメモリ
Hyper-Vのメモリは以下のように定義されます.
- PA(Physical Address) 物理メモリ空間
- SPA(System Physical Address) RootPartitionの物理メモリ空間
- SVA(System Virtual Address) RootPartitionの仮想メモリ空間
- GPA(Guest Physical Address) ゲストの物理メモリ空間
- GVA(Guest Virtual Address) ゲストの仮想メモリ空間
SPA,SVAは他のハイパーバイザだとHPA(Host Physical Address),HVA(Host Virtual Address)と呼ばれることが多い気がします*1.
Root Partitionの役割
上図はRoot Partitionで提供されるサービスの例です.
以下に用語を説明します.
- VDEV(Virtual Device) Rootのユーザ空間で動くエミュレートまたは準仮想化されたデバイス
- VSP(Virtualization Service Provider) Rootのカーネル空間でVDEVと協調して動く準仮想化されたデバイス.
- IC(Integration Component) ゲストがアクセスできるRootのユーザ空間で動くコンポーネント
また次のようなサービスが提供されています.
このようにRootPartitionのユーザ空間でホストされるサービスもあれば,RootPartitionのカーネル空間でホストされるサービスもあります.
ゲストのデバイス操作の流れ
上図はゲストがデバイスを操作するときの概要図です.
流れは以下のとおりです.
- ゲスト内のVSC(Virtualization Service Client)がvmbusを通じてRoot Partition内のVSPに操作を依頼
- VSPがホストOSのデバイスドライバに操作を依頼
- デバイスドライバがデバイスを操作
でばストレージ操作のVSPをみてみましょう.
ユーザ空間のVSPも見てみましょう.
VMWPとはVirtual Machine Worker Processの略で仮想マシンごとに用意されるVSPを提供するためのユーザ空間のプロセスです.
この例ではユーザ空間にSMBのサービスであるVSMBを動作させています.
Hyper-VのLinuxでの実装
当然このような仮想化支援技術はゲストカーネルに実装されていなければなりません.
Linuxでは以下のようなディレクトリにコードがあるようです.
実際にヘッダファイルを眺めてみるとなかなか面白いです.
github.com
予告
次回はHyper-Vのリバースエンジニアリング環境を構築します.
また既知の脆弱性についても解説したいと思います*2.