這篇文章講述了微軟最新修補(bǔ)的漏洞CVE-2015-0057的細(xì)節(jié)。
原文:《One-Bit To Rule Them All: Bypassing Windows’ 10 Protections using a Single Bit》
今天微軟發(fā)布了最新的補(bǔ)丁。這個補(bǔ)丁修復(fù)了漏洞CVE-2015-0057,這是我們幾個月前負(fù)責(zé)任地披露給微軟的一個重要級別的可利用漏洞。 作為研究的一部分,我們發(fā)現(xiàn)這個權(quán)限提升漏洞,利用該漏洞,可使攻擊者完全控制權(quán)Windows系統(tǒng)。換句話說,獲得Windows訪問權(quán)的攻擊者(例如,通過網(wǎng)絡(luò)釣魚運(yùn)動)可以利用此漏洞繞過Windows所有的安全措施,擊敗緩解措施,如沙箱,內(nèi)核隔離和內(nèi)存隨機(jī)化。 有趣的是,漏洞利用僅需要修改Windows操作系統(tǒng)一個比特。
我們已經(jīng)證實(shí)了這一漏洞對所有支持的Windows桌面版本都是可用的,包括Windows10技術(shù)預(yù)覽版。
下面開始漏洞的細(xì)節(jié)。起初,我們似乎無法利用它。但是經(jīng)過一番努力,我們成功地利用了它,我們將描述整個過程。作為分析的一部分,我們也展示了利用視頻。最后,通過分享我們認(rèn)為有趣的死代碼bug來總結(jié)文章。
負(fù)責(zé)任的披露:盡管這篇博客是技術(shù)性的,但我們不會發(fā)布任何代碼,或完整的細(xì)節(jié),以防止任何人重現(xiàn)漏洞。
在過去的幾年里,權(quán)限提升漏洞對于漏洞利用來說變得更加重要了,因?yàn)樗箰阂獯a可以在內(nèi)核權(quán)限上運(yùn)行。因此,攻擊者利用權(quán)限提升漏洞可以繞過安全防護(hù)機(jī)制,如應(yīng)用程序沙箱。
伴隨著攻擊技術(shù)的發(fā)展,微軟做了大量的努力來保護(hù)內(nèi)核。其理由是,即使漏洞存在,利用也是很困難的,但不是不可能。 例如,這里僅僅是少數(shù)存在于Windows 8.1的內(nèi)核保護(hù)機(jī)制:
內(nèi)核DEP - 確保大多數(shù)內(nèi)核數(shù)據(jù)區(qū)不能被執(zhí)行
KASLR - 隨機(jī)化內(nèi)核地址空間,以避免內(nèi)核模塊位置固定
完整性等級 - 限制非特權(quán)應(yīng)用程序泄漏內(nèi)核相關(guān)信息的能力
常見攻擊向量的緩解 – 常被濫用的結(jié)構(gòu)的保護(hù)(如Win32K WND PROC域)
SMEP - 防止執(zhí)行內(nèi)核模式到用戶模式的控制轉(zhuǎn)移
NULL解引用保護(hù) - 禁止用戶空間前64K數(shù)據(jù)的映射
盡管存在這些保護(hù)機(jī)制,在過去的一年中,我們已經(jīng)看到了一些演示,展示了繞過這些保護(hù)機(jī)制的技術(shù)。
我們在本文中描述的漏洞,就是新近披露的繞過這些保護(hù)的可利用的權(quán)限提升漏洞。
漏洞:Win32k.sys中的模塊的一個漏洞
這一漏洞出現(xiàn)在微軟Windows內(nèi)核GUI組件中,即Win32k.sys模塊中。
本文假設(shè)對Win32k.sys模塊有很強(qiáng)的技術(shù)認(rèn)識。此模塊的詳細(xì)信息,請參考Tajei Mandt的Kernel Attacks through UserMode Callbacks,Gilad Bakas 的Windows Kernel Vulnerability Research and Exploitation。
WIN32K模塊實(shí)際上管理著windows滾動條。這些滾動條 - 無論是水平或垂直 – 都是為每個窗口設(shè)置的。
圖1
正如圖1中看到的,每個SBDATA結(jié)構(gòu)定義關(guān)于一個滾動條的信息。
WSBflags是一個位掩碼,決定了滾動條的狀態(tài)。
為了啟用和禁用一個窗口滾動條,可以使用xxxEnableWndSBArrows函數(shù)。通過簡單的函數(shù)調(diào)用,這個函數(shù)就可以改變滾動條的狀態(tài)。 漏洞正是存在于此功能中。
xxxEnableWndSBArrows原型如下:
wnd - 一個指向相關(guān)窗口的指針
wSBflags - 滾動條類型(例如水平或垂直)
wArrows - 指定滾動條的箭頭是否啟用或禁用,并指示那個箭頭啟用或禁用。
為了描述漏洞,我們就來看看在xxxEnableWndSBArrows功能的第一部分,可細(xì)分為3個邏輯部分的:
該功能首先通過檢查該窗口是否已經(jīng)存在滾動信息,并根據(jù)需要分配一個新的滾動條信息結(jié)構(gòu)。
從技術(shù)上講,該函數(shù)讀取pSBInfo域(這個字段指向tagSBINFO結(jié)構(gòu)),測試指針是否為NULL。如果該字段為null和wArrows參數(shù)不是NULL,則為窗口分配一個tagSBINFO結(jié)構(gòu),滾動條的舊標(biāo)志被設(shè)置為0,否則從現(xiàn)有的窗口滾動條的信息中復(fù)制舊的標(biāo)志。該代碼可以在圖2中找到。
流程繼續(xù)測試是否應(yīng)該改變水平滾動的狀態(tài)。
根據(jù)設(shè)定的wArrows參數(shù)是什么,函數(shù)啟用或禁用的箭頭(圖3)。
流程繼續(xù)檢查箭頭的狀態(tài)是否發(fā)生了變化。
從技術(shù)上講,這是通過檢查箭頭的標(biāo)志來做的(注意,有幾個標(biāo)志的檢查 - 但這些對于我們的目的來說都不是很有趣)。如果標(biāo)志已經(jīng)改變,同時該窗口可見,則xxxDrawScrollbar被調(diào)用。
這正是事情變得有趣的地方。
當(dāng)深入研究代碼,似乎xxxDrawScrollBar可能會導(dǎo)致用戶模式回調(diào)(圖4)。
調(diào)用鏈中的關(guān)鍵函數(shù)是ClientLoadLibrary。這個函數(shù)執(zhí)行回調(diào)到用戶模式函數(shù)__ClientLoadLibrary。
現(xiàn)在,讓我們回到xxxEnableWndSBArrows的代碼。
我們的檢查表明tagSBINFO指針在回調(diào)后,不任何驗(yàn)證就使用了。最終,這可能會導(dǎo)致使用后釋放(UAF)漏洞,因?yàn)樵摵瘮?shù)可能繼續(xù)使用被釋放了的滾動條信息(圖5)。
回調(diào)之后,xxxEnableWndSBArrows函數(shù)繼續(xù)并且改變垂直滾動條的狀態(tài)。
在這個階段中,函數(shù)試圖啟用或禁止標(biāo)志。然而,由于該結(jié)構(gòu)已經(jīng)被釋放,我們可以用它來將位于釋放的緩沖區(qū)的第一個DWORD與0xC按位或(如果我們禁止箭頭)或者清除第3位和第4(如果啟用箭頭)。見圖6。
為了簡便起見,我們將展示如何操縱2個比特位來完全控制系統(tǒng)。其實(shí),操縱其中之一就足夠了。
似乎位操作起初還不足以造成任何顯著影響,但我們還是決定繼續(xù)嘗試。最需要去嘗試的事情是,或者增加一些緩沖(使用按位OR)的大小或者減少一定的參考計(jì)數(shù)器(使用按位AND)。
短暫的搜索后,我們發(fā)現(xiàn)了滿足第一個要求的對象。這個對象是一個窗口的屬性列表。
每個窗口都有一個屬性列表。通常GUI應(yīng)用程序可以使用這些屬性來存儲任意值, Win32K也使用屬性列表以便存儲內(nèi)部數(shù)據(jù)。
用于保存窗口的屬性的數(shù)據(jù)結(jié)構(gòu)可以在圖7中看到。第一個域cEntries,是屬性數(shù)組中的條目數(shù); iFirstFree是屬性列表中的第一空閑單元的索引;和props 是PROP數(shù)組。
應(yīng)用程序可以使用SetProp API設(shè)置窗口的屬性。該函數(shù)的原型如下:
hWnd -窗口句柄。
lpString – 屬性或ATOM。
HDATA – 要存儲的數(shù)據(jù)。
添加屬性到一個窗口是通過CreateProp函數(shù)來完成,它在Win32K模塊中。
如圖8所示它的分配算法是相當(dāng)簡單的。如果沒有空間可用于屬性列表中的新條目,則函數(shù)分配多一個條目的新列表。該函數(shù)然后將舊屬性的緩沖區(qū)復(fù)制到新的緩沖區(qū),釋放舊的緩沖區(qū),并增加條目計(jì)數(shù)。
這段代碼中還有幾個重要的點(diǎn)要注意: 首先,屬性是從桌面堆中分配(使用DesktopAlloc)。tagSBINFO也從該堆中分配。如果我們想用UAF漏洞來改變屬性結(jié)構(gòu),這是至關(guān)重要的。 第二,每一個新的條目都觸發(fā)緩沖區(qū)的重新分配。這意味著我們可以很容易地觸發(fā)緩沖區(qū)的重新分配,來達(dá)到tagSBINFO結(jié)構(gòu)的大小。這樣做增加了緩沖區(qū)將被分配在釋放了的tagSBINFO結(jié)構(gòu)的地址的機(jī)會。 第三,也是最重要的是,cEntries域位于該結(jié)構(gòu)的第一個DWORD。這意味著我們可以增加它的大小(用按位OR)。增加屬性數(shù)組的大小后,我們基本上實(shí)現(xiàn)了經(jīng)典的緩沖區(qū)溢出。
上面研究了權(quán)限提升漏洞的利用。我們就此停止,同時避免發(fā)布任何敏感代碼。 我們在64位Windows10技術(shù)預(yù)覽版上提供了概念證明。
視屏地址:https://www.youtube.com/watch?v=ukAr6MiA788
經(jīng)過一番工作,我們成功地創(chuàng)建針對Windows所有版本的一個穩(wěn)定利用 - Windows XP到Windows10預(yù)覽都可用(SMEP和其他保護(hù)都打開)。我們已經(jīng)表明即使是微小的缺陷也可以用來完全控制任何Windows操作系統(tǒng)。
盡管如此,我們認(rèn)為微軟在使其操作系統(tǒng)更安全方面做的努力起到了顯著作用,編寫可靠的攻擊代碼比以往更難了。 不幸的是,這些措施不能完全阻止攻擊者。我們預(yù)計(jì),攻擊者將繼續(xù)整合漏洞利用到他們的犯罪工具包,使得妥協(xié)在所難免。
檢查xxxEnableWndSBArrows函數(shù)的代碼,可以看到有調(diào)用xxxWindowEvent函數(shù)。
乍一看,似乎這兩個函數(shù)會比xxxDrawScrollbar函數(shù)更容易用于漏洞利用,具體如上所述。
但是,在深入研究代碼之后,很快就明白,在代碼中的橫向滾動條部分調(diào)用xxxWindowEvent實(shí)際上是死代碼(圖9)。
看代碼,有兩個條件調(diào)用xxxWindowEvent函數(shù)。僅當(dāng)滾動條信息的舊標(biāo)記與新的標(biāo)志不同時,這些調(diào)用才執(zhí)行。然而,在這些條件出現(xiàn)時,舊的標(biāo)志的值與新的標(biāo)志總是相等的。因此,調(diào)用xxxWindowEvent的條件是永遠(yuǎn)不會滿足的。這實(shí)際上意味著,這個死碼在那里大約15年沒有做任何事。
國產(chǎn)工具PKAV HTTP Fuzzer滲透測試助手最新發(fā)布
閱讀惠普漏洞:惠普ArcSight企業(yè)安全系列產(chǎn)品曝高危安全漏洞
閱讀騰訊、360各顯神通,分別秒殺IE、Flash、PDF項(xiàng)目
閱讀蘋果Mac OS X系統(tǒng)被發(fā)現(xiàn)存在DLL劫持漏洞
閱讀D-Link(友訊)路由器曝遠(yuǎn)程文件上傳及命令注入漏洞(已發(fā)布安全更新)
閱讀Win10將使用P2P進(jìn)行系統(tǒng)更新,引發(fā)安全擔(dān)憂
閱讀美國最大的無卡ATM網(wǎng)絡(luò)即將推出,從此告別刷卡!
閱讀谷歌應(yīng)用漏洞泄漏超過28萬條私人WHOIS數(shù)據(jù)
閱讀使命召喚、魔獸世界、英雄聯(lián)盟……專攻游戲的勒索軟件TeslaCrypt
閱讀本站所有軟件,都由網(wǎng)友上傳,如有侵犯你的版權(quán),請發(fā)郵件[email protected]
湘ICP備2022002427號-10 湘公網(wǎng)安備:43070202000427號© 2013~2025 haote.com 好特網(wǎng)