置,并分析得到所在的目標(biāo)操作基本塊。步驟46標(biāo)記敏感導(dǎo)向函數(shù):遍歷目標(biāo)操作基本塊的入口與目標(biāo)操作位置之間所有指令將其中被調(diào)用的函數(shù)標(biāo)記為敏感導(dǎo)向,并添加到敏感導(dǎo)向函數(shù)鏈表中。步驟47將目標(biāo)操作基本塊的前驅(qū)基本塊鏈表中所有基本塊添加到待擴(kuò)展基本塊集合中。步驟48判斷待擴(kuò)展基本塊集合是否為空,若是,轉(zhuǎn)步驟44,結(jié)束循環(huán);否則轉(zhuǎn)步驟49,進(jìn)入循環(huán)。步驟49從待擴(kuò)展基本塊集合中取一個(gè)基本塊為當(dāng)前基本塊。步驟4a標(biāo)記敏感導(dǎo)向函數(shù):遍歷當(dāng)前基本塊的指令鏈表,將其中被調(diào)用函數(shù)標(biāo)記為敏感導(dǎo)向,并添加到敏感導(dǎo)向函數(shù)鏈表中。4b將當(dāng)前基本塊的前驅(qū)基本塊鏈表中的基本塊添加到待擴(kuò)展基本塊集合中,跳轉(zhuǎn)到步驟48。步驟4c取敏感相關(guān)函數(shù)鏈表中下一個(gè)函數(shù)為當(dāng)前函數(shù),跳轉(zhuǎn)到步驟42。步驟4d設(shè)置循環(huán)初始條件,取敏感導(dǎo)向函數(shù)鏈表中的第一個(gè)函數(shù)為當(dāng)前函數(shù)。步驟4e判斷當(dāng)前函數(shù)是否為空,若為空,跳轉(zhuǎn)到步驟4h,敏感導(dǎo)向函數(shù)標(biāo)記結(jié)束;否則跳轉(zhuǎn)到步驟4f,進(jìn)入循環(huán)。步驟4f標(biāo)記敏感導(dǎo)向函數(shù):將當(dāng)前函數(shù)的調(diào)用函數(shù)鏈表中所有調(diào)用函數(shù)標(biāo)記為敏感導(dǎo)向并添加到敏感導(dǎo)向函數(shù)鏈表中。步驟4g取敏感導(dǎo)向函數(shù)鏈表中下一個(gè)函數(shù)為當(dāng)前函數(shù),跳轉(zhuǎn)到步驟4e。步驟4h是結(jié)束狀態(tài)。
[0034]圖5為有效跳轉(zhuǎn)收集流程圖。步驟50是起始動(dòng)作。步驟51設(shè)置循環(huán)初始狀態(tài),取函數(shù)鏈表中第一個(gè)函數(shù)為當(dāng)前函數(shù)。步驟52判斷當(dāng)前函數(shù)是否為空,若是,轉(zhuǎn)步驟5c,結(jié)束循環(huán);否則跳轉(zhuǎn)步驟53,進(jìn)入循環(huán)。步驟53判斷當(dāng)前函數(shù)是否是敏感相關(guān)且非敏感導(dǎo)向的,若是,跳轉(zhuǎn)到步驟54,進(jìn)入循環(huán);否則跳轉(zhuǎn)到步驟5b,不分析當(dāng)前函數(shù)。步驟54將當(dāng)前函數(shù)中所有包含目標(biāo)操作集合中目標(biāo)操作的基本塊添加到待分析基本塊集合中。步驟55判斷待分析基本塊集合是否為空,若是,當(dāng)前函數(shù)內(nèi)的有效跳轉(zhuǎn)收集完成,跳轉(zhuǎn)到步驟5b,結(jié)束循環(huán);否則跳轉(zhuǎn)到步驟56,進(jìn)入循環(huán)。步驟56從待分析基本塊集合中取一個(gè)基本塊為當(dāng)前基本塊。步驟57設(shè)置循環(huán)起始狀態(tài),取當(dāng)前基本塊的前驅(qū)基本塊鏈表中第一個(gè)基本塊為當(dāng)前前驅(qū)基本塊。步驟58判斷當(dāng)前前驅(qū)基本塊是否為空,若是,跳轉(zhuǎn)到步驟55,循環(huán)結(jié)束;否則跳轉(zhuǎn)步驟59,進(jìn)入循環(huán)。步驟59構(gòu)造有效跳轉(zhuǎn):從當(dāng)前前驅(qū)基本塊中獲得跳轉(zhuǎn)指令inst及當(dāng)前前驅(qū)基本塊到當(dāng)前基本塊的跳轉(zhuǎn)條件取值value,構(gòu)造有效跳轉(zhuǎn)〈fun, inst, value)并添加到有效跳轉(zhuǎn)表中,〈fun, inst, value〉表示函數(shù)fun中的跳轉(zhuǎn)指令inst在條件取值為value時(shí)能夠?qū)蚝心繕?biāo)操作的基本塊。步驟5a取當(dāng)前基本塊中前驅(qū)基本塊鏈表中的下一個(gè)基本塊為當(dāng)前前驅(qū)基本塊,跳轉(zhuǎn)到步驟58。步驟5b取函數(shù)鏈表中下一個(gè)函數(shù)為當(dāng)前函數(shù),跳轉(zhuǎn)到步驟52。步驟5c為結(jié)束狀態(tài)。
[0035]圖6為分支打分流程圖。步驟60是起始操作。步驟61設(shè)置循環(huán)起始狀態(tài),取函數(shù)鏈表中第一個(gè)函數(shù)為當(dāng)前函數(shù)。步驟62判斷當(dāng)前函數(shù)是否為空,若是,跳轉(zhuǎn)步驟6e,打分結(jié)束;否則跳轉(zhuǎn)到步驟63,進(jìn)入循環(huán)。步驟63將當(dāng)前函數(shù)中的所有葉子基本塊的路徑總數(shù)初始化為1,包含目標(biāo)操作集合中目標(biāo)操作的葉子基本塊的敏感操作路徑數(shù)初始化為1,不包含目標(biāo)操作集合中目標(biāo)操作的葉子基本塊的敏感操作路徑數(shù)初始化為0,將每個(gè)葉子基本塊的分?jǐn)?shù)初始化為敏感操作相關(guān)路徑數(shù)/路徑總數(shù),并添加到待分析基本塊集合中。步驟64判斷待分析基本塊集合是否為空,若是,當(dāng)前函數(shù)內(nèi)分支打分結(jié)束,轉(zhuǎn)步驟6d ;否則轉(zhuǎn)步驟65,進(jìn)入循環(huán)。步驟65從待分析基本塊集合中取一個(gè)基本塊作為當(dāng)前基本塊。步驟66設(shè)置循環(huán)起始狀態(tài),取當(dāng)前基本塊的前驅(qū)基本塊鏈表中第一個(gè)基本塊為當(dāng)前前驅(qū)基本塊。步驟67判斷當(dāng)前前驅(qū)基本塊是否為空,若是,轉(zhuǎn)步驟64,否則跳轉(zhuǎn)到步驟68,進(jìn)入循環(huán)。步驟68判斷當(dāng)前前驅(qū)基本塊是否有分?jǐn)?shù),若有,轉(zhuǎn)步驟6c,否則跳轉(zhuǎn)到步驟69。步驟69判斷當(dāng)前前驅(qū)基本塊是否滿足打分條件,即是否當(dāng)前前驅(qū)基本塊后繼基本塊鏈表中的所有后繼基本塊都有分?jǐn)?shù),若是,跳轉(zhuǎn)到步驟6a,否則不分析當(dāng)前前驅(qū)基本塊,轉(zhuǎn)步驟6c。步驟6a給當(dāng)前前驅(qū)基本塊打分:更新當(dāng)前前驅(qū)基本塊的路徑總數(shù)為其后繼基本塊鏈表中所有后繼基本塊的路徑總數(shù)之和,敏感操作相關(guān)路徑數(shù)為所有后繼基本塊的敏感操作相關(guān)路徑數(shù)之和,當(dāng)前前驅(qū)基本塊的打分為敏感操作相關(guān)路徑數(shù)/路徑總數(shù)。步驟6b把當(dāng)前前驅(qū)基本塊添加到待分析基本塊集合與分支打分表中。步驟6c取當(dāng)前基本塊的前驅(qū)基本塊鏈表中下一個(gè)基本塊為當(dāng)前前驅(qū)基本塊,轉(zhuǎn)步驟64。步驟6d,取函數(shù)鏈表中下一個(gè)函數(shù)為當(dāng)前函數(shù),跳轉(zhuǎn)到步驟62。步驟6e是結(jié)束狀態(tài)。
[0036]圖7為符號(hào)執(zhí)行流程圖。步驟70是起始動(dòng)作。步驟71初始化執(zhí)行環(huán)境:按照用戶(hù)提供的參數(shù)鏈接相應(yīng)的函數(shù)庫(kù),完成加載時(shí)鏈接過(guò)程。步驟72符號(hào)化輸入:按照用戶(hù)提供的參數(shù)對(duì)程序的輸入進(jìn)行符號(hào)化,可以指定符號(hào)化參數(shù)的個(gè)數(shù)、長(zhǎng)度以及符號(hào)化文件的個(gè)數(shù)和長(zhǎng)度。步驟73初始化執(zhí)行狀態(tài)并將執(zhí)行狀態(tài)添加到執(zhí)行狀態(tài)池中,包括初始化執(zhí)行狀態(tài)的約束集合、指令指針、棧與堆等。步驟74判斷執(zhí)行狀態(tài)池是否為空,若是,符號(hào)執(zhí)行結(jié)束,轉(zhuǎn)步驟79,否則轉(zhuǎn)步驟75,進(jìn)入循環(huán)。步驟75從執(zhí)行狀態(tài)池中取一個(gè)執(zhí)行狀態(tài)作為當(dāng)前執(zhí)行狀態(tài),選取執(zhí)行狀態(tài)的標(biāo)準(zhǔn)為圖6中得到的分支打分表,優(yōu)先選取指令指針?biāo)钢噶罘謹(jǐn)?shù)更高的執(zhí)行狀態(tài)。步驟76執(zhí)行當(dāng)前執(zhí)行狀態(tài)中指令:從當(dāng)前執(zhí)行狀態(tài)中指令指針?biāo)钢噶铋_(kāi)始模擬執(zhí)行連續(xù)的順序流指令,收集執(zhí)行路徑上的約束到當(dāng)前執(zhí)行狀態(tài)的約束集合。步驟77判斷當(dāng)前執(zhí)行狀態(tài)是否為程序終止?fàn)顟B(tài),若是,跳轉(zhuǎn)到步驟74 ;否則跳轉(zhuǎn)步驟78。步驟78將當(dāng)前執(zhí)行狀態(tài)放入執(zhí)行狀態(tài)池中,跳轉(zhuǎn)到步驟74。步驟79結(jié)束。退出完成。
[0037]圖8為指令執(zhí)行流程圖。該過(guò)程在KLEE指令模擬執(zhí)行的基礎(chǔ)上,利用靜態(tài)分析的結(jié)果引導(dǎo)符號(hào)執(zhí)行探索漏洞相關(guān)路徑并驗(yàn)證是否存在違反安全約束的敏感操作。步驟80是起始操作。步驟81將當(dāng)前執(zhí)行狀態(tài)中指令指針指向的指令作為當(dāng)前指令。步驟82判斷當(dāng)前指令是否是敏感操作及安全約束表中的敏感操作,若是,轉(zhuǎn)步驟83,否則跳轉(zhuǎn)到步驟85。步驟83將敏感操作及安全約束表中當(dāng)前指令對(duì)應(yīng)的安全約束取反后與當(dāng)前執(zhí)行狀態(tài)的約束集合一起交由約束求解器STP進(jìn)行約束求解,如果可解,則存在能夠違反安全約束的測(cè)試樣例,不安全,跳轉(zhuǎn)到步驟8c ;否則跳轉(zhuǎn)到步驟85。步驟84判斷當(dāng)前指令是否是Call指令,若是,跳轉(zhuǎn)到步驟85,否則跳轉(zhuǎn)步驟87。步驟85判斷當(dāng)前指令調(diào)用的目標(biāo)函數(shù)是否是非敏感相關(guān)且非敏感導(dǎo)向的,若是,不執(zhí)行當(dāng)前Call指令,跳轉(zhuǎn)步驟8d,結(jié)束;否則跳轉(zhuǎn)到步驟86。步驟86按照指令語(yǔ)義模擬執(zhí)行當(dāng)前指令,跳轉(zhuǎn)到步驟8d。步驟87判斷當(dāng)前指令是否是Br或者Switch語(yǔ)句,若是,轉(zhuǎn)步驟88,否則跳轉(zhuǎn)到步驟8b。步驟88判斷當(dāng)前指令所屬的函數(shù)是否為敏感導(dǎo)向函數(shù),若是,轉(zhuǎn)步驟8a,否則跳轉(zhuǎn)到步驟Sb。步驟89利用約束求解器對(duì)每個(gè)分支檢查可達(dá)性,并為每個(gè)可達(dá)的分支創(chuàng)建一個(gè)對(duì)應(yīng)的執(zhí)行狀態(tài),放入執(zhí)行狀態(tài)池中,跳轉(zhuǎn)到步驟8d。步驟8a按照有效跳轉(zhuǎn)表,對(duì)表中每個(gè)有效分支檢查可達(dá)性,為每個(gè)可達(dá)的有效分支創(chuàng)建一個(gè)對(duì)應(yīng)的執(zhí)行狀態(tài),放入執(zhí)行狀態(tài)池中,不在有效跳轉(zhuǎn)表中的分支則不做處理,跳轉(zhuǎn)到步驟8d。步驟8b模擬執(zhí)行當(dāng)前指令,跳轉(zhuǎn)步驟8d。步驟8c將生成的測(cè)試樣例報(bào)告給用戶(hù),跳轉(zhuǎn)到步驟8d。步驟8d是結(jié)束狀態(tài)。
【主權(quán)項(xiàng)】
1.一種靜態(tài)分析輔助的符號(hào)執(zhí)行漏洞檢測(cè)方法,其特征是包括輕量級(jí)符號(hào)執(zhí)行、圖生成、靜態(tài)分析和符號(hào)執(zhí)行等階段; O輕量級(jí)符號(hào)執(zhí)行階段,使用KLEE符號(hào)執(zhí)行工具以簡(jiǎn)單的符號(hào)化策略在很小的時(shí)間開(kāi)銷(xiāo)下對(duì)目標(biāo)程序字節(jié)碼文件進(jìn)行符號(hào)執(zhí)行以獲得完成鏈接過(guò)程后的完整程序的字節(jié)碼;輕量級(jí)符號(hào)執(zhí)行過(guò)程使用符號(hào)執(zhí)行工具KLEE對(duì)目標(biāo)程序字節(jié)碼進(jìn)行符號(hào)執(zhí)行得到鏈接后的完整程序字節(jié)碼,符號(hào)化策略為:-Sym-argS I I 2,即I個(gè)長(zhǎng)度為I個(gè)字節(jié)的符號(hào)作為程序輸入; 2)圖生成階段,在完整程序的字節(jié)碼的基礎(chǔ)上,通過(guò)使用LLVM3.1工具集中的opt工具生成完整程序的函數(shù)調(diào)用圖與各個(gè)函數(shù)的控制流圖;生成的函數(shù)調(diào)用圖中包括兩類(lèi)語(yǔ)句:函數(shù)描述語(yǔ)句與函數(shù)調(diào)用關(guān)系描述語(yǔ)句;函數(shù)描述語(yǔ)句中包括了函數(shù)調(diào)用圖中出現(xiàn)的所有函數(shù)的函數(shù)名與函數(shù)編號(hào);函數(shù)調(diào)用關(guān)系描述語(yǔ)句則描述了所有函數(shù)之間的調(diào)用關(guān)系;函數(shù)的控制流圖中包含兩類(lèi)語(yǔ)句:基本塊描述語(yǔ)句與基本塊間關(guān)系描述語(yǔ)句;基本塊描述語(yǔ)句描述了函數(shù)中每個(gè)基本塊的基本塊編號(hào),基本塊標(biāo)簽和基本塊包含的指令,特別地,如果該基本塊的最后一條語(yǔ)句是條件分支指令,基本塊描述語(yǔ)句中還會(huì)包含