鄧兆琨, 陸余良, 黃釗, 黃暉, 朱凱龍
(國(guó)防科技大學(xué)電子對(duì)抗學(xué)院, 合肥 230037)
隨著互聯(lián)網(wǎng)技術(shù)的不斷發(fā)展,網(wǎng)絡(luò)安全問題得到越來(lái)越多人們的關(guān)心,網(wǎng)絡(luò)程序作為用戶使用互聯(lián)網(wǎng)的重要媒介,其自身存在的漏洞問題也為網(wǎng)絡(luò)用戶安全造成了巨大的隱患。攻擊者利用網(wǎng)絡(luò)程序存在的漏洞,對(duì)用戶節(jié)點(diǎn)和服務(wù)器節(jié)點(diǎn)展開的攻擊層出不窮?,F(xiàn)階段針對(duì)網(wǎng)絡(luò)程序安全展開的工作主要分為兩類:一類是通過(guò)白盒、灰盒、黑盒等測(cè)試手段對(duì)網(wǎng)絡(luò)程序的源代碼或二進(jìn)制代碼進(jìn)行檢測(cè),從而發(fā)現(xiàn)高危代碼區(qū)域和漏洞點(diǎn);另一類是通過(guò)監(jiān)控程序上線運(yùn)行的過(guò)程,發(fā)現(xiàn)程序產(chǎn)生運(yùn)行異常的節(jié)點(diǎn)以及導(dǎo)致程序異常的輸入數(shù)據(jù)。相比于前者,后者針對(duì)漏洞的檢測(cè)成功率更高,但在發(fā)現(xiàn)漏洞的時(shí)間上相對(duì)被動(dòng),對(duì)漏洞的發(fā)現(xiàn)往往滯后于攻擊破壞的產(chǎn)生[1]。
本文研究和分析了現(xiàn)階段的3種主要網(wǎng)絡(luò)程序結(jié)構(gòu)及其典型漏洞,同時(shí),對(duì)C/S結(jié)構(gòu)下網(wǎng)絡(luò)程序的漏洞檢測(cè)技術(shù)進(jìn)行了研究。在這一基礎(chǔ)上提出了一種基于程序建模的網(wǎng)絡(luò)程序漏洞檢測(cè)技術(shù),并利用該技術(shù)實(shí)現(xiàn)了一套網(wǎng)絡(luò)程序漏洞檢測(cè)系統(tǒng)。該技術(shù)對(duì)不同I/O模型下的網(wǎng)絡(luò)程序進(jìn)行關(guān)鍵函數(shù)提取并進(jìn)一步構(gòu)建程序模型,通過(guò)API函數(shù)掛鉤的方式引入符號(hào)變?cè)瑢?duì)程序模型進(jìn)行符號(hào)執(zhí)行,通過(guò)程序模型識(shí)別和關(guān)鍵函數(shù)插樁的方式對(duì)程序二進(jìn)制代碼進(jìn)行分析。當(dāng)程序執(zhí)行異常時(shí)得到觸發(fā)異常位置的符號(hào)約束集,通過(guò)約束求解得到觸發(fā)異常的具體輸入和異常點(diǎn),實(shí)現(xiàn)對(duì)目標(biāo)網(wǎng)絡(luò)程序漏洞的檢測(cè)。
網(wǎng)絡(luò)程序主要存在3種結(jié)構(gòu)類型:C/S結(jié)構(gòu)、B/S結(jié)構(gòu)和P2P結(jié)構(gòu)。這3種結(jié)構(gòu)分別有著自身的優(yōu)缺點(diǎn),根據(jù)網(wǎng)絡(luò)環(huán)境和用戶使用需求的不同,程序開發(fā)者采用的結(jié)構(gòu)也不同,且三者之間相互聯(lián)系,并沒有嚴(yán)格意義上的區(qū)分[2]。
C/S結(jié)構(gòu)下的網(wǎng)絡(luò)程序由客戶端和服務(wù)器端共同組成,通過(guò)將網(wǎng)絡(luò)任務(wù)合理地分配到網(wǎng)絡(luò)程序的雙端,達(dá)到降低系統(tǒng)開銷、充分利用雙端軟硬件條件的目的[3-4]。C/S結(jié)構(gòu)下網(wǎng)絡(luò)程序的雙端建立連接后會(huì)一直保持連接狀態(tài),任何一方都可以實(shí)時(shí)地向?qū)Ψ桨l(fā)送信息或文件。如微信、QQ等即時(shí)通信軟件,通過(guò)安裝在電腦上的客戶端向騰訊的服務(wù)器發(fā)送數(shù)據(jù),而騰訊的服務(wù)器也可以實(shí)時(shí)向本地的客戶端回復(fù)信息和文件請(qǐng)求。該架構(gòu)下的大量工作在客戶端進(jìn)行,服務(wù)器端作為中介節(jié)點(diǎn)執(zhí)行保存、轉(zhuǎn)發(fā)功能,雙端信息交互有著實(shí)時(shí)轉(zhuǎn)發(fā)、一對(duì)一通信、點(diǎn)對(duì)點(diǎn)單線傳輸?shù)奶匦?,現(xiàn)階段如QQ、微信、迅雷、快播、暴風(fēng)影音等眾多商業(yè)軟件都采用該結(jié)構(gòu)。C/S結(jié)構(gòu)下的網(wǎng)絡(luò)程序,除了協(xié)議解析和對(duì)數(shù)據(jù)提取模塊外,客戶端和服務(wù)器端在本地運(yùn)行過(guò)程中的原理和普通二進(jìn)制程序基本相同,因此,其本身存在的漏洞也以典型的二進(jìn)制程序漏洞為主,如堆棧等緩沖區(qū)溢出漏洞、格式化字符串漏洞等。
B/S結(jié)構(gòu)是在C/S結(jié)構(gòu)的基礎(chǔ)上變化、改進(jìn)而來(lái),主要是為滿足互聯(lián)網(wǎng)用戶通過(guò)瀏覽器瀏覽、查詢信息的需求。B/S結(jié)構(gòu)下網(wǎng)絡(luò)程序的客戶端一般以瀏覽器的形式存在,客戶端僅實(shí)現(xiàn)部分邏輯運(yùn)算和信息處理,而將大部分的運(yùn)算和需求處理交付給服務(wù)器端實(shí)現(xiàn)。該架構(gòu)用于支持多人訪問的門戶網(wǎng)站或論壇,如搜狐、新浪、微博等,該類情況下無(wú)需信息的實(shí)時(shí)性,但需要其長(zhǎng)期有效[5]。B/S結(jié)構(gòu)下網(wǎng)絡(luò)程序的服務(wù)器端為網(wǎng)站服務(wù)器,但客戶端瀏覽器的結(jié)構(gòu)和功能得到簡(jiǎn)化,由于HTML等網(wǎng)絡(luò)編程語(yǔ)言的特性,導(dǎo)致網(wǎng)站本身(服務(wù)器端)和瀏覽器(客戶端)存在的漏洞以典型的web漏洞為主,如SQL注入,XSS跨站腳本漏洞,CSRF跨站請(qǐng)求偽造,文件上傳等。
P2P結(jié)構(gòu)是一種最新提出的網(wǎng)絡(luò)程序結(jié)構(gòu)形式,目的是適應(yīng)點(diǎn)對(duì)點(diǎn)網(wǎng)絡(luò)中程序開發(fā)的需求,該結(jié)構(gòu)最大的優(yōu)點(diǎn)是分布性和共享性[6]。但由于取消了服務(wù)器端的存在,網(wǎng)絡(luò)用戶以服務(wù)器端和客戶端的雙重身份出現(xiàn)在網(wǎng)絡(luò)中,導(dǎo)致了網(wǎng)絡(luò)可信性的下降和網(wǎng)絡(luò)資源的丟失。同時(shí),由于客戶端高度分散難以管理的缺點(diǎn),導(dǎo)致現(xiàn)今互聯(lián)網(wǎng)上并不存在純P2P結(jié)構(gòu)的網(wǎng)絡(luò)程序,在應(yīng)用過(guò)程中P2P結(jié)構(gòu)網(wǎng)絡(luò)常和前兩種結(jié)構(gòu)混合使用,除了搭載在各個(gè)客戶節(jié)點(diǎn)的客戶端外,一般仍會(huì)布置一臺(tái)或多臺(tái)中心服務(wù)器,用來(lái)保存核心資源起到維持網(wǎng)絡(luò)的作用。根據(jù)混合結(jié)構(gòu)的不同,該結(jié)構(gòu)下網(wǎng)絡(luò)程序中存在的漏洞也同樣以C/S結(jié)構(gòu)和B/S結(jié)構(gòu)本身的漏洞為主。
現(xiàn)階段,研究人員針對(duì)不同結(jié)構(gòu)下的網(wǎng)絡(luò)程序漏洞已進(jìn)行了相關(guān)研究,并基于各項(xiàng)研究形成了一些相關(guān)工具。文獻(xiàn)[7]就針對(duì)B/S結(jié)構(gòu)下的瀏覽器端漏洞挖掘進(jìn)行了研究,其通過(guò)特征提取的方式制定漏洞模板,并利用此類模板進(jìn)行漏洞檢測(cè),其對(duì)于XSS和SQL注入等web漏洞有較好的檢測(cè)效果,特別是在可視化方面實(shí)現(xiàn)較好。文獻(xiàn)[8]同樣針對(duì)XSS和SQL注入等web漏洞進(jìn)行挖掘,不同的是其采用了Fuzzing技術(shù),通過(guò)構(gòu)造大量隨機(jī)輸入的方式執(zhí)行目標(biāo)程序?qū)ふ衣┒袋c(diǎn),該挖掘方法的效果較為直接,針對(duì)挖掘到的漏洞也能很好地提供相關(guān)信息和觸發(fā)POC。文獻(xiàn)[9]在Fuzzing技術(shù)的基礎(chǔ)上提出了一種結(jié)合了動(dòng)態(tài)污點(diǎn)分析的漏洞檢測(cè)技術(shù),針對(duì)C/S架構(gòu)下的網(wǎng)絡(luò)程序二進(jìn)制漏洞進(jìn)行檢測(cè),實(shí)驗(yàn)證明該方法針對(duì)協(xié)議漏洞有較好的效果。文獻(xiàn)[10]提出了一種基于QEMU虛擬機(jī)的二進(jìn)制程序離線動(dòng)態(tài)污點(diǎn)分析方法,該技術(shù)通過(guò)硬件虛擬化的方式提高了污點(diǎn)分析過(guò)程中的執(zhí)行效率。文獻(xiàn)[11]使用符號(hào)執(zhí)行技術(shù)對(duì)B/S結(jié)構(gòu)下瀏覽器端存在的Use-After-Free漏洞進(jìn)行檢測(cè)并實(shí)現(xiàn)了一套檢測(cè)工具,該工具針對(duì)Use-After-Free漏洞進(jìn)行了模型分析和開發(fā),因此針對(duì)性更強(qiáng)。
作為一種重要的漏洞檢測(cè)手段,符號(hào)執(zhí)行技術(shù)將具體的輸入值替換為符號(hào)變?cè)?,通過(guò)監(jiān)控?cái)?shù)據(jù)流的方式記錄程序的執(zhí)行軌跡,并實(shí)時(shí)收集與符號(hào)變?cè)嚓P(guān)的路徑約束條件,當(dāng)一條路徑執(zhí)行完畢后,系統(tǒng)會(huì)恢復(fù)到上一分支節(jié)點(diǎn)探索新的執(zhí)行路徑。通過(guò)對(duì)程序進(jìn)行全路徑分析的方式尋找觸發(fā)程序崩潰的位置,求解從程序起始點(diǎn)到達(dá)該點(diǎn)的路徑約束集,就能夠同時(shí)得到漏洞點(diǎn)和觸發(fā)該漏洞的POC輸入[12-14]。
早期的符號(hào)執(zhí)行技術(shù)主要采取了靜態(tài)分析的方式,這主要是受限于計(jì)算機(jī)系統(tǒng)軟硬件的性能,該方式在不運(yùn)行程序的前提下通過(guò)程序代碼分析的方式獲得執(zhí)行約束,能夠極大地降低系統(tǒng)消耗,但由于缺少程序執(zhí)行過(guò)程的動(dòng)態(tài)信息導(dǎo)致分析過(guò)程的代碼覆蓋不夠準(zhǔn)確[15-16]。之后研究人員針對(duì)該問題提出了動(dòng)態(tài)符號(hào)執(zhí)行思想,通過(guò)真實(shí)運(yùn)行目標(biāo)程序的方式檢測(cè)漏洞存在點(diǎn),該方式提高了漏洞發(fā)現(xiàn)的準(zhǔn)確率,但隨著程序規(guī)模的擴(kuò)大出現(xiàn)了路徑爆炸的問題,特別是隨著路徑復(fù)雜度的提升路徑約束的復(fù)雜度也隨之提升,受限于約束求解器的性能,導(dǎo)致符號(hào)執(zhí)行技術(shù)一直沒有得到更好的應(yīng)用和發(fā)展。隨著2009年選擇符號(hào)執(zhí)行的提出,該問題得到了一定程度上的解決。該技術(shù)的思想核心首先是對(duì)執(zhí)行位置和區(qū)域的“選擇”,如圖1所示,通過(guò)選擇符號(hào)執(zhí)行技術(shù)將符號(hào)執(zhí)行區(qū)域限制在網(wǎng)絡(luò)程序的核心函數(shù)調(diào)取部分,而針對(duì)非程序核心或者一般性程序代碼區(qū)域進(jìn)行具體執(zhí)行過(guò)程,這樣,有效地降低了系統(tǒng)運(yùn)行開支,同時(shí)降低了符號(hào)約束求解過(guò)程的復(fù)雜度。
S2E系統(tǒng)由瑞士洛桑理工大學(xué)的Chipounov等[13]開發(fā),該系統(tǒng)基于選擇符號(hào)執(zhí)行技術(shù)構(gòu)建系統(tǒng)框架,提供了基本的功能性插件模塊。例如,開發(fā)者能夠通過(guò)Selection Plugins類插件制定注入符號(hào)值的位置和選擇執(zhí)行的路徑,當(dāng)OS Event Monitor類插件中的Module Execution Detector截取到系統(tǒng)對(duì)目標(biāo)函數(shù)的調(diào)用時(shí),會(huì)發(fā)送信號(hào)給執(zhí)行插件,此時(shí)系統(tǒng)會(huì)跳轉(zhuǎn)執(zhí)行定義好的行為或者啟動(dòng)符號(hào)執(zhí)行過(guò)程。
本文原型系統(tǒng)采用了選擇符號(hào)執(zhí)行技術(shù),系統(tǒng)基于S2E符號(hào)執(zhí)行平臺(tái)進(jìn)行開發(fā),其中QEMU虛擬機(jī)為待測(cè)試程序提供了模擬運(yùn)行環(huán)境,并為運(yùn)行提供全系統(tǒng)的執(zhí)行監(jiān)控;LLVM提供二進(jìn)制翻譯,將二進(jìn)制代碼翻譯為可供符號(hào)執(zhí)行引擎使用的中間級(jí)代碼;KLEE進(jìn)行符號(hào)執(zhí)行。同時(shí),針對(duì)不同種類的網(wǎng)絡(luò)程序進(jìn)行架構(gòu)抽取并建立函數(shù)模型。與以往的技術(shù)相比創(chuàng)新點(diǎn)主要體現(xiàn)在3個(gè)方面:一是針對(duì)目標(biāo)程序進(jìn)行全系統(tǒng)模擬,能夠更好地發(fā)現(xiàn)目標(biāo)程序存在的真實(shí)漏洞,而選擇符號(hào)執(zhí)行技術(shù)能夠?qū)⒎?hào)執(zhí)行的區(qū)域集中在敏感區(qū)域,有效地降低了符號(hào)執(zhí)行的路徑爆炸問題;二是建立了不同類型網(wǎng)絡(luò)程序模型,通過(guò)目標(biāo)識(shí)別的方式調(diào)取不同模塊,檢測(cè)的針對(duì)性更強(qiáng);三是抽取 程序運(yùn)行過(guò)程中的關(guān)鍵函數(shù)進(jìn)行函數(shù)掛鉤和掛鉤執(zhí)行語(yǔ)義定制,通過(guò)監(jiān)控符號(hào)執(zhí)行的過(guò)程記錄符號(hào)約束表達(dá)式,針對(duì)出現(xiàn)的程序崩潰進(jìn)行約束求解,能夠直接定位到程序漏洞點(diǎn)和觸發(fā)漏洞的具體輸入。
圖1 選擇符號(hào)執(zhí)行技術(shù)Fig.1 Technology of selective symbolic execution
S2E平臺(tái)對(duì)自身框架代碼進(jìn)行了開源,并提供了5種功能性插件供給開發(fā)者進(jìn)行調(diào)用,該5類插件分別為:系統(tǒng)事件監(jiān)控插件、執(zhí)行跟蹤插件、選擇性插件、分析類插件和其他類插件,插件間能夠相互調(diào)用。通過(guò)開發(fā)功能性插件的方式對(duì)該平臺(tái)進(jìn)行針對(duì)性開發(fā),通過(guò)lua腳本操作原型系統(tǒng)的執(zhí)行狀態(tài)和執(zhí)行情況。
原型系統(tǒng)在執(zhí)行區(qū)域選擇、執(zhí)行語(yǔ)義定制和符號(hào)化數(shù)據(jù)引入的環(huán)節(jié)上,采用了系統(tǒng)API函數(shù)掛鉤的技術(shù)。通過(guò)在函數(shù)調(diào)用的起始點(diǎn)和返回點(diǎn)掛鉤,首先可以得到系統(tǒng)函數(shù)服務(wù)提供過(guò)程的具體執(zhí)行語(yǔ)義信息,其次通過(guò)截取函數(shù)調(diào)用的信號(hào),可以控制符號(hào)變?cè)氲奈恢?,間接控制了具體執(zhí)行和符號(hào)執(zhí)行的實(shí)際切換位置。
如圖2所示,基于選擇符號(hào)執(zhí)行技術(shù)思想,原型系統(tǒng)在QEMU虛擬機(jī)環(huán)境下正常啟動(dòng)目標(biāo)程序開始具體執(zhí)行。當(dāng)程序執(zhí)行到目標(biāo)區(qū)域的起始位置時(shí),Windows Monitor會(huì)捕獲到操作系統(tǒng)對(duì)掛鉤的系統(tǒng)API函數(shù)調(diào)用,同時(shí)將信號(hào)發(fā)送給模型模塊中的執(zhí)行插件,執(zhí)行插件中記錄了與目標(biāo)位置相對(duì)應(yīng)的執(zhí)行語(yǔ)義。當(dāng)目標(biāo)區(qū)域執(zhí)行完畢,程序執(zhí)行到結(jié)束位置時(shí),系統(tǒng)會(huì)截取到結(jié)束位置API函數(shù)的調(diào)用信號(hào),當(dāng)該函數(shù)執(zhí)行結(jié)束時(shí)會(huì)觸發(fā)返回點(diǎn)的函數(shù)執(zhí)行語(yǔ)義跳出符號(hào)執(zhí)行過(guò)程。
圖2 選擇符號(hào)執(zhí)行系統(tǒng)運(yùn)行過(guò)程Fig.2 Operational process of selective symbolic execution system
符號(hào)變?cè)囊胪ㄟ^(guò)“系統(tǒng)插件+lua腳本”的方式實(shí)現(xiàn),根據(jù)不同的通信協(xié)議設(shè)置了符號(hào)變?cè)囊胍?guī)則,其中定制的原型系統(tǒng)插件提供變?cè)氲木唧w操作,lua腳本制定了符號(hào)變?cè)氲木唧w規(guī)則。網(wǎng)絡(luò)中數(shù)據(jù)以字節(jié)流的形式傳播,與一般程序接收的輸入不同,網(wǎng)絡(luò)程序除了接收消息之外,還會(huì)接收傳輸?shù)奈募?,但無(wú)論是消息信息或文件數(shù)據(jù),這些內(nèi)容都是以網(wǎng)絡(luò)字節(jié)流的形式傳輸,因此本系統(tǒng)選擇通過(guò)字節(jié)流的方式引入符號(hào)變?cè)?。圖3所示是lua腳本中基于TCP協(xié)議的符號(hào)變?cè)氩呗浴?/p>
圖3 符號(hào)變?cè)氩呗訤ig.3 Symbolic variable introduction policies
原型系統(tǒng)基于STP約束求解器進(jìn)行約束求解。首先,在執(zhí)行的過(guò)程中會(huì)對(duì)每個(gè)執(zhí)行分支節(jié)點(diǎn)的約束條件進(jìn)行收集,2條相反路徑的約束會(huì)通過(guò)取反的方式分別記錄在2條不同路徑的約束條件集中,新約束條件通過(guò)取并集的方式添加。STP約束求解器提供了符號(hào)變?cè)臉?gòu)造器和在此基礎(chǔ)上的一階邏輯中各種表達(dá)式的構(gòu)造器、符號(hào)公式的可滿足性判定器以及反例求解器。該求解器基于整數(shù)和位向量理論進(jìn)行開發(fā)和編寫,能夠滿足大多數(shù)網(wǎng)絡(luò)程序執(zhí)行路徑的約束求解要求。
網(wǎng)絡(luò)程序模型的組成包括開發(fā)者定義的個(gè)人函數(shù)以及調(diào)用的內(nèi)核API函數(shù)。在Windows平臺(tái)下,網(wǎng)絡(luò)程序運(yùn)行的過(guò)程中主要調(diào)取的是winsock函數(shù)庫(kù),特別是在XP系統(tǒng)之后,微軟已將winsock2作為內(nèi)核函數(shù)庫(kù)寫入了操作系統(tǒng)本身。從最原始的阻塞模型,到之后的select模型、WSAAsycSelect模型、Overlapped模型、IOCP模型,不同程序模型調(diào)用winsock庫(kù)中函數(shù)種類以及順序的不同決定了不同模型下網(wǎng)絡(luò)程序的運(yùn)轉(zhuǎn)方式。本文原型系統(tǒng)針對(duì)不同網(wǎng)絡(luò)程序模型開發(fā)了針對(duì)性執(zhí)行子模塊,基于模型識(shí)別的方式對(duì)不同模型下的網(wǎng)絡(luò)程序進(jìn)行漏洞檢測(cè)。
阻塞模型即最早的一類網(wǎng)絡(luò)程序模型,該類模型基于Winsock API函數(shù)實(shí)現(xiàn)服務(wù)器和客戶端之間的通信。該模型運(yùn)行過(guò)程中采用單線程的方式。在本次連接通信未完成、連接未斷開前,新的客戶端只能不斷地發(fā)出連接請(qǐng)求,等待新的連接。當(dāng)正在進(jìn)行的服務(wù)過(guò)程結(jié)束、本次連接斷開后,服務(wù)器端才接受新的連接請(qǐng)求并提供服務(wù)。
圖4為阻塞模型下的通信模型及通信過(guò)程,通過(guò)關(guān)鍵函數(shù)抽取的方式本文建立了網(wǎng)絡(luò)程序的阻塞模型。
針對(duì)模型中的關(guān)鍵函數(shù)進(jìn)行掛鉤,并針對(duì)掛鉤后函數(shù),定制特殊的執(zhí)行語(yǔ)義,當(dāng)系統(tǒng)執(zhí)行到模型的節(jié)點(diǎn)函數(shù)時(shí)將觸發(fā)定制的操作,啟動(dòng)符號(hào)執(zhí)行過(guò)程。如圖5所示,針對(duì)程序運(yùn)行過(guò)程中數(shù)據(jù)接收、處理的關(guān)鍵函數(shù)的調(diào)用點(diǎn)和返回點(diǎn)進(jìn)行掛鉤,從而實(shí)現(xiàn)針對(duì)該模型下網(wǎng)絡(luò)程序的漏洞檢測(cè),提高檢測(cè)過(guò)程和實(shí)際程序代碼的貼合率。
圖4 阻塞通信模型Fig.4 Blocking communication model
圖5 阻塞通信模型執(zhí)行模塊部分代碼Fig.5 Part of execution module code of blocking communication model
select類網(wǎng)絡(luò)程序是網(wǎng)絡(luò)程序發(fā)展過(guò)程中實(shí)現(xiàn)的第1種非阻塞網(wǎng)絡(luò)程序,該類程序基于單進(jìn)程實(shí)現(xiàn),但其在阻塞類程序的基礎(chǔ)上實(shí)現(xiàn)了多套接字管理。通過(guò)程序分析發(fā)現(xiàn),在該類程序中select函數(shù)負(fù)責(zé)了套接字的申請(qǐng)、分配和調(diào)度,因此在模型建立過(guò)程中重點(diǎn)對(duì)select及其附屬函數(shù)進(jìn)行執(zhí)行監(jiān)控和漏洞檢測(cè)。定制select_call_hook()的掛鉤語(yǔ)義對(duì)readfds(檢查可讀性)、writefds(檢查可寫性)、exceptfds(檢查錯(cuò)誤)等敏感變量進(jìn)行符號(hào)化,通過(guò)收集該符號(hào)變?cè)趫?zhí)行過(guò)程中的路徑約束,監(jiān)控該變量的傳播過(guò)程。針對(duì)執(zhí)行過(guò)程中涉及權(quán)限檢查的部分進(jìn)行重點(diǎn)監(jiān)控,因?yàn)樵摬糠滞浅绦虼a的高危區(qū)域之一。針對(duì)select函數(shù)執(zhí)行點(diǎn)進(jìn)行掛鉤如下:
int select
(
int nfds,
fd_set* readfds,
fd_set* writefds,
fd_set* exceptfds,
const struct timeval* timeout
);
如圖6所示,當(dāng)有網(wǎng)絡(luò)事件發(fā)生時(shí),socket函數(shù)會(huì)建立對(duì)應(yīng)的套接字處理接口,select函數(shù)會(huì)修改對(duì)應(yīng)套接字接口的相關(guān)屬性,將套接字句柄添加到對(duì)應(yīng)的屬性集合之中,從而賦予新的套接字接口新的權(quán)限。據(jù)此分析,程序代碼在該位置存在多次調(diào)用和反復(fù)的修改,在執(zhí)行點(diǎn)掛鉤的基礎(chǔ)上,通過(guò)定制select_ret_hook()的掛鉤語(yǔ)義,檢查select函數(shù)的返回值和該值的傳遞路徑,判斷是否存在脆弱節(jié)點(diǎn)。
圖6 select模型執(zhí)行過(guò)程Fig.6 select model execution process
IOCP類程序基于多線程并行處理器完成網(wǎng)絡(luò)程序客戶端的服務(wù)請(qǐng)求,該類網(wǎng)絡(luò)程序運(yùn)行后會(huì)預(yù)先創(chuàng)造提供服務(wù)的線程池,與在接受請(qǐng)求時(shí)創(chuàng)建線程相比效率更高,Apache等高性能商業(yè)服務(wù)器程序均采用該架構(gòu)進(jìn)行開發(fā)。通過(guò)模型分析發(fā)現(xiàn),在運(yùn)行過(guò)程中,該類網(wǎng)絡(luò)程序采取兩類線程并行的方式:主線程負(fù)責(zé)監(jiān)聽和創(chuàng)造任務(wù)線程,并完成接口關(guān)聯(lián)等操作;任務(wù)線程負(fù)責(zé)處理用戶請(qǐng)求,為用戶提供服務(wù)。任務(wù)線程處理請(qǐng)求過(guò)程中為接收用戶數(shù)據(jù)申請(qǐng)的緩沖區(qū),該類內(nèi)存空間操作往往是程序代碼存在漏洞的高危區(qū)域,需要重點(diǎn)進(jìn)行程序運(yùn)行監(jiān)控和代碼分析,具體如下:
……
#define BUFFER_SIZE 1024
typedef struct _PER_HANDLE_DATA
{
SOCKET s;
sockaddr_in addr;
} PER_HANDLE_DATA, *PPER_HANDLE_DATA;
typedef struct _PER_IO_DATA
{
OVERLAPPED ol;
char buf[BUFFER_SIZE];
int nOperationType;
} PER_IO_DATA, *PPER_IO_DATA;
……
針對(duì)該類網(wǎng)絡(luò)程序進(jìn)行建模,抽取了從服務(wù)連接建立到終止過(guò)程中的關(guān)鍵函數(shù),同時(shí)作為該模型核心,對(duì)GetQueuedCompletionStatus()函數(shù)的執(zhí)行點(diǎn)進(jìn)行掛鉤,并定制特殊的函數(shù)執(zhí)行語(yǔ)義。事件發(fā)生后I/O系統(tǒng)會(huì)向完成端口對(duì)象發(fā)送完整消息通知,GetQueuedCompletionStatus()函數(shù)會(huì)按照順序優(yōu)先級(jí)的方式讀取隊(duì)列封包,通信過(guò)程每一個(gè)連接的相關(guān)輸入和參數(shù)見下文代碼,此時(shí)針對(duì)如lpNumberOfBytes等危險(xiǎn)區(qū)域或變量進(jìn)行執(zhí)行監(jiān)視,則有可能得到觸發(fā)程序崩潰的漏洞點(diǎn)。
BOOL GetQueuedCompletionStatus
(
HANDLE CompletionPort,
LPDWORD lpNumberOfBytes,
PULONG_PTR lpCompletionKey,
LPOVERLAPPED* lpOverlapped,
DWORD dwMilliseconds
);
本文提出了一種基于程序建模的網(wǎng)絡(luò)程序漏洞檢測(cè)技術(shù),并利用該技術(shù)實(shí)現(xiàn)了一套多模型網(wǎng)絡(luò)程序漏洞檢測(cè)系統(tǒng)。系統(tǒng)共分為4個(gè)模塊:目標(biāo)模型識(shí)別模塊、網(wǎng)絡(luò)程序模型模塊、網(wǎng)絡(luò)程序漏洞檢測(cè)模塊、漏洞記錄模塊。圖7所示為該原型系統(tǒng)的架構(gòu)。
圖7 系統(tǒng)原型架構(gòu)Fig.7 System prototype architecture
檢測(cè)過(guò)程主要分為以下5步:
1) 目標(biāo)程序傳入檢測(cè)系統(tǒng)后,目標(biāo)模型識(shí)別模塊會(huì)對(duì)目標(biāo)程序所屬的網(wǎng)絡(luò)程序類型進(jìn)行判斷,并從網(wǎng)絡(luò)程序模型模塊中調(diào)用相應(yīng)模型的子模塊。同時(shí),將目標(biāo)程序傳入檢測(cè)運(yùn)行環(huán)境中(QEMU虛擬機(jī))。
2) 網(wǎng)絡(luò)程序模型模塊會(huì)將對(duì)應(yīng)模型子模塊的調(diào)用信號(hào)發(fā)送給網(wǎng)絡(luò)程序漏洞檢測(cè)模塊,同時(shí)啟動(dòng)漏洞檢測(cè)過(guò)程。
3) 針對(duì)目標(biāo)程序進(jìn)行檢測(cè),并記錄不同路徑的約束條件,如果碰到程序崩潰則記錄到達(dá)對(duì)應(yīng)崩潰點(diǎn)的約束條件集。
4) 將能夠到達(dá)崩潰點(diǎn)的約束集交給約束求解器進(jìn)行求解,將結(jié)果發(fā)送給漏洞記錄模塊。
5) 漏洞記錄模塊記錄崩潰點(diǎn)的相關(guān)信息和導(dǎo)致崩潰的具體輸入。
該系統(tǒng)基于S2E框架進(jìn)行開發(fā),采用了模塊化的組成方式,最初版本的系統(tǒng)僅包含阻塞類模型,通過(guò)后期開發(fā)已經(jīng)拓展到了4種主流模型。原型系統(tǒng)采用“系統(tǒng)-功能模塊-子模塊”的三級(jí)結(jié)構(gòu)設(shè)置。系統(tǒng)會(huì)判定程序所屬的模型,并根據(jù)模型種類調(diào)用相應(yīng)模型的漏洞檢測(cè)子模塊進(jìn)行漏洞檢測(cè)過(guò)程,調(diào)用記錄模塊對(duì)相應(yīng)的脆弱點(diǎn)進(jìn)行分類和記錄,全系統(tǒng)能夠針對(duì)目標(biāo)網(wǎng)絡(luò)程序?qū)崿F(xiàn)自動(dòng)化的漏洞檢測(cè)過(guò)程。
本文以QEMU虛擬機(jī)下WindowsXP-SP3操作系統(tǒng)為測(cè)試環(huán)境進(jìn)行實(shí)驗(yàn),實(shí)驗(yàn)環(huán)境配置如表1所示。
實(shí)驗(yàn)過(guò)程分為兩部分進(jìn)行,首先針對(duì)每種類型的網(wǎng)絡(luò)程序編寫了較為簡(jiǎn)單的測(cè)試用例,并針對(duì)各類測(cè)試用例進(jìn)行試驗(yàn)。實(shí)驗(yàn)結(jié)果證明原型系統(tǒng)可以穩(wěn)定運(yùn)行,并針對(duì)不同類型的網(wǎng)絡(luò)程序進(jìn)行漏洞檢測(cè)。
其次,從CVE漏洞庫(kù)中選擇了2個(gè)已知漏洞作為實(shí)驗(yàn)對(duì)象,這2個(gè)漏洞均存在于商業(yè)化網(wǎng)絡(luò)程序Tftpd32中,該程序軟件基于TCP通信協(xié)議開發(fā),能夠?qū)崿F(xiàn)數(shù)據(jù)文件的發(fā)送和接收,結(jié)果如表2所示。
如圖8所示,通過(guò)QEMU監(jiān)視器可以看到,系統(tǒng)能夠識(shí)別操作系統(tǒng)版本,并定位到Tftpd32運(yùn)行過(guò)程中需要調(diào)用的系統(tǒng)函數(shù),實(shí)現(xiàn)對(duì)程序調(diào)用函數(shù)的掛鉤和監(jiān)控。此時(shí),啟動(dòng)客戶端程序和服務(wù)器端建立連接,并向服務(wù)器發(fā)送數(shù)據(jù)??梢园l(fā)現(xiàn)服務(wù)器端接收到網(wǎng)絡(luò)數(shù)據(jù)后會(huì)觸發(fā)掛鉤函數(shù)的語(yǔ)義內(nèi)容,系統(tǒng)針對(duì)本次輸入啟動(dòng)選擇性符號(hào)執(zhí)行過(guò)程。
如圖9所示,服務(wù)器端針對(duì)符號(hào)執(zhí)行過(guò)程的路徑約束進(jìn)行收集,對(duì)分支節(jié)點(diǎn)的自身狀態(tài)進(jìn)行保存。同時(shí),向客戶端發(fā)送指令,要求其保存對(duì)應(yīng)執(zhí)行節(jié)點(diǎn)下的狀態(tài)信息。
通過(guò)客戶端的QEMU監(jiān)視器可以看到以服務(wù)器端為中心的漏洞檢測(cè)過(guò)程。通過(guò)圖10可看 出,系統(tǒng)執(zhí)行到了服務(wù)器端程序某一路徑的終點(diǎn)需要回溯到上一分支節(jié)點(diǎn),此時(shí),服務(wù)器端通過(guò)指令成功使客戶端恢復(fù)到了相同節(jié)點(diǎn)狀態(tài)。
表1 實(shí)驗(yàn)環(huán)境配置Table 1 Experimental environment configuration
表2 實(shí)驗(yàn)結(jié)果Table 2 Experimental result
圖8 實(shí)現(xiàn)函數(shù)掛鉤Fig.8 Function hook realization
圖9 服務(wù)器端符號(hào)執(zhí)行過(guò)程Fig.9 Symbolic execution process of server
圖10 客戶端狀態(tài)保存及回置Fig.10 Client state savinges and restoringes
通過(guò)穩(wěn)定的實(shí)驗(yàn)測(cè)試過(guò)程,系統(tǒng)能夠檢測(cè)到針對(duì)Tftpd32的2款漏洞。為了驗(yàn)證系統(tǒng)的穩(wěn)定性,在平臺(tái)上對(duì)測(cè)試目標(biāo)進(jìn)行了500次重復(fù)試驗(yàn)驗(yàn)證,其中464次實(shí)驗(yàn)正確探索到了2種程序缺陷所在的執(zhí)行位置,25次實(shí)驗(yàn)探測(cè)到了CVE-2006-6141缺陷所在位置,11次執(zhí)行產(chǎn)生了誤報(bào),反饋了無(wú)異常點(diǎn)的信息,整體性能較穩(wěn)定。誤報(bào)率和漏報(bào)率較低。
1) 系統(tǒng)針對(duì)網(wǎng)絡(luò)程序各模型的漏洞檢測(cè)進(jìn)行了可行性拓展,能夠適應(yīng)現(xiàn)階段約85%的網(wǎng)絡(luò)程序目標(biāo),針對(duì)另外2種模型的適配也在進(jìn)一步開發(fā)之中。
2) 相比于本文中提到的幾款漏洞檢測(cè)系統(tǒng),本系統(tǒng)對(duì)C/S架構(gòu)下網(wǎng)絡(luò)程序漏洞檢測(cè)的針對(duì)性更強(qiáng),代碼覆蓋率更高,通過(guò)對(duì)不同模型網(wǎng)絡(luò)程序的針對(duì)性開發(fā),目標(biāo)區(qū)域函數(shù)代碼的覆蓋率可以提高到90%以上。
3) 針對(duì)目標(biāo)程序所屬模型的判斷雖然增加了系統(tǒng)的開銷,但在后期的檢測(cè)過(guò)程中可以提高檢測(cè)效率和漏洞發(fā)現(xiàn)的準(zhǔn)確率。
4) STP約束求解器為本系統(tǒng)提供了符號(hào)化支撐和求解,該求解器能夠針對(duì)非浮點(diǎn)數(shù)計(jì)算類指令進(jìn)行求解分析。
5) 漏洞信息的記錄和導(dǎo)出采取了文本記錄的方式,隨著實(shí)驗(yàn)的推進(jìn),實(shí)驗(yàn)?zāi)繕?biāo)和漏洞信息不斷增多,在后期的開發(fā)中將結(jié)合數(shù)據(jù)庫(kù)技術(shù)思想添加數(shù)據(jù)管理模塊,對(duì)漏洞信息進(jìn)行數(shù)據(jù)庫(kù)管理。
為提高本系統(tǒng)的實(shí)用性和檢測(cè)效果,下一步開發(fā)將重點(diǎn)進(jìn)行網(wǎng)絡(luò)程序模型的探索和構(gòu)建,進(jìn)一步增強(qiáng)該系統(tǒng)的普適性,同時(shí),進(jìn)行針對(duì)大型網(wǎng)絡(luò)程序軟件的檢測(cè)實(shí)驗(yàn)。