unsafe nested virtualization on intel cpu

56
Unsafe Nested Virtualization on Intel CPU 深井 貴明(筑波大学) 20161251

Upload: takaaki-fukai

Post on 23-Jan-2018

277 views

Category:

Software


2 download

TRANSCRIPT

Page 1: Unsafe Nested Virtualization on Intel CPU

Unsafe Nested Virtualization on Intel CPU

深井貴明(筑波大学)

2016年12月5日

1

Page 2: Unsafe Nested Virtualization on Intel CPU

Nested Virtualization

2

VMM

VMM QEMU/KVM, VirtualBox, etc.

VM

CPU

VM

VM の中にVMM が!

Page 3: Unsafe Nested Virtualization on Intel CPU

Nested Virtualization

3

L0 VMM (Layer 0)

L1 VMM (Layer 1) QEMU/KVM, VirtualBox, etc.

L2 VM (Layer 2)

CPU

VM

VM の中にVMM が!

Page 4: Unsafe Nested Virtualization on Intel CPU

Nested Virtualization

4

L0 VMM (Layer 0)

L1 VMM (Layer 1) QEMU/KVM, VirtualBox, etc.

L2 VM (Layer 2)

CPU

VM

VM の中にVMM が!

仮想化支援機能で速度向上!

VT-x/AMD-V

Virtual VT-x/AMD-V

仮想化支援機能を提供

Page 5: Unsafe Nested Virtualization on Intel CPU

BitVisor の Nested Virtualization

• イーゲル榮樂さんによる発表

Unsafe Nested Virtualization

5

Page 6: Unsafe Nested Virtualization on Intel CPU

Unsafe Nested Virtualization とは

• L1 VMMが trusted だと仮定し,いくつかの仮想化支援機能をパススルーで L1 に提供する• E.g. EPT をパススルーとか

• Para-passthroughな BitVisor ならではの (荒) 技

6

Page 7: Unsafe Nested Virtualization on Intel CPU

実行の流れ

7

L2 用 VMCB をロード

L1 用VMCBをロード

L1 VMM

L0 VMM

L2 VM

L1 が作成したVMCSを変換なしに直接ロード

VMExit VMEnter VMExit VMEnter

Page 8: Unsafe Nested Virtualization on Intel CPU

アドレス変換

L1 VMM

L0 VMM

L2 VM

CPU

EPT L2p L1p

PT L2v L2p

L2 動作時

• L1 が作成した EPT を直接ロード

• BitVisor では L0p = L1p

• L0 の保護なしUnsafe

(L2p = L2 Physical address, …)

Page 9: Unsafe Nested Virtualization on Intel CPU

夢が広がりますね

• VMM のデバッグなどの用途に• 木村さんのシステムと組み合わせればとても夢が広がるかも

•自由なライセンスの Nested Virtualization• BitVisor は BSD ライセンス

• Open かつ not GPL で Nested Virtualization できる VMM はほかにない

9

Page 10: Unsafe Nested Virtualization on Intel CPU

しかし…

• Intel VT-x -未着手

• AMD SVM -実装済み

10

Page 11: Unsafe Nested Virtualization on Intel CPU

しかし…

• Intel VT-x -未着手

• AMD SVM -実装済み

11

Page 12: Unsafe Nested Virtualization on Intel CPU

Unsafe Nested Virtualization on Intel CPU

12

Page 13: Unsafe Nested Virtualization on Intel CPU

基本設計

基本的には AMD 版と同じ(だと思う)

• L1 が作成した VMCS を (ほぼ) 直接ロード

• EPTは L1 が作成したものを直接ロード

VT-x と AMD-V の違いに対応

• VMX命令

• VMExit 時の Host Stateのロード

13

Page 14: Unsafe Nested Virtualization on Intel CPU

AMD 版実装との主な違い

•全部

•命令エミュレーション

• Host Statesの Shadowing

• VMExitのエミュレーション

• vCPU マイグレーションへの対応

14

Page 15: Unsafe Nested Virtualization on Intel CPU

AMD 版実装との主な違い

•全部

•命令エミュレーション

• Host States の Shadowing

• VMExit のエミュレーション

• vCPU マイグレーションへの対応

15

Page 16: Unsafe Nested Virtualization on Intel CPU

VMX instructions

• VMXOFF

• VMXON

• INVEPT

• INVVPID

• VMREAD

• VMWRITE

• VMLAUNCH

• VMRESUME

• VMCLEAR

• VMPTRLD

• VMPTRST

16

Page 17: Unsafe Nested Virtualization on Intel CPU

VMX instructions

• VMXOFF

• VMXON

• INVEPT

• INVVPID

• VMREAD

• VMWRITE

• VMLAUNCH

• VMRESUME

• VMCLEAR

• VMPTRLD

• VMPTRST

17

実行したふりだけする

BitVisorが代わりに実行

Page 18: Unsafe Nested Virtualization on Intel CPU

VT-x 命令のエミュレーション

基本的には

• VMCSを L1/L0 L2/L0 に切り替え

•実際に命令を実行

•結果を L1 に返す• L1 RFLAGS の反映

• オペランドとして渡されたレジスタ or メモリに結果を渡す

18

Page 19: Unsafe Nested Virtualization on Intel CPU

例: VMREAD

19

L0 BitVisor

L1 VMM

CPUL1/L0VMCS

L2/L0VMCS

L1/L0VMCS

L2/L1VMCS

VMREAD!

Page 20: Unsafe Nested Virtualization on Intel CPU

例: VMREAD/VMWRITE

20

L0 BitVisor

L1 VMM

CPUL1/L0VMCS

L2/L0VMCS

L1/L0VMCS

L2/L1VMCS

VMREAD!

VM

Exit

Page 21: Unsafe Nested Virtualization on Intel CPU

例: VMREAD/VMWRITE

21

L0 BitVisor

L1 VMM

CPUL2/L0VMCS

L2/L0VMCS

L1/L0VMCS

L2/L1VMCS

VMPTRLD

VMREAD!

Page 22: Unsafe Nested Virtualization on Intel CPU

例: VMREAD/VMWRITE

22

L0 BitVisor

L1 VMM

CPUL2/L0VMCS

L2/L0VMCS

L1/L0VMCS

L2/L1VMCS

VMREAD

VMREAD!

Page 23: Unsafe Nested Virtualization on Intel CPU

例: VMREAD/VMWRITE

23

L0 BitVisor

L1 VMM

CPUL1/L0VMCS

L2/L0VMCS

L1/L0VMCS

L2/L1VMCS

VMREAD!

VMPTRLD

Page 24: Unsafe Nested Virtualization on Intel CPU

例: VMREAD/VMWRITE

24

L0 BitVisor

L1 VMM

CPUL1/L0VMCS

L2/L0VMCS

L1/L0VMCS

L2/L1VMCS

VMREAD!

VM

Ente

r

Page 25: Unsafe Nested Virtualization on Intel CPU

AMD 版実装との主な違い

•全部

•命令エミュレーション

• Host Statesの Shadowing

• VMExit のエミュレーション

• vCPU マイグレーションへの対応

25

Page 26: Unsafe Nested Virtualization on Intel CPU

VMCS が持つ States

26

VMCS

Guest State

Host State

Control State

Page 27: Unsafe Nested Virtualization on Intel CPU

VMCS が持つ States

27

VMCS

Guest State

Host State

Control State

VMExit 時に物理コアにロードされる情報• RIP• RSP• etc.

Page 28: Unsafe Nested Virtualization on Intel CPU

VMCS が持つ States

28

VMCS

Guest State

Host State

Control State

VMExit 時に物理コアにロードされる情報• RIP• RSP• etc.

L2 からのVMExit 時もBitVisor の状態でないと困る

Page 29: Unsafe Nested Virtualization on Intel CPU

VMCS Shadowing

29

L2/L0 VMCS

Guest StateL1が設定

Host StateL0が設定

Control StateL1が設定

Host StateL1 が設定

Shadow VMCS

CPU にセット L0 BitVisor が管理

Page 30: Unsafe Nested Virtualization on Intel CPU

AMD 版実装との主な違い

•全部

•命令エミュレーション

• Host Statesの Shadowing

• VMExit のエミュレーション

• VMCS のライフサイクルの対応

30

Page 31: Unsafe Nested Virtualization on Intel CPU

VMCS の切り替え

31

L1 VMM

L0 VMM

L2 VM

VMExit VMEnter VMExit VMEnter

CPU L1/L0 VMCS

L2/L0 VMCS

L1/L0 VMCS

Page 32: Unsafe Nested Virtualization on Intel CPU

VMCS の切り替え

32

L1 VMM

L0 VMM

L2 VM

VMExit VMEnter VMExit VMEnter

CPU L1/L0 VMCS

L2/L0 VMCS

L1/L0 VMCS

Page 33: Unsafe Nested Virtualization on Intel CPU

VMExit 時の処理

33

Intel SDM 3C が手元にある人は LOADING HOST STATE という章を見てみましょう

Page 34: Unsafe Nested Virtualization on Intel CPU

34

こんなにある!

Page 35: Unsafe Nested Virtualization on Intel CPU

35

bool to_64bit_mode;ulong tmp;ulong cr0, cr3, cr4;/* These bit is not modified */const u64 cr0_reserved = 0xffffffff1ffaffc0; /* 63:32, 28:19, 17, 15:6 */ulong cr0_mask = CR0_ET_BIT | CR0_CD_BIT | CR0_NW_BIT | CR0_NE_BIT |

cr0_reserved;ulong cr3_mask = ~(current->pte_addr_mask | PAGESIZE_MASK);ulong cr4_mask = CR4_VMXE_BIT;

ulong acr;u64 guest_efer;

const u64 efer_mask = MSR_IA32_EFER_LME_BIT | MSR_IA32_EFER_LMA_BIT;struct vmcs_host_states hs = current->u.vt.shadow_vt->current_shadow_vmcs->hs;ulong exit_ctl = current->u.vt.shadow_vt->current_shadow_vmcs->exit_ctl_shadow;ulong exec_ctl;

/* Load some L2-L0 VMCS field */asm_vmread (VMCS_VMEXIT_CTL, &tmp);

これが”VMExit” 時のアトミックな処理…

Page 36: Unsafe Nested Virtualization on Intel CPU

AMD 版実装との主な違い

•全部

•命令エミュレーション

• Host Statesの Shadowing

• VMExit のエミュレーション

• vCPU マイグレーションへの対応

36

Page 37: Unsafe Nested Virtualization on Intel CPU

vCPUマイグレーション

= vCPUの物理コア間の移動(プロセスマイグレーションみたいなイメージ)

37

物理コア 物理コア 物理コア 物理コア

vCPU

Page 38: Unsafe Nested Virtualization on Intel CPU

vCPUマイグレーションの流れ

38

物理コア 物理コア

vCPU

RAM

VMM

VMCS

VMCSのキャッシュ

VMCS

Page 39: Unsafe Nested Virtualization on Intel CPU

vCPUマイグレーションの流れ

39

物理コア 物理コア

RAM

VMM

VMCS

VMCS

VMCLEAR

VMCSのキャッシュ

キャッシュ吐き出し

Page 40: Unsafe Nested Virtualization on Intel CPU

vCPUマイグレーションの流れ

40

物理コア 物理コア

RAM

VMM

VMCS

VMCS

VMCS

vCPU

VMCLEAR VMPTRLD

VMCSのキャッシュ

キャッシュ吐き出し

vCPU

Page 41: Unsafe Nested Virtualization on Intel CPU

Nested Virtualization でのvCPU マイグレーションの流れ

41

物理コア 物理コア

RAM

L1 VMM

L2/L0 VMCS

VMCLEAR

L0 VMM

L2/L1 VMCS

L1 Host State

vCPU

Page 42: Unsafe Nested Virtualization on Intel CPU

Nested Virtualization でのvCPU マイグレーションの流れ

42

物理コア 物理コア

RAM

L1 VMM

L2/L1 VMCS

L2/L1 VMCS

VMCLEAR

L0 VMM

L1 Host State

vCPU

Page 43: Unsafe Nested Virtualization on Intel CPU

Nested Virtualization でのvCPU マイグレーションの流れ

43

物理コア 物理コア

RAM

L1 VMM

L2/L1 VMCS

VMCLEAR

L0 VMM

L1 Host State

L2/L1 VMCS

Page 44: Unsafe Nested Virtualization on Intel CPU

Nested Virtualization でのvCPU マイグレーションの流れ

44

物理コア 物理コア

RAM

L1 VMM

L2/L1 VMCS

VMCLEAR

L0 VMM

L1 Host State

L2/L1 VMCS

VMPTRLD

Page 45: Unsafe Nested Virtualization on Intel CPU

Nested Virtualization でのvCPU マイグレーションの流れ

45

物理コア 物理コア

RAM

L1 VMM

L2/L1 VMCS

VMCLEAR

L0 VMM

L1 Host State

L2/L1 VMCS

VMPTRLD

L2/L1 VMCS

Page 46: Unsafe Nested Virtualization on Intel CPU

Nested Virtualization でのvCPU マイグレーションの流れ

46

物理コア 物理コア

RAM

L1 VMM

L2/L1 VMCS

VMCLEAR

L0 VMM

L1 Host State

L2/L1 VMCS

VMPTRLD

L2/L1 VMCS

L1 Host State

Page 47: Unsafe Nested Virtualization on Intel CPU

Nested Virtualization でのvCPU マイグレーションの流れ

47

物理コア 物理コア

RAM

L1 VMM

L2/L1 VMCS

VMCLEAR

L0 VMM

L1 Host State

L2/L1 VMCS

VMPTRLD

L2/L0 VMCS

L1 Host State

L0 Host State

vCPU

Page 48: Unsafe Nested Virtualization on Intel CPU

その他ハマったところ: EFER

• IA32_MSR_EFER が Exit 時にロードされたりされなかったりする• Exit control でL1が制御可能

• ゲストとホストが同じ EFER の設定を使っていると,VMExit のたびに EFER を更新しないような設定にされたりする (KVM)

• うまく対応する必要がある

48

Page 49: Unsafe Nested Virtualization on Intel CPU

EFER の扱い

• L1 EFER Physical EFER

• VMEntry from L0 to L2

• VMExit from L2 to L0

• If (exit_ctl & load_host_efer)• L1/L0_VMCS_GUEST_EFER = L2/L1_VMCS_HOST_EFER

• else• L1/L0_VMCS_GUEST_EFER = Physical EFER

• Restore EFER

• 32 Bit OS対応どうしよう?

49

Page 50: Unsafe Nested Virtualization on Intel CPU

コード行数

•明らかに Intel 対応の方が行数が多い

AMD: +266行,-6行 (Changeset #106)

Intel: +1455行, -1行

50

Page 51: Unsafe Nested Virtualization on Intel CPU

対応状況 (L2 は Ubuntu 16.04 64bit)

51

L1 VMM 対応状況

KVM O

VirtualBox on Linux O

VirtualBox on Windows O?

VMWare workstation player on Linux O

Bhyve O?

Hyper-V ?

BitVisor O

Xen ?

* on Mac ?

Page 52: Unsafe Nested Virtualization on Intel CPU

対応/検証状況

52

• とりあえず OS 起動のみ検証

• デバイスの共有などは未検証

• Nested EPTは未対応

• L2 は Ubuntu 16.04 64bit, Thinkpad X1 でのみの検証

Page 53: Unsafe Nested Virtualization on Intel CPU

性能評価

• とかやりたかったんですけどね…

• Advent Calendarで書けるといいな…

53

Page 54: Unsafe Nested Virtualization on Intel CPU

まとめ

• Intel CPU 向けに Unsafe Nested Virtualization の対応

• Intel だと以下が大変だった• 命令エミュレーション

• Host States の Shadowing

• VMExit のエミュレーション

• vCPU マイグレーションへの対応

•色々大変だったけど何とか動いて?よかった

• そのうちメインラインに入る…かも…?

54

Page 55: Unsafe Nested Virtualization on Intel CPU

55

Page 56: Unsafe Nested Virtualization on Intel CPU

書いてね

56