軟件安全漏洞挖掘技術(shù)探討
- 來源:中國信息化周報(bào) smarty:if $article.tag?>
- 關(guān)鍵字:軟件,Windows7,函數(shù) smarty:/if?>
- 發(fā)布時(shí)間:2015-09-28 10:45
軟件安全漏洞挖掘,國內(nèi)還有漏洞分析的叫法,漏洞分析和漏洞挖掘業(yè)界也是有區(qū)別的,有些就是把漏洞挖掘歸在漏洞分析之下,我們這里講的漏洞挖掘是指對位置漏洞的挖掘。當(dāng)前,漏洞挖掘本身是很難的問題。Windows7發(fā)現(xiàn)了很多遠(yuǎn)程管理的漏洞,但Windows7發(fā)布之后,遠(yuǎn)程管理漏洞,尤其是系統(tǒng)級的變得比較少了,這和微軟SDL開發(fā)模式有一定的關(guān)系,他們有安全的開發(fā)平臺。
漏洞挖掘技術(shù)正處于發(fā)展過程中
實(shí)際漏洞挖掘技術(shù)也是在發(fā)展的,早期主要是通過一些漏洞的函數(shù),構(gòu)建函數(shù)模型來進(jìn)行漏洞挖掘。后期會引入路徑模型的概念,包括原代碼審計(jì)系統(tǒng),二進(jìn)制代碼反饋之后也是一種源碼,也就是說我們可以根據(jù)代碼直接的上下文關(guān)系,語義解析構(gòu)建出一些路徑模型來挖掘漏洞。系統(tǒng)的安全對抗也是發(fā)展的,既然有了新的技術(shù)和安全機(jī)制,同樣也會推出對抗的技術(shù),例如數(shù)據(jù)執(zhí)行保護(hù)制,可以通過ROP構(gòu)造出來各種各樣的Gaget,調(diào)用系統(tǒng)里相關(guān)的函數(shù),因?yàn)楣粽吖魧Ψ街?,更多是用被攻擊機(jī)器上的資源完成攻擊的過程。
以Windows系統(tǒng)為例介紹一下它的內(nèi)存保護(hù)機(jī)制,傳統(tǒng)內(nèi)存機(jī)制,GS、SafeHEP、SafeSEH、DEP和SLF,Windows8里也引入了新的能夠檢測到ROP的方法。對堆進(jìn)行了更多的改進(jìn),比如隨機(jī)化的LFH,對頁面屬性的保護(hù),對其他內(nèi)存方面比如虛指針也提供了相應(yīng)的安全機(jī)制,對于空頁面、內(nèi)存分配的隨機(jī)化,GS方面也進(jìn)行了積極的增強(qiáng),也就是StackCookie,Windows7和Windows8最大的一個(gè)區(qū)別就是在Cookie生成算法里采用了Intel的SQL-key算法和技術(shù),使得Cookie更難以進(jìn)行猜測。在SL方面,他又提出了高算地址的隨機(jī)化,研究過Win8或調(diào)試過Win8的系統(tǒng)安全人員應(yīng)該都很清楚它的機(jī)制。DEP里也提出了檢測ROP的機(jī)制。
以微軟Windows為例,Windows出現(xiàn)藍(lán)屏事件時(shí)會有系統(tǒng)轉(zhuǎn)存,轉(zhuǎn)存模式有三種:一是完全的淡化,把當(dāng)前物理內(nèi)存里的所有信息都存下來;二是核心內(nèi)容的存儲,除了進(jìn)程之外的信息我們把它下載下來;三是小內(nèi)存的存儲,以16位為單位進(jìn)行轉(zhuǎn)存。得到這些信息之后,就可以通過微軟自身提供的Win DBG進(jìn)行分析,每一個(gè)出錯(cuò)的信息都可以形成陷阱針,可以通過bing看到它當(dāng)時(shí)出錯(cuò)的場景,比如堆棧是什么情況,在一條什么指令上出錯(cuò),可能大家從這條指令就能夠看出,它在讀一些不應(yīng)該讀的地址,讀出一個(gè)錯(cuò)誤。
回溯之后,可以把整個(gè)函數(shù)調(diào)用順序清晰地展示出來。下一步我們可以借助強(qiáng)大的反饋鏈平臺,像IDA來進(jìn)一步判斷它是不是存在邏輯的缺陷,判斷這個(gè)漏洞有沒有可能被利用。其中一個(gè)依據(jù)就是看看用戶態(tài)里的參數(shù)或數(shù)據(jù)能不能傳遞到內(nèi)核態(tài)里?;谶@樣的假設(shè),也就是假設(shè)我們給廠商自己的產(chǎn)品打補(bǔ)丁時(shí),打的補(bǔ)丁存在一些安全隱患,或者打的不完備,因?yàn)檐浖S商發(fā)現(xiàn)自己的產(chǎn)品出來漏洞之后一定希望用最小的代價(jià)去修復(fù)當(dāng)前這個(gè)漏洞,所以,它一般比較注重當(dāng)前漏洞點(diǎn)的修補(bǔ),而很少考慮漏洞上下文的環(huán)境,尤其Windows在大型邏輯上是很嚴(yán)謹(jǐn)?shù)模珜芏嗟倪壿嫍l件在別的地方可能也存在相應(yīng)的改變,也就是它不能考慮到整個(gè)系統(tǒng)或者第三方代碼會給變量和邏輯條件帶來影響,這樣我們可以形成參考,安全補(bǔ)丁比對邏輯挖掘的思路。這種技術(shù)在清華大學(xué)學(xué)報(bào)上已經(jīng)形成論文,思路很簡單,就是說我們可以通過路徑查找找出所有可能執(zhí)行的路徑。
進(jìn)一步對這個(gè)邏輯條件進(jìn)行相應(yīng)判斷或者進(jìn)行約束,最后進(jìn)行求解,能不能找到繞過這個(gè)邏輯條件直接執(zhí)行到漏洞點(diǎn)的路徑,如果能找到的話,就意味著這個(gè)漏洞修補(bǔ)可能是不完全的。
這里有個(gè)典型的漏洞,這個(gè)漏洞應(yīng)該說是已經(jīng)公開的。漏洞之前和之后實(shí)際在前面就是加了一個(gè)邏輯條件和框段,同時(shí)Windows系統(tǒng)和其他開發(fā)者在其他地方又對這個(gè)地方進(jìn)行了修改,如果我們采用某一種方法,能夠把它的條件先進(jìn)行重置,就可以把以前的漏洞進(jìn)行重現(xiàn)。
改變新思路進(jìn)行漏洞挖掘
系統(tǒng)內(nèi)核函數(shù)的無序調(diào)用,這里面不僅僅是內(nèi)核函數(shù),也可以是API函數(shù),Windows7、Windows8出現(xiàn)之后,系統(tǒng)漏洞的確很難繼續(xù)挖掘,我們需要改變一些新的思路進(jìn)行漏洞挖掘,這種方法實(shí)際是很好的能夠去挖掘本地學(xué)習(xí)提升漏洞的方法,它可以面向Windows的內(nèi)核模塊,也可以面向一些驅(qū)動程序進(jìn)行漏洞挖掘。
它的思路很簡單,一個(gè)普通用戶能夠驅(qū)動打印機(jī),就意味著一個(gè)普通用戶能夠調(diào)用打印機(jī)驅(qū)動里面的函數(shù),既然是普通用戶能夠驅(qū)動的函數(shù),完全可以通過自己的代碼編程把這些函數(shù)剝離出來,其目的就是為了進(jìn)行無序的調(diào)用,所以,我們可以有正常的順序序列,也可以有打亂順序的調(diào)用,譬如順序里的函數(shù)經(jīng)過多次調(diào)用之后在內(nèi)存里會不會打架。也可以看調(diào)用的順序能不能改變,或者調(diào)用一些條件或參數(shù),或者沒有公開過的API函數(shù)。這也是MS10-010的特點(diǎn),它是客戶端子系統(tǒng)的漏洞,在微軟里它應(yīng)該屬于重要級的漏洞。MS10-010,也就是客戶端子系統(tǒng)主要是完成這樣的功能,用戶登錄之后開啟的每一個(gè)進(jìn)程可以在SDRSD里留下一個(gè)PLD,就是進(jìn)程列表。用戶退出操作系統(tǒng),但是曾經(jīng)開啟過的進(jìn)程依然留在這個(gè)系統(tǒng)里,這應(yīng)該是存在安全隱患的,這和操作系統(tǒng)設(shè)計(jì)原則是違背的。
這種方式怎樣讓它重現(xiàn)呢?就是打亂它的調(diào)用數(shù)據(jù),這里列出的一段代碼,我們可以改變它的邏輯條件,繞過它的安全補(bǔ)丁。這里面每一步都可以通過安全函數(shù)實(shí)現(xiàn)。正常情況下會先連接ApiPort——退出——關(guān)閉,我們的標(biāo)志就結(jié)束了。如果打亂這個(gè)順序的調(diào)用,先連接,接著關(guān)閉,最后調(diào)用退出函數(shù),這樣它就會在寄存器里變成0,進(jìn)程卻依然留在系統(tǒng)里?;趨f(xié)議握手的漏洞管理技術(shù),這也沒有什么太多的新意,主要是針對一些網(wǎng)絡(luò)軟件,這個(gè)測試空間是很大的。尤其是針對網(wǎng)絡(luò)的應(yīng)用軟件,原來我們在進(jìn)行Fuzzing測試時(shí)比較關(guān)注的是它的第一步,現(xiàn)在可以關(guān)注到第二步或第三步。首先可以把整個(gè)網(wǎng)絡(luò)通信流程模擬出來,再結(jié)合立項(xiàng)工程,立項(xiàng)主要用在C端(Server端),也就是說解析傳遞過去的數(shù)據(jù)包,最后在Client端或Server端,我們能夠去定制更加自動化的Fuzzing測試用例,從而縮小測試用例的空間。
這是個(gè)典型的例子,我們往往關(guān)注的是第一步,實(shí)際往往很多漏洞會出現(xiàn)在第二步或第三步,在連接創(chuàng)建之后或者用戶已經(jīng)登陸進(jìn)去之后,后續(xù)數(shù)據(jù)包的傳遞可能會導(dǎo)致一些安全漏洞,最近我們團(tuán)隊(duì)也在研究URL的漏洞,主要是針對瀏覽器和Flash的一些對象,比如SWF。一提到UAF可能大家都知道,就是User After Free。我們在解析HTML時(shí),HTML里可以通過Create Edident去創(chuàng)建對象,同時(shí)通過JS完成事件的回調(diào),事件回調(diào)中可以銷毀對象或者對對象屬性進(jìn)行修改,修改完了之后后面還會有繼續(xù)的引用,這樣就會導(dǎo)致UAF的漏洞。
?。ㄒ陨蟽?nèi)容系根據(jù)文偉平教授在“2015中國網(wǎng)絡(luò)安全大會”上的演講整理而成,未經(jīng)本人確認(rèn))
北京大學(xué)副教授 文偉平
