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