基于二進(jìn)制程序的漏洞挖掘方法及裝置制造方法
【專利摘要】本申請公開了基于二進(jìn)制程序的漏洞挖掘方法及裝置,其中,所述方法包括:在目標(biāo)程序執(zhí)行過程中,確定需要進(jìn)行鏡像的目標(biāo)點(diǎn);暫停所述目標(biāo)程序的執(zhí)行,并對所述目標(biāo)點(diǎn)對應(yīng)時刻的進(jìn)程狀態(tài)進(jìn)行鏡像;鏡像創(chuàng)建完成后,恢復(fù)所述目標(biāo)程序的執(zhí)行,并通過符號執(zhí)行求解新的污點(diǎn)數(shù)據(jù);得到新的污點(diǎn)數(shù)據(jù)后,先利用鏡像過程保存的信息對進(jìn)程空間進(jìn)行恢復(fù),再利用求解得到的新的污點(diǎn)數(shù)據(jù)替換原有污點(diǎn)數(shù)據(jù)后輸入到所述目標(biāo)程序中,以便從所述目標(biāo)點(diǎn)開始繼續(xù)迭代執(zhí)行。通過本申請,能夠減少執(zhí)行軌跡中重復(fù)出現(xiàn)的部分,提高漏洞挖掘的效率。
【專利說明】基于二進(jìn)制程序的漏洞挖掘方法及裝置
【技術(shù)領(lǐng)域】
[0001]本申請涉及應(yīng)用程序漏洞挖掘【技術(shù)領(lǐng)域】,特別涉及基于二進(jìn)制程序的漏洞挖掘方法及裝置。
【背景技術(shù)】
[0002]隨著計(jì)算機(jī)在國民經(jīng)濟(jì)和國防建設(shè)各個領(lǐng)域的廣泛應(yīng)用,作為信息系統(tǒng)只能載體的計(jì)算機(jī)軟件的安全性變得尤為重要。軟件安全漏洞已經(jīng)成為信息安全風(fēng)險的主要根源之一。由于軟件安全漏洞的危害性、多樣性和廣泛性,在當(dāng)前網(wǎng)絡(luò)空間的各種博弈行為中,漏洞被各方所積極關(guān)注。如何有效的發(fā)現(xiàn)漏洞、消除或減少漏洞對社會生活、國家信息安全等的負(fù)面影響,即漏洞挖掘和防護(hù)工作已經(jīng)成為信息安全領(lǐng)域的研究重點(diǎn)。
[0003]面向源程序的漏洞挖掘研究歷史已經(jīng)比較悠久,并取得顯著進(jìn)步。然而處于商業(yè)利益、知識產(chǎn)權(quán)保護(hù)等原因,大部分軟件廠商不對外提供源程序;有些廠商雖然提供了源程序,但源程序和實(shí)際系統(tǒng)之間的對應(yīng)關(guān)系無從驗(yàn)證。另外,源程序級的漏洞分析也無法發(fā)現(xiàn)編譯、鏈接過程引入的漏洞。因此,直接面向二進(jìn)制程序的安全漏洞挖掘研究具有重要的意義。
[0004]針對面向二進(jìn)制程序的漏洞挖掘,業(yè)界主要有靜態(tài)挖掘和動態(tài)挖掘兩個大類。然而,面向二進(jìn)制程序的安全漏洞挖掘面臨更多的挑戰(zhàn)。一方面,靜態(tài)挖掘以漏洞模型為指導(dǎo),運(yùn)用程序靜態(tài)分析技術(shù)發(fā)現(xiàn)程序中安全問題,但是,對于復(fù)雜機(jī)理的安全漏洞,基于靜態(tài)程序分析的漏洞挖掘誤報率高,往往需要大量人工分析來驗(yàn)證挖掘結(jié)果的正確性,這嚴(yán)重制約了靜態(tài)挖掘技術(shù)的應(yīng)用范圍。
[0005]基于動態(tài)分析的二進(jìn)制漏洞挖掘方法,利用程序運(yùn)行時的信息進(jìn)行漏洞挖掘,其本質(zhì)是通過真實(shí)遍歷程序狀態(tài)空間,檢測程序執(zhí)行過程中是否會違背特定安全屬性。由于利用運(yùn)行時的信息,因此,得到的分析結(jié)果均為真實(shí)、有效、可重現(xiàn)的。然而,基于動態(tài)分析的二進(jìn)制漏洞挖掘方法依賴于兩大技術(shù)問題:污點(diǎn)分析和路徑遍歷。早期的動態(tài)漏洞挖掘方法使用大量隨機(jī)產(chǎn)生的畸形樣本來對目標(biāo)程序進(jìn)行模糊測試。模糊測試不僅效率低下,而且效果不明顯。其原因有兩個,其一就是,這些畸形樣本的產(chǎn)生完全依靠的是既有的規(guī)貝U,沒有對目標(biāo)程序進(jìn)行深入的學(xué)習(xí)分析,導(dǎo)致其中相當(dāng)大比例的處理流程都一樣;其二是,模糊測試僅僅側(cè)重于樣本的產(chǎn)生,對于樣本中的數(shù)據(jù)(稱為污點(diǎn)數(shù)據(jù))在目標(biāo)程序處理的流程及污點(diǎn)數(shù)據(jù)之間的關(guān)系是不關(guān)心的。
[0006]路徑遍歷是通過符號執(zhí)行的方法來實(shí)現(xiàn)的。程序運(yùn)行過程就是函數(shù)調(diào)用的過程,每個函數(shù)都是由很多條指令組成的,這些指令中有一些特殊的指令:跳轉(zhuǎn)指令。X86匯編中就是類似JMP、JZ、JNZ等的跳轉(zhuǎn)指令。這些指令在執(zhí)行過程中由于受外部輸入的污點(diǎn)數(shù)據(jù)的影響會跳轉(zhuǎn)到不同的目的地址繼續(xù)執(zhí)行。而多次的跳轉(zhuǎn)就可以形成一條跳轉(zhuǎn)路徑,程序中會有很多條這種跳轉(zhuǎn)路徑。任意一條的執(zhí)行路徑下都有可能有潛在的安全漏洞,如果應(yīng)用程序在某條路徑上運(yùn)行時,出現(xiàn)了崩潰、信息泄漏等現(xiàn)象,則該路徑下就可能存在安全漏洞。因此,為了最大限度的發(fā)掘程序中的安全漏洞,就需要對程序的執(zhí)行路徑進(jìn)行最大限度的遍歷。
[0007]在輸入的污點(diǎn)數(shù)據(jù)已經(jīng)確定的情況下,程序的執(zhí)行路徑也就已經(jīng)唯一確定,但是,唯一的一條執(zhí)行路徑確定的情況下,其輸入的污點(diǎn)數(shù)據(jù)卻有可能有很多種。符號執(zhí)行的目的就是,通過一次執(zhí)行完畢后,使用根據(jù)程序的執(zhí)行路徑的符號表達(dá),求解出代表另外一條新的執(zhí)行路徑的污點(diǎn)數(shù)據(jù)集。
[0008]如上所述,符號執(zhí)行的目的是求解得出新的污點(diǎn)數(shù)據(jù)集,然后回到程序的污點(diǎn)數(shù)據(jù)的引入指令處繼續(xù)迭代執(zhí)行,直到?jīng)]有新的路徑產(chǎn)生為止。也就是說,在初始狀態(tài)下,應(yīng)用程序根據(jù)原始輸入數(shù)據(jù)在某條路徑下運(yùn)行,此時,就可以對程序運(yùn)行過程中的每個指令進(jìn)行符號執(zhí)行,得到一條新的路徑,并構(gòu)造出新的污點(diǎn)數(shù)據(jù),接下來就可以將新的污點(diǎn)數(shù)據(jù)輸入到程序中,該程序就會在該新的路徑下運(yùn)行,然后監(jiān)控該路徑下是否存在安全漏洞,同時也進(jìn)行新一輪的符號執(zhí)行,求解新的污點(diǎn)數(shù)據(jù),直到?jīng)]有新的路徑產(chǎn)生。利用符號執(zhí)行,能夠在復(fù)雜的數(shù)據(jù)依賴關(guān)系中發(fā)現(xiàn)數(shù)據(jù)本質(zhì)的約束關(guān)系,而且符號執(zhí)行精確記錄了路徑的約束條件,有利于實(shí)現(xiàn)對應(yīng)用程序執(zhí)行過程中各種可能的路徑的遍歷。
[0009]但是,這種實(shí)現(xiàn)方式仍然至少存在以下問題:每次符號執(zhí)行的過程中存在相當(dāng)大的重復(fù)操作的情況(例如,每次都需要重新打開某文件等等),漏洞挖掘的效果受到影響。
【發(fā)明內(nèi)容】
[0010]本申請?zhí)峁┝嘶诙M(jìn)制程序的漏洞挖掘方法及裝置,能夠減少執(zhí)行軌跡中重復(fù)出現(xiàn)的部分,提高漏洞挖掘的效率。
[0011]本申請?zhí)峁┝巳缦路桨?
[0012]一種基于二進(jìn)制程序的漏洞挖掘方法,包括:
[0013]在目標(biāo)程序執(zhí)行過程中,確定需要進(jìn)行鏡像的目標(biāo)點(diǎn);
[0014]暫停所述目標(biāo)程序的執(zhí)行,并對所述目標(biāo)點(diǎn)對應(yīng)時刻的進(jìn)程狀態(tài)進(jìn)行鏡像;
[0015]鏡像創(chuàng)建完成后,恢復(fù)所述目標(biāo)程序的執(zhí)行,并通過符號執(zhí)行求解新的污點(diǎn)數(shù)據(jù);
[0016]得到新的污點(diǎn)數(shù)據(jù)后,先利用鏡像過程保存的信息對進(jìn)程空間進(jìn)行恢復(fù),再利用求解得到的新的污點(diǎn)數(shù)據(jù)替換原有污點(diǎn)數(shù)據(jù)后輸入到所述目標(biāo)程序中,以便從所述目標(biāo)點(diǎn)開始繼續(xù)迭代執(zhí)行。
[0017]一種基于二進(jìn)制程序的漏洞挖掘裝置,包括:
[0018]目標(biāo)點(diǎn)確定單元,用于在目標(biāo)程序執(zhí)行過程中,確定需要進(jìn)行鏡像的目標(biāo)點(diǎn);
[0019]鏡像創(chuàng)建單元,用于暫停所述目標(biāo)程序的執(zhí)行,并對所述目標(biāo)點(diǎn)對應(yīng)時刻的進(jìn)程狀態(tài)進(jìn)行鏡像;
[0020]符號執(zhí)行單元,用于鏡像創(chuàng)建完成后,恢復(fù)所述目標(biāo)程序的執(zhí)行,并通過符號執(zhí)行求解新的污點(diǎn)數(shù)據(jù);
[0021]進(jìn)程恢復(fù)單元,用于得到新的污點(diǎn)數(shù)據(jù)后,先利用鏡像過程保存的信息對進(jìn)程空間進(jìn)行恢復(fù),再利用求解得到的新的污點(diǎn)數(shù)據(jù)替換原有污點(diǎn)數(shù)據(jù)后輸入到所述目標(biāo)程序中,以便從所述目標(biāo)點(diǎn)開始繼續(xù)迭代執(zhí)行。
[0022]根據(jù)本申請?zhí)峁┑木唧w實(shí)施例,本申請公開了以下技術(shù)效果:
[0023]通過本申請實(shí)施例,可以在目標(biāo)程序執(zhí)行過程中的某個目標(biāo)點(diǎn)處創(chuàng)建鏡像,之后在每次迭代過程獲取到新的污點(diǎn)數(shù)據(jù)之后,并不是直接將新的污點(diǎn)數(shù)據(jù)輸入到目標(biāo)程序中,而是首先利用鏡像過程保存的信息對進(jìn)程空間進(jìn)行恢復(fù),也即,相當(dāng)于直接使得進(jìn)程達(dá)到之前進(jìn)行鏡像的目標(biāo)點(diǎn)處,而不用重新從入口處開始執(zhí)行。完成進(jìn)行空間的恢復(fù)之后,再用新的污點(diǎn)數(shù)據(jù)替換原污點(diǎn)數(shù)據(jù),并輸入到目標(biāo)程序中,接下來就可以觸發(fā)下一次的符號執(zhí)行迭代,這使得新的符號執(zhí)行迭代過程可以從該目標(biāo)點(diǎn)開始,而不是目標(biāo)程序的入口處,從而可以減少執(zhí)行軌跡中重復(fù)出現(xiàn)的部分,提高漏洞挖掘的效率。
[0024]另外,如果存在需要人工干預(yù)的情況,可以將進(jìn)行鏡像的目標(biāo)點(diǎn)設(shè)置在人工干預(yù)之后,這樣可以使得后續(xù)的符號執(zhí)行過程復(fù)用之前的人工干預(yù)結(jié)果,不需要在每次符號執(zhí)行時都進(jìn)行人工干預(yù),提高自動化程度。
[0025]對于類似網(wǎng)絡(luò)收包之后才進(jìn)行污點(diǎn)數(shù)據(jù)引入的情況,可以通過進(jìn)程狀態(tài)鏡像的方法,在收到特定數(shù)據(jù)包后,建立鏡像,隨后符號執(zhí)行并求得污點(diǎn)數(shù)據(jù)之后,先將進(jìn)程恢復(fù)到接收到特定數(shù)據(jù)包之后的狀態(tài),然后再將新的污點(diǎn)數(shù)據(jù)輸入到目標(biāo)程序,這樣就可以回到開始收包的指令地址開始處理。
[0026]當(dāng)然,實(shí)施本申請的任一產(chǎn)品并不一定需要同時達(dá)到以上所述的所有優(yōu)點(diǎn)。
【專利附圖】
【附圖說明】
[0027]為了更清楚地說明本申請實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對實(shí)施例中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本申請的一些實(shí)施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
[0028]圖1是本申請實(shí)施例提供的方法的流程圖;
[0029]圖2是本申請實(shí)施例提供的裝置的示意圖。
【具體實(shí)施方式】
[0030]下面將結(jié)合本申請實(shí)施例中的附圖,對本申請實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例僅僅是本申請一部分實(shí)施例,而不是全部的實(shí)施例。基于本申請中的實(shí)施例,本領(lǐng)域普通技術(shù)人員所獲得的所有其他實(shí)施例,都屬于本申請保護(hù)的范圍。
[0031 ] 為了便于理解本申請實(shí)施例,下面首先對幾個概念進(jìn)行簡單地介紹。
[0032]基于路徑遍歷的動態(tài)漏洞挖掘?qū)嶋H采用的是污點(diǎn)數(shù)據(jù)傳播分析的思想,主要在于監(jiān)控所謂的“不可信數(shù)據(jù)”,也即污點(diǎn)數(shù)據(jù)的傳播軌跡。污點(diǎn)數(shù)據(jù)通常來源于用戶輸入,包括命令行參數(shù)、圖形界面交互數(shù)據(jù)、文件數(shù)據(jù)、網(wǎng)絡(luò)通信數(shù)據(jù)以及系統(tǒng)環(huán)境變量等幾種類型。
[0033]污點(diǎn)數(shù)據(jù):也稱半有效的數(shù)據(jù)或文件,基于路徑的遍歷就是以半有效的數(shù)據(jù)或文件作為應(yīng)用程序的輸入。所謂的半有效的數(shù)據(jù)或文件是指對于某應(yīng)用程序來說,數(shù)據(jù)的大部分?jǐn)?shù)據(jù)段或者文件的大部分標(biāo)識段是有效的,這樣程序就會認(rèn)為這是一個有效的數(shù)據(jù)或文件,但是數(shù)據(jù)或文件的其他部分是無效的,它是依據(jù)安全漏洞挖掘方案進(jìn)行構(gòu)造的,應(yīng)用程序在處理這種畸形數(shù)據(jù)或文件的時候,就可能觸發(fā)某種安全漏洞,常常表現(xiàn)為應(yīng)用程序發(fā)生崩潰或者造成信息的泄漏或者發(fā)生延遲等。
[0034]符號執(zhí)行:采用抽象符號代替程序遍歷,根據(jù)程序的定義,在每條路徑上通過符號計(jì)算引擎對抽象符號做等語義操作,模擬程序執(zhí)行。采用符號執(zhí)行的好處在于,能夠發(fā)現(xiàn)變量之間代數(shù)運(yùn)算關(guān)系,便于理解程序的內(nèi)在邏輯,在漏洞挖掘時,有利于在復(fù)雜的數(shù)據(jù)依賴關(guān)系中發(fā)現(xiàn)數(shù)據(jù)本質(zhì)的約束關(guān)系,而且符號執(zhí)行精確記錄了路徑的約束條件,可以進(jìn)一步用于判斷路徑可行性和路徑約束的完備性。動態(tài)符號執(zhí)行是從傳統(tǒng)符號執(zhí)行衍生的分析方法,輸入具體值并模擬程序的執(zhí)行,同時從分支語句中搜集符號約束。一次分析結(jié)束后,用約束求解器求解上次執(zhí)行獲得的符號約束,得到新的輸入值。動態(tài)符號執(zhí)行以具體輸入值來驅(qū)動下一輪分析。
[0035]也就是說,在基于路徑遍歷的動態(tài)漏洞挖掘方案中,需要多次向目標(biāo)程序輸入污點(diǎn)數(shù)據(jù),使得目標(biāo)程序在各種可能的路徑下運(yùn)行,以便分別判斷各條路徑上是否存在安全漏洞。其中,對于每次輸入的污點(diǎn)數(shù)據(jù),可以通過符號執(zhí)行來進(jìn)行求解構(gòu)造。符號執(zhí)行就是根據(jù)程序當(dāng)前運(yùn)行過程中執(zhí)行的指令,獲得程序執(zhí)行過程中的路徑約束關(guān)系,求解出一條新的路徑,進(jìn)而根據(jù)路徑約束條件反向求解出新的路徑下的污點(diǎn)數(shù)據(jù),這樣,在將該新求解出的污點(diǎn)數(shù)據(jù)輸入到目標(biāo)程序時,目標(biāo)程序就會在該新的路徑下執(zhí)行,進(jìn)而就可以監(jiān)測在該新的路徑上是否存在安全漏洞。
[0036]本申請的發(fā)明人發(fā)現(xiàn),現(xiàn)有技術(shù)中在符號執(zhí)行的迭代過程中,每次迭代都需要從目標(biāo)程序的程序入口處開始執(zhí)行。這也就導(dǎo)致每次的執(zhí)行軌跡中有相當(dāng)大的部分是重復(fù)的。不僅如此,在遇到某些需要人工干預(yù)(比如點(diǎn)擊按鈕等)才能繼續(xù)往下執(zhí)行的情況下,每次符號執(zhí)行都需要人工干預(yù)一次,漏洞挖掘的自動化程度比較低。另外,有些情況下需要在類似網(wǎng)絡(luò)收包后才能進(jìn)行符號執(zhí)行的污點(diǎn)數(shù)據(jù)引入,這樣,如果按照該現(xiàn)有技術(shù),由于每次都需要回到程序入口處開始執(zhí)行,因此即便根據(jù)符號執(zhí)行求得了污點(diǎn)數(shù)據(jù),也無法準(zhǔn)確返回到開始的處理流程起始點(diǎn),因?yàn)榫W(wǎng)絡(luò)發(fā)收包是無序的。
[0037]另外,發(fā)明人還發(fā)現(xiàn),對于一個目標(biāo)程序而言,在運(yùn)行過程中,一般都會存在一個點(diǎn),在各個不同的路徑下,從程序入口開始到這個點(diǎn),執(zhí)行的軌跡都是相同的。因此,如果使得符號執(zhí)行每次都從這個點(diǎn)開始迭代,則可以避免執(zhí)行軌跡中大量重復(fù)部分的出現(xiàn),提高漏洞挖掘的效率。并且,如果到這個點(diǎn)之前已經(jīng)進(jìn)行了人工干預(yù),則可以直接將之前人工干預(yù)的結(jié)果帶入到后續(xù)的迭代過程中,從而避免每次符號執(zhí)行過程都需要進(jìn)人工干預(yù),提高自動化程度。再者,如果這個點(diǎn)恰好在收到某數(shù)據(jù)包時,則如果以后的迭代過程需要從收到該數(shù)據(jù)包時開始,則可以直接將新構(gòu)造出的污點(diǎn)數(shù)據(jù)從該點(diǎn)導(dǎo)入到目標(biāo)程序中。本申請實(shí)施例就是基于上述考慮,提供了一種新的漏洞挖掘方法,以便對現(xiàn)有的基于路徑遍歷的動態(tài)漏洞挖掘方法進(jìn)行改進(jìn),下面進(jìn)行詳細(xì)地介紹。
[0038]參見圖1,本申請實(shí)施例提供的基于二進(jìn)制程序的漏洞挖掘方法具體可以包括以下步驟:
[0039]SlOl:在目標(biāo)程序執(zhí)行過程中,確定需要進(jìn)行鏡像的目標(biāo)點(diǎn);
[0040]在本申請實(shí)施例中,可以在目標(biāo)程序運(yùn)行的過程中,在一些關(guān)鍵的目標(biāo)點(diǎn)上對進(jìn)程狀態(tài)進(jìn)行鏡像,這樣后續(xù)在獲取到新的污點(diǎn)數(shù)據(jù)時,就可以根據(jù)鏡像的數(shù)據(jù)恢復(fù)進(jìn)程空間,然后再將新的污點(diǎn)數(shù)據(jù)輸入到目標(biāo)程序,這樣就可以從該目標(biāo)點(diǎn)開始進(jìn)行符號執(zhí)行,而不需要從程序的入口處開始執(zhí)行。其中,可以通過snapshot的方式進(jìn)行鏡像。所謂snapshot是指以進(jìn)程某一個運(yùn)行時刻(CONTEXT)為點(diǎn),對當(dāng)前時刻進(jìn)程的狀態(tài),包括內(nèi)存狀態(tài)、文件操作、內(nèi)核對象等進(jìn)行鏡像,并且,后續(xù)進(jìn)程運(yùn)行不會影響這個鏡像,即為進(jìn)程的一個 snapshot ο
[0041]需要說明的是,由于后續(xù)的符號執(zhí)行都需要從進(jìn)行鏡像的點(diǎn)開始執(zhí)行,因此,在選擇需要進(jìn)行鏡像的點(diǎn)時,可滿足以下條件:目標(biāo)程序在各種不同路徑下運(yùn)行時,從程序入口點(diǎn)到需要進(jìn)行鏡像的目標(biāo)點(diǎn)的運(yùn)行軌跡相同。具體實(shí)現(xiàn)時,還可以結(jié)合目標(biāo)程序的實(shí)際情況,選擇需要進(jìn)行鏡像的目標(biāo)點(diǎn)。例如,可以在目標(biāo)程序執(zhí)行過程中,監(jiān)控是否存在需關(guān)注的污點(diǎn)數(shù)據(jù)類型被引入,如果是,則將污點(diǎn)數(shù)據(jù)被引入的時刻確定為需要進(jìn)行鏡像的目標(biāo)點(diǎn)。這樣,后續(xù)每次獲取到新的污點(diǎn)數(shù)據(jù)之后,就可以都從這個目標(biāo)點(diǎn)開始進(jìn)行符號執(zhí)行,而不需要再重復(fù)執(zhí)行從程序入口到該目標(biāo)點(diǎn)的過程。其中,具體實(shí)現(xiàn)時,可以根據(jù)既有的策略文件判斷那些污點(diǎn)數(shù)據(jù)需要被符號執(zhí)行,判斷的依據(jù)可以是根據(jù)污點(diǎn)數(shù)據(jù)類型可能引起安全漏洞的可能性確定。在確定策略后,根據(jù)執(zhí)行過程中的指令判斷是否符合策略文件的定義,如果符合則認(rèn)為污點(diǎn)數(shù)據(jù)已經(jīng)被引入,然后就可以對進(jìn)程狀態(tài)進(jìn)行鏡像。
[0042]另外,如果某目標(biāo)程序在執(zhí)行過程中需要人工干預(yù),則可以將進(jìn)行了人工干預(yù)之后的時刻確定為需要進(jìn)行鏡像的目標(biāo)點(diǎn)。這樣,就可以將人工干預(yù)的結(jié)果記錄在鏡像文件中,后續(xù)每次進(jìn)行符號執(zhí)行時,就都可以使用已經(jīng)得到的人工干預(yù)的結(jié)果,而不需要重復(fù)執(zhí)行人工干預(yù)。
[0043]再者,如果當(dāng)前進(jìn)程中,需要在進(jìn)行類似網(wǎng)絡(luò)收包之后才進(jìn)行污點(diǎn)數(shù)據(jù)引入,則可以在目標(biāo)程序執(zhí)行過程中,監(jiān)控是否收到特定數(shù)據(jù)包,如果是,則將收到特定數(shù)據(jù)包的時候確定為需要進(jìn)行鏡像的目標(biāo)點(diǎn),以便將新的污點(diǎn)數(shù)據(jù)從該目標(biāo)點(diǎn)導(dǎo)入到目標(biāo)程序中,從而實(shí)現(xiàn)以后每次進(jìn)行符號執(zhí)行時,都從該目標(biāo)點(diǎn)也即接收到該特定數(shù)據(jù)包之后的狀態(tài)導(dǎo)入到目標(biāo)程序。
[0044]S102:暫停所述目標(biāo)程序的執(zhí)行,并對所述目標(biāo)點(diǎn)對應(yīng)時刻的進(jìn)程狀態(tài)進(jìn)行鏡像;
[0045]在選定了需要進(jìn)行鏡像的目標(biāo)點(diǎn)之后,可以首先將目標(biāo)程序暫停執(zhí)行,然后對目標(biāo)點(diǎn)對應(yīng)時刻的進(jìn)程狀態(tài)進(jìn)行鏡像。具體的,可以將當(dāng)前進(jìn)程的內(nèi)存狀態(tài)鏡像到指定文件并進(jìn)行保存。
[0046]S103:鏡像創(chuàng)建完成后,恢復(fù)所述目標(biāo)程序的執(zhí)行,并通過符號執(zhí)行求解新的污點(diǎn)數(shù)據(jù);
[0047]鏡像創(chuàng)建完成之后,就可以恢復(fù)目標(biāo)程序的執(zhí)行,并進(jìn)行符號執(zhí)行,根據(jù)污點(diǎn)數(shù)據(jù)的依賴情況結(jié)束本次符號執(zhí)行,然后使用線性求解器求得新的污點(diǎn)數(shù)據(jù),本地迭代過程完成。具體的,可以通過在目標(biāo)程序執(zhí)行過程中的指令解析獲取程序執(zhí)行過程中的路徑約束條件,然后由求解引擎根據(jù)路徑約束條件反向求解得到新的路徑條件下的污點(diǎn)數(shù)據(jù)。
[0048]需要說明的是,在實(shí)際應(yīng)用中,為了兼容各個平臺以及方便求解,還可以將各種平臺的匯編語言(X86、ARM、MIPS等等)統(tǒng)一翻譯至通用的中間語言,方便后續(xù)進(jìn)行求解。這樣,在進(jìn)行符號執(zhí)行時,在得到路徑約束條件后,可以用中間語言進(jìn)行表述,求解引擎可以根據(jù)使用中間語言描述的路徑約束條件反向求解得到新的路徑條件下的污點(diǎn)數(shù)據(jù)。
[0049]另外需要說明的是,關(guān)于符號執(zhí)行以及求解引擎的具體實(shí)現(xiàn)過程,可以參見已有技術(shù)中的實(shí)現(xiàn),這里不進(jìn)行詳述。
[0050]S104:得到新的污點(diǎn)數(shù)據(jù)后,先利用鏡像過程保存的信息對進(jìn)程空間進(jìn)行恢復(fù),再利用求解得到的新的污點(diǎn)數(shù)據(jù)替換原有污點(diǎn)數(shù)據(jù)后輸入到所述目標(biāo)程序中,以便從所述目標(biāo)點(diǎn)開始繼續(xù)迭代執(zhí)行。
[0051]在結(jié)束一次迭代過程后,就可以得到新的污點(diǎn)輸入數(shù)據(jù)。此時,在本申請實(shí)施例中,并不是直接將新的污點(diǎn)數(shù)據(jù)輸入到目標(biāo)程序中,而是首先利用鏡像過程保存的信息對進(jìn)程空間進(jìn)行恢復(fù),也即相當(dāng)于直接使得進(jìn)程達(dá)到之前進(jìn)行鏡像的目標(biāo)點(diǎn)處,而不用重新從入口處開始執(zhí)行。完成進(jìn)行空間的恢復(fù)之后,再用新的污點(diǎn)數(shù)據(jù)替換原污點(diǎn)數(shù)據(jù),并輸入到目標(biāo)程序中,接下來就可以觸發(fā)下一次的符號執(zhí)行迭代,這使得新的符號執(zhí)行迭代過程可以從該目標(biāo)點(diǎn)開始,而不是目標(biāo)程序的入口處。這樣可以減少執(zhí)行軌跡中重復(fù)出現(xiàn)的部分,提高漏洞挖掘的效率。另外,如果存在需要人工干預(yù)的情況,可以將進(jìn)行鏡像的目標(biāo)點(diǎn)設(shè)置在人工干預(yù)之后,這樣可以使得后續(xù)的符號執(zhí)行過程復(fù)用之前的人工干預(yù)結(jié)果,不需要在每次符號執(zhí)行時都進(jìn)行人工干預(yù),提高自動化程度。對于類似網(wǎng)絡(luò)收包之后才進(jìn)行污點(diǎn)數(shù)據(jù)引入的情況,可以通過進(jìn)程狀態(tài)鏡像的方法,在收到特定數(shù)據(jù)包后,建立鏡像,隨后符號執(zhí)行并求得污點(diǎn)數(shù)據(jù)之后,先將進(jìn)程恢復(fù)到接收到特定數(shù)據(jù)包之后的狀態(tài),然后再將新的污點(diǎn)數(shù)據(jù)輸入到目標(biāo)程序,這樣就可以回到開始收包的指令地址開始處理。
[0052]需要說明的是,在本申請實(shí)施例中,需要在選定的目標(biāo)點(diǎn)處對進(jìn)程狀態(tài)進(jìn)行鏡像,后續(xù)在每次迭代結(jié)束獲得新的污點(diǎn)數(shù)據(jù)之后,首先根據(jù)鏡像數(shù)據(jù)進(jìn)行進(jìn)程狀態(tài)的恢復(fù),然后再進(jìn)行污點(diǎn)數(shù)據(jù)的輸入,在這個過程中,需要保持之前創(chuàng)建的鏡像不被破壞,否則將無法將進(jìn)程恢復(fù)到指定的狀態(tài)。但是,在實(shí)際應(yīng)用中,在創(chuàng)建了鏡像之后,目標(biāo)程序還需要繼續(xù)執(zhí)行,而如果在執(zhí)行過程中會執(zhí)行一些可能會破壞鏡像的操作,例如,文件操作函數(shù)、系統(tǒng)操作函數(shù)及其他會改變系統(tǒng)變量的操作,則可能會破壞鏡像。為了避免鏡像被破壞,在本申請實(shí)施例中,可以預(yù)先對進(jìn)程中會使鏡像被破壞的操作函數(shù)進(jìn)行鉤掛(Η00Κ),鏡像完成并程序恢復(fù)執(zhí)行后,可以在HOOK函數(shù)中過濾那些對系統(tǒng)、文件有改變的操作,并重定向到某預(yù)先指定的地方,按照特定的格式保存。這樣,相當(dāng)于對系統(tǒng)、文件的改變實(shí)際上并未生效,只是按照程序執(zhí)行的操作將改變情況記錄在另一個地方。當(dāng)然,目標(biāo)程序在執(zhí)行了修改操作之后,還可能需要讀取修改后的值,為了保證目標(biāo)程序的正常執(zhí)行,還可以對讀取操作對應(yīng)的函數(shù)也進(jìn)行Η00Κ,這樣在監(jiān)控到目標(biāo)程序的讀取操作時,可以按照讀取的偏移等信息判斷是否屬于重定向的數(shù)據(jù)范圍,如果是,則可以從重定向數(shù)據(jù)返回讀取結(jié)果,否則放行。
[0053]與本申請實(shí)施例提供的基于二進(jìn)制程序的漏洞挖掘方法相對應(yīng),本申請實(shí)施例還提供了一種基于二進(jìn)制程序的漏洞挖掘裝置,參見圖2,該裝置可以包括:
[0054]目標(biāo)點(diǎn)確定單元201,用于在目標(biāo)程序執(zhí)行過程中,確定需要進(jìn)行鏡像的目標(biāo)點(diǎn);
[0055]鏡像創(chuàng)建單元202,用于暫停所述目標(biāo)程序的執(zhí)行,并對所述目標(biāo)點(diǎn)對應(yīng)時刻的進(jìn)程狀態(tài)進(jìn)行鏡像;
[0056]符號執(zhí)行單元203,用于鏡像創(chuàng)建完成后,恢復(fù)所述目標(biāo)程序的執(zhí)行,并通過符號執(zhí)行求解新的污點(diǎn)數(shù)據(jù);
[0057]進(jìn)程恢復(fù)單元204,用于得到新的污點(diǎn)數(shù)據(jù)后,先利用鏡像過程保存的信息對進(jìn)程空間進(jìn)行恢復(fù),再利用求解得到的新的污點(diǎn)數(shù)據(jù)替換原有污點(diǎn)數(shù)據(jù)后輸入到所述目標(biāo)程序中,以便從所述目標(biāo)點(diǎn)開始繼續(xù)迭代執(zhí)行。
[0058]其中,所述目標(biāo)程序在各種不同路徑下運(yùn)行時,從程序入口點(diǎn)到所述需要進(jìn)行鏡像的目標(biāo)點(diǎn)的運(yùn)行軌跡相同。
[0059]具體在確定需要進(jìn)行鏡像的目標(biāo)點(diǎn)時,可以根據(jù)實(shí)際的需求進(jìn)行設(shè)定。其中,在一種實(shí)現(xiàn)方式下,目標(biāo)點(diǎn)確定單元201可以包括:
[0060]第一目標(biāo)點(diǎn)確定子單元,用于在目標(biāo)程序執(zhí)行過程中,監(jiān)控是否存在需關(guān)注的污點(diǎn)數(shù)據(jù)類型被引入,如果是,則將污點(diǎn)數(shù)據(jù)被引入的時刻確定為需要進(jìn)行鏡像的目標(biāo)點(diǎn)。
[0061]或者,如果進(jìn)程運(yùn)行過程中需要人工干預(yù),則目標(biāo)點(diǎn)確定單元201可以包括:
[0062]第二目標(biāo)點(diǎn)確定子單元,用于在目標(biāo)程序執(zhí)行過程中,監(jiān)控是否需要人工干預(yù),如果是,則將人工干預(yù)完成后的時刻確定為需要鏡像的目標(biāo)點(diǎn),以便將人工干預(yù)的結(jié)果保存到鏡像數(shù)據(jù)中。
[0063]再者,如果需要在類似網(wǎng)絡(luò)收包后才能進(jìn)行污點(diǎn)數(shù)據(jù)輸入,則目標(biāo)點(diǎn)確定單元201可以包括:
[0064]第三目標(biāo)點(diǎn)確定子單元,用于在目標(biāo)程序執(zhí)行過程中,監(jiān)控是否收到特定數(shù)據(jù)包,如果是,則將收到特定數(shù)據(jù)包的時候確定為需要進(jìn)行鏡像的目標(biāo)點(diǎn),以便將新的污點(diǎn)數(shù)據(jù)從該目標(biāo)點(diǎn)導(dǎo)入到所述目標(biāo)程序中。
[0065]具體實(shí)現(xiàn)時,鏡像創(chuàng)建單元202具體可以用于:
[0066]將當(dāng)前進(jìn)程的內(nèi)存狀態(tài)鏡像到指定文件并進(jìn)行保存。
[0067]為了避免在目標(biāo)程序運(yùn)行過程中鏡像被破壞,該裝置還可以包括:
[0068]第一函數(shù)鉤掛單元,用于對進(jìn)程中會使鏡像被破壞的操作函數(shù)進(jìn)行鉤掛;
[0069]第一監(jiān)控單元,用于所述目標(biāo)程序恢復(fù)執(zhí)行后,根據(jù)所鉤掛的函數(shù)監(jiān)控是否發(fā)生相應(yīng)的操作;
[0070]重定向單元,用于如果所述第一監(jiān)控單元的監(jiān)控結(jié)果為是,則將所述操作重定向到指定位置,并按照預(yù)置的格式進(jìn)行保存。
[0071]另外,如果目標(biāo)程序中還存在對數(shù)據(jù)進(jìn)行讀取的操作,則為了保證目標(biāo)程序的正常運(yùn)行,該裝置還可以包括:
[0072]第二函數(shù)鉤掛單元,用于對進(jìn)程中執(zhí)行讀取操作的函數(shù)進(jìn)行鉤掛;
[0073]第二監(jiān)控單元,用于監(jiān)控到所述目標(biāo)程序執(zhí)行讀取操作時,按照讀取的偏移信息判斷是否屬于重定向的數(shù)據(jù)范圍;
[0074]數(shù)據(jù)返回單元,用于如果第二監(jiān)控單元的監(jiān)控結(jié)果為是,則根據(jù)重定向的數(shù)據(jù)返回讀取結(jié)果。
[0075]另外,為了兼容各個平臺以及方便求解,該裝置還可以包括:
[0076]指令翻譯單元,用于將各種平臺的匯編語言翻譯至通用的中間語言,以便將符號執(zhí)行得到的路徑約束條件用所述中間語言進(jìn)行描述。
[0077]總之,通過本申請實(shí)施例提供的上述裝置,可以在目標(biāo)程序執(zhí)行過程中的某個目標(biāo)點(diǎn)處創(chuàng)建鏡像,之后在每次迭代過程獲取到新的污點(diǎn)數(shù)據(jù)之后,并不是直接將新的污點(diǎn)數(shù)據(jù)輸入到目標(biāo)程序中,而是首先利用鏡像過程保存的信息對進(jìn)程空間進(jìn)行恢復(fù),也即相當(dāng)于直接使得進(jìn)程達(dá)到之前進(jìn)行鏡像的目標(biāo)點(diǎn)處,而不用重新從入口處開始執(zhí)行。完成進(jìn)行空間的恢復(fù)之后,再用新的污點(diǎn)數(shù)據(jù)替換原污點(diǎn)數(shù)據(jù),并輸入到目標(biāo)程序中,接下來就可以觸發(fā)下一次的符號執(zhí)行迭代,這樣使得新的符號執(zhí)行迭代過程可以從該目標(biāo)點(diǎn)開始,而不是目標(biāo)程序的入口處,從而可以減少執(zhí)行軌跡中重復(fù)出現(xiàn)的部分,提高漏洞挖掘的效率。
[0078]通過以上的實(shí)施方式的描述可知,本領(lǐng)域的技術(shù)人員可以清楚地了解到本申請可借助軟件加必需的通用硬件平臺的方式來實(shí)現(xiàn)。基于這樣的理解,本申請的技術(shù)方案本質(zhì)上或者說對現(xiàn)有技術(shù)做出貢獻(xiàn)的部分可以以軟件產(chǎn)品的形式體現(xiàn)出來,該計(jì)算機(jī)軟件產(chǎn)品可以存儲在存儲介質(zhì)中,如ROM/RAM、磁碟、光盤等,包括若干指令用以使得一臺計(jì)算機(jī)設(shè)備(可以是個人計(jì)算機(jī),服務(wù)器,或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行本申請各個實(shí)施例或者實(shí)施例的某些部分所述的方法。
[0079]本說明書中的各個實(shí)施例均采用遞進(jìn)的方式描述,各個實(shí)施例之間相同相似的部分互相參見即可,每個實(shí)施例重點(diǎn)說明的都是與其他實(shí)施例的不同之處。尤其,對于系統(tǒng)或系統(tǒng)實(shí)施例而言,由于其基本相似于方法實(shí)施例,所以描述得比較簡單,相關(guān)之處參見方法實(shí)施例的部分說明即可。以上所描述的系統(tǒng)及系統(tǒng)實(shí)施例僅僅是示意性的,其中所述作為分離部件說明的單元可以是或者也可以不是物理上分開的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位于一個地方,或者也可以分布到多個網(wǎng)絡(luò)單元上??梢愿鶕?jù)實(shí)際的需要選擇其中的部分或者全部模塊來實(shí)現(xiàn)本實(shí)施例方案的目的。本領(lǐng)域普通技術(shù)人員在不付出創(chuàng)造性勞動的情況下,即可以理解并實(shí)施。
[0080]以上對本申請所提供的基于二進(jìn)制程序的漏洞挖掘方法及裝置,進(jìn)行了詳細(xì)介紹,本文中應(yīng)用了具體個例對本申請的原理及實(shí)施方式進(jìn)行了闡述,以上實(shí)施例的說明只是用于幫助理解本申請的方法及其核心思想;同時,對于本領(lǐng)域的一般技術(shù)人員,依據(jù)本申請的思想,在【具體實(shí)施方式】及應(yīng)用范圍上均會有改變之處。綜上所述,本說明書內(nèi)容不應(yīng)理解為對本申請的限制。
【權(quán)利要求】
1.一種基于二進(jìn)制程序的漏洞挖掘方法,其特征在于,包括: 在目標(biāo)程序執(zhí)行過程中,確定需要進(jìn)行鏡像的目標(biāo)點(diǎn); 暫停所述目標(biāo)程序的執(zhí)行,并對所述目標(biāo)點(diǎn)對應(yīng)時刻的進(jìn)程狀態(tài)進(jìn)行鏡像; 鏡像創(chuàng)建完成后,恢復(fù)所述目標(biāo)程序的執(zhí)行,并通過符號執(zhí)行求解新的污點(diǎn)數(shù)據(jù); 得到新的污點(diǎn)數(shù)據(jù)后,先利用鏡像過程保存的信息對進(jìn)程空間進(jìn)行恢復(fù),再利用求解得到的新的污點(diǎn)數(shù)據(jù)替換原有污點(diǎn)數(shù)據(jù)后輸入到所述目標(biāo)程序中,以便從所述目標(biāo)點(diǎn)開始繼續(xù)迭代執(zhí)行。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述目標(biāo)程序在各種不同路徑下運(yùn)行時,從程序入口點(diǎn)到所述需要進(jìn)行鏡像的目標(biāo)點(diǎn)的運(yùn)行軌跡相同。
3.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述在目標(biāo)程序執(zhí)行過程中,確定需要進(jìn)行鏡像的目標(biāo)點(diǎn),包括: 在目標(biāo)程序執(zhí)行過程中,監(jiān)控是否存在需關(guān)注的污點(diǎn)數(shù)據(jù)類型被引入,如果是,則將污點(diǎn)數(shù)據(jù)被弓I入的時刻確定為需要進(jìn)行鏡像的目標(biāo)點(diǎn)。
4.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述在目標(biāo)程序執(zhí)行過程中,確定需要進(jìn)行鏡像的目標(biāo)點(diǎn),包括: 在目標(biāo)程序執(zhí)行過程中,監(jiān)控是否需要人工干預(yù),如果是,則將人工干預(yù)完成后的時刻確定為需要鏡像的目標(biāo)點(diǎn),以便將人工干預(yù)的結(jié)果保存到鏡像數(shù)據(jù)中。
5.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述在目標(biāo)程序執(zhí)行過程中,確定需要進(jìn)行鏡像的目標(biāo)點(diǎn),包括: 在目標(biāo)程序執(zhí)行過程中,監(jiān)控是否收到特定數(shù)據(jù)包,如果是,則將收到特定數(shù)據(jù)包的時候確定為需要進(jìn)行鏡像的目標(biāo)點(diǎn),以便將新的污點(diǎn)數(shù)據(jù)從該目標(biāo)點(diǎn)導(dǎo)入到所述目標(biāo)程序中。
6.根據(jù)權(quán)利要求1至5任一項(xiàng)所述的方法,其特征在于,所述對所述目標(biāo)點(diǎn)對應(yīng)時刻的進(jìn)程狀態(tài)進(jìn)行鏡像包括: 將當(dāng)前進(jìn)程的內(nèi)存狀態(tài)鏡像到指定文件并進(jìn)行保存。
7.根據(jù)權(quán)利要求1至5任一項(xiàng)所述的方法,其特征在于,還包括: 對進(jìn)程中會使鏡像被破壞的操作函數(shù)進(jìn)行鉤掛; 所述目標(biāo)程序恢復(fù)執(zhí)行后,根據(jù)所鉤掛的函數(shù)監(jiān)控是否發(fā)生相應(yīng)的操作; 如果是,則將所述操作重定向到指定位置,并按照預(yù)置的格式進(jìn)行保存。
8.根據(jù)權(quán)利要求7所述的方法,其特征在于,還包括: 對進(jìn)程中執(zhí)行讀取操作的函數(shù)進(jìn)行鉤掛; 監(jiān)控到所述目標(biāo)程序執(zhí)行讀取操作時,按照讀取的偏移信息判斷是否屬于重定向的數(shù)據(jù)范圍; 如果是,則根據(jù)重定向的數(shù)據(jù)返回讀取結(jié)果。
9.根據(jù)權(quán)利要求1至5任一項(xiàng)所述的方法,其特征在于,還包括: 將各種平臺的匯編語言翻譯至通用的中間語言,以便將符號執(zhí)行得到的路徑約束條件用所述中間語言進(jìn)行描述。
10.一種基于二進(jìn)制程序的漏洞挖掘裝置,其特征在于,包括: 目標(biāo)點(diǎn)確定單元,用于在目標(biāo)程序執(zhí)行過程中,確定需要進(jìn)行鏡像的目標(biāo)點(diǎn); 鏡像創(chuàng)建單元,用于暫停所述目標(biāo)程序的執(zhí)行,并對所述目標(biāo)點(diǎn)對應(yīng)時刻的進(jìn)程狀態(tài)進(jìn)行鏡像; 符號執(zhí)行單元,用于鏡像創(chuàng)建完成后,恢復(fù)所述目標(biāo)程序的執(zhí)行,并通過符號執(zhí)行求解新的污點(diǎn)數(shù)據(jù); 進(jìn)程恢復(fù)單元,用于得到新的污點(diǎn)數(shù)據(jù)后,先利用鏡像過程保存的信息對進(jìn)程空間進(jìn)行恢復(fù),再利用求解得到的新的污點(diǎn)數(shù)據(jù)替換原有污點(diǎn)數(shù)據(jù)后輸入到所述目標(biāo)程序中,以便從所述目標(biāo)點(diǎn)開始繼續(xù)迭代執(zhí)行。
【文檔編號】G06F21/12GK104346542SQ201310314639
【公開日】2015年2月11日 申請日期:2013年7月24日 優(yōu)先權(quán)日:2013年7月24日
【發(fā)明者】樊興華 申請人:阿里巴巴集團(tuán)控股有限公司