本發(fā)明屬于云計算安全技術(shù)領(lǐng)域,涉及一種虛擬化平臺漏洞修復(fù)的方法,特別涉及基于Xen虛擬化平臺的漏洞熱修復(fù)方法。
背景技術(shù):
云計算作為一種迅速崛起的計算模式,受到了政府、工業(yè)界、學(xué)術(shù)界的廣泛關(guān)注,正在給整個IT行業(yè)帶來徹底的變革。云計算是指應(yīng)用以服務(wù)形式通過互聯(lián)網(wǎng)交付使用,并且數(shù)據(jù)中心的硬件和軟件能夠提供這些服務(wù)。云計算幫助企業(yè)、政府、公共機構(gòu)、私營機構(gòu)和研究機構(gòu)形成更有效的、有需求驅(qū)動的計算系統(tǒng)。虛擬化技術(shù)作為云計算的基本組件,是支撐云計算最重要的技術(shù)基石。
虛擬化帶來了一定程度的可自定義性和可控性,實質(zhì)上是一種創(chuàng)建不同計算環(huán)境的技術(shù)。三種最為常用的虛擬化技術(shù)是基于軟件的完全虛擬化、硬件輔助虛擬化及類虛擬化技術(shù)。虛擬化技術(shù)經(jīng)過多年的發(fā)展,出現(xiàn)了很多成熟的產(chǎn)品,應(yīng)用也從最初的服務(wù)器到了桌面等更寬的領(lǐng)域。虛擬化軟件的主流廠商包括VMware、Xen、KVM及Microsoft。其中,作為一個起源于英國劍橋大學(xué)的社區(qū)驅(qū)動的開源軟件項目,Xen吸引了許多公司和科研院所的開發(fā)者,發(fā)展非常迅速。Xen最初的虛擬化思路是類虛擬化,通過修改Linux內(nèi)核,實現(xiàn)處理器和內(nèi)存的虛擬化,通過引入輸入輸出前后端驅(qū)動架構(gòu)實現(xiàn)設(shè)備的類虛擬化。隨著Xen社區(qū)的發(fā)展壯大,硬件完全虛擬化技術(shù)也被加入到Xen中。Xen目前已經(jīng)非常成熟,基于Xen的虛擬化產(chǎn)品也很多,如Ctrix、Virtuallron、Redhat和Novell、阿里云等都有相應(yīng)的產(chǎn)品。
虛擬化技術(shù)飛速發(fā)展的同時,也不可避免的帶來了很多安全問題,利用虛擬化平臺漏洞進行攻擊的惡意行為層出不窮,嚴(yán)重?fù)p害了云服務(wù)廠商和云服務(wù)使用者的利益。漏洞一旦曝光,為了不影響業(yè)務(wù)安全,需要云計算公司對漏洞進行快速修復(fù)。目前存在冷啟動和熱修復(fù)兩種Xen漏洞修復(fù)方式。顧名思義,冷啟動方式,指通過修改及編譯Xen源碼并重啟機器的方式修復(fù)Xen平臺系統(tǒng)漏洞。冷啟動方式實現(xiàn)簡單粗暴,但服務(wù)器的重啟必然影響上層使用者業(yè)務(wù)的正常運行。熱修復(fù)方式,指服務(wù)器運行期間,更改系統(tǒng)內(nèi)存插入補丁。熱修復(fù)方式不影響上層云服務(wù)使用者業(yè)務(wù)運行,技術(shù)門檻高,同時需要考慮多種軟硬件組合,給云計算廠商帶來了極大挑戰(zhàn)。因此有必要提出一種虛擬化平臺漏洞熱修復(fù)的方法,高效的修復(fù)虛擬化平臺漏洞,避免惡意攻擊的發(fā)生。
技術(shù)實現(xiàn)要素:
針對虛擬化平臺漏洞修復(fù)問題,本發(fā)明提出了一種基于Xen虛擬化平臺的漏洞熱修復(fù)方法。在對Xen虛擬化平臺進行環(huán)境搭建、使用及源碼分析后,可以發(fā)現(xiàn)Xen虛擬化平臺下存在特權(quán)域Dom0,Dom0的DMA操作可以訪問Xen內(nèi)存。本發(fā)明主要利用特權(quán)域Dom0對Xen漏洞進行內(nèi)存修復(fù)。
本發(fā)明采用的技術(shù)方案如下:
一種基于Xen虛擬化平臺的漏洞熱修復(fù)方法,其步驟包括:
1)根據(jù)Xen系統(tǒng)的e820表計算Xen物理內(nèi)存起始地址,其中Xen系統(tǒng)的e820表為系統(tǒng)物理內(nèi)存分布表,在Xen啟動過程中生成并輸出到系統(tǒng)日志中;
2)根據(jù)計算出的物理內(nèi)存起始地址及Xen內(nèi)存分布,計算待修復(fù)函數(shù)的虛擬地址所映射到的物理地址,其中Xen內(nèi)存分布為系統(tǒng)虛擬地址空間的內(nèi)存分布,在Xen源碼中有明確規(guī)定;
3)通過特權(quán)域Dom0獲取補丁機器碼,并將補丁寫入內(nèi)存,記錄補丁函數(shù)的物理地址;
4)特權(quán)域Dom0使用超級調(diào)用通知Xen有補丁需要插入;
5)Xen處理特權(quán)域Dom0的超級調(diào)用請求,設(shè)置標(biāo)志位,通知Dom0插入補??;
6)特權(quán)域Dom0插入補丁,同時,Xen攔截VMEXIT請求,等待補丁插入完成;
7)補丁插入成功后,特權(quán)域Dom0使用超級調(diào)用通知Xen補丁插入完成;
8)Xen處理特權(quán)域Dom0超級調(diào)用請求,重置標(biāo)志位。
上述方法中,補丁的插入利用特權(quán)域Dom0的DMA(Direct Memory Access,直接內(nèi)存訪問)操作完成,需要計算待修復(fù)函數(shù)所在內(nèi)存虛擬地址映射到的物理地址,作為DMA操作的物理內(nèi)存地址。同時,所有補丁以機器碼的形式寫入內(nèi)存。
上述方法中,Xen與特權(quán)域Dom0通過超級調(diào)用和事件通知的方式通信。當(dāng)Xen的客戶機需要執(zhí)行更高權(quán)限的操作時,如頁表的更新、對物理資源的訪問等,由于自身在非特權(quán)域無法完成這些操作,則需要通過調(diào)用超級調(diào)用交給Xen來完成。
上述方法中,全虛擬化下虛擬機執(zhí)行特權(quán)指令時,需要執(zhí)行VMEXIT操作陷入到Xen,Xen執(zhí)行內(nèi)核函數(shù)代替虛擬機處理特權(quán)指令。
本發(fā)明的有益效果是:
1.本發(fā)明通過特權(quán)域Dom0修復(fù)Xen平臺漏洞,無需重啟機器和暫停平臺上虛擬機的運行,實現(xiàn)了基于Xen的虛擬化平臺漏洞熱修復(fù)功能。
2.本發(fā)明通過特權(quán)域Dom0完成補丁的插入和應(yīng)用,保證了補丁的可控性和安全性。
3.本發(fā)明新增的Xen超級調(diào)用操作,僅用來實現(xiàn)Xen與Dom0間通信,在補丁插入前和插入后分別設(shè)置標(biāo)志位,不包含補丁的增刪改查操作,避免了惡意攻擊者利用虛擬機申請超級調(diào)用的方式破壞Xen內(nèi)核函數(shù)。
綜上,本發(fā)明提出的基于Xen虛擬化平臺的漏洞熱修復(fù)方法,能夠較準(zhǔn)確地修復(fù)虛擬化平臺漏洞,無需重啟機器,保證了虛擬化平臺上虛擬機的正常運行,且利用Dom0進行修復(fù)更加安全。
附圖說明
圖1為基于Xen虛擬化平臺的漏洞熱修復(fù)方法的流程示意圖。
具體實施方式
下面將結(jié)合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術(shù)方案進行清楚、完整地描述,可以理解的是,所描述的實施例僅僅是本發(fā)明一部分實施例,而不是全部的實施例?;诒景l(fā)明中的實施例,本領(lǐng)域技術(shù)人員在沒有做出創(chuàng)造性勞動前提下所獲得的所有其他實施例,都屬于本發(fā)明保護的范圍。
實現(xiàn)本發(fā)明的一種具體實施方式如下,基于Xen虛擬化平臺的漏洞熱修復(fù)方法,其步驟為:
1)根據(jù)Xen系統(tǒng)的e820表計算Xen物理內(nèi)存起始地址;
2)根據(jù)上述計算出的物理內(nèi)存起始地址及Xen內(nèi)存分布,計算待修復(fù)函數(shù)的虛擬地址所映射到的物理地址;
3)通過特權(quán)域Dom0獲取補丁機器碼,并將補丁寫入內(nèi)存,記錄補丁函數(shù)所在物理內(nèi)存地址;
4)特權(quán)域Dom0使用超級調(diào)用通知Xen有補丁需要插入;
5)Xen處理特權(quán)域Dom0的超級調(diào)用請求,設(shè)置標(biāo)志位,通知Dom0插入補??;
6)特權(quán)域Dom0插入補丁,同時,Xen攔截VMEXIT請求,等待補丁插入完成;
7)補丁插入成功后,特權(quán)域Dom0使用超級調(diào)用通知Xen補丁插入完成;
8)Xen處理特權(quán)域Dom0超級調(diào)用請求,重置標(biāo)志位。
本方法采用的虛擬化環(huán)境為Xen虛擬化平臺,在Xen平臺下虛擬機分為特權(quán)虛擬機Dom0和非特權(quán)虛擬機DomU。Xen系統(tǒng)內(nèi)存為嚴(yán)格隔離的內(nèi)存,在Xen 4.0版本以前,特權(quán)域Dom0的DMA操作可以訪問到Xen系統(tǒng)內(nèi)存。
Xen系統(tǒng)的e820表指當(dāng)前系統(tǒng)物理內(nèi)存分布表,描述當(dāng)前系統(tǒng)物理內(nèi)存的使用情況,在Xen啟動過程中生成并輸出到系統(tǒng)日志中。
Xen物理內(nèi)存起始地址,是指Xen啟動后內(nèi)核函數(shù)的首地址。Xen啟動后將內(nèi)核動態(tài)重映射到一個高端的物理地址。
待修復(fù)函數(shù)的虛擬地址所映射到的物理地址,是指待修復(fù)函數(shù)在物理內(nèi)存中的位置,本發(fā)明通過特權(quán)域Dom0的DMA操作訪問Xen系統(tǒng)內(nèi)存,DMA操作使用的地址為物理內(nèi)存地址。
特權(quán)域Dom0和Xen之間使用超級調(diào)用和事件通知進行通信。特權(quán)域Dom0的用戶從程序使用一個特殊的內(nèi)核驅(qū)動程序privcmd申請超級調(diào)用,經(jīng)內(nèi)核處理后,交由下層Xen處理超級調(diào)用請求。
Xen向特權(quán)域Dom0發(fā)送事件通知,以虛擬中斷的形式,Dom0收到事件通知后,處理過程和處理物理中斷類似。
虛擬機運行過程中會不斷產(chǎn)生超級調(diào)用請求和VMEXIT、VMENTRY操作。VMEXIT是指虛擬機執(zhí)行特權(quán)指令時,需要陷入到Xen中由Xen處理。Xen執(zhí)行完特權(quán)指令后將結(jié)果返回到虛擬機中,執(zhí)行VMENTRY操作切換到虛擬機中運行。其中VMEXIT的處理過程包括保存虛擬機寄存器狀態(tài),加載宿主機寄存器狀態(tài),執(zhí)行VMEXIT處理函數(shù),執(zhí)行VMENTRY繼續(xù)調(diào)度虛擬機運行。
圖1是上述基于Xen虛擬化平臺的漏洞熱修復(fù)方法的流程示意圖,對其各步驟詳細(xì)說明如下:
1.計算Xen物理內(nèi)存起始地址。
啟動過程中Xen Hypervisor被動態(tài)裝載到內(nèi)存的高端地址xen_phys_start。該高端地址通過以下公式確定:
xen_phys_start=end-reloc_size;
其中end代表物理地址空間中,4G之內(nèi)最大可用內(nèi)存首地址。reloc_size為Xen的代碼和數(shù)據(jù)段所占的內(nèi)存空間的大小,默認(rèn)為4M。在本發(fā)明的一實施例中,我們通過在另一臺主機源碼編譯安裝同一版本Xen,獲得reloc_size大小值。
2.計算待修復(fù)函數(shù)所在的內(nèi)存物理地址。
Xen Hypervisor頁面線性映射到高端虛擬地址,在本發(fā)明的一實施例中,通過查看Xen內(nèi)存分布獲得Xen內(nèi)存虛擬起始地址xen_virt_start,另通過查看Xen-syms文件獲得待修復(fù)函數(shù)虛擬地址VA,根據(jù)上述所得Xen物理內(nèi)存起始地址,推算出待修復(fù)內(nèi)存函數(shù)物理地址PA的計算公式:
①offset=VA-xen_virt_start
②PA=xen_phys_start+offset
3.獲取補丁機器碼。
因為補丁需要直接寫入物理內(nèi)存,所以要保證補丁機器碼與內(nèi)存函數(shù)機器碼的格式一致。本發(fā)明結(jié)合已有的Linux下內(nèi)核修復(fù)方法kpatch和kgraft實現(xiàn)原理,在同一主機上修復(fù)內(nèi)核函數(shù)源碼,重新編譯安裝Xen,最后通過特權(quán)域Dom0讀取Xen二進制文件獲取補丁函數(shù)的機器碼。特權(quán)域Dom0執(zhí)行DMA寫操作將補丁機器碼寫入內(nèi)存。
在其它實施例中,也可通過在另一主機上修復(fù)內(nèi)核函數(shù)源碼,重新編譯安裝Xen,最后通過特權(quán)域Dom0的DMA操作讀取補丁函數(shù)的機器碼。補丁的寫入可通過特權(quán)域Dom0的讀文件操作將機器碼寫入kmalloc操作申請到的內(nèi)核空間。
4.特權(quán)域Dom0請求插入補丁。
特權(quán)域Dom0和Xen通過超級調(diào)用和事件通知進行通信。超級調(diào)用和Linux下的系統(tǒng)調(diào)用類似,特權(quán)域Dom0的用戶程序可以使用一個特殊的內(nèi)核驅(qū)動程序privcmd申請超級調(diào)用。本發(fā)明新增一個超級調(diào)用操作HYPERVISOR_set_worktodo及兩個子操作,分別用來設(shè)置標(biāo)志位和清除標(biāo)志位。
Xen處理Dom0的超級調(diào)用請求,設(shè)置標(biāo)志位,并向特權(quán)域Dom0發(fā)送事件通知,通知Dom0可以進行補丁插入操作。本發(fā)明新增一個虛擬中斷,用于Xen和Dom0之間的通信。Xen向Dom0發(fā)送一個事件通知即虛擬中斷請求,特權(quán)域Dom0處理該虛擬中斷,處理過程與物理中斷相似。
5.特權(quán)域Dom0插入補丁。
為實現(xiàn)Xen運行過程中動態(tài)替換Xen Hypervisor內(nèi)存函數(shù),本發(fā)明通過特權(quán)域Dom0的一次DMA讀操作,將原函數(shù)機器碼前五個字節(jié)更改為一次JMP跳轉(zhuǎn)指令,原函數(shù)執(zhí)行時,指令從原函數(shù)跳轉(zhuǎn)到新函數(shù)繼續(xù)執(zhí)行。
為保證插入補丁過程中待修復(fù)函數(shù)正確運行,本發(fā)明通過設(shè)置標(biāo)志位livepatch_work和works_to_do,分別用來標(biāo)識當(dāng)前有補丁需要插入和正在執(zhí)行補丁插入操作。
虛擬機運行過程中會不斷產(chǎn)生超級調(diào)用請求和VMEXIT、VMENTRY操作。VMEXIT是指虛擬機執(zhí)行特權(quán)指令時,需要陷入到Xen中由Xen處理。為避免補丁插入過程中待修復(fù)函數(shù)被調(diào)用,本發(fā)明在Xen的VMEXIT處理函數(shù)中首先判斷l(xiāng)ivepatch_work標(biāo)志位,若被設(shè)置,則存在補丁需要插入,繼續(xù)判斷works_to_do標(biāo)志位,若被設(shè)置,則存在CPU正在執(zhí)行補丁插入操作,此時暫停該VMEXIT處理過程,等待補丁插入操作完成,同時調(diào)度其他虛擬機運行。
6.特權(quán)域Dom0通知Xen補丁插入完成。
特權(quán)域Dom0通過一次DMA操作將補丁插入Xen內(nèi)存,DMA操作結(jié)束時,特權(quán)域Dom0發(fā)送超級調(diào)用請求,通知Xen補丁插入完成,Xen重置標(biāo)志位livepatch_work和works_to_do,繼續(xù)被暫停的VMEXIT處理過程。
實驗結(jié)果:
首先對基于Xen虛擬化平臺的漏洞熱修復(fù)方法進行功能有效性測試,測試結(jié)果表明通過本發(fā)明提出的方法可以在無需重啟系統(tǒng)和暫停虛擬機的前提下修復(fù)Xen虛擬化平臺漏洞,符合本發(fā)明的設(shè)計目標(biāo)。
其次為了衡量該方法給虛擬機帶來的性能影響,對以下兩種情況下的性能進行了分析和評估:沒有進行熱修復(fù)時虛擬機性能和熱修復(fù)過程中虛擬機性能。內(nèi)存讀寫為能夠反映系統(tǒng)性能的典型操作,結(jié)果表明,使用該方法進行漏洞修復(fù)的虛擬化平臺與原始平臺在性能上雖出現(xiàn)差異,與現(xiàn)有的一些方法在保證修復(fù)Xen虛擬化平臺漏洞的同時暫停虛擬機運行相比,本發(fā)明實驗結(jié)果對虛擬機性能損失在可接受范圍內(nèi),且修復(fù)完成后系統(tǒng)性能恢復(fù),本發(fā)明方法的檢測效果更好。