KVM虛擬化新型漏洞CVE-2015-6815技術分析
云計算業務目前已經觸及到多個行業,無論是云存儲,云音樂等生活中隨處可見的業務,就連銀行金融,支付信息等服務也都和云緊密相關。
作為云服務的基礎,虛擬化系統扮演著非常重要的角色,因為在云生態中主機的硬件多是由虛擬化系統模擬出來的。虛擬化系統中的安全漏洞將嚴重影響云業務的安全。
360虛擬化安全團隊(MarvelTeam)近日發現了多個虛擬化軟件安全漏洞,使用kvm和xen作為虛擬化平臺的公司業務都將會受這批漏洞影響。該漏洞一旦被攻擊者惡意利用,可以造成三種類型的安全風險:
1)虛擬機宕機,影響業務;
2)系統資源被強制占用,宿主機及所有虛擬機拒絕服務;
3)虛擬機逃逸,攻擊者在宿主機中執行任意代碼。
我們將陸續公開系列針對虛擬化軟件高危0day漏洞的分析文章,揭開宿主機攻擊技術的神秘面紗。本文將首先分析KVM虛擬化新型漏洞CVE-2015-6815。
關于QEMU和KVM
QEMU是一款處理器模擬軟件,可以提供用戶模式模擬和系統模式模擬。當處于用戶模式模擬狀態時,將使用動態翻譯技術,允許一個cpu構建的進程在另一個cpu上執行。系統模式模擬狀態下,允許對整個pc系統的處理器和所使用到的相關外圍設備進行模擬。
qemu提供的仿真外設包括硬件Video Graphics Array (VGA) 仿真器、PS/2 鼠標和鍵盤、集成開發環境(IDE)硬盤和 CD-ROM 接口,以及軟盤仿真。也包括對E2000 Peripheral Controller Interconnect (PCI) 網絡適配器、串行端口、大量的聲卡和 PCI Universal Host Controller Interface (UHCI) Universal Serial Bus (USB) 控制器(帶虛擬 USB 集線器)的仿真。除了仿真標準 PC 或 ISA PC(不帶 PCI 總線)外,QEMU 還可以仿真其他非 PC 硬件,如 ARM Versatile 基線板(使用 926E)和 Malta million instructions per second (MIPS) 板。對于各種其他平臺,包括 Power Macintosh G3 (Blue & White) 和 Sun-4u 平臺,都能正常工作。
圖1.qemu可進行模擬的外圍設備
KVM是一種依賴硬件虛擬化技術(Intel VT或者AMD V)的裸機虛擬化程序,它使用 Linux 內核作為它的虛擬機管理程序。對 KVM 虛擬化的支持自 2.6.20 版開始已成為主流 Linux 內核的默認部分。KVM支持的操作系統非常廣泛,包括Linux、BSD、Solaris、Windows、Haiku、ReactOS 和 AROS Research Operating System。
在 KVM 架構中,虛擬機實現為常規的 Linux 進程,由標準 Linux 調度程序進行調度。事實上,每個虛擬 CPU 顯示為一個常規的 Linux 進程。這使 KVM 能夠享受 Linux 內核的所有功能。設備模擬由提供了修改過的 qemu 版本來完成。
QEMU網卡設備簡介
QEMU支持多種網卡設備,可以通過如下的命令去列舉所支持的網卡設備類型,一共有8種,基本可以滿足大多數操作系統的需求。
圖2.qemu支持的虛擬網卡設備
此次漏洞出現在e1000網卡設備中,該網卡的基本功能等同于Intel rc82540EM硬件網卡,支持TSO技術,網絡數據傳輸效率極高。
#p#
漏洞分析
CVE-2015-6815是qemu軟件的虛擬網卡設備存在的一處邏輯漏洞,攻擊者可通過構造惡意的數據流觸發該漏洞。
我們分析網卡在處理惡意數據流時執行的邏輯:
- a)網卡驅動向網卡設備發送指令,通知網卡設備執行數據發送操作;
- b)set_tctl(E1000State *s, int index, uint32_t val)當網卡設備判斷已經設置相關寄存器,即開始進行發包操作,進入set_tctl函數中進行相關處理,函數原型如下:
- c) start_xmit(E1000State *s)
start_xmit函數首先檢查(s->reg[TCTL]&E1000_TCTL_EN),若等于0,表示沒開啟發送功能,將直接退出。否則判斷是否存在有效的描述符,有的話則依次取出描述符交給process_tx_desc處理。
- d)存在漏洞的函數源碼如下:
圖3.存在漏洞的函數代碼
根據注釋,可以清晰地看到,該函數的主要目的是按照3種類型來處理網卡數據描述符表中的單個描述符,分別是context descriptor,data descriptor,legacy descriptor,這三種類型代表了不同的數據內容:描述信息,數據,遺留信息,網卡通過判斷處于何種類型,設置s->tx的狀態位,然后根據 tp->tse 和 tp->cptst來確定是否要調用xmit_seg函數以及怎樣填充buf,由于函數對驅動傳進來描述符的內容沒有檢測,可設置成任意值。
xmit_seg函數根據s->tx中各字段的信息來填充s->data,最后調用qemu_send_packet函數發送s->data,qemu_send_packet(nc, buf, size)。
在該函數的執行過程中,攻擊者通過惡意的數據流,可以控制該函數中的tp->hdr_len和tp->mss數據的值,而 msh = tp->hdr_len + tp->mss。在進入do…while 循環之后,tp->size值為0,而bytes和msh的值可以控制,通過迫使代碼邏輯進入第一個if循環,可將bytes設置為msh的值,即 bytes也可以被控制。之后,bytes可以一直保持值不變,直至進入while的條件判斷語句,此時如果bytes為0,則do…while進入死循環的邏輯。
漏洞危害
攻擊者利用該漏洞可以導致虛擬機拒絕服務,并且保持對cpu的高占用率,繼而會影響宿主機以及其他虛擬機的正常執行。
我們在測試環境中對該漏洞進行測試,觸發前后的截圖如下。可以看到,在漏洞觸發后宿主機的空閑cpu百分比一直鎖定為為0%。
圖4.觸發漏洞前
圖5.觸發漏洞后
漏洞修補方案
360虛擬化安全團隊(MarvelTeam)在發現了該漏洞之后,第一時間通知QEMU軟件官方團隊進行修復。官方在20天的緊張修復之后,在9月5日完成對該漏洞的修復補丁。詳細信息,該網頁也包含了360虛擬化安全團隊的致謝。
官方對該漏洞的修補方法如下:
圖6.官方提供的漏洞補丁
在該補丁中,開發人員加入了對漏洞關鍵數據 – bytes樹值的判斷,如為0,則退出循環,完美修復漏洞。建議所有使用qemu的廠商采用該補丁,防止攻擊者對在虛擬機中利用CVE-2015-6815漏洞。