VMware 虛擬機逃逸漏洞


所謂虛擬機逃逸(Escape Exploit),指的是突破虛擬機的限制,實現與宿主機操作系統交互的一個過程,攻擊者可以通過虛擬機逃逸感染宿主機或者在宿主機上運行惡意軟件。

針對 VMware 的虛擬機逃逸 exploit 源碼實現了從虛擬機到宿主機器的代碼執行,彈出了熟悉的計算器。該開源代碼,只需要將執行計算器部分的 shellcode 替換成其他具有惡意攻擊的代碼,就可以造成很大的危害。

影響范圍

  • VMware Workstation Pro / Player(12.5.5 之前版本)
  • VMware Fusion Pro / Fusion

漏洞分析

  1. 首先分析漏洞存在於 DnD 和 CnP 機制的 Version3 中,故設置 DnD 與 CnP 均為 version3 的版本。使用的命令分別為「tool.capability.dnd_version 3」和「tools.capability.copypaste_version 3」。
  2. 為了達到代碼執行,需要溢出堆中對象函數指針或者虛表指針。
  3. 需要通過查詢DnD和CnP的版本才能使設置生效,需要發送的命令分別為:「vmx.capability.dnd_version」和「vmx.capability.copypaste_version」,這兩個命令均會檢查 DnD/CnP 機制的版本,同時根據版本會創建兩個對象,DnD 和 CnP,其中 version3 對應的 C++ 對象大小為 0xA8。
  4. 根據 C++ 對象的大小進行多次越界寫內存。
  5. 通過命令 info-set guestinfo.KEY VALUE 和 info-get guestinfo.KEY 來設置和獲取數據繞過 ASLR,通過這兩個命令后面的值來泄露堆上的對象,從而獲取對象的虛表地址,從而得到 vmware-vmx 的地址。
  6. 我們根據信息泄露判斷溢出的是哪一種 C++ 對象,是 DnD 還是 CnP。根據判斷類型,分別利用 ROP 繞過 DEP,拼接 shellcode 后完成 exploit 的構造。CnP 類型對象溢出利用構造:覆蓋對象虛表地址,指向偽造的虛表,然后發送 CP 命令,觸發虛函數調用,實現命令執行。
    SetGlobalPointer 函數發送 「unity.window.contents.start」 命令,通過在命令中指定參數的寬度和高度,寫入一個 64 位的堆棧遷移 gadget 地址。然后 DnD 類型對象溢出利用構造,最終發送 payload 完成構造!

逃逸演示

穩定性討論

因為 Windows LFH 堆的隨機化,當前的 exploit 無法做到 100% 成功率。不過可以嘗試下列方法來提高成功率:

  • 觀察 0xA8 大小的內存分配,考慮是否可以通過一些 malloc 和 free 的調用來實現確定性的 LFH 分配,參考這里和這里。
  • 尋找堆上的其他 C++ 對象,尤其是那些可以在堆上噴射的
  • 尋找堆上其他帶有函數指針的對象,尤其是那些可以在堆上噴射的
  • 找到一個獨立的信息泄漏漏洞

項目地址:https://github.com/unamer/vmware_escape


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM