董國(guó)良,臧 洌,李 航,甘 露,郭詠科
(1.南京航空航天大學(xué) 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,江蘇 南京 211106;2.江南計(jì)算技術(shù)研究所,江蘇 無錫 214083)
動(dòng)態(tài)污點(diǎn)分析技術(shù)(dynamic taint analysis,DTA)是指對(duì)非信任來源的數(shù)據(jù)進(jìn)行標(biāo)記,追蹤并記錄其在程序執(zhí)行中的傳播過程,檢測(cè)污點(diǎn)數(shù)據(jù)的非法使用,以達(dá)到獲取關(guān)鍵位置與輸入數(shù)據(jù)關(guān)聯(lián)信息的分析方法[1]。在對(duì)攻擊進(jìn)行有效分析的同時(shí)獲得程序的漏洞所在,且錯(cuò)誤率較低,實(shí)用性很強(qiáng)[2],被廣泛應(yīng)用于信息安全驗(yàn)證、惡意代碼分析[3]、隱私泄露分析、協(xié)議格式逆向分析[4]等領(lǐng)域[5]。國(guó)內(nèi)近年來的研究成果包括李根博士團(tuán)隊(duì)研發(fā)的Hunter[6]和北大王鐵磊博士研究的TaintScope[7],以及基于類型[8]和基于虛擬化[9]技術(shù)的動(dòng)態(tài)污點(diǎn)分析技術(shù)等。
目前的動(dòng)態(tài)污點(diǎn)分析平臺(tái)主要存在準(zhǔn)確率與性能兩方面的問題[10],其中準(zhǔn)確率問題主要體現(xiàn)在由于“過污染”(over-tainting)引起的誤報(bào),以及由于“欠污染”(under-tainting)造成的漏報(bào)問題。另外,早期的粗粒度污點(diǎn)分析[11]平臺(tái)在污點(diǎn)標(biāo)記屬性、污點(diǎn)傳播策略及污點(diǎn)檢測(cè)規(guī)則定義過程中存在不夠完善的情況,使得漏洞挖掘效率不高,檢測(cè)結(jié)果不夠準(zhǔn)確。
針對(duì)上述問題,文中分別在污點(diǎn)分析的三個(gè)階段對(duì)現(xiàn)有問題進(jìn)行改進(jìn)和優(yōu)化。在污點(diǎn)標(biāo)識(shí)過程中擴(kuò)充污點(diǎn)狀態(tài)定義,添加除“污染”和“未污染”外的第三種污點(diǎn)狀態(tài)“間接污染”,細(xì)化污點(diǎn)標(biāo)記過程中定義的污點(diǎn)狀態(tài)屬性;在污點(diǎn)傳播過程中,針對(duì)X86平臺(tái)匯編指令設(shè)計(jì)了較為完善的污點(diǎn)傳播策略,增加“污點(diǎn)清除”傳播狀態(tài)行為實(shí)體,分析造成污點(diǎn)清除的目標(biāo)指令和操作并將其添加入污點(diǎn)傳播策略;在污點(diǎn)檢測(cè)階段,進(jìn)一步擴(kuò)充安全檢測(cè)規(guī)則,將觸發(fā)的安全規(guī)則按照危險(xiǎn)嚴(yán)重性分為漏洞觸發(fā)、危險(xiǎn)操作和安全操作三個(gè)級(jí)別,并根據(jù)不同級(jí)別設(shè)計(jì)了不同的安全響應(yīng)策略?;谏鲜龇椒▽?shí)現(xiàn)了改進(jìn)的細(xì)粒度動(dòng)態(tài)污點(diǎn)分析[12]原型系統(tǒng)ODDTA,并通過實(shí)驗(yàn)對(duì)其進(jìn)行驗(yàn)證。
ODDTA的框架結(jié)構(gòu)如圖1所示。
ODDTA原型系統(tǒng)主要包括信息捕獲、二進(jìn)制動(dòng)態(tài)插樁、污點(diǎn)標(biāo)記、污點(diǎn)傳播、污點(diǎn)檢測(cè)、污點(diǎn)信息存儲(chǔ)及日志生成等模塊。其中信息捕獲模塊主要使用HOOK機(jī)制對(duì)二進(jìn)制目標(biāo)程序的主要輸入函數(shù)進(jìn)行監(jiān)控,獲取目標(biāo)程序的指令流。二進(jìn)制動(dòng)態(tài)插樁模塊負(fù)責(zé)在程序運(yùn)行動(dòng)態(tài)編譯二進(jìn)制代碼時(shí),將插樁代碼置于目標(biāo)程序中,獲取程序運(yùn)行時(shí)的特征數(shù)據(jù),其生成的指令為經(jīng)過二次提升的類匯編指令。污點(diǎn)分析的核心模塊包括污點(diǎn)標(biāo)記、污點(diǎn)傳播和污點(diǎn)檢測(cè)三個(gè)部分,所有細(xì)粒度的污點(diǎn)狀態(tài)信息均以影子內(nèi)存[13]形式存放于內(nèi)存中,在污點(diǎn)分析整個(gè)過程中進(jìn)行維護(hù)和存取。在線分析后產(chǎn)生的安全相關(guān)報(bào)告信息由日志生成模塊生成,用于離線的漏洞檢測(cè)與分析。
污點(diǎn)標(biāo)記是將外部引入的數(shù)據(jù)標(biāo)記為污點(diǎn)數(shù)據(jù),并對(duì)其設(shè)置污點(diǎn)標(biāo)簽,其標(biāo)記方式極大影響著污點(diǎn)傳播處理與污點(diǎn)狀態(tài)信息存儲(chǔ)的效率。但在現(xiàn)有的污點(diǎn)分析工具中,因?yàn)槲埸c(diǎn)標(biāo)記定義和設(shè)計(jì)的不夠完善,不能檢測(cè)出某些間接污染的情況,如以下代碼所示程序:
1 void func(char *source,int length)
2 {
3 char buf [10];
4 strncpy(buf, source,length);
5 }
6 void main()
7 {
8 char src[256];
9 scanf(“%s”,src);
10 intlen=strlen(src);
11 func (src,len);
12 }
變量len的值由系統(tǒng)函數(shù)strlen()得出,并非直接通過賦值或算術(shù)邏輯運(yùn)算得出,若strlen()中的參數(shù)包含污點(diǎn)數(shù)據(jù),則len與污點(diǎn)數(shù)據(jù)相關(guān)。傳統(tǒng)的污點(diǎn)分析只標(biāo)記變量是被“污染的”或“未被污染的”,且在污點(diǎn)傳播過程中,對(duì)“污染的”變量只考慮直接由算術(shù)運(yùn)算指令或數(shù)據(jù)傳送指令等直接傳遞的污點(diǎn)數(shù)據(jù)和污染鏈,所以不會(huì)將變量len標(biāo)識(shí)為“污染的”,這種欠污染的污點(diǎn)標(biāo)記和傳播方式會(huì)導(dǎo)致漏報(bào)。
對(duì)此,文中提出了第三種污點(diǎn)標(biāo)記狀態(tài)“間接污染”,當(dāng)檢測(cè)到變量由某些參數(shù)包含污點(diǎn)數(shù)據(jù)的函數(shù)間接所得,則標(biāo)記該變量為“間接污染”。采用統(tǒng)一的標(biāo)記模型集中存儲(chǔ)污點(diǎn)信息,對(duì)內(nèi)存中的污點(diǎn)數(shù)據(jù)采用
污點(diǎn)傳播指根據(jù)二進(jìn)制程序指令的特點(diǎn),為不同類型的指令制定不同的傳播策略,根據(jù)此策略追蹤污點(diǎn)數(shù)據(jù)的運(yùn)行過程。污點(diǎn)傳播分析不僅要關(guān)注污點(diǎn)數(shù)據(jù)的產(chǎn)生與引用位置,更重要的是找出污點(diǎn)傳播路徑與影響范圍[14]。文中的動(dòng)態(tài)污點(diǎn)分析過程即從信息流傳播入手,研究執(zhí)行時(shí)的二進(jìn)制類匯編代碼,對(duì)污點(diǎn)相關(guān)的數(shù)據(jù)流和控制流傳播過程加以分析,制定針對(duì)不同類別指令類型的污點(diǎn)傳播策略,確定污點(diǎn)傳播行為實(shí)體(對(duì)污點(diǎn)屬性的具體操作),并實(shí)時(shí)更新和維護(hù)影子內(nèi)存中的污點(diǎn)狀態(tài)屬性。
1.3.1 污點(diǎn)傳播指令分析
分析了X86體系架構(gòu)各類指令的執(zhí)行特性,結(jié)合污點(diǎn)數(shù)據(jù)信息流傳播方式,在動(dòng)態(tài)污點(diǎn)傳播模塊將指令歸納為以下幾類:
數(shù)據(jù)轉(zhuǎn)移類:包含X86匯編指令中的數(shù)據(jù)傳送指令、算術(shù)指令、位操作指令、標(biāo)志處理指令、串操作指令。數(shù)據(jù)轉(zhuǎn)移類指令包含數(shù)據(jù)信息流傳播,是數(shù)據(jù)流流入、數(shù)據(jù)流流出與參數(shù)地址的作用之集。
控制跳轉(zhuǎn)類:包含控制信息流傳播,其主要對(duì)象為條件跳轉(zhuǎn)指令,如控制轉(zhuǎn)移指令的Jcc類。在程序運(yùn)行中,運(yùn)行路徑的選擇是由條件跳轉(zhuǎn)指令判斷轉(zhuǎn)移的。
傳播無關(guān)類:指執(zhí)行不會(huì)引發(fā)數(shù)據(jù)信息流與控制信息流的傳播的無關(guān)指令,例如NOP、HLT、JMP、CALL等。
1.3.2 污點(diǎn)傳播策略設(shè)計(jì)
在污點(diǎn)傳播策略設(shè)計(jì)過程中,除了針對(duì)上述幾類指令進(jìn)行分析外,還應(yīng)考慮控制流污點(diǎn)傳播、污點(diǎn)清除行為、間接污染與檢測(cè)盲點(diǎn)[15]等情況下的污點(diǎn)傳播過程。其中檢測(cè)盲點(diǎn)問題是指由于無效用例導(dǎo)致漏洞未被觸發(fā)時(shí)的潛在漏洞情況。如包含潛在緩沖區(qū)溢出漏洞的程序,只有當(dāng)漏洞觸發(fā),且溢出的字符串覆蓋并修改了返回值時(shí)(即改變了數(shù)據(jù),又影響了控制流),傳統(tǒng)的污點(diǎn)分析系統(tǒng)才將其確定為漏洞觸發(fā),而當(dāng)輸入字符串長(zhǎng)度不足以造成緩沖區(qū)溢出,或者已經(jīng)造成溢出但未修改到返回值,則此時(shí)漏洞被忽略,存在檢測(cè)的盲點(diǎn),造成漏報(bào)。污點(diǎn)分析傳播策略如表1所示。
表1 指令類別與對(duì)應(yīng)的污點(diǎn)傳播策略
(1)數(shù)據(jù)轉(zhuǎn)移類。
數(shù)據(jù)轉(zhuǎn)移類指令的傳播行為包括污點(diǎn)添加、污點(diǎn)傳遞和不傳播。針對(duì)包含顯式操作數(shù)的指令,如MOV、ADD等指令,若源操作數(shù)包含污點(diǎn)數(shù)據(jù),則執(zhí)行后源與目的操作數(shù)均被污染。對(duì)包含隱式操作數(shù)(implicit operands)的指令,如指令DIV EBX,其顯式操作數(shù)(explicit operands)只有EBX,但根據(jù)指令的執(zhí)行語義,除數(shù)為EBX,隱含的被除數(shù)為EDX,商保存在EAX中,其余數(shù)保存在EDX中,所以該算術(shù)指令的執(zhí)行同樣引發(fā)數(shù)據(jù)信息流傳播。
(2)條件跳轉(zhuǎn)類(控制流傳播分析)。
控制流操縱了程序的運(yùn)行路徑,確定了執(zhí)行流程,其在主方向選擇上間接影響了數(shù)據(jù)流的傳播。為保證污點(diǎn)分析的精確性,將數(shù)據(jù)流與控制流結(jié)合分析,從路徑轉(zhuǎn)移和數(shù)據(jù)傳播兩方面確定污點(diǎn)關(guān)聯(lián)信息。
在動(dòng)態(tài)污點(diǎn)傳播過程中,一次實(shí)際執(zhí)行對(duì)應(yīng)一條固定的運(yùn)行路徑。文中進(jìn)行的控制流傳播分析基于程序控制流圖(CFG),分析由指令跳轉(zhuǎn)引發(fā)的控制轉(zhuǎn)移過程,研究分支路徑的跳轉(zhuǎn)條件,獲取執(zhí)行路徑的污點(diǎn)約束針對(duì)跳轉(zhuǎn)類指令。在匯編指令中,跳轉(zhuǎn)指令分為直接跳轉(zhuǎn)指令(JMP)和條件跳轉(zhuǎn)指令(JCC)。條件跳轉(zhuǎn)分為兩類,其中多數(shù)以標(biāo)志位為判斷,包括JZ、JS、JC等,也有部分非判斷標(biāo)志位的指令,包括JCXZ、JECXZ等,其以CX、ECX是否為零作為判斷條件。文中提出的控制流分析的主要對(duì)象為標(biāo)志位污點(diǎn)信息。
(3)傳播無關(guān)類。
傳播行為僅包含不傳播,無污點(diǎn)信息流操作。
(4)函數(shù)級(jí)污點(diǎn)傳播分析。
針對(duì)間接污染和潛在漏洞問題,在指令級(jí)污點(diǎn)分析外提出了函數(shù)級(jí)的污點(diǎn)傳播分析,對(duì)相關(guān)函數(shù)和其對(duì)應(yīng)的指令(已標(biāo)記為“間接污染”)進(jìn)行監(jiān)控,記錄和分析數(shù)據(jù)狀態(tài)信息和數(shù)據(jù)流傳播信息,在污點(diǎn)檢測(cè)模塊誤用檢測(cè)時(shí)進(jìn)行安全規(guī)則匹配,根據(jù)污點(diǎn)檢測(cè)處理方式對(duì)分析結(jié)果進(jìn)行處理。
(5)污點(diǎn)清除類。
傳統(tǒng)的污點(diǎn)分析系統(tǒng),在污點(diǎn)傳播階段只考慮污點(diǎn)信息的增加與傳遞,即污點(diǎn)傳播狀態(tài)轉(zhuǎn)換的行為實(shí)體只包括污點(diǎn)添加、污點(diǎn)傳播和不傳播三類,未考慮污點(diǎn)清除的情況,會(huì)導(dǎo)致“過污染”情況產(chǎn)生,造成誤報(bào)。如表1中的示例,指令中將常量賦給變量,或是XOR、SUB、SBB等指令結(jié)果為常量時(shí),此時(shí)原操作數(shù)中包含的污點(diǎn)變量將不應(yīng)再進(jìn)行傳播?;诖?,提出了第四類污點(diǎn)傳播行為實(shí)體,即污點(diǎn)清除,對(duì)符合上述條件的指令執(zhí)行污點(diǎn)清除操作,不再進(jìn)行污點(diǎn)傳播。
現(xiàn)有的污點(diǎn)分析平臺(tái),污點(diǎn)檢測(cè)時(shí)一旦發(fā)現(xiàn)污點(diǎn)數(shù)據(jù)違背安全規(guī)則,通常只有一種處理方式,即終止運(yùn)行并記錄相關(guān)信息,當(dāng)違背的安全規(guī)則僅僅只是觸發(fā)了某個(gè)危害較輕的安全風(fēng)險(xiǎn),而非發(fā)現(xiàn)危害較重的某個(gè)漏洞,直接終止運(yùn)行會(huì)造成檢測(cè)效率低下。
為此,將觸發(fā)的安全規(guī)則按照危險(xiǎn)嚴(yán)重性分為三個(gè)級(jí)別,即“漏洞觸發(fā)”、“潛在危險(xiǎn)”和“安全操作”,根據(jù)不同級(jí)別對(duì)污點(diǎn)數(shù)據(jù)進(jìn)行不同處理。當(dāng)某污點(diǎn)數(shù)據(jù)在污點(diǎn)傳播過程中觸發(fā)漏洞時(shí),則記錄漏洞觸發(fā)相關(guān)信息并終止運(yùn)行;當(dāng)某污點(diǎn)數(shù)據(jù)僅執(zhí)行的操作危害較輕,僅為“潛在危險(xiǎn)”時(shí),則記錄該污點(diǎn)數(shù)據(jù)風(fēng)險(xiǎn)操作的相關(guān)信息并繼續(xù)運(yùn)行;當(dāng)污點(diǎn)數(shù)據(jù)執(zhí)行的操作為“安全操作”,未違反任何安全規(guī)則,則執(zhí)行繼續(xù)。
原型系統(tǒng)ODDTA基于二進(jìn)制分析平臺(tái)Pin[16]實(shí)現(xiàn),Pin借鑒了ATOM[17]工具的兩個(gè)概念:Instrumentation Routine(簡(jiǎn)稱IR,插樁例程)和Analysis Routine(簡(jiǎn)稱AR,分析例程)。前者定義插樁的位置,后者定義插樁時(shí)需要執(zhí)行的分析工作。Pin框架提供指令集插樁、軌跡級(jí)插樁和函數(shù)級(jí)插樁等三種插樁粒度。文中選用軌跡級(jí)插樁。
污點(diǎn)標(biāo)記模塊算法實(shí)現(xiàn)中變量和函數(shù)定義包括:
INST:匯編指令類型;
voidSetTaintMark():設(shè)定污點(diǎn)源數(shù)據(jù)標(biāo)記;
char*GetInstAddr(INST):獲取指令源地址;
intGetInstLen(INST):獲取引入污點(diǎn)指令長(zhǎng)度;
char*GetInstDest(INST):獲取指令目的地址;
SetMEMLabel(char* DestAddr,intcount,TaintDataTaintLabel):設(shè)置內(nèi)存單元污點(diǎn)標(biāo)簽;
SetREGLabel(char* DestAddr,intcount,TaintDataTaintLabel):設(shè)置寄存器單元污點(diǎn)標(biāo)簽;
bddAddList(SoueceTaintList,DestAddr,count):將污點(diǎn)信息加入到影子內(nèi)存中。
其中bdd為影子內(nèi)存中基于規(guī)約有序二元決策圖[18](roBDD)方法設(shè)計(jì)的存儲(chǔ)結(jié)構(gòu),該方法可實(shí)現(xiàn)對(duì)集合運(yùn)算效率的優(yōu)化,具體實(shí)現(xiàn)時(shí)調(diào)用開源的BuDDY庫,支持幾乎所有的BDD運(yùn)算。
污點(diǎn)傳播模塊以執(zhí)行指令為依據(jù),通過分析指令信息獲取當(dāng)前數(shù)據(jù)流和控制流的傳播。算法實(shí)現(xiàn)中主要變量和函數(shù)定義說明如下:
INSTINFO:指令信息流類型;
AddrInfo:包含char*格式的地址addr,和污點(diǎn)傳播模式mode;
AddrInfoGetInstDest(INSTINFO):獲取指令信息流傳播目的地址信息集合;
intGetAddrCount(AddrInfo):信息流目的地址個(gè)數(shù);
char**GetRelateAddr(AddrInfo*,int):獲取信息流傳播目的地址的相關(guān)源地址集合;
GetTaintInfo(char**):通過bdd庫進(jìn)行目標(biāo)目的地址的污點(diǎn)信息計(jì)算;
voidSetDestTaintInfo(AddrInfo*,int,bdd):設(shè)置目標(biāo)地址污點(diǎn)信息;
voidAddTaintInfo(AddrInfo*,int,bdd):將污點(diǎn)信息添加至目標(biāo)地址;
voidClearTaintInfo(AddrInfo*,int):清除目標(biāo)地址污點(diǎn)信息;
DestAddr[count].mode:三個(gè)取值{in,add,clear}對(duì)應(yīng)污點(diǎn)傳播狀態(tài)的三種轉(zhuǎn)換模式:污點(diǎn)傳播、污點(diǎn)添加和污點(diǎn)清除。污點(diǎn)控制流傳播算法實(shí)現(xiàn)如下:
1.TaintControlPropagate(INSTINFO inst,bddCurrentCon-
trolInfo)
2.char* ControlSource=GetJCCSource(inst);
3.TaintInfo=GetControlTaintInfo(RelateSource);
4.AddControlInfo(CurrentControlInfo,TaintInfo);
char*GetJCCSource(INSTINFO):獲取條件跳轉(zhuǎn)的受控源集合;
GetControlTaintInfo(char**):通過bdd庫獲取受控源集合污點(diǎn)信息;
AddControlInfo(bdd,bdd):添加新控制源至當(dāng)前污點(diǎn)控制信息。
污點(diǎn)檢測(cè)模塊算法實(shí)現(xiàn)中主要包含的函數(shù)如下:
ModeGetInstMode(INST):獲取指令模式(如MOV_REG32_REG32);
boolSusceptibleModeMatch(Mode,Mode*):匹配敏感指令模式;
InstStructGetInstStruct(INST, TaintInfo):獲取指令結(jié)構(gòu);
boolSusceptibleStructMatch(InstStruct,InstStruct*):匹配敏感指令結(jié)構(gòu);
voidSensitiveOperate():敏感點(diǎn)操作。
在實(shí)現(xiàn)污點(diǎn)檢測(cè)時(shí),依據(jù)污點(diǎn)誤用檢測(cè)的規(guī)則,設(shè)定了幾種敏感模式,包括MOV類、JMP類以及敏感函數(shù)對(duì)應(yīng)的指令,當(dāng)當(dāng)前指令為上述指令類型時(shí),則進(jìn)入敏感函數(shù)匹配。當(dāng)系統(tǒng)監(jiān)測(cè)到敏感指令執(zhí)行時(shí),即有可能觸發(fā)安全規(guī)則,進(jìn)入危險(xiǎn)狀態(tài)。
實(shí)驗(yàn)測(cè)試環(huán)境即為原型系統(tǒng)的開發(fā)環(huán)境,底層硬件為曙光i840-G25和DELLR510服務(wù)器,基于VMware vSphere4.1.0實(shí)現(xiàn)硬件資源虛擬化,虛擬機(jī)虛擬硬件配置為Intel Core2 Duo CPU @3.00 GHz x2/4 G/SATA 20 GB,操作系統(tǒng)為L(zhǎng)inux Ubuntu 12.04(內(nèi)核3.8.0-32-generic)。
為驗(yàn)證污點(diǎn)分析原型系統(tǒng)漏洞挖掘的有效性,采用自編譯的包含有緩沖區(qū)溢出漏洞的實(shí)例程序作為測(cè)試目標(biāo)程序,該程序關(guān)鍵溢出代碼如下:
intfunc(char* str)
{
char buf[10];
strcpy(buf,str);
printf(“%s ”,buf);
}
int main(intargc,char** argv)
{
char str[50];
scanf(“%s”,& str);
if(str[0]!=‘Z’)
func(str);
return 0;
}
該程序中,執(zhí)行func()中的函數(shù)strcpy時(shí)未對(duì)數(shù)組邊界進(jìn)行檢查,當(dāng)源數(shù)組長(zhǎng)度大于目標(biāo)數(shù)組長(zhǎng)度時(shí),會(huì)發(fā)生緩沖區(qū)溢出。對(duì)該程序進(jìn)行編譯,對(duì)生成的可執(zhí)行文件輸入不同的測(cè)試用例,分別進(jìn)行漏洞檢測(cè)有效性測(cè)試、潛在漏洞測(cè)試以及危險(xiǎn)函數(shù)檢測(cè)。
以目標(biāo)程序test作為ODDTA輸入并執(zhí)行,輸入字符串為“abcdefghijklmnopqrstuvwx”,共24個(gè)字符,則可覆蓋func函數(shù)調(diào)用后的返回地址,此時(shí)緩沖區(qū)漏洞被觸發(fā),程序異常退出。系統(tǒng)終止污點(diǎn)跟蹤,輸出安全分析日志中的相關(guān)信息,如下所示:
Program:test
Trace ID: test_55
Crash location:0x004012b6
Crash instruction:RET
Crash case: themem can’t execute
Detection rule: controlled execute
Target instruction address:0x0022ff11
Target address taint:
0x0022ff11:{22}; 0x0022ff12:{23}
Taint link:
3027:004012b6: RET M@0x0022ff11[0x00007877]$4T
2208: 77c160c1: MOV [EDI],EDX M@0x0022ff0e[0x13f00022] $4 UT R@EDX[0x78777675]$4 T
……
污點(diǎn)傳播過程為:系統(tǒng)對(duì)輸入數(shù)據(jù)進(jìn)行污點(diǎn)標(biāo)記和編號(hào),污點(diǎn)數(shù)據(jù)按照指令執(zhí)行,進(jìn)行數(shù)據(jù)傳輸,當(dāng)源緩沖區(qū)大于目的緩沖區(qū)時(shí),發(fā)生溢出,并覆蓋與緩沖區(qū)相鄰的其他地址空間數(shù)據(jù),當(dāng)函數(shù)執(zhí)行完畢后,此時(shí)返回地址0x0022ff11被覆蓋,程序崩潰。
以目標(biāo)程序test作為ODDTA輸入并執(zhí)行,輸入字符串為“abcdefghijkl”,共12個(gè)字符,結(jié)合實(shí)例程序執(zhí)行strcpy時(shí)的棧狀態(tài)可知,此時(shí)發(fā)生了緩沖區(qū)溢出,但并未覆蓋返回地址,并不會(huì)造成程序崩潰。此時(shí),早期的動(dòng)態(tài)污點(diǎn)分析系統(tǒng)并不會(huì)給出存在潛在漏洞的安全警告,在ODDTA原型系統(tǒng)中,由于發(fā)生了外部引入污點(diǎn)數(shù)據(jù)的誤用,此時(shí)在污點(diǎn)檢測(cè)中將對(duì)應(yīng)的指令操作標(biāo)記為“Latent Danger”(潛在危險(xiǎn)),輸出如下信息:
Program:test
Detect target risklevel:Latent Danger
Misuse location:0x004017c0
Misused mode:execute tainted instruction
Detail instruction:004012b6:RET M@0x0022ff11[0x000078 77]$4 T
ODDTA原型系統(tǒng)記錄控制流污點(diǎn)信息的傳播過程,對(duì)目標(biāo)程序執(zhí)行進(jìn)行細(xì)粒度污點(diǎn)分析后,可結(jié)合離線日志文件中的軌跡信息對(duì)每條指令進(jìn)行細(xì)粒度分析,同時(shí)可結(jié)合控制流污點(diǎn)信息對(duì)分析出的漏洞可疑點(diǎn)進(jìn)行輔助分析。以目標(biāo)程序test作為原型系統(tǒng)輸入并執(zhí)行,輸入字符串為“abcdef”,共7個(gè)字符,此時(shí)未發(fā)生緩沖區(qū)溢出,不會(huì)觸發(fā)潛在漏洞。運(yùn)行結(jié)束后對(duì)安全日志文件中的軌跡信息進(jìn)行離線分析,發(fā)現(xiàn)當(dāng)前存在脆弱性可疑點(diǎn)的匹配項(xiàng)REP MOVSL ES:[EDI],DS:[ESI] M@0x003e37c0[0x61656c70]$4 UT M@0x0022fef6[0x33323130]$4 T R@ecx[0x00000002]$4 T,判定該位置存在緩沖區(qū)溢出可疑點(diǎn),此時(shí)輸出如下信息:
Program:test
Trace ID: test_28
Suspicious location:184
Suspicious mode: buffer overflow
Suspicious address:0x77c1168d
Suspicious instruction: REPMOVSL ES:[EDI],DS:[ESI]
M@0x003e37c0[0x61656c70]$4 UT
M@0x0022fef6[0x33323130]$4 T
R@ecx[0x00000002]$4 T
……
通過結(jié)合分析污點(diǎn)指令,發(fā)現(xiàn)原因在于在字符轉(zhuǎn)移時(shí),匯編程序會(huì)對(duì)其有效性進(jìn)行判斷,檢測(cè)是否等于0x09,0x0d,0x20等。
程序結(jié)束時(shí)刻對(duì)應(yīng)的控制流轉(zhuǎn)移指令信息如下:
……
1311:4013e8:CMP 0x5a,AL,0x5a R@AL[0x00000030]$1 T I@0x00000000[0x0000005a]$1
1312:4013ea:JE J@0x0000000[004013f8]$4 E@0x000000 00[0x0000000e]$4 T
……
該指令中包含的污點(diǎn)變量與char型的Z的ASCII碼90(0x5a)進(jìn)行比較,只有相等情況下才執(zhí)行跳轉(zhuǎn)。
針對(duì)現(xiàn)有動(dòng)態(tài)污點(diǎn)分析系統(tǒng)存在的準(zhǔn)確率方面的問題,提出了基于動(dòng)態(tài)污點(diǎn)分析的二進(jìn)制程序漏洞挖掘與分析技術(shù),從動(dòng)態(tài)污點(diǎn)分析的三個(gè)主要階段逐一對(duì)準(zhǔn)確度問題進(jìn)行改進(jìn),有效解決了“過污染”造成的誤報(bào)以及由于“欠污染”造成的漏報(bào)問題,增加了針對(duì)控制流的污點(diǎn)分析,并基于此方法實(shí)現(xiàn)了原型系統(tǒng)ODDTA。實(shí)驗(yàn)結(jié)果表明,該方法能夠有效提升漏洞挖掘的精準(zhǔn)度和執(zhí)行效率。下一步將結(jié)合符號(hào)執(zhí)行和模糊測(cè)試技術(shù),進(jìn)一步細(xì)化控制流污點(diǎn)分析,實(shí)現(xiàn)測(cè)試路徑的自動(dòng)生成,提高對(duì)目標(biāo)程序的分析效能。
[1] LAM M S,MARTIN M,LIVSHITS B,et al.Securing web applications with static and dynamic information flow tracking[C]//Proceedings of the 2008 ACM SIGPLAN symposium on partial evaluation and semantics-based program manipulation.New York,NY,USA:ACM,2008:3-12.
[2] 宋奕青.基于動(dòng)態(tài)二進(jìn)制探測(cè)框架的緩沖區(qū)溢出檢測(cè)研究[D].上海:上海交通大學(xué),2010.
[3] SHARIF M,LANZI A,GIFFIN J,et al.Automatic reverse engineering of malware emulators[C]//30th IEEE symposium on security and privacy.Washington,DC,USA:IEEE Computer Society,2009:94-109.
[4] COMPARETTI P M,WONDRACEK G,KRUEGEL C,et al.Prospex:protocol specification extraction[C]//30th IEEE symposium on security and privacy.Washington,DC,USA:IEEE Computer Society,2009:110-125.
[5] 史大偉,袁天偉.一種粗細(xì)粒度結(jié)合的動(dòng)態(tài)污點(diǎn)分析方法[J].計(jì)算機(jī)工程,2014,40(3):12-17.
[6] 李 根.基于動(dòng)態(tài)測(cè)試用例生成的二進(jìn)制軟件缺陷自動(dòng)發(fā)掘技術(shù)研究[D].長(zhǎng)沙:國(guó)防科學(xué)技術(shù)犬學(xué),2010.
[7] WANG T,WEI T,GU G,et al.TaintScope:a checksum-aware directed fuzzing tool for automatic software vulnerability detection[C]//IEEE symposium on security and privacy.Washington,DC,USA:IEEE Computer Society,2010:497-512.
[8] 諸葛建偉,陳力波,田 繁,等.基于類型的動(dòng)態(tài)污點(diǎn)分析技術(shù)[J].清華大學(xué)學(xué)報(bào):自然科學(xué)版,2012,52(10):1320-1328.
[9] 陳衍鈴,趙 靜.基于虛擬化技術(shù)的動(dòng)態(tài)污點(diǎn)分析[J].計(jì)算機(jī)應(yīng)用,2011,31(9):2367-2372.
[10] 宋 錚,王永劍,金 波,等.二進(jìn)制程序動(dòng)態(tài)污點(diǎn)分析技術(shù)研究綜述[J].信息網(wǎng)絡(luò)安全,2016(3):77-83.
[11] KOHLI P.Coarse-grained dynamic taint analysis for defeating control and non-control data attacks[EB/OL].(2017-06-12).https://arxiv.org/abs/0906.4481.
[12] YIN H,SONG D,EGELE M,et al.Panorama:capturing system-wide information flow for malware detection and analysis[C]//Proceedings of the 14th ACM conference on computer and communications security.New York,NY,USA:ACM,2007:116-127.
[13] NETHERCOTE N,SEWARD J.How to shadow every byte of memory used by a program[C]//Proceedings of the 3rd international conference on virtual execution environments.New York,NY,USA:ACM,2007:65-74.
[14] 黃 強(qiáng),曾慶凱.基于信息流策略的污點(diǎn)傳播分析及動(dòng)態(tài)驗(yàn)證[J].軟件學(xué)報(bào),2011,22(9):2036-2048.
[15] 王 卓.基于符號(hào)執(zhí)行的二進(jìn)制代碼動(dòng)態(tài)污點(diǎn)分析[D].上海:上海交通大學(xué),2011.
[16] LUK C K,COHN R,MUTH R,et al.Pin:building customized program analysis tools with dynamic instrumentation[J].ACM SIGPLAN Notices,2005,40(6):190-200.
[17] SRIVASTAVA A,EUSTACE A.ATOM:a system for building customized program analysis tools[J].ACM SIGPLAN Notices,2004,39(4):528-539.
[18] 王鐵磊,韋 韜,鄒 維.基于roBDD的細(xì)顆粒度動(dòng)態(tài)污點(diǎn)分析[J].北京大學(xué)學(xué)報(bào):自然科學(xué)版,2011,47(6):1003-1008.