VMM Security

03 October 2021

VMM Security

VMM如果有漏洞被compromised就會造成attacker可以讀取其他VM的資料甚至影響Guest VM的執行, 所以要做的事情就事如何增強VMM的部分, 作法包括hardening(加強現有VM), redesign VMM(縮小code-base之類的),

VMM properties

  • Isolation: 每個VM互相不會影響到彼此,也不會影響到host, 不論是data存取或者執行
    • 所以這個特性讓VM很適合用來做sandbox分析malware或者各種要在isolation環境才能做得事
  • Inspection: VMM要有權限能夠觀察VM的state和資源使用狀況(包括CPU states, regsiter, memory, IO device state)
  • Interposition: VMM會介入VM如果他要使用某些instruction時(e.g. sensitive instruction)

challenges

  • patching VM
    • VM可以跑各種不同的VM同時能維持VM的正常運行(有些patch如果失敗VM可能會直接掛掉進而影響memory, disk資料), 要如何避免這種patching造成的失誤的影響
    • 如何確定new patch一定是security fix
    • 如何rollback(放棄這次的patch回到上個版本)

VMBR(Virtual Machine based Rootkit)

一種malware讓沒有權限的software能夠執行privilege operation來得到不該得到的資料 一種做法是在host operating system裝rootkit, 所以使用者在開機電腦時裝host OS時實際上會安裝一個惡意的VMM, 接著把host OS透過這個VMM以VM形式裝起來, 然後這個惡意的VMM會在建立另一個VM跑malicious service. 所以使用者以為他在電腦上裝一個OS, 實際上是先裝了一個VMM接著VMM在安裝使用者要的host OS, 同時VMM另外裝了一個VM裡面跑malicious service

所以就是能夠讓使用者以為他裝OS, 殊不知他裝的這個OS其實是跑在一個VM上, 而且是被一個惡意的VMM host

因此可以做到的事:

  • launch malicious service from malicious VM
  • 觀察目標OS的資料(keylogging或者看封包)
  • 修改target OS的執行狀況

Defense: 一些研究設法在OS中加一些東西想辦法讓他們能不能夠分辨自己在VM裡還是不是, 如果在VM裡可能可以detect或者有不同行為, 例如利用sidt instruction(修改interrupt descriptor table register, IDTR)

Trusted Platform Module(TPM)

一個hardware晶片用來驗證software integrity(跟hash值做比較), 只有驗證過的software才能安裝, 所以他能提供authenticate的機制, 但不能保證安裝好的software沒有0-day漏洞

Security Research

通常security research可以用四個點來概括他的target跟具體做了甚麼事

  • Goal: 希望達成的目標
  • Threat Model: Attacker能做到甚麼事, 做不到甚麼事
  • Policy: high-level如何達到安全性
  • Mechanism: 具體怎麼實行policy的內容

Trusted Computing Based(TCB)

基本上在security research時, 大部分情況我們都會有某些假設(例如假設某些code是bug free), 只要人寫的就可能會有bug, 所以總是會有這些假設. 例如我們可能會假設Hypervisor是bug free的狀況下怎麼保護VM, 那這種假設某些程式是bug free的部分就稱為TCB.

一般而言, TCB越大則整個research assumption越強(即現實中越難達成或較不切實際), 當然可以假設整個OS kernel是TCB, 但這很明顯就是有問題的假設, 甚至連一般來說我們會假設hardware是安全的這件事都不是事實了(meltdown, spectre attack)

所以在做security research要能夠想清楚TCB是哪個區段. 原則上以整個VMM作為TCB太大, 所以會配合的方法包刮把部分VMM的功能做hardening, 或者Redesign VMM讓他的codebase比較小, 甚至把部分的功能移到hardware來做.

Secvisor

確保guest kernel的integrity避免malicious software修改guest kernel code或者加一些東西或者Load malicious device driver

Hypersafe

harding VMM, 保護Type-1 hypervisor, 想法就是對VMM做好一些integrity check, 包括load time integrity(確保boot的VM是正常的), memory lockdown(memory permission), 也確保各種Control flow,避免ROP等等攻擊, 想法是先建立好預先的Control Flow Graph(CFG), 接著在run-time時比對這個jump是否是CFG上的其中一個路徑, 不是的話代表可能很有問題

Xoar

針對Xen上面的改良, 基本上想法就是harden vmm,把現有太大的Xen拆成多個Component,每個Component本身是isolated的, 所以假設Xen某個Component被compromised, 那也不會影響到其他的component, 相比原本一整個Xen只要某個部分有漏洞, 整個Xen就可能所有服務都受到威脅.

具體而言就是把Xen切成多個模組, 有的是long-lived模組, 有的是只有在bootstrap VM時才會啟動的模組, 有的則是週期性啟動的, 所以一直在運行的程式部分相對也比較少, 某方面來說減少了attack vector

NOVA

No hypervisor架構, reduce VMM TCB, 利用microkernel的形式建立一個microhypervisor, 在kernel-space只執行必要, 少數的service,而把其他的service像是device driver等等的都移到user-space. 這樣VMM的codebase就變很少. 這樣變成每個VM會有自己的service外, 也會有多個VM share一些user-level service的部分

只是microkernel的缺點在於原本能夠在kernel-space做的一些事變成user-space program, 這樣會增加很多的context switch, performance下降外, 因為VMM code-base小, 等於她相對可以支援的虛擬化feature也比較少, 甚至很多要在user-space host的部分自己implement. 而且因為可能使用的service接口不同, 很多的app可能每次都要重新porting

Threat model是attacker可以Compormise guest VM, NOVA作法是statically partition CPU, memory給每次新開的VM, 也就是在這樣的狀況下,VMM的最大功能就是bootstrap VM跟preallocate資源, 而不用做後續的demand paging的事情, 那VMM的code base就變很小

Cloudvisor

Deprivilege VMM, 假設Hypervisor能夠被攻擊者全權掌控, 解法是利用nested VM在host VMM上面跑gueste VMM, 所以guest VMM(被攻擊者compromise)要做甚麼行為或存取硬體資料都會被host VMM監控, 然後host VMM能夠針對guest VMM上的VM作保護(例如將VM資料全部加密, 這樣guest VMM就看不到VM的data)

當guest VM exit時不會直接跳到guest VMM, 而是會先trap到cloudvisor在送到guest VMM

這種模式保證即使VMM被攻破, VM還是能夠正常運行而且資料不會被malicious VMM偷走, 但這種做法就會有nested virtualization的問題(exit multiplication), host/guest VMM中間會有很多溝通

Hypsec

把microkernel的概念應用在kvm上面, 也是保證即使VMM被攻擊者掌控, VM資料還是不會外洩, 包括trap VM_exit,enter以及對VM data做access control(跟encryption不同是, encryption是會把資料加密而要有key才能解密, 但加解密過程費時跟資源, 相對ACL是不加密資料但只有合法的user存取資料VMM才會return資料)

流程跟上圖其實差不多,把hypervisor切成hostvisor跟corevisor, corevisor是TCB的部分), hostvisor就是可能會被comrpomise的, 但所有VM跟guest VMM溝通都需要經過corevisor(host vmm), 然後對於那些不需要存取VM資料的工作(如demand paging, cpu scheduling) 就交給corevisor把它做掉, 就不用在特別去guest VMM做處理. 然後只有corevisor能真的接觸到硬體資源, 然後corevisor要確保提供給hostvisor VM的資料都要是有經過加密的且要確保hostvisor有權限去存取VM的資料(ACL). corevisor也提供一些api給hostvisor來建立VM或者存取VM相關資訊的API, 並配合file storeage, key management來驗證跑起來的VM使用的kernel image是不是user提供的, 還是惡意hostvisor亂改的

kvm整合hypsec就是corevisor(TCB, codebase小)有權限存去hardware資源, 而hostvisor(guestVMM)就是可以跑一個完整的Linux kernel的hypervisor, 這部分的code就不需要被信任. corevisor做的事情包括cpu virtualization, page table management, hostvisor對於VM的ACL, 所以codebase不大,要管理, 做的事情不多, 剩下很多關於加密的方法可以運用VM自己本身有提供的end to end加密機制而不用在corevisor上實作加解密

缺點:

  • 因為hostvisor不能直接存取VM記憶體資料, 所以很多IO DMA的做法會失靈, 例如ringbuffer根本沒辦法map到同塊記憶體, 變成要透過另外創一些API來做到這些事
  • Exit Multiplication問題

Hardware based Solution (VMM protection)

Intel SGX

Software Guard Extension, 一組新的instruction set, 可以建立enclave(記憶體加密的區域, 包含user-level code/data, 但都加密過的), 而且因為是hardware加密的方式, 所以就算是跑在privilege mode的OS kernel去access到的enclave data也都是加密過的.

因此假設VM開了一個enclave會讓VMM也沒辦法去存取VM開的enclave資料, 所以VM就可以把重要資料放在enclave裡, 讓malicious VMM也沒辦法存取VM的資料. enclave只有在CPU上運作時才會解密, 在ram上面的儲存都是加密的狀態

但因為enclave是預先宣告好的一個區段,要在enclave裡面放程式時要預先想好要給多少的空間(就是程式跑起來包括stack, heap使用的最大空間或是code modules總共是多少), 然後enclave也沒辦法修改page permission

SGX2則允許動態加入記憶體到enclave裡面

AMD SEV

Secure Encryped Virtualization, 一樣是硬體提供的技術讓VM能夠免於malicious VMM讀取機密資料或者CPU state, 利用AES, 每個VM會有一個key加密自己的資料. 相較於SGX是他可以對整個VM做加密, 而SGX是針對單一Application為主, 所以VMM在SGX下可以對OS kernel做修改來影響application(例如修改system call的位址)或是當enclave application呼叫mmap時, 惡意的os kernel亂allocate記憶體給enclave的application.

但AMD SEV的另一個問題點就變成是Hypervisor是untrusted, 然後guest VM要跟hypervisor溝通, 這會導致hypervisor有機會修改hypercall做的事情來影響SEV的安全性

  • Secure Memory Encryption(SME): 用per VM key把VM記憶體資料加密(利用physical address上的c-bit來決定是否要加密記憶體資料)
  • Encrypted State(SE): 當VM停止運行時, 把VM的所有CPU register資料都加密起來
  • Secure Nested Page(SNP):保證VM memory的integrity

Hardware security

雖然上面提到可以使用hardware解法來縮小TCB或者SGX,SEV來保護VM資料, 但其實Hardware也不是bug-free, 一但有bug就沒有辦法像software那樣那麼容易上patch