國(guó)家保密局網(wǎng)站>>保密科技

虛擬機(jī)逃逸安全研究

2021年05月13日    來(lái)源:國(guó)家保密科技測(cè)評(píng)中心【字體: 打印

【摘   要】 虛擬化技術(shù)是云計(jì)算實(shí)現(xiàn)提供用戶靈活增減IT資源、按需付費(fèi)等特色服務(wù)的基礎(chǔ)。虛擬化技術(shù)架構(gòu)主要由宿主機(jī)、虛擬化層和虛擬機(jī)3部分組成,每個(gè)部分都存在各種安全問(wèn)題,其中虛擬機(jī)逃逸被認(rèn)為是對(duì)虛擬機(jī)安全最嚴(yán)重的威脅之一。本文提煉虛擬機(jī)逃逸的提權(quán)模型,劃分其表現(xiàn)特征,并對(duì)虛擬化安全的研究提出了展望。

【關(guān)鍵詞】 虛擬化 虛擬機(jī)逃逸 提權(quán)模型 表現(xiàn)特征

1 引言

近些年,虛擬化技術(shù)從開(kāi)源KVM、XEN到Docker和Kubernetes,微服務(wù)和軟件定義網(wǎng)絡(luò)的理念模糊了開(kāi)發(fā)和運(yùn)維的界限,也把更多的安全問(wèn)題帶入到虛擬化技術(shù)中。更多基礎(chǔ)設(shè)施即服務(wù)(Iaas)管理平臺(tái)的問(wèn)題以及云供應(yīng)商的不可控都給虛擬化技術(shù)的安全應(yīng)用帶來(lái)阻礙,而真正的虛擬化安全要從虛擬化技術(shù)本身談起。虛擬機(jī)分享宿主機(jī)的資源,宿主機(jī)提供了虛擬機(jī)之間、宿主機(jī)與虛擬機(jī)之間的隔離。虛擬機(jī)的設(shè)計(jì)理念是虛擬機(jī)上運(yùn)行的程序不能監(jiān)控和交互宿主機(jī)與其他虛擬機(jī)上運(yùn)行的程序。但是隨著虛擬化技術(shù)的延展,這種隔離機(jī)制被弱化,導(dǎo)致安全問(wèn)題的發(fā)生。一個(gè)最典型的攻擊類(lèi)型是虛擬機(jī)逃逸,早在2007年,就有研究人員提出當(dāng)宿主機(jī)與虛擬機(jī)之間的隔離機(jī)制被弱化的時(shí)候,它是最嚴(yán)重的威脅。虛擬機(jī)逃逸的定義是指虛擬機(jī)里運(yùn)行的程序利用虛擬機(jī)的漏洞突破虛擬機(jī)管理器(Hypervisor),獲得宿主機(jī)操作系統(tǒng)管理權(quán)限,并控制宿主機(jī)上運(yùn)行的其他虛擬機(jī),導(dǎo)致安全環(huán)境架構(gòu)的徹底破壞。

虛擬化環(huán)境中,上層虛擬機(jī)與底層虛擬機(jī)監(jiān)控器進(jìn)行交互,實(shí)現(xiàn)對(duì)底層物理資源的訪問(wèn),而這種交互過(guò)程就是潛在的引入虛擬機(jī)逃逸漏洞的關(guān)鍵。虛擬機(jī)逃逸的發(fā)生來(lái)源于虛擬化技術(shù)自身的安全問(wèn)題,而虛擬化自身的安全問(wèn)題往往由虛擬化技術(shù)的機(jī)制產(chǎn)生。下面從虛擬機(jī)逃逸的提權(quán)模型和表現(xiàn)特征展開(kāi)討論。

2 虛擬機(jī)逃逸的提權(quán)模型

虛擬機(jī)逃逸種類(lèi)繁多,原因復(fù)雜,很難對(duì)其進(jìn)行歸納總結(jié),提取共同特征。本小節(jié)基于虛擬化系統(tǒng)中指令處理的機(jī)制和原理,嘗試揭示虛擬機(jī)逃逸的根本原因,提出虛擬機(jī)逃逸的提權(quán)模型,發(fā)掘虛擬機(jī)逃逸的根源。

2.1 虛擬機(jī)逃逸的提權(quán)機(jī)理

攻擊者利用虛擬機(jī)操作系統(tǒng)發(fā)起執(zhí)行相關(guān)敏感指令的請(qǐng)求,該指令會(huì)交由內(nèi)核態(tài)去處理,對(duì)于某些特權(quán)指令會(huì)交由Hypervisor處理,此時(shí)攻擊者可利用Hypervisor的脆弱性漏洞使得Hypervisor執(zhí)行完特權(quán)指令后不產(chǎn)生指令狀態(tài)的返回,導(dǎo)致用戶態(tài)停留在了內(nèi)核態(tài),攻擊者實(shí)現(xiàn)了提權(quán),隨后攻擊者可以滲透到Hypervisor和虛擬機(jī)的其他區(qū)域,破壞虛擬化的隔離機(jī)制,完成逃逸操作。虛擬機(jī)逃逸的關(guān)鍵機(jī)理是先提權(quán)后滲透,提權(quán)完成系統(tǒng)級(jí)別的控制切換,滲透完成隔離機(jī)制的破壞,從而打破虛擬化體系的安全機(jī)制。

虛擬機(jī)逃逸是一個(gè)復(fù)雜多變的過(guò)程,完成一次成功的逃逸攻擊,需要具備下面4個(gè)條件:

(1) 一個(gè)有漏洞的內(nèi)核;

(2)一次可匹配漏洞的逃逸;

(3)擁有將逃逸轉(zhuǎn)移到目標(biāo)位置的能力;

(4)擁有在目標(biāo)位置上執(zhí)行逃逸攻擊的能力。

假設(shè)用戶處于Ring3狀態(tài),實(shí)現(xiàn)逃逸利用的通用流程為:

(1)誘使內(nèi)核在根模式Ring0下運(yùn)行企圖的有效載荷;

(2)修改任意數(shù)據(jù),例如進(jìn)程權(quán)限;

(3)以新權(quán)限啟動(dòng)一個(gè)Shell,并獲取root權(quán)限。

權(quán)限提升的目的:

(1)讀/寫(xiě)任意的敏感文件;

(2)系統(tǒng)重啟后依然運(yùn)行;

(3)插入永久后門(mén)。

2.2 虛擬機(jī)逃逸的提權(quán)模型構(gòu)建

CPU指令按照運(yùn)行級(jí)別的不同,可以劃分為特權(quán)指令和非特權(quán)指令兩類(lèi)。特權(quán)指令只能在最高級(jí)別上運(yùn)行,非特權(quán)指令可以在各個(gè)級(jí)別的狀態(tài)下執(zhí)行。引入虛擬化后,客戶機(jī)操作系統(tǒng)就不能運(yùn)行在Ring 0上,原本需要在最高級(jí)別下執(zhí)行的指令不能直接執(zhí)行,而是交由Hypervisor處理執(zhí)行,這部分指令稱為敏感指令。屬于特權(quán)指令的敏感指令可以陷入Hypervisor下直接執(zhí)行。而非特權(quán)指令的敏感指令在(軟件)全虛擬化模式和半虛擬化模式下需要進(jìn)行復(fù)雜的陷入和模擬操作才能執(zhí)行,該難題在硬件輔助虛擬化下得到解決。

權(quán)限提升在虛擬化系統(tǒng)中尤為重要,包括兩部分權(quán)限提升,從用戶層到內(nèi)核層,從內(nèi)核層到虛擬化層。權(quán)限提升可以使得攻擊者獲得更高的權(quán)限,運(yùn)行的代碼級(jí)別更高,危害更大。下面分別給出全虛擬化/半虛擬化模式提權(quán)模型和硬件輔助虛擬化模式提權(quán)模型。

全虛擬化/半虛擬化的提權(quán)模型如圖1所示。

在全虛擬化和半虛擬化模式下,敏感指令在Ring0級(jí)執(zhí)行完后沒(méi)有返回用戶級(jí)Ring3,而是駐留在Ring0級(jí),表示用戶態(tài)應(yīng)用程序成功逃逸到最高特權(quán)級(jí)。

為了減輕全虛擬化模式應(yīng)用二進(jìn)制翻譯技術(shù)帶來(lái)的性能消耗過(guò)大,以及克服半虛擬化模式需要修改虛擬機(jī)操作系統(tǒng)帶來(lái)的不便,硬件輔助虛擬化模式在2005年出現(xiàn),并成為至今普遍推廣的虛擬化模式,其提權(quán)模型如圖2所示。

在硬件輔助虛擬化模式下,非根模式Ring3級(jí)的用戶操作使得敏感指令在根模式的Ring0級(jí)執(zhí)行后駐留在Ring0,表示虛擬機(jī)非根模式應(yīng)用程序成功逃逸到根模式宿主機(jī)最高特權(quán)級(jí)。

3 虛擬機(jī)逃逸的表現(xiàn)特征

當(dāng)前對(duì)虛擬機(jī)逃逸的分類(lèi)沒(méi)有一定的標(biāo)準(zhǔn),為了最大程

度涵蓋截至當(dāng)前出現(xiàn)的虛擬機(jī)逃逸漏洞,本小節(jié)從國(guó)內(nèi)外專業(yè)漏洞庫(kù)CVE(Common Vulnerabilities and Exposures,公共漏洞和暴露)和NVD(National Vulnerability Database,國(guó)家漏洞數(shù)據(jù)庫(kù))搜集信息,采用造成虛擬機(jī)逃逸漏洞的表現(xiàn)特征來(lái)進(jìn)行分類(lèi),任何一個(gè)逃逸漏洞包括表現(xiàn)特征的一個(gè)或多個(gè)組合,其表現(xiàn)特征主要?jiǎng)澐譃橐韵?個(gè)方面。

3.1 拒絕服務(wù)類(lèi)型

傳統(tǒng)拒絕服務(wù)是指通過(guò)占滿服務(wù)器的所有服務(wù)線程或者網(wǎng)絡(luò)帶寬,導(dǎo)致正常的服務(wù)請(qǐng)求無(wú)法得到響應(yīng),致使服務(wù)器處于癱瘓的狀態(tài)。拒絕服務(wù)類(lèi)型虛擬機(jī)逃逸與傳統(tǒng)網(wǎng)絡(luò)攻擊中的拒絕服務(wù)攻擊有所區(qū)別,虛擬機(jī)環(huán)境中,惡意用戶以正常租戶的身份獲取客戶虛擬機(jī),利用設(shè)備仿真或其他類(lèi)型漏洞,引起緩沖區(qū)溢出或內(nèi)核崩潰,導(dǎo)致客戶機(jī)惡意停止工作,甚至影響其他客戶虛擬機(jī),造成嚴(yán)重的拒絕服務(wù)。一個(gè)典型的拒絕服務(wù)類(lèi)型虛擬機(jī)逃逸漏洞如CVE-2019-3887:基于內(nèi)核虛擬機(jī)的虛擬化系統(tǒng)(Kernrel-based Virtual Machine,KVM)的Hypervisor在啟用嵌套虛擬化的情況下處理x2APIC特殊機(jī)器寄存器(MSR)訪問(wèn)的方式存在缺陷。在這種情況下,當(dāng)啟用“virtualize x2APIC mode”時(shí),L1 guest虛擬機(jī)可以通過(guò)L2 guest訪問(wèn)L0的APIC寄存器值。攻擊者可以利用此漏洞致使主機(jī)內(nèi)核崩潰,從而導(dǎo)致拒絕服務(wù)問(wèn)題。

3.2 內(nèi)存隔離失效類(lèi)型

內(nèi)存隔離失效類(lèi)型主要包括緩沖區(qū)溢出和堆棧溢出等,緩沖區(qū)溢出是一種非常普遍、非常危險(xiǎn)的漏洞,在各種操作系統(tǒng)、應(yīng)用軟件中廣泛存在。緩沖區(qū)在系統(tǒng)中的表現(xiàn)形式是多樣的,高級(jí)語(yǔ)言定義的變量、數(shù)組、結(jié)構(gòu)體等在運(yùn)行時(shí)可以說(shuō)都是保存在緩沖區(qū)內(nèi)的,因此所謂緩沖區(qū)可以更抽象地理解為一段可讀寫(xiě)的內(nèi)存區(qū)域,緩沖區(qū)攻擊的最終目的就是希望系統(tǒng)能執(zhí)行這塊可讀寫(xiě)內(nèi)存中已經(jīng)被蓄意設(shè)定好的惡意代碼。按照馮·諾依曼存儲(chǔ)程序原理,程序代碼是作為二進(jìn)制數(shù)據(jù)存儲(chǔ)在內(nèi)存的,同樣程序的數(shù)據(jù)也在內(nèi)存中,因此直接從內(nèi)存的二進(jìn)制形式上是無(wú)法區(qū)分哪些是數(shù)據(jù)哪些是代碼的,這也為緩沖區(qū)溢出攻擊提供了可能。

利用緩沖區(qū)溢出攻擊,可以導(dǎo)致程序運(yùn)行失敗、系統(tǒng)宕機(jī)、重新啟動(dòng)等后果。而緩沖區(qū)溢出類(lèi)型的虛擬機(jī)逃逸漏洞,則更為嚴(yán)重,它可以利用溢出執(zhí)行非授權(quán)指令,甚至可以取得系統(tǒng)特權(quán),進(jìn)而進(jìn)行各種非法操作,對(duì)數(shù)據(jù)的安全造成嚴(yán)重威脅。

CVE-2020-8834是較新的堆棧損壞逃逸攻擊,在Power8處理器上的Linux內(nèi)核中,KVM在kvmpc{save,restore}tm中使用HSTATE_HOST_R1將R1狀態(tài)存儲(chǔ)在kvmpcuhv_entry plus中時(shí)發(fā)生沖突,導(dǎo)致堆棧損壞。具有在客戶虛擬機(jī)內(nèi)核空間中運(yùn)行代碼能力的攻擊者可以導(dǎo)致主機(jī)內(nèi)核死機(jī)。

3.3 權(quán)限提升類(lèi)型

權(quán)限提升漏洞是指利用該安全漏洞使得自己突破了原來(lái)的限制,能夠非法訪問(wèn)其他信息,甚至使得自己能夠如管理員那樣來(lái)獲取整個(gè)系統(tǒng)控制權(quán)。權(quán)限提升型虛擬機(jī)逃逸漏洞即:客戶機(jī)非法獲取了宿主機(jī)操作系統(tǒng)權(quán)限,進(jìn)而實(shí)現(xiàn)對(duì)整個(gè)集群的控制能力。這種權(quán)限提升要么來(lái)源于指令操作的錯(cuò)誤結(jié)果,要么來(lái)源于系統(tǒng)對(duì)某些指令或指針沒(méi)有預(yù)先的限制而導(dǎo)致潛在的權(quán)限提升可能。

CVE-2018-10853虛擬機(jī)逃逸漏洞是一個(gè)權(quán)限提升類(lèi)型的代表,在KVM4.18版本之前,Linux內(nèi)核的Hypervisor處發(fā)現(xiàn)了一個(gè)仿真指令的錯(cuò)誤。在仿真非權(quán)限指令時(shí),它不檢查當(dāng)前權(quán)限級(jí)別,導(dǎo)致一個(gè)非權(quán)限用戶或進(jìn)程可以利用這個(gè)錯(cuò)誤提升權(quán)限。

3.4 QEMU仿真錯(cuò)誤類(lèi)型

KVM的內(nèi)核模塊存在于系統(tǒng)Linux內(nèi)核,并且直接在內(nèi)核態(tài)上執(zhí)行,一旦內(nèi)核模塊攻陷,攻擊者甚至無(wú)須進(jìn)一步提權(quán)。但是,內(nèi)核模塊比用戶空間組件的代碼量少很多,攻擊者難以下手,而且從實(shí)施的角度講,攻擊者很難從客戶機(jī)上接觸到存在于物理機(jī)的內(nèi)核組件。QEMU是由法布里斯·貝拉(Fabrice Bellard)所編寫(xiě)的以GPL許可證分發(fā)源碼的模擬處理器,可以模擬多款不同架構(gòu)的CPU,還包含部分硬件模擬,例如軟驅(qū)、顯卡、并口、串口、聲卡、網(wǎng)卡等以提供基本的操作系統(tǒng)運(yùn)行所需環(huán)境。而QEMU作為組件中代碼量最龐大也最陳舊的部分,在設(shè)備仿真過(guò)程中,更容易成為攻擊者的下手對(duì)象,當(dāng)前的QEMU-KVM可以多線程實(shí)現(xiàn)硬件I/O虛擬化。

例如:CVE-2020-25637的漏洞,是在libvirt6.8.0之前的版本中,出現(xiàn)雙可用內(nèi)存問(wèn)題,該問(wèn)題發(fā)生在請(qǐng)求有關(guān)正在運(yùn)行的QEMU域的網(wǎng)絡(luò)接口信息的過(guò)程中,影響訪問(wèn)控制驅(qū)動(dòng)程序。尤其是使用有限的ACL權(quán)限連接到讀寫(xiě)套接字的客戶端,可能會(huì)利用此漏洞使libvirt守護(hù)程序崩潰,可升級(jí)其在系統(tǒng)上的權(quán)限。

從以上4種虛擬機(jī)逃逸的類(lèi)型中可以看出,無(wú)論逃逸用什么方法,最終的目的是提權(quán),只有這樣,才能造成宿主機(jī)或Hypervisor崩潰,或執(zhí)行任意代碼,從而控制Hypervisor或其他虛擬機(jī)戶。

4 虛擬化安全研究展望

本文設(shè)計(jì)了虛擬機(jī)逃逸的提權(quán)模型,概括了虛擬機(jī)逃逸的表現(xiàn)特征。當(dāng)前對(duì)虛擬化技術(shù)的安全威脅、安全研究點(diǎn)以及安全架構(gòu)眾說(shuō)紛紜,是為了研究虛擬化安全而試圖增添更多的威脅還是脫離了虛擬化技術(shù)本身而去研究實(shí)際系統(tǒng)安全,筆者做出以下的研究展望。首先,虛擬化技術(shù)本身是充分利用資源,是計(jì)算資源的高效利用,而不是敏感數(shù)據(jù)的無(wú)規(guī)則處理。研究虛擬化技術(shù)安全,應(yīng)該從其本身的機(jī)理、特征出發(fā),分析其對(duì)系統(tǒng)造成的影響。其次,虛擬化的管理平臺(tái)帶來(lái)了更多的安全問(wèn)題,從最早的cloudstack到openstack管理平臺(tái),從紅帽的RHEV管理平臺(tái)到開(kāi)源的oVirt管理平臺(tái),以及各家各自基于開(kāi)源代碼的虛擬化管理平臺(tái)均是如此。與其說(shuō)是虛擬化技術(shù)選擇了管理平臺(tái),不如說(shuō)是管理平臺(tái)選擇了虛擬化,而所謂的安全問(wèn)題、安全威脅讓虛擬化技術(shù)脫離其自身的機(jī)理,而是更偏向了傳統(tǒng)系統(tǒng)安全。最后,云供應(yīng)商當(dāng)前被認(rèn)為是存儲(chǔ)數(shù)據(jù)不可控的源頭,甚至是虛擬化系統(tǒng)不安全的一個(gè)重要原因。實(shí)際一個(gè)安全的系統(tǒng)不應(yīng)該由外界接觸,而是建立自己的補(bǔ)丁測(cè)試團(tuán)隊(duì)和安全運(yùn)維團(tuán)隊(duì)。美國(guó)很早就讓敏感系統(tǒng)脫離外界接觸,供應(yīng)商根本不知道給誰(shuí)提供了系統(tǒng),給誰(shuí)提供了服務(wù),而是由敏感系統(tǒng)的設(shè)計(jì)團(tuán)隊(duì)負(fù)責(zé),只有這種模式才能解決外界不可控的問(wèn)題?傊,虛擬化安全融入系統(tǒng)安全得到重視,也應(yīng)因系統(tǒng)安全而萌發(fā)獨(dú)特活力。

 

(原載于《保密科學(xué)技術(shù)》雜志2020年10月刊)