0x00 前言


云計算目前已成為一種被大多數互聯網公司接受的服務模式,它提供了定制化的硬件資源,應用,以及服務。作為實現云計算構想的最重要的技術基石,虛擬化系統提供了硬件資源的量化分配和靈活調度,保證云業務的順利實施。因此,云業務的健康發展,離不開虛擬化系統的穩定運行。

360 Marvel Team將陸續公開一系列獨立發現的針對虛擬化軟件高危0day漏洞的分析文章,揭開虛擬化攻擊技術的神秘面紗。在9月29日的360 ISC 2015大會上,該團隊安全研究員唐青昊,將進行關于《云虛擬化系統的漏洞挖掘技術》議題的演講,在該議題中將分享漏洞挖掘的核心技術。

本文為該系列的第二篇文章,將詳細分析CVE-2015-5279 qemu網卡堆溢出漏洞的相關知識。關于第一篇文章針對CVE-2015-6815漏洞的分析,詳見http://www.freebuf.com/vuls/77834.html

0x01 漏洞基礎知識


CVE-2015-5279是qemu虛擬化環境中rtl8029網卡設備存在一處堆溢出類型漏洞。那么什么是qemu軟件?qemu軟件和kvm虛擬化存在什么樣的關系?rtl8029網卡是怎樣的一款設備呢?下面將逐一解答這些問題。

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 版本來完成。

在了解了kvm和qemu的原理以及相互的關系之后,我們再來關注下rtl8029網卡設備,如下圖所示。這里需要了解的是在qemu中模擬rtl8029網卡設備的模塊是ne2000。ne2000模擬了rtl8029網卡收發數據包的流程,邏輯位置位于虛擬機設備驅動和宿主機qemu網絡適配器模塊之間,當虛擬機的用戶空間發生socket send操作之后,設備驅動將封裝好的數據發送到ne2000設備模擬器,然后進入qemu相關適配器模塊,再通過宿主機的物理網卡向外發送數據。而接收數據則是相反的過程。

圖2. rtl8029網卡實物照

0x02 漏洞原理分析


第一部分中簡要分析了kvm, qemu,以及關于ne2000網卡模塊這些了解漏洞原理的基礎知識,我們再來分析CVE-2015-5279漏洞的具體產生原因。

該漏洞發生在ne2000網卡模塊的接收數據包的過程,相關代碼截圖如下。這部分代碼取自qemu-2.4.0/hw/net/ne2000.c文件中的ne2000_receive函數。ne2000_receive函數是虛擬機接收外部數據包的關鍵函數,其大致流程為:

  1. 判斷網卡是否處于工作狀態,數據緩沖區是否處于滿的狀態;
  2. 通過檢測是否是否處于混雜模式,mac地址是否匹配,是否為廣播地址,從而判斷是否接收此數據包;
  3. 如緩沖區較小,則對其進行擴展;
  4. 進入數據包處理過程(如下圖代碼所示):處理數據包頭部;寫數據包內容;
  5. 結束收包過程(如下圖代碼所示)。

圖3. 有缺陷的代碼

在進入收包代碼之前,s->curpag,s->stop,s->start是可以被黑客控制為任意數值。因此在上述函數流程的第4步中,index,avail,len這些關鍵的變量也可以被設置為可控的數值。利用這一特點,黑客可以創造出哪些攻擊方式呢?

首先可以導致邏輯循環,即當進入while循環之后,使len不斷等于0,執行”size -= len; ”這一行指令時,size永遠不會減小,因此“ while (size > 0) ”的判斷永遠為真,進入死循環。

第二種是造成堆緩沖區的溢出,在執行“memcpy(s->mem + index, buf, len); ”這一行代碼時,由于index是可被操控的,因此可以在正確的緩沖區之外寫入數據包內容。要實現這種利用方式,還需控制收包流程中的第一步,即判斷緩沖區邊界的過程。相關代碼截圖如下。

圖4. 需要進行關注的關鍵代碼

0x03 漏洞危害


CVE-2015-5279被qemu官方安全團隊定義為高危漏洞,一旦被黑客惡意利用,可以實現拒絕服務攻擊,虛擬機逃逸攻擊。在成功利用該漏洞之后,黑客進而可以控制宿主機以及該宿主機上的其他虛擬機,進而造成企業的敏感信息泄露,內網被滲透的可怕后果。

圖5. 官方確定該漏洞為高危

0x04 漏洞修復方案


360 Marvel Team在發現該漏洞之后,第一時間通知了qemu官方安全團隊進行修復。 在經歷了長達25天的緊張修復之后,官方團隊于9月15日公開了該漏洞的詳細信息,詳見https://access.redhat.com/security/cve/CVE-2015-5279,該鏈接也包含了對360 Marvel Team成員的致謝信息。

補丁地址:https://lists.gnu.org/archive/html/qemu-devel/2015-09/msg03984.html

官方提供了對該漏洞的補丁,其中在ne2000_receive函數中增加了對索引邊界的檢查,防止了緩沖區溢出的危險。建議使用qemu的廠商盡快采用該補丁,以免黑客利用該漏洞對業務造成影響。

圖6. 官方發布的補丁信息

您的支持將鼓勵我們繼續創作!

[微信] 掃描二維碼打賞

[支付寶] 掃描二維碼打賞