新聞中心
一、名詞定義

Host機(jī):運(yùn)行VMware軟件的真實(shí)主機(jī);
Guest機(jī):裝在VMware軟件中的虛擬系統(tǒng);
后門:VMware有一套自己專有的“Backdoor I/O Port”指令,Host和Guest之間的所有數(shù)據(jù)都是通過(guò)一個(gè)固定的IO端口,使用in和out指令來(lái)進(jìn)行傳遞,Guest就是通過(guò)這個(gè)端口發(fā)命令讓Host幫助它完成某些自身不能完成的工作。
二、漏洞背景
理論上來(lái)說(shuō),可以認(rèn)為Host機(jī)和Guest機(jī)是兩臺(tái)不同的電腦,只不過(guò)它們是共享同一套真實(shí)的物理硬件,這樣就帶來(lái)一個(gè)問(wèn)題,即如何在Host和Guest之間傳輸數(shù)據(jù), VMware的共享文件夾就是解決該問(wèn)題的一個(gè)很實(shí)用功能,不需要設(shè)置任何網(wǎng)絡(luò),就可以在Host和Guest機(jī)器間互相傳輸文件。至于怎么設(shè)置共享文件夾,不是本文的重點(diǎn),就不多說(shuō)了,不熟悉的建議Google一下先。
在安裝完VMware Tools后,會(huì)在Guest機(jī)上看到一個(gè)名為Hgfs.sys的文件,這個(gè)驅(qū)動(dòng)文件實(shí)現(xiàn)了一個(gè)虛擬的文件系統(tǒng),這個(gè)虛擬文件系統(tǒng)的根目錄就 是\\.host,當(dāng)你在Guest機(jī)上進(jìn)入任何共享文件夾的目錄時(shí),可以看到路徑都是以\\.host開(kāi)始的,在這個(gè)目錄下的所有操作都將通過(guò)后門傳遞 給運(yùn)行在Host上的VMware主程序。
舉例來(lái)說(shuō):在Host機(jī)上有個(gè)目錄是:E:\Debug\Share,把這個(gè)目錄設(shè)置為Guest系統(tǒng)的共享目 錄后,VMware會(huì)記錄下這個(gè)目錄所對(duì)應(yīng)的Host路徑是E:\Debug\Share,當(dāng)在Guest機(jī)的“運(yùn)行”對(duì)話框中輸入:\\.host \Shared Folders\Share,就會(huì)在Guest上打開(kāi)E:\Debug\Share這個(gè)目錄。
這個(gè)過(guò)程是通過(guò)后門完成的,Guest把“遍歷目錄“命令傳 遞給Host,Host上的VMware主程序找到該目錄對(duì)應(yīng)關(guān)系,通過(guò)API函數(shù)遍歷E:\Debug\Share目錄,把得到的數(shù)據(jù)通過(guò)后門返回給 Guest,***Guest上就列出了Share目錄下的所有文件。
三、漏洞描述
現(xiàn)在就到了本文所要說(shuō)的重點(diǎn)了。我們知道,當(dāng)Guest位于\\.host\Shared Folders\Share目錄下時(shí),Guest執(zhí)行命令“dir”,就相當(dāng)于要求Host機(jī)執(zhí)行“dir E:\Debug\Share”,沒(méi)有問(wèn)題。那再讓Guest執(zhí)行命令“dir ..”,會(huì)發(fā)生什么情況呢?
如果是Host本身在執(zhí)行這條命令,沒(méi)有問(wèn)題,自然會(huì)列出E:\Debug下的所有文件;但現(xiàn)在要求執(zhí)行命令的是 Guest,Host只設(shè)置了E:\Debug\Share這個(gè)目錄給Guest,自然是希望Guest只能看到這個(gè)目錄,而沒(méi)有權(quán)限看到它的父目錄,因此VMware會(huì)對(duì)含有“..”的路徑名作特別處理,處理的結(jié)果就是Guest上執(zhí)行這條命令無(wú)效。
那么它的處理方法是什么呢?簡(jiǎn)單說(shuō)來(lái)是這樣的,VMware會(huì)對(duì)共享文件夾的路徑名進(jìn)行驗(yàn)證,確認(rèn)它不含有0×2e0×2e(翻譯為ASCII子字符就是 “..”)字符串后,就會(huì)將其從多字節(jié)字符串轉(zhuǎn)換為寬字符字符串,然后將所生成的寬字符字符串傳送給Host上的系統(tǒng)文件API。這個(gè)轉(zhuǎn)換使用 Windows API中的MultiByteToWideChar函數(shù)完成。該函數(shù)的原型如下:
| int MultiByteToWideChar ( UINT CodePage, DWORD dwFlags, LPCSTR lpMultiByteStr, int cbMultiByte, LPWSTR lpWideCharStr, int cchWideChar ); |
這里只對(duì)dwFlags做簡(jiǎn)單解釋。
dwFlags:指定是否轉(zhuǎn)換成預(yù)制字符或合成的寬字符,對(duì)控制字符是否使用像形文字,以及怎樣處理無(wú)效字符。其中:
MB_ERR_INVALID_CHARS:設(shè)置此選項(xiàng),則函數(shù)遇到非法字符就失敗并返回錯(cuò)誤碼ERROR_NO_UNICODE_TRANSLATION,否則丟棄非法字符。
正是由于對(duì)MultiByteToWideChar函數(shù)中dwFlags參數(shù)的錯(cuò)誤使用,導(dǎo)致VMware共享文件夾先后出現(xiàn)了兩個(gè)漏洞,按時(shí)間順序是 CVE-2007-1744和CVE-2008-0923。
不過(guò)嚴(yán)格說(shuō)起來(lái),這并非是因?yàn)閂Mware開(kāi)發(fā)人員在使用 MultiByteToWideChar函數(shù)時(shí)的編碼錯(cuò)誤,而是由于這套驗(yàn)證機(jī)制本身在邏輯上就存在一個(gè)漏洞。
因?yàn)椋候?yàn)證“..”字符串是在轉(zhuǎn)換輸入字符 串之前執(zhí)行的,因此只要Guest系統(tǒng)上的惡意程序或用戶提供的路徑名可以通過(guò)驗(yàn)證,則在調(diào)用MultiByteToWideChar之后仍可能映射為包 含有Unicode UTF-16版本的“..”字符串。
3.1 CVE-2007-1744
受影響版本:
VMWare VMWare Workstation 5.5.3 build 34685
不受影響版本:
VMWare VMWare Workstation 5.5.4 build 44386
這個(gè)漏洞的起因是dwFlags使用了默認(rèn)值0,這意味著在轉(zhuǎn)換過(guò)程中會(huì)忽略輸入的無(wú)效字符,因此可以很容易地構(gòu)造出一個(gè)多字節(jié)字符串,輕松地繞過(guò)驗(yàn)證,成為Unicode UTF-16版本的“..”。示例程序如下:
| #include int main(int argc, char* argv[]) { unsigned int ans; char utf8[] = { 0xc0,0×2e,0xc0,0×2e }; //0xc0是無(wú)效字符 wchar_t utf16[100] = { 0 }; UINT CodePage = CP_UTF8; ans = MultiByteToWideChar(CodePage, 0, (LPCSTR)&utf8, 4, (LPWSTR)utf16, 100); printf(”utf16: %S\n”, utf16); return 0; } |
盡管0xc0是無(wú)效字符,但因?yàn)槭褂玫牡膁wFlags值是0,所以MultiByteToWideChar函數(shù)會(huì)忽略它,而繼續(xù)轉(zhuǎn)換有效的字符 0×2e,所以執(zhí)行這個(gè)程序的輸出結(jié)果是:utf16: ..可見(jiàn),只要我們?cè)谳斎氲穆窂矫邪?xc00×2e0xc00×2e”,那么就能夠通過(guò)VMware對(duì)0×2e0×2e的驗(yàn)證,因此Host會(huì)去訪問(wèn)上層目錄,從而讓Guest看到不應(yīng)該看到的東西。
3.2 CVE-2008-0923
受影響版本
| VMWare Workstation 6.0.2 VMWare Workstation 5.5.4 VMWare Player 2.0.2 VMWare Player 1.0.4 VMWare ACE 2.0.2 VMWare ACE 1.0.2 |
不受影響版本:
| VMWare Workstation 6.0.3 VMWare Workstation 5.5.6 VMWare Player 2.0.3 VMWare Player 1.0.5 VMWare ACE 2.0.3 VMWare ACE 1.0.5 VMWare ESX VMWare Server |
由于上個(gè)漏洞中dwFlags參數(shù)簡(jiǎn)單使用了默認(rèn)值0,導(dǎo)致無(wú)效字符也能夠順利通過(guò)轉(zhuǎn)換,因此VMware的更新版本中將dwFlags參數(shù)的值修 改為 MB_ERR_INVALID_CHARS,這個(gè)宏的整數(shù)值是8。這樣一來(lái),像上面使用過(guò)的“0xc00×2e0xc00×2e”字符串,由于包含了無(wú)效 字符,就會(huì)導(dǎo)致MultiByteToWideChar函數(shù)調(diào)用失敗了。那么,我們有沒(méi)有辦法構(gòu)造出一個(gè)有效的多字節(jié)字符序列,而又能成功轉(zhuǎn)換為 Unicode UTF-16版本的“..”呢?試一試就知道了,還是讓程序來(lái)幫忙吧。測(cè)試程序如下:
| #include #include #include int main(int argc, char* argv[]) { unsigned int i, ans; unsigned char buf[200]; UINT CodePage = CP_UTF8; for (i=1; i; i++) { memset(buf, 0, 200); ans = MultiByteToWideChar(CodePage, MB_ERR_INVALID_CHARS, //8 (LPCSTR)&i, 4, (LPWSTR)buf, 100); if (ans && (buf[0] == ‘.’) && (buf[1] == 0) && ((i & 0xff) != ‘.’)) { printf(”%d %04x: %02x %02x %02x %02x\n”, ans, i, buf[0], buf[1], buf[2], buf[3]); getchar(); // 找到后讓程序暫停一下 } } return 0; } |
很快就能找到第1個(gè)字符序列是“0xc20×2e0xc20×2e”,也就是說(shuō)它能夠通過(guò)驗(yàn)證,并且成功地轉(zhuǎn)換為Unicode UTF-16版本的“..”。
新聞名稱:VMware漏洞實(shí)例分析之共享文件夾目錄遍歷
文章地址:http://m.fisionsoft.com.cn/article/djoccsg.html


咨詢
建站咨詢
