亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

基于源代碼靜態(tài)分析的軟件安全代碼分析器及其檢測(cè)方法

文檔序號(hào):6573328閱讀:619來(lái)源:國(guó)知局
專(zhuān)利名稱(chēng):基于源代碼靜態(tài)分析的軟件安全代碼分析器及其檢測(cè)方法
技術(shù)領(lǐng)域
本發(fā)明涉及一種在軟件源代碼中檢測(cè)安全漏洞的技術(shù),確切地說(shuō),涉及一種基于源代碼靜態(tài)分析技術(shù)的軟件安全代碼分析器及其檢測(cè)方法,屬于信息安全中的軟件安全技術(shù)領(lǐng)域。
背景技術(shù)
目前,代碼分析技術(shù)的研究很多,主流的開(kāi)源軟件包括ITS4,BOON,CQual,MOPS,RATS,F(xiàn)lawFinder等。下面對(duì)這些軟件進(jìn)行簡(jiǎn)介ITS4一種用于靜態(tài)檢測(cè)C和C++源代碼安全漏洞的工具。同其它類(lèi)似技術(shù)相比,ITS4的準(zhǔn)確性更高,能夠在編程過(guò)程中把檢測(cè)結(jié)果實(shí)時(shí)反饋給開(kāi)發(fā)人員;同時(shí)能夠輕松地支持C++代碼的檢測(cè)。ITS4支持命令行格式,可運(yùn)行于Windows和Unix平臺(tái)。ITS4在C或C++源代碼中尋找危險(xiǎn)的函數(shù)調(diào)用。對(duì)于某些調(diào)用,ITS4會(huì)加以分析,以確定其危險(xiǎn)程度。ITS4還會(huì)提供包括漏洞的簡(jiǎn)單描述和改進(jìn)方法的分析報(bào)告。ITS4基于函數(shù)匹配進(jìn)行代碼掃描,不關(guān)心上下文。它只是搜索C或C++源代碼中與漏洞數(shù)據(jù)庫(kù)相匹配的函數(shù)或應(yīng)用程序接口API(Application Program Interface)。如果漏洞函數(shù)存在,ITS4會(huì)發(fā)出警告,并向程序員提供修改建議,以提高代碼安全性。程序員可以選擇危險(xiǎn)等級(jí)(0-5),從而降低誤報(bào)率。ITS4還允許程序員忽略對(duì)某個(gè)特定函數(shù)名的檢查,如scanf。
RATS一種用于C、C++、Python、Per和PHP代碼的安全審計(jì)工具。它能夠?qū)υ创a進(jìn)行掃描,找出潛在的危險(xiǎn)函數(shù)調(diào)用。該工具的最終目標(biāo)并不是找出代碼漏洞,而是為人工安全審計(jì)提供一個(gè)方便合理的起點(diǎn)。RATS結(jié)合了ITS4的靜態(tài)檢查技術(shù)和MOPS的深度語(yǔ)義分析技術(shù)檢查緩沖區(qū)溢出漏洞。RATS遵守通用公共許可證GPL。同ITS4相比,RATS可以對(duì)整個(gè)工程代碼進(jìn)行檢查,而不是單一文件。同時(shí),RATS還可以檢查數(shù)組的邊界。
BOONBOON使用深度語(yǔ)義分析技術(shù)自動(dòng)掃描C語(yǔ)言源代碼中存在的緩沖區(qū)溢出漏洞。BOON可以對(duì)整數(shù)范圍進(jìn)行分析從而確定C程序中的數(shù)組是否越界。盡管BOON能夠找到許多其它分析工具所遺漏的漏洞,但是仍不精確。
除了上述主要工具外,國(guó)內(nèi)外在軟件的安全性分析領(lǐng)域也做了大量研究,提出了一些可行的靜態(tài)的安全性分析方法,并且構(gòu)造了相應(yīng)的軟件安全性分析工具。目前靜態(tài)的安全性分析方法可分為模型檢驗(yàn),攜帶代碼驗(yàn)證,詞法分析,簡(jiǎn)單語(yǔ)義分析,基于信息流的安全性分析等。下面對(duì)其分別進(jìn)行簡(jiǎn)要介紹模型檢驗(yàn),其基礎(chǔ)是有限狀態(tài)自動(dòng)機(jī)。它列舉一個(gè)系統(tǒng)能夠處于的所有可能狀態(tài),檢查每個(gè)狀態(tài)是否違反由用戶制定的規(guī)則和條件,并根據(jù)分析結(jié)果報(bào)告導(dǎo)致不合法狀態(tài)的步驟。模型檢驗(yàn)的理論基礎(chǔ)是時(shí)序邏輯和自動(dòng)機(jī)理論。它將所要檢驗(yàn)的屬性表示成時(shí)序邏輯公式,系統(tǒng)表示成有限狀態(tài)自動(dòng)機(jī),在遍歷有限狀態(tài)自動(dòng)機(jī)時(shí),檢查自動(dòng)機(jī)所有狀態(tài)是否滿足所給屬性。
模型檢驗(yàn)?zāi)軌虬l(fā)現(xiàn)程序中存在復(fù)雜語(yǔ)義上的錯(cuò)誤,從而準(zhǔn)確發(fā)現(xiàn)程序中潛在的安全性漏洞,但現(xiàn)存的模型檢驗(yàn)工具通常是分析源程序的形式化的表示(數(shù)學(xué)描述),而不是以源程序作為輸入。如需要源程序的數(shù)學(xué)模型,通??梢酝ㄟ^(guò)程序分析(如數(shù)據(jù)流分析、控制流分析、程序切片)工具來(lái)自動(dòng)完成源程序模型的生成。從程序切片提取程序的精簡(jiǎn)模型中不難看出,程序分析是基礎(chǔ)。此處的程序分析,除了語(yǔ)法分析外,更需要涉及語(yǔ)義的分析,包括控制流分析和數(shù)據(jù)流分析。
攜帶驗(yàn)證代碼PCC(Proof-Carrying Code)的基本思想十分類(lèi)似于密碼。首先,為代碼定義一組安全策略。然后,代碼提供者在編制程序時(shí)必須遵守這些安全策略,并在程序源代碼中加入驗(yàn)證的代碼,以證明源程序的代碼遵守了這些安全策略;最后由代碼使用者確認(rèn)這些代碼的安全性。
詞法掃描是基于詞法分析的安全性掃描。對(duì)源代碼只進(jìn)行詞法分析。通過(guò)靜態(tài)掃描源代碼找出潛在的安全漏洞,一旦發(fā)現(xiàn)就給出警告信息?;痉椒ㄊ菍⒁粋€(gè)或多個(gè)源代碼文件作為輸入,并將每個(gè)文件分解為詞法記號(hào)流,比較記號(hào)流中的標(biāo)識(shí)符和預(yù)先定義的安全性漏洞字典。例如一旦發(fā)現(xiàn)C源程序中存在strcpy,strcat等字符串操作函數(shù),即認(rèn)為存在緩沖區(qū)溢出的安全性漏洞,因?yàn)檫@些函數(shù)可能引起緩沖區(qū)溢出,此時(shí)的安全性漏洞字典包含strcpy,strcat等。
簡(jiǎn)單語(yǔ)義分析是基于語(yǔ)法和簡(jiǎn)單語(yǔ)義分析的安全性檢查,其工作原理非常類(lèi)似于編譯器系統(tǒng),它以語(yǔ)法分析和語(yǔ)義規(guī)則為基礎(chǔ),同時(shí)加入簡(jiǎn)單的控制流分析和數(shù)據(jù)流分析,因此具有較高的分析效率和可擴(kuò)展性,并且可以通過(guò)向程序中加入面向?qū)ο蟪绦蚯衅械臄?shù)據(jù)流分析注釋信息的方式發(fā)現(xiàn)軟件中廣泛存在的安全性漏洞,如程序中出現(xiàn)機(jī)率最多的內(nèi)存訪問(wèn)漏洞,包括存儲(chǔ)區(qū)的非法使用、空指針的脫引用、緩沖區(qū)溢出等等。它的另一個(gè)優(yōu)點(diǎn)是可適用于對(duì)大規(guī)模程序的分析。
信息流分析長(zhǎng)期以來(lái),特別是隨著網(wǎng)絡(luò)技術(shù)的發(fā)展,計(jì)算機(jī)系統(tǒng)中的信息安全一直倍受關(guān)注,主流方法是基于類(lèi)型推理的信息流驗(yàn)證和檢測(cè)。信息流驗(yàn)證和檢測(cè)方法通過(guò)建立安全信息流驗(yàn)證的格模型(latice model)來(lái)提出了一種驗(yàn)證機(jī)制來(lái)確保程序中信息流的安全性。該方法為信息指定一個(gè)集合的“安全類(lèi)”,并用“流關(guān)系”定義安全類(lèi)之間允許的信息流,將程序中每個(gè)存貯對(duì)象綁定到特定的安全類(lèi)。當(dāng)一個(gè)操作(或一系列的操作)使用某些對(duì)象(如x)的值,獲得其他對(duì)象(如y)的值,則引起從x到y(tǒng)的信息流。當(dāng)且僅當(dāng)給定的流策略中x的安全類(lèi)可以流向y的安全類(lèi),從x到y(tǒng)的信息流是允許的。
綜合上述,目前主流的靜態(tài)代碼分析引擎基本都是以可疑API字符串匹配為主,某些算法在上下文關(guān)聯(lián)上也做了不少工作,但總的來(lái)看,這些現(xiàn)有技術(shù)存在的不足是各算法所能實(shí)現(xiàn)的功能還是局限性比較大。比如(1)字符串匹配的不足以字符串匹配為基礎(chǔ)的規(guī)則匹配技術(shù)是目前代碼分析技術(shù)使用最普遍的算法,其主要思想是通過(guò)預(yù)先制定好的規(guī)則,根據(jù)關(guān)鍵字匹配,查找出對(duì)應(yīng)的代碼,并提示用戶。例如,使用ITC4掃描代碼時(shí),會(huì)將所有使用strcpy的代碼全部報(bào)告,認(rèn)為其不安全,需要使用strncpy進(jìn)行替換。但是,這種方法誤報(bào)率太高,很多已經(jīng)經(jīng)過(guò)檢測(cè)的API也被認(rèn)為是危險(xiǎn)的,開(kāi)發(fā)人員很難分辨哪里才是真正存在安全問(wèn)題。
(2)目前上下文關(guān)聯(lián)算法的不足有一些程序可以做到一定程度的根據(jù)上下文關(guān)聯(lián),例如RATS及BOON。這里以BOON為例,其能將相關(guān)代碼轉(zhuǎn)換成特定的描述語(yǔ)言,并通過(guò)檢測(cè)相關(guān)變量在全文是否經(jīng)過(guò)檢查來(lái)判斷代碼是否存在緩沖區(qū)溢出。這樣,在一定程度上解決了誤報(bào)問(wèn)題,但是還存在一些問(wèn)題。例如不能檢測(cè)句柄(雙重指針)、不能檢測(cè)字符串偏移(strcpy(a+5,b)的形式)等,并且只能解決字符串緩沖區(qū)溢出和整數(shù)溢出,不能解決邊界條件、輸入驗(yàn)證等問(wèn)題。
由于目前軟件的安全威脅非常多,包括常見(jiàn)的緩沖區(qū)溢出、競(jìng)賽條件、輸入驗(yàn)證等。這些在開(kāi)發(fā)中的安全威脅非常容易被黑客所利用,而且不容易被開(kāi)發(fā)人員發(fā)現(xiàn)。因此如何對(duì)軟件源代碼中檢測(cè)安全漏洞的技術(shù)進(jìn)行改進(jìn),就成為業(yè)內(nèi)技術(shù)人員關(guān)注的熱點(diǎn)。

發(fā)明內(nèi)容
有鑒于此,本發(fā)明的目的是提供一種基于源代碼靜態(tài)分析技術(shù)的軟件安全代碼分析器及其檢測(cè)方法,該軟件安全代碼分析器SSCA(Software Security CodeAnalyzer)是從源代碼入手,解決軟件面臨的安全問(wèn)題。該軟件安全代碼分析器根據(jù)輸入的源程序,根據(jù)語(yǔ)法與語(yǔ)義,分析程序的結(jié)構(gòu)與關(guān)鍵特征,從而獲得程序的安全風(fēng)險(xiǎn),并報(bào)告給用戶。此外,它還可以將代碼分析的結(jié)果通過(guò)報(bào)表,將發(fā)現(xiàn)的安全漏洞提交給用戶進(jìn)行審核與評(píng)估。
為了達(dá)到上述目的,本發(fā)明提供了一種基于源代碼靜態(tài)分析技術(shù)的軟件安全代碼分析器,其特征在于所述軟件安全代碼分析器包括有下述五個(gè)功能模塊所組成代碼解析器,負(fù)責(zé)對(duì)源程序代碼進(jìn)行詞法、語(yǔ)法分析。然后抽象出足夠多的信息并轉(zhuǎn)換成抽象語(yǔ)法樹(shù)AST(Abstract Syntax Tree)來(lái)表示,再送入代碼分析引擎,為后繼分析提供便利;該模塊還可以支持解析項(xiàng)目工程文件,獲取工程中全部源代碼信息;代碼分析引擎,由分別完成各自功能的五個(gè)子功能模塊數(shù)據(jù)流分析器、控制流分析器、結(jié)構(gòu)分析器、安全分析調(diào)度器及安全分析接口所組成,負(fù)責(zé)根據(jù)規(guī)則庫(kù)分析程序的結(jié)構(gòu)與關(guān)鍵特征,獲得程序的安全風(fēng)險(xiǎn),并通過(guò)安全風(fēng)險(xiǎn)報(bào)告器將結(jié)果提交給用戶接口;安全風(fēng)險(xiǎn)報(bào)告器,負(fù)責(zé)根據(jù)代碼分析引擎的結(jié)果,再參照規(guī)則庫(kù)的相關(guān)語(yǔ)法與語(yǔ)義進(jìn)行比對(duì),將發(fā)現(xiàn)的安全風(fēng)險(xiǎn)提交給用戶接口;安全規(guī)則庫(kù),負(fù)責(zé)為代碼分析引擎提供使用可擴(kuò)展標(biāo)記語(yǔ)言XML配置的代碼分析規(guī)則,以及對(duì)應(yīng)不同的安全性漏洞的安全風(fēng)險(xiǎn)支持;還可以提供風(fēng)險(xiǎn)改進(jìn)策略報(bào)告,即能夠針對(duì)不同環(huán)境的軟件系統(tǒng)的多樣性和復(fù)雜性進(jìn)行擴(kuò)充;用戶接口,負(fù)責(zé)與用戶進(jìn)行交互,一方面接受用戶掃描代碼的請(qǐng)求,另一方面則將掃描分析的結(jié)果向用戶輸出。
所述代碼分析引擎中五個(gè)子模塊的功能是數(shù)據(jù)流分析器,用于在代碼解析的基礎(chǔ)上,提取程序的數(shù)據(jù)流信息;它是通過(guò)遍歷抽象語(yǔ)法樹(shù)AST,提取出包括指針變量、內(nèi)存塊、常量,函數(shù)結(jié)構(gòu)的數(shù)據(jù)信息,再根據(jù)用戶規(guī)則對(duì)這些信息進(jìn)行刷選,并向程序結(jié)構(gòu)分析器提供接口,以讀取這些信息;控制流分析器,用于在代碼解析基礎(chǔ)上,提取程序的控制流信息;它是根據(jù)規(guī)則和通過(guò)遍歷抽象語(yǔ)法樹(shù)AST,生成對(duì)應(yīng)的程序控制依賴(lài)圖,并向安全分析調(diào)度器提供接口,以讀取這些信息;結(jié)構(gòu)分析器,用于在代碼分析引擎提取出的語(yǔ)法樹(shù)基礎(chǔ)上,根據(jù)安全規(guī)則庫(kù)提供的代碼分析規(guī)則,提取程序的包括入口點(diǎn)、主要函數(shù)名和函數(shù)關(guān)系的主要結(jié)構(gòu)信息,再調(diào)度數(shù)據(jù)流分析器和控制流分析器,完成對(duì)規(guī)則指定的關(guān)鍵變量的分析,并調(diào)用安全分析接口,完成對(duì)相關(guān)代碼的安全性檢測(cè);安全分析調(diào)度器,作為代碼分析引擎的主要調(diào)度模塊,用于根據(jù)安全規(guī)則庫(kù)提供的信息,調(diào)度結(jié)構(gòu)分析器進(jìn)行安全性分析,并生成報(bào)告表,提供接口供安全分析報(bào)告器調(diào)用;安全分析接口,負(fù)責(zé)根據(jù)安全規(guī)則調(diào)用特定的安全分析方法,這些方法利用語(yǔ)法樹(shù)和流分析結(jié)果,進(jìn)行安全分析,并將分析結(jié)果提交給安全風(fēng)險(xiǎn)報(bào)告器。
所述源程序代碼是包括C、C++、C#、JAVA和Perl的主流開(kāi)發(fā)語(yǔ)言。
所述軟件安全代碼分析器能夠檢測(cè)出來(lái)的軟件安全漏洞包括以下多類(lèi)輸入驗(yàn)證Input Validation,包括緩沖區(qū)溢出Buffer Overflow,命令注入Command Injection,跨站腳本Cross-Site Scripting,格式化字符串Format String,非法指針I(yè)llegal Pointer Value,整數(shù)溢出Integer Overflow,日志偽造Log Forging,路徑操縱Path Manipulation,進(jìn)程控制Process Control,資源泄漏ResourceInjection,SQL注入SQL Injection,字符串錯(cuò)誤中止String Termination Error;API誤用,即API Abuse,包括危險(xiǎn)函數(shù)Dangerous Function,目錄限制Directory Restriction,未檢測(cè)返回值Unchecked Return Value,堆檢查HeapInspection;安全特征Security Features,包括不安全的隨機(jī)數(shù)Insecure Randomness,最小權(quán)限違規(guī)Least Privilege Violation;時(shí)間與狀態(tài)Time and State,包括文件訪問(wèn)競(jìng)賽條件File Access RaceConditionTOCTOU,不安全的臨時(shí)文件Insecure Temporary File;代碼質(zhì)量Code Quality,包括雙重釋放Double Free,內(nèi)存泄漏MemoryLeak,空指針檢查Null Dereference,廢棄函數(shù)Obsolete,未初始化變量Uninitialized Variable,未釋放資源Unreleased Resource,釋放后使用Use AfterFree。
為了達(dá)到上述目的,本發(fā)明還提供了一種基于源代碼靜態(tài)分析技術(shù)的軟件安全代碼分析器的檢測(cè)軟件安全漏洞的方法,其特征在于包括下列操作步驟(1)將用戶配置好的需要進(jìn)行檢測(cè)的源代碼目錄、代碼語(yǔ)言、頭文件目錄送入軟件安全代碼分析器后,該檢測(cè)裝置開(kāi)始工作;(2)先對(duì)輸入的源代碼進(jìn)行預(yù)處理,將程序中已經(jīng)定義的頭文件和宏解開(kāi),替換到源代碼中相應(yīng)的位置上;(3)讀取規(guī)則文件,解析存儲(chǔ)規(guī)則所使用的可擴(kuò)展標(biāo)記語(yǔ)言XML文件,獲取所需要的安全分析規(guī)則;(4)對(duì)每一個(gè)處理過(guò)的源文件進(jìn)行語(yǔ)法解析,在經(jīng)過(guò)宏解析和頭文件處理后,進(jìn)行文法解析,將源代碼解析成從左到右LL描述文法所描述的數(shù)據(jù),此后解析為標(biāo)準(zhǔn)的AST語(yǔ)法樹(shù);(5)根據(jù)安全規(guī)則和AST語(yǔ)法樹(shù),對(duì)目標(biāo)工程的源代碼進(jìn)行預(yù)分析;如果發(fā)現(xiàn)不需要進(jìn)行流分析就能發(fā)現(xiàn)的安全問(wèn)題,則直接把分析結(jié)果提交給結(jié)果處理模塊;否則,將AST樹(shù)與安全規(guī)則交給控制流分析器、數(shù)據(jù)流分析器和安全分析調(diào)度器,作進(jìn)一步處理;(6)分別對(duì)AST語(yǔ)法樹(shù)作進(jìn)一步的控制流分析與數(shù)據(jù)流分析,其中數(shù)據(jù)流分析是將代碼中所有變量的調(diào)用關(guān)系的數(shù)據(jù)集中到一個(gè)預(yù)先分配好的緩沖池中,使用時(shí)告訴變量名和所在行號(hào),以便查找其函數(shù)調(diào)用表;控制流分析則是對(duì)特定行的控制關(guān)系進(jìn)行統(tǒng)計(jì),可以將代碼中任意一行是否被控制、以及被哪行控制都提交給相關(guān)接口;(7)根據(jù)規(guī)則中配置的分析類(lèi)名,通過(guò)分析調(diào)度器對(duì)代碼的安全問(wèn)題進(jìn)行分析,每一類(lèi)安全問(wèn)題對(duì)應(yīng)于一個(gè)安全分析方法,由安全分析接口動(dòng)態(tài)調(diào)用這些安全分析方法進(jìn)行安全性分析;這些分析方法針對(duì)的安全漏洞至少包括緩沖區(qū)溢出、資源泄漏、危險(xiǎn)API和格式化字符串,這些結(jié)構(gòu)分析器利用安全規(guī)則、AST語(yǔ)法樹(shù)和流分析的結(jié)果進(jìn)行具體分析,一旦發(fā)現(xiàn)安全問(wèn)題后,即將分析結(jié)果填充到結(jié)果緩沖池中;(8)安全分析結(jié)束后,將存儲(chǔ)在結(jié)果緩沖池中的分析結(jié)果取出,存儲(chǔ)在本地磁盤(pán),并提交給用戶審閱;所述步驟4進(jìn)一步包括下列操作內(nèi)容(41)代碼解析器中的語(yǔ)法解析模塊先對(duì)輸入的源文件的類(lèi)型進(jìn)行過(guò)濾,根據(jù)擴(kuò)展名提取所需的源代碼;(42)對(duì)提取的源代碼進(jìn)行預(yù)處理,解析代碼中所有的頭文件信息和宏信息,并將其解開(kāi)到指定的文件中;(43)進(jìn)行詞法分析,將源代碼轉(zhuǎn)換為L(zhǎng)L文法;(44)進(jìn)行語(yǔ)法分析,將文法分析的結(jié)果轉(zhuǎn)換成AST語(yǔ)法樹(shù)。
所述步驟6進(jìn)一步包括下列操作內(nèi)容
(61)先進(jìn)行控制流分析,即由軟件安全代碼分析器遍歷AST語(yǔ)法樹(shù),尋找并獲取其中包括if、while、for、switch的控制語(yǔ)句;(62)如果存在所述包括if、while、for、switch的控制語(yǔ)句,則進(jìn)行遞歸計(jì)算,記錄控制關(guān)系,直到找不到控制關(guān)系為止;如果不存在所述的控制語(yǔ)句,則對(duì)已經(jīng)分析出來(lái)的控制關(guān)系進(jìn)行記錄;(63)進(jìn)行到達(dá)/定值的數(shù)據(jù)流分析,獲取每個(gè)參數(shù)的使用狀況;(64)如果存在參數(shù)引用的情況,則進(jìn)行指針/別名分析,獲取這些參數(shù)的實(shí)際指向;(65)根據(jù)參數(shù)的不同,分別進(jìn)行變量查詢(xún)、內(nèi)存查詢(xún)、或函數(shù)查詢(xún);(66)將查詢(xún)結(jié)果存儲(chǔ)到對(duì)應(yīng)的數(shù)據(jù)列表中,方便下一步使用。
所述步驟64中的別名分析是分析出兩個(gè)或多個(gè)不同變量指向同一塊數(shù)據(jù)區(qū)的情況。
本發(fā)明是一種基于源代碼靜態(tài)分析技術(shù)的軟件安全代碼分析器及其檢測(cè)方法,該軟件安全代碼分析器中的安全代碼分析引擎可以提取出程序結(jié)構(gòu)并通過(guò)基于全文的語(yǔ)法、語(yǔ)義來(lái)分析代碼的安全問(wèn)題。通過(guò)輸入的源代碼以及代碼的語(yǔ)法與語(yǔ)義,由該引擎分析出代碼的結(jié)構(gòu)和關(guān)鍵特征,由此獲取程序的安全風(fēng)險(xiǎn)并報(bào)告給用戶。
相對(duì)于目前其他相關(guān)技術(shù),本發(fā)明的技術(shù)創(chuàng)新點(diǎn)主要是1、其中的安全規(guī)則是通過(guò)XML進(jìn)行配置的,因此SSCA支持的軟件安全漏洞是可以擴(kuò)充的。2、可擴(kuò)充的多編程語(yǔ)言支持源代碼是經(jīng)過(guò)獨(dú)立的轉(zhuǎn)換器轉(zhuǎn)換為AST語(yǔ)法樹(shù),再進(jìn)行分析的,即編程語(yǔ)言是可擴(kuò)充的。3、基于上下文的代碼含義理解技術(shù)本發(fā)明在分析代碼時(shí)使用了數(shù)據(jù)流分析技術(shù)和控制流分析技術(shù),從而保證分析代碼時(shí)是經(jīng)過(guò)上下文含義理解與分析的。4、安全分析器動(dòng)態(tài)加載在流分析后根據(jù)規(guī)則動(dòng)態(tài)加載安全分析器。因此,本發(fā)明的優(yōu)點(diǎn)和效果是(1)全程考察API參數(shù)使用的正確性例如參數(shù)在使用之前的某個(gè)地方已經(jīng)做出是否越界的處理等,而不是僅限于當(dāng)前行做出判斷,更不是簡(jiǎn)單地根據(jù)可疑API的使用與否。
本發(fā)明通過(guò)分析特定的API或變量,提取出關(guān)鍵信息并轉(zhuǎn)換為特定的格式,再通過(guò)預(yù)先制定好的約束條件,在上下文范圍內(nèi)對(duì)代碼進(jìn)行分析,從而確定代碼的安全問(wèn)題。例如,對(duì)于string溢出問(wèn)題,程序通過(guò)分析特定的API(如strcpy、strncpy、sprintf等),對(duì)其調(diào)用的變量進(jìn)行檢查,根據(jù)上下文檢測(cè)其是否經(jīng)過(guò)了檢測(cè)(例如是否判斷過(guò)字符串長(zhǎng)度、是否限制過(guò)字符串長(zhǎng)度等),并根據(jù)該函數(shù)的約束條件,判斷是否可能發(fā)生緩沖區(qū)溢出。
(2)基于語(yǔ)意深度檢測(cè)相對(duì)于其他技術(shù),本發(fā)明是根據(jù)程序的代碼邏輯,理解代碼的含義,從而做出最恰當(dāng)?shù)呐袛?。例如在處理緩沖區(qū)溢出時(shí),不再只根據(jù)關(guān)鍵API名稱(chēng)進(jìn)行檢測(cè),而可以對(duì)API的上下關(guān)系進(jìn)行分析,通過(guò)流分析技術(shù),找出其使用的變量是否已經(jīng)被判斷,從而大大提高檢測(cè)的準(zhǔn)確率。
(3)多語(yǔ)言支持及擴(kuò)充能力目前其他技術(shù)只能支持少數(shù)幾種固定的語(yǔ)言,例如RATS支持C、C++、Python、Per和PHP,BOON只能支持C/C++。本發(fā)明可以支持C、C++、C#、JAVA、Perl等主流開(kāi)發(fā)語(yǔ)言,并可支持對(duì)新的語(yǔ)言的擴(kuò)充能力。
(4)多種特征漏洞的檢測(cè)及擴(kuò)充能力目前其他工具只能支持特定的漏洞,例如BOON只能檢測(cè)緩沖區(qū)溢出,RATS也只能檢測(cè)少數(shù)代碼漏洞。本發(fā)明目前已支持?jǐn)?shù)十種軟件安全漏洞,并可以通過(guò)預(yù)先配置好的安全規(guī)則,動(dòng)態(tài)添加可以檢測(cè)的安全漏洞。
(5)多操作系統(tǒng)支持相對(duì)其他軟件安全工具,本系統(tǒng)可以支持目前絕大多數(shù)主流操作系統(tǒng),包括Windows系列,Unix,Linux,F(xiàn)reeBSD等。
因此,本發(fā)明具有很好的推廣應(yīng)用前景。


圖1是本發(fā)明軟件安全代碼分析器的組成結(jié)構(gòu)方框圖。
圖2是本發(fā)明軟件安全代碼分析器的檢測(cè)方法的流程圖。
圖3是本發(fā)明軟件安全代碼分析器檢測(cè)方法中的語(yǔ)法解析流程圖。
圖4是本發(fā)明軟件安全代碼分析器檢測(cè)方法中的流分析流程圖。
圖5是使用本發(fā)明進(jìn)行軟件開(kāi)發(fā)的實(shí)施例流程圖。
圖6是使用本發(fā)明進(jìn)行準(zhǔn)入評(píng)估的實(shí)施例流程圖。
具體實(shí)施例方式
為使本發(fā)明的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面結(jié)合附圖對(duì)本發(fā)明作進(jìn)一步的詳細(xì)描述。
參見(jiàn)圖1,介紹本發(fā)明基于源代碼靜態(tài)分析技術(shù)的軟件安全代碼分析器SSCA的結(jié)構(gòu)組成,主要包括有下述五個(gè)功能模塊1、代碼解析器,負(fù)責(zé)對(duì)源程序進(jìn)行詞法、語(yǔ)法分析。然后抽象出足夠多的信息并轉(zhuǎn)換成抽象語(yǔ)法樹(shù)AST來(lái)表示,再送入代碼分析引擎,為后繼分析提供便利;該模塊還可以支持解析項(xiàng)目工程文件,獲取工程中全部源代碼信息;2、代碼分析引擎,負(fù)責(zé)根據(jù)規(guī)則庫(kù)分析程序的結(jié)構(gòu)與關(guān)鍵特征,獲得程序的安全風(fēng)險(xiǎn),并通過(guò)安全風(fēng)險(xiǎn)報(bào)告器將結(jié)果提交給用戶接口;由分別完成各自功能的五個(gè)子功能模塊數(shù)據(jù)流分析器、控制流分析器、結(jié)構(gòu)分析器、安全分析調(diào)度器及安全分析接口所組成;下面分別介紹這五個(gè)子功能模塊數(shù)據(jù)流分析器是在代碼解析的基礎(chǔ)上,提取程序的數(shù)據(jù)流信息;它是通過(guò)遍歷抽象語(yǔ)法樹(shù)AST,提取出包括指針變量、內(nèi)存塊、常量,函數(shù)結(jié)構(gòu)的數(shù)據(jù)信息,再根據(jù)用戶規(guī)則對(duì)這些信息進(jìn)行刷選,并向程序結(jié)構(gòu)分析器提供接口,以讀取這些信息;控制流分析器是在代碼解析基礎(chǔ)上,提取程序的控制流信息;它是根據(jù)規(guī)則和通過(guò)遍歷抽象語(yǔ)法樹(shù)AST,生成對(duì)應(yīng)的程序控制依賴(lài)圖,并向安全分析調(diào)度器提供接口,以讀取這些信息;結(jié)構(gòu)分析器是在代碼分析引擎提取出的語(yǔ)法樹(shù)基礎(chǔ)上,根據(jù)安全規(guī)則庫(kù)提供的代碼分析規(guī)則,提取程序的主要結(jié)構(gòu)(如入口點(diǎn)、主要函數(shù)名和函數(shù)關(guān)系等)信息,再調(diào)度數(shù)據(jù)流分析器和控制流分析器,完成對(duì)規(guī)則指定的關(guān)鍵變量的分析,并調(diào)用安全分析接口,完成對(duì)相關(guān)代碼的安全性檢測(cè);安全分析調(diào)度器是代碼分析引擎的主要調(diào)度模塊,用于根據(jù)安全規(guī)則庫(kù)提供的信息,調(diào)度結(jié)構(gòu)分析器進(jìn)行安全性分析,并生成報(bào)告表,提供接口供安全分析報(bào)告器調(diào)用;安全分析接口是負(fù)責(zé)根據(jù)安全規(guī)則調(diào)用特定的安全分析方法。這些方法利用語(yǔ)法樹(shù)和流分析結(jié)果,進(jìn)行安全分析,并將分析結(jié)果提交給安全風(fēng)險(xiǎn)報(bào)告器。
3、安全風(fēng)險(xiǎn)報(bào)告器,負(fù)責(zé)根據(jù)代碼分析引擎的結(jié)果,再參照規(guī)則庫(kù)的相關(guān)語(yǔ)法與語(yǔ)義進(jìn)行比對(duì),將發(fā)現(xiàn)的安全風(fēng)險(xiǎn)提交給用戶接口;4、安全規(guī)則庫(kù),負(fù)責(zé)為代碼分析引擎提供使用可擴(kuò)展標(biāo)記語(yǔ)言XML配置的代碼分析規(guī)則,以及對(duì)應(yīng)不同的安全性漏洞的安全風(fēng)險(xiǎn)支持;還可提供風(fēng)險(xiǎn)改進(jìn)策略報(bào)告,即能夠針對(duì)不同環(huán)境的軟件系統(tǒng)的多樣性和復(fù)雜性進(jìn)行擴(kuò)充;5、用戶接口,負(fù)責(zé)與用戶進(jìn)行交互,一方面接受用戶掃描代碼的請(qǐng)求,另一方面則將掃描分析的結(jié)果向用戶輸出。
本發(fā)明軟件安全代碼分析器SSCA的關(guān)鍵是安全代碼分析引擎,該引擎可根據(jù)輸入的源程序,根據(jù)語(yǔ)法與語(yǔ)義,分析程序的結(jié)構(gòu)與關(guān)鍵特征,從而獲得程序的安全風(fēng)險(xiǎn),并報(bào)告給用戶。其中源代碼首先考慮支持C/C++/C#/JAVA/Perl等主流開(kāi)發(fā)語(yǔ)言。
由上文可知,程序分析方法和安全規(guī)則的內(nèi)容,決定了分析的結(jié)果和效率。程序分析是安全性檢查的基礎(chǔ),負(fù)責(zé)提取程序信息,以便和安全性規(guī)則相匹配,從而掃描出其中的安全性漏洞。在本發(fā)明中,程序分析從數(shù)據(jù)流分析和控制流分析兩個(gè)角度切入。安全規(guī)則的構(gòu)建在于尋求不同安全性漏洞的安全模式。
由于軟件系統(tǒng)(特別是分布式環(huán)境的軟件系統(tǒng))的多樣性和復(fù)雜性,使得安全性漏洞種類(lèi)繁多,不可能解決所有這些問(wèn)題。目前,本發(fā)明裝置能夠支持的軟件安全漏洞主要類(lèi)別有Input Validation、API Abuse、Security Features、Time and State、Code Quality等。
參見(jiàn)圖2,介紹SSCA檢測(cè)操作方法流程的主要處理步驟(1)將用戶配置好的需要進(jìn)行檢測(cè)的源代碼目錄、代碼語(yǔ)言、頭文件目錄送入軟件安全代碼分析器后,該檢測(cè)裝置開(kāi)始工作;(2)先對(duì)輸入的源代碼進(jìn)行預(yù)處理,將程序中已經(jīng)定義的頭文件和宏解開(kāi),替換到源代碼中相應(yīng)的位置上;(3)讀取規(guī)則文件,解析存儲(chǔ)規(guī)則使用的可擴(kuò)展標(biāo)記語(yǔ)言XML文件,獲取所需的安全分析規(guī)則;(4)對(duì)每一個(gè)處理過(guò)的源文件進(jìn)行語(yǔ)法解析,在經(jīng)過(guò)宏解析和頭文件處理后,進(jìn)行文法解析,將源代碼解析成LL文法描述的數(shù)據(jù),此后解析為標(biāo)準(zhǔn)的AST語(yǔ)法樹(shù);該步驟可細(xì)分為下述各個(gè)具體操作內(nèi)容(參見(jiàn)圖3所示)(41)代碼解析器中的語(yǔ)法解析模塊先對(duì)輸入的源文件的類(lèi)型進(jìn)行過(guò)濾,根據(jù)擴(kuò)展名提取所需的源代碼;(42)對(duì)提取源代碼進(jìn)行預(yù)處理,解析代碼中所有的頭文件信息和宏信息,并將其解開(kāi)到指定的文件中;(43)進(jìn)行詞法分析,將源代碼轉(zhuǎn)換為L(zhǎng)L文法;(44)進(jìn)行語(yǔ)法分析,將文法分析的結(jié)果轉(zhuǎn)換成AST語(yǔ)法樹(shù)。
(5)根據(jù)安全規(guī)則和AST語(yǔ)法樹(shù),對(duì)目標(biāo)工程的源代碼進(jìn)行預(yù)分析;如果發(fā)現(xiàn)不需要進(jìn)行流分析就能發(fā)現(xiàn)的安全問(wèn)題,則直接把分析結(jié)果提交給結(jié)果處理模塊;否則,將AST樹(shù)與安全規(guī)則交給控制流分析器、數(shù)據(jù)流分析器和安全分析調(diào)度器,作進(jìn)一步處理;(6)分別對(duì)AST語(yǔ)法樹(shù)作進(jìn)一步的控制流分析與數(shù)據(jù)流分析,其中數(shù)據(jù)流分析是將代碼中所有變量的調(diào)用關(guān)系的數(shù)據(jù)集中到一個(gè)預(yù)先分配好的緩沖池中,使用時(shí)告訴變量名和所在行號(hào),以便查找其函數(shù)調(diào)用表;控制流分析則是對(duì)特定行的控制關(guān)系進(jìn)行統(tǒng)計(jì),可以將代碼中任意一行是否被控制、以及被哪行控制都提交給相關(guān)接口;該步驟細(xì)分為下述各個(gè)具體操作內(nèi)容(如圖4所示)(61)先進(jìn)行控制流分析,即由軟件安全代碼分析器遍歷AST語(yǔ)法樹(shù),尋找并獲取其中包括if、while、for、switch的控制語(yǔ)句的控制節(jié)點(diǎn);(62)如果存在所述包括if、while、for、switch的控制語(yǔ)句,則進(jìn)行遞歸計(jì)算,記錄控制關(guān)系,直到找不到控制關(guān)系為止;如果不存在所述的控制語(yǔ)句,則對(duì)已經(jīng)分析出來(lái)的控制關(guān)系的控制節(jié)點(diǎn)進(jìn)行記錄;(63)進(jìn)行到達(dá)/定值的數(shù)據(jù)流分析,獲取每個(gè)參數(shù)的使用狀況;
(64)如果存在參數(shù)引用的情況,則進(jìn)行指針/別名分析,獲取這些參數(shù)的實(shí)際指向;(65)根據(jù)參數(shù)的不同,分別進(jìn)行變量查詢(xún)、內(nèi)存查詢(xún)、或函數(shù)查詢(xún);(66)將查詢(xún)結(jié)果存儲(chǔ)到對(duì)應(yīng)的數(shù)據(jù)列表中,方便下一步使用。
(7)根據(jù)規(guī)則中配置的分析類(lèi)名,通過(guò)分析調(diào)度器對(duì)代碼的安全問(wèn)題進(jìn)行分析,每一類(lèi)安全問(wèn)題對(duì)應(yīng)于一個(gè)安全分析方法,由安全分析接口動(dòng)態(tài)調(diào)用這些安全分析方法進(jìn)行安全性分析;這些分析方法針對(duì)的安全漏洞至少包括緩沖區(qū)溢出、資源泄漏、危險(xiǎn)API和格式化字符串,這些結(jié)構(gòu)分析器利用安全規(guī)則、AST語(yǔ)法樹(shù)和流分析的結(jié)果進(jìn)行具體分析,一旦發(fā)現(xiàn)安全問(wèn)題后,即將分析結(jié)果填充到結(jié)果緩沖池中;(8)安全分析結(jié)束后,將存儲(chǔ)在結(jié)果緩沖池中的分析結(jié)果取出,存儲(chǔ)在本地磁盤(pán),并提交給用戶審閱;本發(fā)明已經(jīng)進(jìn)行了兩方面的實(shí)施試驗(yàn),一個(gè)是軟件開(kāi)發(fā)的進(jìn)行軟件開(kāi)發(fā)的企業(yè)和個(gè)人可以使用本發(fā)明對(duì)開(kāi)發(fā)完成的源代碼進(jìn)行檢測(cè),從中查找出存在的風(fēng)險(xiǎn),并進(jìn)行改進(jìn)。這樣其代碼研發(fā)的改進(jìn)流程如圖5所示。另一個(gè)是準(zhǔn)入評(píng)估的作為測(cè)評(píng)機(jī)構(gòu)以及最終部署軟件產(chǎn)品的單位,由于并不了解軟件開(kāi)發(fā)的流程,只能對(duì)軟件進(jìn)行黑盒檢測(cè),軟件中存在的安全隱患不能及時(shí)發(fā)現(xiàn),對(duì)這些單位的安全運(yùn)營(yíng)造成了極大的威脅。本發(fā)明可以有效解決這一問(wèn)題,通過(guò)代碼掃描可以清楚地發(fā)現(xiàn)軟件中存在的風(fēng)險(xiǎn),保證軟件的安全與穩(wěn)定。其應(yīng)用流程如圖6所示。
權(quán)利要求
1.一種基于源代碼靜態(tài)分析技術(shù)的軟件安全代碼分析器,其特征在于所述軟件安全代碼分析器包括有下述五個(gè)功能模塊所組成代碼解析器,負(fù)責(zé)對(duì)源程序代碼進(jìn)行詞法、語(yǔ)法分析。然后抽 象出足夠多的信息并轉(zhuǎn)換成抽象語(yǔ)法樹(shù)AST來(lái)表示,再送入代碼分析引擎,為后繼分析提供便利;該模塊還可以支持解析項(xiàng)目工程文件,獲取工程中全部源代碼信息;代碼分析引擎,由分別完成各自功能的五個(gè)子功能模塊數(shù)據(jù)流分析器、控制流分析器、結(jié)構(gòu)分析器、安全分析調(diào)度器及安全分析接口所組成,負(fù)責(zé)根據(jù)規(guī)則庫(kù)分析程序的結(jié)構(gòu)與關(guān)鍵特征,獲得程序的安全風(fēng)險(xiǎn),并通過(guò)安全風(fēng)險(xiǎn)報(bào)告器將結(jié)果提交給用戶接口;安全風(fēng)險(xiǎn)報(bào)告器,負(fù)責(zé)根據(jù)代碼分析引擎的結(jié)果,再參照規(guī)則庫(kù)的相關(guān)語(yǔ)法與語(yǔ)義進(jìn)行比對(duì),將發(fā)現(xiàn)的安全風(fēng)險(xiǎn)提交給用戶接口;安全規(guī)則庫(kù),負(fù)責(zé)為代碼分析引擎提供使用可擴(kuò)展標(biāo)記語(yǔ)言XML配置的代碼分析規(guī)則,以及對(duì)應(yīng)不同的安全性漏洞的安全風(fēng)險(xiǎn)支持;還可以提供風(fēng)險(xiǎn)改進(jìn)策略報(bào)告,即能夠針對(duì)不同環(huán)境的軟件系統(tǒng)的多樣性和復(fù)雜性進(jìn)行擴(kuò)充;用戶接口,負(fù)責(zé)與用戶進(jìn)行交互,一方面接受用戶掃描代碼的請(qǐng)求,另一方面則將掃描分析的結(jié)果向用戶輸出。
2.根據(jù)權(quán)利要求1所述的軟件安全代碼分析器,其特征在于所述代碼分析引擎中五個(gè)子模塊的功能是數(shù)據(jù)流分析器,用于在代碼解析的基礎(chǔ)上,提取程序的數(shù)據(jù)流信息;它是通過(guò)遍歷抽象語(yǔ)法樹(shù)AST,提取出包括指針變量、內(nèi)存塊、常量,函數(shù)結(jié)構(gòu)的數(shù)據(jù)信息,再根據(jù)用戶規(guī)則對(duì)這些信息進(jìn)行刷選,并向程序結(jié)構(gòu)分析器提供接口,以讀取這些信息;控制流分析器,用于在代碼解析基礎(chǔ)上,提取程序的控制流信息;它是根據(jù)規(guī)則和通過(guò)遍歷抽象語(yǔ)法樹(shù)AST,生成對(duì)應(yīng)的程序控制依賴(lài)圖,并向安全分析調(diào)度器提供接口,以讀取這些信息;結(jié)構(gòu)分析器,用于在代碼分析引擎提取出的語(yǔ)法樹(shù)基礎(chǔ)上,根據(jù)安全規(guī)則庫(kù)提供的代碼分析規(guī)則,提取程序的包括入口點(diǎn)、主要函數(shù)名和函數(shù)關(guān)系的主要結(jié)構(gòu)信息,再調(diào)度數(shù)據(jù)流分析器和控制流分析器,完成對(duì)規(guī)則指定的關(guān)鍵變量的分析,并調(diào)用安全分析接口,完成對(duì)相關(guān)代碼的安全性檢測(cè);安全分析調(diào)度器,作為代碼分析引擎的主要調(diào)度模塊,用于根據(jù)安全規(guī)則庫(kù)提供的信息,調(diào)度結(jié)構(gòu)分析器進(jìn)行安全性分析,并生成報(bào)告表,提供接口供安全分析報(bào)告器調(diào)用;安全分析接口,負(fù)責(zé)根據(jù)安全規(guī)則調(diào)用特定的安全分析方法,這些方法利用語(yǔ)法樹(shù)和流分析結(jié)果,進(jìn)行安全分析,并將分析結(jié)果提交給安全風(fēng)險(xiǎn)報(bào)告器。
3.根據(jù)權(quán)利要求1所述的軟件安全代碼分析器,其特征在于所述源程序代碼是包括C、C++、C#、JAVA和Perl的主流開(kāi)發(fā)語(yǔ)言。
4.根據(jù)權(quán)利要求1所述的軟件安全代碼分析器,其特征在于所述軟件安全代碼分析器能夠檢測(cè)出來(lái)的軟件安全漏洞包括以下多類(lèi)輸入驗(yàn)證Input Validation,包括緩沖區(qū)溢出Buffer Overflow,命令注入Command Injection,跨站腳本Cross-Site Scripting,格式化字符串Format String,非法指針I(yè)llegal Pointer Value,整數(shù)溢出Integer Overflow,日志偽造Log Forging,路徑操縱Path Manipulation,進(jìn)程控制Process Control,資源泄漏ResourceInjection,SQL注入SQL Injection,字符串錯(cuò)誤中止String Termination Error;API誤用,即API Abuse,包括危險(xiǎn)函數(shù)Dangerous Function,目錄限制Directory Restriction,未檢測(cè)返回值Unchecked Return Value,堆檢查HeapInspection;安全特征Security Features,包括不安全的隨機(jī)數(shù)Insecure Randomness,最小權(quán)限違規(guī)Least Privilege Violation;時(shí)間與狀態(tài)Time and State,包括文件訪問(wèn)競(jìng)賽條件File Access RaceConditionTOCTOU,不安全的臨時(shí)文件Insecure Temporary File;代碼質(zhì)量Code Quality,包括雙重釋放Double Free,內(nèi)存泄漏MemoryLeak,空指針檢查Null Dereference,廢棄函數(shù)Obsolete,未初始化變量Uninitialized Variable,未釋放資源Unreleased Resource,釋放后使用Use AfterFree。
5.一種基于源代碼靜態(tài)分析技術(shù)的軟件安全代碼分析器的檢測(cè)軟件安全漏洞的方法,其特征在于包括下列操作步驟(1)將用戶配置好的需要進(jìn)行檢測(cè)的源代碼目錄、代碼語(yǔ)言、頭文件目錄送入軟件安全代碼分析器后,該檢測(cè)裝置開(kāi)始工作;(2)先對(duì)輸入的源代碼進(jìn)行預(yù)處理,將程序中已經(jīng)定義的頭文件和宏解開(kāi),替換到源代碼中相應(yīng)的位置上;(3)讀取規(guī)則文件,解析存儲(chǔ)規(guī)則所使用的可擴(kuò)展標(biāo)記語(yǔ)言XML文件,獲取所需要的安全分析規(guī)則;(4)對(duì)每一個(gè)處理過(guò)的源文件進(jìn)行語(yǔ)法解析,在經(jīng)過(guò)宏解析和頭文件處理后,進(jìn)行文法解析,將源代碼解析成從左到右LL描述文法所描述的數(shù)據(jù),此后解析為標(biāo)準(zhǔn)的AST語(yǔ)法樹(shù);(5)根據(jù)安全規(guī)則和AST語(yǔ)法樹(shù),對(duì)目標(biāo)工程的源代碼進(jìn)行預(yù)分析;如果發(fā)現(xiàn)不需要進(jìn)行流分析就能發(fā)現(xiàn)的安全問(wèn)題,則直接把分析結(jié)果提交給結(jié)果處理模塊;否則,將AST樹(shù)與安全規(guī)則交給控制流分析器、數(shù)據(jù)流分析器和安全分析調(diào)度器,作進(jìn)一步處理;(6)分別對(duì)AST語(yǔ)法樹(shù)作進(jìn)一步的控制流分析與數(shù)據(jù)流分析,其中數(shù)據(jù)流分析是將代碼中所有變量的調(diào)用關(guān)系的數(shù)據(jù)集中到一個(gè)預(yù)先分配好的緩沖池中,使用時(shí)告訴變量名和所在行號(hào),以便查找其函數(shù)調(diào)用表;控制流分析則是對(duì)特定行的控制關(guān)系進(jìn)行統(tǒng)計(jì),可以將代碼中任意一行是否被控制、以及被哪行控制都提交給相關(guān)接口;(7)根據(jù)規(guī)則中配置的分析類(lèi)名,通過(guò)分析調(diào)度器對(duì)代碼的安全問(wèn)題進(jìn)行分析,每一類(lèi)安全問(wèn)題對(duì)應(yīng)于一個(gè)安全分析方法,由安全分析接口動(dòng)態(tài)調(diào)用這些安全分析方法進(jìn)行安全性分析;這些分析方法針對(duì)的安全漏洞至少包括緩沖區(qū)溢出、資源泄漏、危險(xiǎn)API和格式化字符串,這些結(jié)構(gòu)分析器利用安全規(guī)則、AST語(yǔ)法樹(shù)和流分析的結(jié)果進(jìn)行具體分析,一旦發(fā)現(xiàn)安全問(wèn)題后,即將分析結(jié)果填充到結(jié)果緩沖池中;(8)安全分析結(jié)束后,將存儲(chǔ)在結(jié)果緩沖池中的分析結(jié)果取出,存儲(chǔ)在本地磁盤(pán),并提交給用戶審閱;
6.根據(jù)權(quán)利要求5所述的檢測(cè)軟件安全漏洞的方法,其特征在于所述步驟4進(jìn)一步包括下列操作內(nèi)容(41)代碼解析器中的語(yǔ)法解析模塊先對(duì)輸入的源文件的類(lèi)型進(jìn)行過(guò)濾,根據(jù)擴(kuò)展名提取所需的源代碼;(42)對(duì)提取的源代碼進(jìn)行預(yù)處理,解析代碼中所有的頭文件信息和宏信息,并將其解開(kāi)到指定的文件中;(43)進(jìn)行詞法分析,將源代碼轉(zhuǎn)換為L(zhǎng)L文法;(44)進(jìn)行語(yǔ)法分析,將文法分析的結(jié)果轉(zhuǎn)換成AST語(yǔ)法樹(shù)。
7.根據(jù)權(quán)利要求5所述的檢測(cè)軟件安全漏洞的方法,其特征在于所述步驟6進(jìn)一步包括下列操作內(nèi)容(61)先進(jìn)行控制流分析,即由軟件安全代碼分析器遍歷AST語(yǔ)法樹(shù),尋找并獲取其中包括if、while、for、switch的控制語(yǔ)句;(62)如果存在所述包括if、while、for、switch的控制語(yǔ)句,則進(jìn)行遞歸計(jì)算,記錄控制關(guān)系,直到找不到控制關(guān)系為止;如果不存在所述的控制語(yǔ)句,則對(duì)已經(jīng)分析出來(lái)的控制關(guān)系進(jìn)行記錄;(63)進(jìn)行到達(dá)/定值的數(shù)據(jù)流分析,獲取每個(gè)參數(shù)的使用狀況;(64)如果存在參數(shù)引用的情況,則進(jìn)行指針/別名分析,獲取這些參數(shù)的實(shí)際指向;(65)根據(jù)參數(shù)的不同,分別進(jìn)行變量查詢(xún)、內(nèi)存查詢(xún)、或函數(shù)查詢(xún);(66)將查詢(xún)結(jié)果存儲(chǔ)到對(duì)應(yīng)的數(shù)據(jù)列表中,方便下一步使用。
8.根據(jù)權(quán)利要求5所述的檢測(cè)軟件安全漏洞的方法,其特征在于所述步驟64中的別名分析是分析出兩個(gè)或多個(gè)不同變量指向同一塊數(shù)據(jù)區(qū)的情況。
全文摘要
一種基于源代碼靜態(tài)分析的軟件安全代碼分析器及其檢測(cè)方法,軟件安全代碼分析器包括五個(gè)功能模塊代碼解析器、代碼分析引擎、安全風(fēng)險(xiǎn)報(bào)告器、安全規(guī)則庫(kù)和用戶接口,其中代碼分析引擎由數(shù)據(jù)流分析器、控制流分析器、結(jié)構(gòu)分析器、安全分析調(diào)度器及安全分析接口所組成,負(fù)責(zé)提取程序結(jié)構(gòu)并通過(guò)基于全文的語(yǔ)法、語(yǔ)義來(lái)分析代碼的安全問(wèn)題;通過(guò)輸入的源代碼和代碼的語(yǔ)法與語(yǔ)義,由該引擎分析代碼的結(jié)構(gòu)和關(guān)鍵特征,由此獲取程序的安全風(fēng)險(xiǎn)并報(bào)告給用戶。本發(fā)明根據(jù)輸入的源程序,根據(jù)語(yǔ)法與語(yǔ)義,分析程序的結(jié)構(gòu)與關(guān)鍵特征,從而獲得程序的安全風(fēng)險(xiǎn),并報(bào)告給用戶;還可將代碼分析結(jié)果通過(guò)報(bào)表,將發(fā)現(xiàn)的安全漏洞提交給用戶進(jìn)行審核與評(píng)估。
文檔編號(hào)G06F11/36GK101017458SQ20071006415
公開(kāi)日2007年8月15日 申請(qǐng)日期2007年3月2日 優(yōu)先權(quán)日2007年3月2日
發(fā)明者徐國(guó)愛(ài), 張淼, 徐國(guó)勝, 梁婕, 陳愛(ài)國(guó) 申請(qǐng)人:北京郵電大學(xué)
網(wǎng)友詢(xún)問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1