一種內(nèi)存訪問溢出的檢測(cè)方法及裝置的制造方法
【技術(shù)領(lǐng)域】
[0001] 本申請(qǐng)涉及計(jì)算機(jī)編譯領(lǐng)域,特別是涉及一種內(nèi)存訪問溢出的檢測(cè)方法及裝置。
【背景技術(shù)】
[0002] 內(nèi)存訪問溢出是導(dǎo)致C語言程序出現(xiàn)漏洞的根本原因之一,它通常表現(xiàn)為數(shù)組越 界訪問、棧溢出等關(guān)鍵問題。這些關(guān)鍵問題可能導(dǎo)致程序在運(yùn)行期出現(xiàn)很難預(yù)測(cè)的結(jié)果,既 可能正常運(yùn)行,也可能導(dǎo)致程序崩潰,這將在測(cè)試時(shí)給程序員帶來極大的困擾。歸其原因, 它們都是由于程序未按照理想約束條件下進(jìn)行內(nèi)存訪問。因此,如何盡可能的檢測(cè)、判斷可 能存在漏洞,并盡可能的減少誤判率是目前的研宄熱點(diǎn)和難點(diǎn)。
[0003] -般而言,內(nèi)存訪問溢出檢測(cè)分為靜態(tài)檢測(cè)與動(dòng)態(tài)檢測(cè)兩部分的內(nèi)容,內(nèi)存訪問 溢出的靜態(tài)檢測(cè)是將內(nèi)存訪問溢出的問題轉(zhuǎn)換為約束求解問題,并配合模型檢驗(yàn)方法來建 立約束,模型檢驗(yàn)方法具有很高的可靠性和完備性,理論上能保證沒有誤報(bào)和漏報(bào),并且能 全自動(dòng)地實(shí)施。已有的內(nèi)存訪問溢出的靜態(tài)檢測(cè)方法,都是通過遍歷狀態(tài)空間,將所有可能 存在內(nèi)存訪問溢出的代碼全部檢測(cè)出,并將這些代碼進(jìn)行報(bào)告。
[0004] 然而,現(xiàn)實(shí)情況下,狀態(tài)空間由于循環(huán)結(jié)構(gòu)、跳轉(zhuǎn)分支可能無窮大,而遍歷狀態(tài)空 間所花費(fèi)的空間和時(shí)間代價(jià)卻是無法承受,而且由于源代碼中的函數(shù)、循環(huán)較多,現(xiàn)有的檢 測(cè)方法可以處理簡單循環(huán),但無法處理遞歸等復(fù)雜結(jié)構(gòu),很難在資源受限的條件下遍歷全 部的狀態(tài)空間,因此存在較高的漏報(bào)和誤報(bào)。
【發(fā)明內(nèi)容】
[0005] 有鑒于此,本申請(qǐng)實(shí)施例提供一種內(nèi)存訪問溢出的檢測(cè)方法及裝置,以減少遍歷 狀態(tài)空間所花費(fèi)的空間和時(shí)間代價(jià),且減少對(duì)于內(nèi)存訪問溢出的漏報(bào)和誤報(bào)。
[0006] 為了實(shí)現(xiàn)上述目的,本申請(qǐng)實(shí)施例提供的技術(shù)方案如下:
[0007] 一種內(nèi)存訪問溢出的檢測(cè)方法,包括:
[0008] 對(duì)源代碼進(jìn)行預(yù)處理和詞法分析、語法分析以及語義分析,生成控制流圖、數(shù)據(jù)依 賴圖以及抽象語義樹;
[0009] 針對(duì)不同的檢測(cè)場景建立多種檢測(cè)模型,并根據(jù)多種檢測(cè)模型分析所述控制流 圖、數(shù)據(jù)依賴圖以及抽象語義樹,進(jìn)行表達(dá)式迭代以及狀態(tài)空間遍歷,輸出檢測(cè)結(jié)果;
[0010] 根據(jù)所述檢測(cè)結(jié)果判斷所述源代碼中是否存在內(nèi)存訪問溢出,并對(duì)檢測(cè)出的內(nèi)存 訪問溢出進(jìn)行反饋輸出。
[0011] 優(yōu)選地,所述對(duì)源代碼進(jìn)行預(yù)處理和詞法分析、語法分析以及語義分析,生成控制 流圖、數(shù)據(jù)依賴圖以及抽象語義樹,包括:
[0012] 對(duì)所述源代碼進(jìn)行詞法分析和語法分析,并基于詞法分析和語法分析的結(jié)果進(jìn)行 語義分析以及上下文分析,生成抽象語義樹;
[0013] 根據(jù)所述源代碼的分支跳轉(zhuǎn)和函數(shù)調(diào)用關(guān)系,將所述源代碼切分為多個(gè)基本塊, 并分析每個(gè)基本塊之間的跳轉(zhuǎn)關(guān)系,根據(jù)所述跳轉(zhuǎn)關(guān)系生成控制流圖;
[0014] 分析所述源代碼的變量之間的數(shù)據(jù)依賴關(guān)系,生成數(shù)據(jù)依賴圖。
[0015] 優(yōu)選地,所述針對(duì)不同場景建立多種檢測(cè)模型,并根據(jù)多種檢測(cè)模型分析所述控 制流圖、數(shù)據(jù)依賴圖以及抽象語義樹,進(jìn)行表達(dá)式迭代以及狀態(tài)空間遍歷,包括:
[0016] 針對(duì)不同的檢測(cè)場景定義多種檢測(cè)模型,所述檢測(cè)模型包括:指針操作模型、數(shù)組 訪問模型、標(biāo)準(zhǔn)庫函數(shù)模型和循環(huán)體與抽象迭代模型;
[0017] 對(duì)所述控制流圖和所述數(shù)據(jù)依賴圖進(jìn)行剪裁,沿所述控制流圖和所述數(shù)據(jù)依賴圖 中的路徑將常量節(jié)點(diǎn)依次向后繼節(jié)點(diǎn)傳遞,并計(jì)算常量表達(dá)式,通過操作符連接并迭代內(nèi) 存訪問操作的輸入條件,進(jìn)行表達(dá)式迭代并得到所述輸入條件的迭代結(jié)果;
[0018] 掃描所述抽象語義樹的結(jié)構(gòu),對(duì)所述抽象語義樹中的指針和數(shù)組變量的聲明、賦 值、訪問以及標(biāo)準(zhǔn)庫函數(shù)的節(jié)點(diǎn)進(jìn)行關(guān)鍵詞標(biāo)記,并查找所述抽象語義樹中與所述多種檢 測(cè)模型中相匹配的節(jié)點(diǎn)以及分支;
[0019] 建立狀態(tài)機(jī),并分析內(nèi)存訪問操作和所述輸入條件的迭代結(jié)果,判斷當(dāng)前的內(nèi)存 訪問操作是否在全量環(huán)境下有效。
[0020] 優(yōu)選地,所述對(duì)所述控制流圖和所述數(shù)據(jù)依賴圖進(jìn)行剪裁,包括:
[0021] 分析所述抽象語義樹中被標(biāo)記節(jié)點(diǎn)所在基本塊對(duì)應(yīng)于所述控制流圖上的節(jié)點(diǎn),刪 除其余節(jié)點(diǎn),重新建立節(jié)點(diǎn)之間的連接關(guān)系;
[0022] 保留所述控制流圖中被保留下的節(jié)點(diǎn)以及內(nèi)存訪問操作的變量在所述數(shù)據(jù)依賴 圖中的依賴關(guān)系,刪除所述數(shù)據(jù)依賴圖中的其余依賴關(guān)系。
[0023] 優(yōu)選地,所述根據(jù)所述檢測(cè)結(jié)果判斷所述源代碼中是否存在內(nèi)存訪問溢出,包 括:
[0024] 如果當(dāng)前的內(nèi)存訪問操作在全量環(huán)境下有效,則判斷不存在內(nèi)存訪問溢出,如果 當(dāng)前的內(nèi)存訪問操作不是在全量環(huán)境下有效,則判斷存在內(nèi)存訪問溢出。
[0025] 一種內(nèi)存訪問溢出的檢測(cè)裝置,包括:
[0026] 分析模塊,用于對(duì)源代碼進(jìn)行預(yù)處理和詞法分析、語法分析以及語義分析,生成控 制流圖、數(shù)據(jù)依賴圖以及抽象語義樹;
[0027] 檢測(cè)模塊,用于針對(duì)不同的檢測(cè)場景建立多種檢測(cè)模型,并根據(jù)多種檢測(cè)模型分 析所述控制流圖、數(shù)據(jù)依賴圖以及抽象語義樹,進(jìn)行表達(dá)式迭代以及狀態(tài)空間遍歷,輸出檢 測(cè)結(jié)果;
[0028] 輸出模塊,用于根據(jù)所述檢測(cè)結(jié)果判斷所述源代碼中是否存在內(nèi)存訪問溢出,并 對(duì)檢測(cè)出的內(nèi)存訪問溢出進(jìn)行反饋輸出。
[0029] 優(yōu)選地,所述分析模塊,包括:
[0030]分析單元,用于對(duì)所述源代碼進(jìn)行詞法分析和語法分析,并基于詞法分析和語法 分析的結(jié)果進(jìn)行語義分析以及上下文分析,生成抽象語義樹;
[0031] 切分單元,用于根據(jù)所述源代碼的分支跳轉(zhuǎn)和函數(shù)調(diào)用關(guān)系,將所述源代碼切分 為多個(gè)基本塊,并分析每個(gè)基本塊之間的跳轉(zhuǎn)關(guān)系,根據(jù)所述跳轉(zhuǎn)關(guān)系生成控制流圖;
[0032] 生成單元,用于分析所述源代碼的變量之間的數(shù)據(jù)依賴關(guān)系,生成數(shù)據(jù)依賴圖。
[0033] 優(yōu)選地,所述檢測(cè)模塊,包括:
[0034] 定義單元,用于針對(duì)不同的檢測(cè)場景定義多種檢測(cè)模型,所述檢測(cè)模型包括:指針 操作模型、數(shù)組訪問模型、標(biāo)準(zhǔn)庫函數(shù)模型和循環(huán)體與抽象迭代模型;
[0035] 裁剪單元,用于對(duì)所述控制流圖和所述數(shù)據(jù)依賴圖進(jìn)行剪裁,沿所述控制流圖和 所述數(shù)據(jù)依賴圖中的路徑將常量節(jié)點(diǎn)依次向后繼節(jié)點(diǎn)傳遞,并計(jì)算常量表達(dá)式,通過操作 符連接并迭代內(nèi)存訪問操作的輸入條件,進(jìn)行表達(dá)式迭代并得到所述輸入條件的迭代結(jié) 果;
[0036] 掃描單元,用于掃描所述抽象語義樹的結(jié)構(gòu),對(duì)所述抽象語義樹中的指針和數(shù)組 變量的聲明、賦值、訪問以及標(biāo)準(zhǔn)庫函數(shù)的節(jié)點(diǎn)進(jìn)行關(guān)鍵詞標(biāo)記,并查找所述抽象語義樹中 與所述多種檢測(cè)模型中相匹配的節(jié)點(diǎn)以及分支;
[0037] 判斷單元,用于建立狀態(tài)機(jī),并分析內(nèi)存訪問操作和所述輸入條件的迭代結(jié)果,判 斷當(dāng)前的內(nèi)存訪問操作是否在全量環(huán)境下有效。
[0038] 優(yōu)選地,所述裁剪單元,包括:
[0039] 分析子單元,用于分析所述抽象語義樹中被標(biāo)記節(jié)點(diǎn)所在基本塊對(duì)應(yīng)于所述控制 流圖上的節(jié)點(diǎn),刪除其余節(jié)點(diǎn),重新建立節(jié)點(diǎn)之間的連接關(guān)系;
[0040] 保留子單元,用于保留所述控制流圖中被保留下的節(jié)點(diǎn)以及內(nèi)存訪問操作的變量 在所述數(shù)據(jù)依賴圖中的依賴關(guān)系,刪除所述數(shù)據(jù)依賴