專利名稱:一種程序分解方法
技術(shù)領(lǐng)域:
本發(fā)明涉及程序分析和程序安全審計(jì),尤其涉及一種程序分解方法及其在漏洞挖掘中 的應(yīng)用,屬于軟件工程、信息安全技術(shù)領(lǐng)域。
背景技術(shù):
由于現(xiàn)在軟件規(guī)模越來越大,設(shè)計(jì)越來越復(fù)雜,軟件中不可避免地存在大量漏洞;同 時(shí),龐大的軟件規(guī)模給程序分析和代碼安全審計(jì)帶來巨大困難。例如,Linux 2.6.27內(nèi)核源 代碼行數(shù)已經(jīng)超過了 1000萬行,Windows Vista操作系統(tǒng)代碼規(guī)模在5000萬行以上。為了 分析如此大規(guī)模的軟件,首先需要將大的程序分解為多個(gè)較小的代碼片段從而使代碼安全 分析變?yōu)榭尚?,因此程序分解技術(shù)一直是業(yè)界研究的焦點(diǎn)。
最常見的程序分解方法是程序切片技術(shù)。程序切片技術(shù)由M. Weiser于1979年首次提 出,經(jīng)過幾十年的發(fā)展,理論研究日益豐富,形成了多個(gè)分支。但是,應(yīng)用程序切片技術(shù) 分解程序時(shí),需要構(gòu)造大量數(shù)據(jù)流方程,迭代求解這些數(shù)據(jù)流方程的過程異常復(fù)雜;此外, 當(dāng)程序中存在大量指針別名時(shí),切片技術(shù)的準(zhǔn)確性受到嚴(yán)重制約。
另一方面,程序切片技術(shù)并沒有考慮到代碼安全分析領(lǐng)域新產(chǎn)生的需求。根據(jù)CERT 的研究報(bào)告,絕大部分的程序安全漏洞都是因?yàn)槌绦驔]有對污染數(shù)據(jù)(如從文件、網(wǎng)絡(luò)等讀 取的數(shù)據(jù))進(jìn)行嚴(yán)格檢驗(yàn)而造成的,當(dāng)這些污染數(shù)據(jù)應(yīng)用于敏感的系統(tǒng)調(diào)用(如execv、strcpy) 時(shí),就會引發(fā)嚴(yán)重的安全問題。安全分析人員需要對這種既包含污染數(shù)據(jù)引入函數(shù)(如 fread, recv, recvfrom等)也包含污染數(shù)據(jù)敏感函數(shù)(如execv, strcpy, strcat等)的程序路徑 格外關(guān)注,因?yàn)檫@些路徑最容易引發(fā)安全問題。比如,函數(shù)recv會引入污染數(shù)據(jù),而函數(shù) execv對污染數(shù)據(jù)敏感,在下面所示代碼中,
int size = recv(s, buffer, sizeof(buffer),0); if(size!=-l){
check—buf(buffer);
execv(buffer, argv);
存在一條程序路徑,調(diào)用函數(shù)recv()讀取網(wǎng)絡(luò)數(shù)據(jù)后,又調(diào)用了函數(shù)execv()。因?yàn)榫W(wǎng)絡(luò)數(shù)據(jù)被直接用于函數(shù)execv()將會導(dǎo)致嚴(yán)重的安全威脅,分析人員需要嚴(yán)格分析這段代碼 以確認(rèn)是否存在安全問題。
發(fā)明內(nèi)容
本發(fā)明目的在于克服現(xiàn)有技術(shù)中存在的問題,提供一種程序分解方法,以及該方法用 于漏洞挖掘的用途。
本發(fā)明程序分解方法通過分析程序函數(shù)調(diào)用圖和程序控制流圖,自動識別程序中最容 易引起安全問題的程序路徑(在這些程序路徑上,調(diào)用污染數(shù)據(jù)引入函數(shù)后,又調(diào)用了污染 數(shù)據(jù)敏感函數(shù)),進(jìn)而將大規(guī)模程序分解為較小的代碼片段,充分降低程序分析的復(fù)雜性, 大大提高代碼安全分析的效率。
本發(fā)明程序分解方法包括下列步驟
1. 設(shè)定始函數(shù)和終函數(shù);
2. 以所述始函數(shù)和直接或間接調(diào)用所述始函數(shù)的函數(shù)組成的函數(shù)集作為Source;以 所述終函數(shù)以及直接或間接調(diào)用所述終函數(shù)的函數(shù)組成的函數(shù)集作為Sinks;若Source fl Sinks為空,則本方法不適用;
3. 對[Source-(SourcenSinks)]中的每一個(gè)函數(shù),以該函數(shù)的控制流圖中由入口節(jié)點(diǎn)經(jīng) 調(diào)用Source中函數(shù)的節(jié)點(diǎn)到出口節(jié)點(diǎn)的控制流作為分解后的控制流對[Sinks-(SourcenSinks)]中的每一個(gè)函數(shù),以該函數(shù)的控制流圖中由入口節(jié)點(diǎn)經(jīng)調(diào)用 Sinks中函數(shù)的節(jié)點(diǎn)到出口節(jié)點(diǎn)的控制流作為分解后的控制流對(Source門Sinks)中的每一個(gè)函數(shù),以該函數(shù)的控制流圖中由入口節(jié)點(diǎn)經(jīng)調(diào)用(Source USinks)中函數(shù)的節(jié)點(diǎn)到出口節(jié)點(diǎn)的控制流作為分解后的控制流4. 按照所述程序的函數(shù)調(diào)用圖依次連接步驟c)所述各個(gè)分解后的控制流圖,并以對 應(yīng)的程序作為分解后的程序。
在所述分解后的程序中,既調(diào)用了始函數(shù),也調(diào)用了終函數(shù)。
進(jìn)一步,上述步驟2可通過下述方法進(jìn)行
i. 在所述程序的函數(shù)調(diào)用圖中,設(shè)置始函數(shù)所在的節(jié)點(diǎn)具有"i"屬性;設(shè)置終函數(shù) 所在的節(jié)點(diǎn)具有"u"屬性;
ii. 以始函數(shù)或終函數(shù)所在的節(jié)點(diǎn)為起點(diǎn),同時(shí)向上作下述遞歸分析若某節(jié)點(diǎn)的子 節(jié)點(diǎn)具有"i"屬性,則設(shè)置該節(jié)點(diǎn)具有"i"屬性;若某節(jié)點(diǎn)的子節(jié)點(diǎn)具有"11"屬性,則設(shè)置該節(jié)點(diǎn)具有"U"屬性;
iii.以所有具有"i"屬性的節(jié)點(diǎn)所對應(yīng)的函數(shù)組成的函數(shù)集作為Source;以所有具有 "u"屬性的節(jié)點(diǎn)所對應(yīng)的函數(shù)組成的函數(shù)集作為Sinks。
進(jìn)一步,上述步驟3可通過下述方法進(jìn)行
對(SourceU Sinks)中的每一個(gè)函數(shù)f,在該函數(shù)的控制流圖中,若某節(jié)點(diǎn)對應(yīng)的函數(shù)屬 于Source,則設(shè)置該節(jié)點(diǎn)具有"r"屬性;若某節(jié)點(diǎn)對應(yīng)的函數(shù)屬于Sinks,則設(shè)置該節(jié)點(diǎn) 具有"w"屬性;
如果f $ Sinks (即f在Source中而不在Sinks中),根據(jù)函數(shù)f原有控制流圖生成新控 制流圖的過程為
a) 初始化節(jié)點(diǎn)集合ebsl= ebs2 = {函數(shù)f原有控制流圖中屬性為"r"的節(jié)點(diǎn)〉;
b) 向上擴(kuò)充ebsl:循環(huán)地把ebsl中節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)加入到ebsl,直到ebsl中每個(gè)節(jié) 點(diǎn)的所有前驅(qū)節(jié)點(diǎn)也在ebsl內(nèi);
c) 向下擴(kuò)充ebs2:循環(huán)地把ebs2中節(jié)點(diǎn)的后繼節(jié)點(diǎn)加入到ebs2,直到ebs2中每個(gè)節(jié) 點(diǎn)的所有后繼也在ebs2內(nèi);
d) 函數(shù)f新控制流圖中的節(jié)點(diǎn)=ebslUebs2;
如果f $ Source (即f在Sinks中而不在Source中),根據(jù)函數(shù)f原有控制流圖生成新控 制流圖的過程為
a) 初始化節(jié)點(diǎn)集合ebsl= ebs2 = {函數(shù)f原有控制流圖中屬性為"w"的節(jié)點(diǎn)〉;
b) 向上擴(kuò)充ebsl:循環(huán)地把ebsl中節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)加入到ebsl,直到ebsl中每個(gè)節(jié) 點(diǎn)的所有前驅(qū)節(jié)點(diǎn)也在ebsl內(nèi);
c) 向下擴(kuò)充ebs2:循環(huán)地把ebs2中節(jié)點(diǎn)的后繼節(jié)點(diǎn)加入到ebs2,直到ebs2中每個(gè)節(jié) 點(diǎn)的所有后繼也在ebs2內(nèi);
d) 函數(shù)f新控制流圖中的節(jié)點(diǎn)=ebslUebS2;
如果f e SourcenSinks,根據(jù)函數(shù)f原有控制流圖生成新控制流圖的過程為
a) 初始化節(jié)點(diǎn)集合ebsl= ebs2 = {函數(shù)f原有控制流圖中屬性為"r"的節(jié)點(diǎn)〉;
b) 初始化節(jié)點(diǎn)集合ebs3= ebs4 = {函數(shù)f原有控制流圖中屬性為"w"的節(jié)點(diǎn));
c) 向上擴(kuò)充ebsl:循環(huán)地把ebsl中節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)加入到ebsl,直到ebsl中每個(gè)節(jié) 點(diǎn)的所有前驅(qū)節(jié)點(diǎn)也在ebsl內(nèi);
d) 向下擴(kuò)充ebs2:循環(huán)地把ebs2中節(jié)點(diǎn)的后繼節(jié)點(diǎn)加入到ebs2,直到ebs2中每個(gè)節(jié)
6點(diǎn)的所有后繼也在ebs2內(nèi);
e) 向上擴(kuò)充ebs3:循環(huán)地把ebs3中節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)加入到ebs3,直到ebs3中每個(gè)節(jié) 點(diǎn)的所有前驅(qū)節(jié)點(diǎn)也在ebs3內(nèi);
f) 向下擴(kuò)充ebs4:循環(huán)地把ebs4中節(jié)點(diǎn)的后繼節(jié)點(diǎn)加入到ebs4,直到ebs4中每個(gè)節(jié) 點(diǎn)的所有后繼也在ebs4內(nèi);
g) 函數(shù)f新控制流圖中的節(jié)點(diǎn)=ebsl U(ebs2Hebs3)Uebs4。
本發(fā)明可用于多種用途,特別地,本發(fā)明可用于漏洞挖掘。
當(dāng)本發(fā)明用于漏洞挖掘時(shí),所述始函數(shù)選自污染數(shù)據(jù)引入函數(shù),所述終函數(shù)選自污染 數(shù)據(jù)敏感函數(shù)。
所述污染數(shù)據(jù)引入函數(shù)包括但不限于基本的文件讀入函數(shù)(如fread, read, fgetc, fgets, fscanf),網(wǎng)絡(luò)數(shù)據(jù)讀入函數(shù)(如recv, recvfrom, recvmsg)和格式化輸入函數(shù)(如scanf, fscanf, sscanf, vscanf, vsscanf, vfscanf)等;
所述污染數(shù)據(jù)敏感函數(shù)包括但不限于內(nèi)存操作函數(shù)(如memcpy, wmemcpy, memccpy, bcopy),內(nèi)存分酉己函數(shù)(如malloc, realloc, alloc, heapalloc),字符串操作函數(shù)(如strcat, strcpy, sprintf, printf)禾口進(jìn)程啟動函數(shù)(如execl, execlp, execle, execv, execvp)等o
可以理解,根據(jù)目標(biāo)程序的不同以及分析關(guān)注點(diǎn)的不同,可以選擇不同的始函數(shù)和終 函數(shù);基于不同的始函數(shù)和/終函數(shù)獲得的分解后的程序也不相同。
和現(xiàn)有技術(shù)相比,本發(fā)明的優(yōu)點(diǎn)和積極效果如下
1. 本發(fā)明可以有效分解程序,自動識別最容易發(fā)生安全問題的程序代碼,大大降低 程序分析的復(fù)雜性,減少分析人員的工作量;
2. 本發(fā)明不依賴于程序語言的種類,可直接應(yīng)用于各種語言(如C/C++、 Java、 Delphi、 匯編語言等)的程序,普適性強(qiáng);
3. 本發(fā)明可擴(kuò)展性強(qiáng)應(yīng)用本發(fā)明時(shí)用戶可以根據(jù)自身經(jīng)驗(yàn)和對目標(biāo)系統(tǒng)的理解, 任意更改始函數(shù)和終函數(shù),以達(dá)到最佳效果;
本發(fā)明復(fù)雜度低,效率高,易于實(shí)現(xiàn);本發(fā)明所用到的"函數(shù)調(diào)用圖"和"控制流圖"是 程序分析領(lǐng)域基本知識,大量程序分析工具如Codesurfer, IDAPro都可以自動生成函數(shù)調(diào) 用圖和控制流圖。
圖1表示實(shí)施例待分解程序的函數(shù)調(diào)用示意圖2表示實(shí)施例函數(shù)main的控制流示意圖;陰影部分為經(jīng)過本發(fā)明分解后所保留部分; 圖3表示實(shí)施例函數(shù)getline的控制流示意圖;陰影部分為經(jīng)過本發(fā)明分解后所保留部分; 圖4表示實(shí)施例函數(shù)mnprog的控制流示意圖;陰影部分為經(jīng)過本發(fā)明分解后所保留部分。
具體實(shí)施例方式
下面結(jié)合附圖,更詳細(xì)的描述本發(fā)明的實(shí)施例。 本實(shí)施例用于漏洞挖掘的程序分解方法包括下列步驟 步驟l:設(shè)定始函數(shù)和終函數(shù)。
本實(shí)施例以fread為始函數(shù),以execv為終函數(shù)。 步驟2:以所述始函數(shù)和直接或間接調(diào)用所述始函數(shù)的函數(shù)組成的函數(shù)集作為Source;以 所述終函數(shù)以及直接或間接調(diào)用所述終函數(shù)的函數(shù)組成的函數(shù)集作為Sinks。
舉例來說,如圖1所示,getline直接調(diào)用fread,因此加入Source,而main通過getline 間接調(diào)用execv,因此也加入Source。
本實(shí)例中,典型運(yùn)行結(jié)果為
Source = {fread, getline, main}
Sinks = {execv, runprog, main}
因?yàn)镾ource門Sinks為(main),繼續(xù)執(zhí)行。 步驟3:對(SourceUSinks)中的各個(gè)函數(shù),生成新的控制流圖。
遍歷每個(gè)函數(shù)的控制流圖,確定控制流圖中每一個(gè)節(jié)點(diǎn)的屬性,具體實(shí)施過程如下
設(shè)置該節(jié)點(diǎn)不具有任何屬性值;
如果該節(jié)點(diǎn)含有調(diào)用Source中的函數(shù)的語句,標(biāo)記該節(jié)點(diǎn)具有"r"屬性;同時(shí),如果 該節(jié)點(diǎn)含有調(diào)用Sinks中的函數(shù)的語句,標(biāo)記該節(jié)點(diǎn)具有"w"屬性。如圖2所示,節(jié)點(diǎn)B 內(nèi)調(diào)用了函數(shù)getline,而getline屬于Source,故節(jié)點(diǎn)B被標(biāo)識為"r"屬性;節(jié)點(diǎn)D調(diào)用了 函數(shù)runprog,而runprog屬于Sinks ,故節(jié)點(diǎn)D被標(biāo)識為"w"屬性。
在本實(shí)例中,典型運(yùn)行結(jié)果為
圖2中節(jié)點(diǎn)B為"r"屬性;
圖2中節(jié)點(diǎn)D為"w"屬性;圖3中節(jié)點(diǎn)J為"r"屬性;
圖4中節(jié)點(diǎn)T和節(jié)點(diǎn)W為"w"屬性;
其余節(jié)點(diǎn)不具有"r"、 "w"屬性。
然后,為每個(gè)函數(shù)生成新的控制流圖,具體實(shí)施過程為
對于每個(gè)在Source中而不在Sinks中函數(shù),新的控制流圖僅包含原控制流圖中從入口 節(jié)點(diǎn)到具有"r"屬性的節(jié)點(diǎn)部分和從"r"屬性的節(jié)點(diǎn)到函數(shù)出口節(jié)點(diǎn)部分;本實(shí)例中,針對圖 3生成的新的控制流圖僅包含圖3中陰影節(jié)點(diǎn)部分;
對于每個(gè)在Sinks中而不在Source中函數(shù),新的控制流圖僅包含原控制流圖中從入口 節(jié)點(diǎn)到具有"w"屬性的節(jié)點(diǎn)和從"w"屬性的節(jié)點(diǎn)到函數(shù)出口節(jié)點(diǎn)部分;本實(shí)例中,針對圖4 生成的新的控制流圖僅包含圖4中陰影節(jié)點(diǎn)部分;
對于既屬于Source也屬于Sinks中的函數(shù),新的控制流圖僅包含從函數(shù)入口節(jié)點(diǎn)到具 有"r"屬性的節(jié)點(diǎn)部分,從具有"f'屬性的節(jié)點(diǎn)到具有"w"屬性的節(jié)點(diǎn)部分和具有"w"屬性節(jié) 點(diǎn)到函數(shù)出口節(jié)點(diǎn)部分;在本實(shí)例中,針對圖2生成的新的控制流圖僅包含圖2中陰影節(jié) 點(diǎn)部分。
步驟4:將圖2-4獲得的控制流圖按照圖1中函數(shù)調(diào)用圖依次連接,將其對應(yīng)的程序作為 分解后的程序。
最后應(yīng)說明的是以上實(shí)施例僅用以說明而非限制本發(fā)明的技術(shù)方案,盡管參照上述 實(shí)施例對本發(fā)明進(jìn)行了詳細(xì)說明,本領(lǐng)域的技術(shù)人員應(yīng)當(dāng)理解依然可以對本發(fā)明進(jìn)行修
改或者等同替換,而不脫離本發(fā)明的精神和范圍的任何修改或局部替換,其均應(yīng)涵蓋在本 發(fā)明的權(quán)利要求范圍當(dāng)中。
9
權(quán)利要求
1、一種程序分解方法,其特征在于,包括下列步驟a)設(shè)定始函數(shù)和終函數(shù);b)以所述始函數(shù)和直接或間接調(diào)用所述始函數(shù)的函數(shù)組成的函數(shù)集作為Source;以所述終函數(shù)以及直接或間接調(diào)用所述終函數(shù)的函數(shù)組成的函數(shù)集作為Sinks;c)對[Source-(Source∩Sinks)]中的每一個(gè)函數(shù),以該函數(shù)的控制流圖中由入口節(jié)點(diǎn)經(jīng)調(diào)用Source中函數(shù)的節(jié)點(diǎn)到出口節(jié)點(diǎn)的控制流作為分解后的控制流圖;對[Sinks-(Source∩Sinks)]中的每一個(gè)函數(shù),以該函數(shù)的控制流圖中由入口節(jié)點(diǎn)經(jīng)調(diào)用Sinks中函數(shù)的節(jié)點(diǎn)到出口節(jié)點(diǎn)的控制流作為分解后的控制流圖;對(Source∩Sinks)中的每一個(gè)函數(shù),以該函數(shù)的控制流圖中由入口節(jié)點(diǎn)經(jīng)調(diào)用(Source∪Sinks)中函數(shù)的節(jié)點(diǎn)到出口節(jié)點(diǎn)的控制流作為分解后的控制流圖;d)按照所述程序的函數(shù)調(diào)用圖依次連接步驟c)所述各個(gè)分解后的控制流圖,并以對應(yīng)的程序作為分解后的程序。
2、 如權(quán)利要求1所述的程序分解方法,其特征在于,步驟b)通過下述方法進(jìn)行i. 在所述程序的函數(shù)調(diào)用圖中,設(shè)置始函數(shù)所在的節(jié)點(diǎn)具有"i"屬性;設(shè)置終函數(shù) 所在的節(jié)點(diǎn)具有"U"屬性;ii. 以始函數(shù)或終函數(shù)所在的節(jié)點(diǎn)為起點(diǎn),同時(shí)向上作下述遞歸分析若某節(jié)點(diǎn)的子 節(jié)點(diǎn)具有"i"屬性,則設(shè)置該節(jié)點(diǎn)具有"i"屬性;若某節(jié)點(diǎn)的子節(jié)點(diǎn)具有"u"屬性,則 設(shè)置該節(jié)點(diǎn)具有"U"屬性;iii. 以所有具有"i"屬性的節(jié)點(diǎn)所對應(yīng)的函數(shù)組成的函數(shù)集作為Source;以所有具有 "u"屬性的節(jié)點(diǎn)所對應(yīng)的函數(shù)組成的函數(shù)集作為Sinks。
3、 如權(quán)利要求1所述的程序分解方法,其特征在于,步驟C)通過下述方法進(jìn)行i. 對(SourceU Sinks)中的每一個(gè)函數(shù),在該函數(shù)的控制流圖中,若某節(jié)點(diǎn)調(diào)用的函數(shù) 屬于Source,則設(shè)置該節(jié)點(diǎn)具有"r"屬性;若某節(jié)點(diǎn)調(diào)用的函數(shù)屬于Sinks,則設(shè)置該節(jié) 點(diǎn)具有"w"屬性;ii. 對[Source-(SourcenSinks)]中的每一個(gè)函數(shù),初始化節(jié)點(diǎn)集合ebs^ebs2^具有"r" 屬性的節(jié)點(diǎn)};向上遞歸擴(kuò)充ebsl,使ebsl內(nèi)的節(jié)點(diǎn)的父節(jié)點(diǎn)也在ebsl內(nèi),直至入口節(jié)點(diǎn);向下遞 歸擴(kuò)充ebs2,使ebs2內(nèi)的節(jié)點(diǎn)的子節(jié)點(diǎn)也在ebsl內(nèi),直至出口節(jié)點(diǎn);以包含ebslUebs2中的節(jié)點(diǎn)的控制流作為分解后的函數(shù)控制流圖;iii. 對[Sinks-(SourcenSinks)]中的每一個(gè)函數(shù),初始化節(jié)點(diǎn)集合ebshebs2^具有"w" 屬性的節(jié)點(diǎn)};向上遞歸擴(kuò)充ebsl,使ebsl內(nèi)的節(jié)點(diǎn)的父節(jié)點(diǎn)也在ebsl內(nèi),直至入口節(jié)點(diǎn);向下遞 歸擴(kuò)充ebs2,使ebs2內(nèi)的節(jié)點(diǎn)的子節(jié)點(diǎn)也在ebsl內(nèi),直至出口節(jié)點(diǎn); 以包含ebslUebs2中的節(jié)點(diǎn)的控制流作為分解后的函數(shù)控制流圖;iv. 對(SourcenSinks)中的每一個(gè)函數(shù),初始化節(jié)點(diǎn)集合ebs^ebs2^具有"r"屬性的 節(jié)點(diǎn)};初始化節(jié)點(diǎn)集合ebs3二ebs4^具有"w"屬性的節(jié)點(diǎn)};向上遞歸擴(kuò)充ebsl,使ebsl內(nèi)的節(jié)點(diǎn)的父節(jié)點(diǎn)也在ebsl內(nèi),直至入口節(jié)點(diǎn);向下遞 歸擴(kuò)充ebs2,使ebs2內(nèi)的節(jié)點(diǎn)的子節(jié)點(diǎn)也在ebsl內(nèi),直至出口節(jié)點(diǎn);向上遞歸擴(kuò)充ebs3, 使ebs3內(nèi)的節(jié)點(diǎn)的父節(jié)點(diǎn)也在ebs3內(nèi),直至入口節(jié)點(diǎn);向下遞歸擴(kuò)充ebs4,使ebs4內(nèi)的 節(jié)點(diǎn)的子節(jié)點(diǎn)也在ebs4內(nèi),直至出口節(jié)點(diǎn);以包含[ebsl U (ebs2Hebs3)Uebs4]中的節(jié)點(diǎn)的控制流作為分解后的函數(shù)控制流圖。
4、 如權(quán)利要求1-3任意一項(xiàng)所述的程序分解方法,其特征在于,所述始函數(shù)選自污染數(shù) 據(jù)引入函數(shù),所述終函數(shù)選自污染數(shù)據(jù)敏感函數(shù)。
5、 如權(quán)利要求4所述的程序分解方法,其特征在于,所述始函數(shù)選自由文件讀入函數(shù), 網(wǎng)絡(luò)數(shù)據(jù)讀入函數(shù)和格式化輸入函數(shù)組成的集合;所述終函數(shù)選自由內(nèi)存操作函數(shù),內(nèi)存 分配函數(shù),字符串操作函數(shù)和進(jìn)程啟動函數(shù)組成的集合。
6、 如權(quán)利要求5所述的程序分解方法,其特征在于,所述始函數(shù)選自由fread, read, fgetc, fgets, fscanf, recv, recvfrom , recvmsg , scanf, fscanf, sscanf, vscanf, vsscanf禾口 vfscanf組成的集合;所述終函數(shù)選自由memcpy, wmemcpy, memccpy, bcopy, malloc, realloc, alloc, heapalloc, strcat, strcpy, sprintf, printf, execl, execlp, execle, execv禾口 execvp組成的集合。
全文摘要
本發(fā)明公開了一種程序分解方法,屬于軟件工程、信息安全技術(shù)領(lǐng)域。本發(fā)明方法包括a)設(shè)定始函數(shù)和終函數(shù);b)以始函數(shù)和直接或間接調(diào)用始函數(shù)的函數(shù)組成的集合為Source;類似地,設(shè)定Sinks;c)分別對僅屬于Source和Sinks的函數(shù),以及兩者交集中的函數(shù)分解其控制流圖;d)依次連接各控制流圖,輸出對應(yīng)的程序。當(dāng)本方法用于漏洞挖掘時(shí),始函數(shù)選自污染數(shù)據(jù)引入函數(shù),比如文件讀入函數(shù),網(wǎng)絡(luò)數(shù)據(jù)讀入函數(shù)和格式化輸入函數(shù);終函數(shù)選自污染數(shù)據(jù)敏感函數(shù),比如內(nèi)存操作函數(shù),內(nèi)存分配函數(shù),字符串操作函數(shù)和進(jìn)程啟動函數(shù)。本發(fā)明方法可將大規(guī)模程序分解為較小的代碼片段,可有效地應(yīng)用域漏洞挖掘等技術(shù)領(lǐng)域。
文檔編號G06F21/00GK101477611SQ200910076769
公開日2009年7月8日 申請日期2009年1月20日 優(yōu)先權(quán)日2009年1月20日
發(fā)明者超 張, 戴帥夫, 李佳靜, 劍 毛, 王鐵磊, 趙新建, 維 鄒, 韜 韋 申請人:北京大學(xué)