幾種C/C++語言安全檢測工具介紹

轉自新浪微博http://www.vckbase.com/index.php/wv/1635

 

針對C/C++語言安全漏洞的分析檢測也出現了大量的工具,按照不同的機理主要分爲以下幾類,如表所示:

分析類型

機理

分析工具

備註

靜態分析

預處理

FormatGuard

預處理提供的宏功能來對printf函數中的參數個數進行計數

詞法分析

Rats、Flawfinder、Its4

見後文介紹

語法分析

Antlr/Gold

見後文介紹

註解分析

Splint/

見後文介紹

語義/值流分析

Cqual

見後文介紹

逆向分析

IDA/ Win32Dasml

反彙編工具

動態分析

攔截庫函數的調用

LibFormat

見後文介紹

逆向分析

OllyDbg/ Windbg

動態調試工具,常結合靜態反彙編工具對程序進行逆向分析


  FormatGuard:Linux下防止格式化字符串攻擊的工具,是對glibc的增強。具體通過預處理提供的宏功能來對類printf函數中的參數個數進行計數,通過glibc提供的parse_printf_format函數來對轉換說明符進行計數。如果轉換說明符的數目大於提供給printf的參數個數,_proteced_printf函數認爲可能遭受格式串攻擊,發出警告。但該工具不能分析類vprintf函數(而此類函數卻大量存在)
   LibFormat:Unix中提供了一個有用的環境變量LD_PRELOAD,它允許我們定義在程序允許前優先加載的動態鏈接庫。主要思想,通過動態連接器將自己插入到程序中,在程序以後的運行中如果發現了包含%n的格式串出現在可寫內存中,則終止程序。但對讀操作卻無能爲力,而且遇到的任何%n格式串,都會終止程序,誤報高。
   ANTLR:識別和處理編程語言是 Antlr 的首要任務,編程語言的處理是一項繁重複雜的任務,爲了簡化處理,一般的編譯技術都將語言處理工作分爲前端和後端兩個部分。其中前端包括詞法分析、語法分析、語義分析、中間代碼生成等若干步驟,後端包括目標代碼生成和代碼優化等步驟。Antlr 致力於解決編譯前端的所有工作。使用 Anltr 的語法可以定義目標語言的詞法記號和語法規則,Antlr 自動生成目標語言的詞法分析器和語法分析器;此外,如果在語法規則中指定抽象語法樹的規則,在生成語法分析器的同時,Antlr 還能夠生成抽象語法樹;最終使用樹分析器遍歷抽象語法樹,完成語義分析和中間代碼生成。整個工作在 Anltr 強大的支持下,將變得非常輕鬆和愉快。另外,Antlr的詞法分析器生成器,可以很容易的完成正則表達式能夠完成的所有工作;除此之外使用 Anltr 還可以完成一些正則表達式難以完成的工作,比如識別左括號和右括號的成對匹配等。
   GOLD:它是一個較爲複雜的分析器,支持很多語言,包括:Assembly – Intel x86 、ANSI C、C#、D、Delphi、Java、Pascal、Python、Visual Basic、Visual Basic .NET、Visual C++、所有.NET語言、所有ActiveX語言。是個免費的軟件。
   Its4:讀取一個或多個C/C++源程序,將每個源程序分割成函數標誌流,然後檢查生成的標誌是否存在於漏洞數據庫中,從而得到每個源程序的所有錯誤警告列表,並帶有相關的描述。其規則庫vulns.i4d定義了各種函數的危險等級,描述等,通過規則匹配來報出風險,但它不能理解程序上下文意思,存在很大的誤報。
   Flawfinder:詞法掃描和分析,內嵌了一些漏洞數據庫,如緩衝區溢出、格式化串漏洞等,掃描快,按照代碼中漏洞的風險等級對漏洞進行劃分,可以快速找到存在的問題,誤報較高
   Rats:掃描C、C++、Perl、PHP和Python開發的源程序中潛在的漏洞,掃描規則比較粗糙
   詞法分析工具的分析流程:



描述:
   (1)輸入待掃描的源程序文件或者文件夾,分析輸入的文件和文件夾,識別出其中的所有源程序文件,建立一個待掃描文件列表,下一步就可以從待掃描文件列表中有序的讀取帶掃描文件進行掃描。
   (2)當詞法分析工具得到一行待分析文件的源代碼的同時,從危險函數數據庫中提取一個等級的危險函數與該行源代碼進行匹配,這就是初步分析。
   (3)如果在初步分析中匹配成功,那麼詞法分析工具將使該行代碼進入下一步的分類特徵分析,否則,返回繼續進行下一行的初步分析。
   (4)詞法分析工具不斷的讀取源代碼按照設定的危險等級進行分析,直到最後生成報告,以便開發者進行改進。
   Cqual:採用語義/值流分析,該工具的功能即是查找格式化字符串缺陷,const數據類型以及結構體的檢查等。其分析流程如下:



   (1)用戶輸入源文件和格配置文件,作爲程序的輸入。Cqual內置了常用的分析模式(格配置),在分析常用缺陷時,直接使用其自帶的配置文件
   (2)Cqual前端對C文件進行詞法分析和語法分析,生成抽象語法樹
   (3)遍歷抽象語法樹,根據類型推斷系統,生成限定子約束關係。Cqual在分析之初,會爲每個變量創建一個同名的限定子變量。通過遍歷語法樹,Cqual能夠執行高效的流不敏感的類型推斷,從而檢查推斷出剩餘的類型限定子並檢查一致性。在執行推斷的時候,Cqual會產生限定子和限定子變量之間的一系列約束。
   (4)使用約束求解算法對約束不等式組進行求解。如果不等式組沒有解,則Cqual認爲發現錯誤,重新遍歷一遍約束圖,輸出對用戶最有用的錯誤路徑信息然後退出。否則,它認爲源程序沒有缺陷,直接退出。Cqual的一個優勢在於發現錯誤時,能夠輸出合理的錯誤路徑,這有利於用戶快速定位錯誤。
   Cqual採用的是覆蓋全部路徑,因此也存在誤報
   splint:是一個動態檢查C語言程序安全弱點和編寫錯誤的程序.splint會進行多種常規檢查,包括未使用的變量,類型不一致,使用未定義變量,無法執行的代碼,忽略返回值,執行路徑未返回,無限循環等錯誤。
Cppcheck
   http://sourceforge.net/apps/mediawiki/cppcheck/index.php?title=Main_Page
   cppcheck是靜態的C/C++ 代碼分析工具,用以檢查內存泄漏,錯配的內存分配和釋放,緩衝區溢出,以及更多的問題。
   Frama-C
   是一個用來分析 C 代碼的工具,它收集了很多靜態統計技術,如代碼切片和依賴分析等。http://www.oschina.net/p/frama-c
   Flexc++
   是一個語法掃描器生成工具,基於正則表達式。與 Flex 和 Flex++ 高度一致。
   http://www.oschina.net/p/flexcpp
   另外介紹一個商業的源代碼靜態掃描工具Fortify SCA:該工具是一個靜態的、白盒的軟件源代碼安全測試工具。它通過內置的五大主要分析引擎:數據流、語義、結構、控制流、配置流等對應用軟件的源代碼進行靜態的分析,分析的過程中與它特有的軟件安全漏洞規則集進行全面地匹配、查找,從而將源代碼中存在的安全漏洞掃描出來,並給予整理報告。掃描的結果中不但包括詳細的安全漏洞的信息,還會有相關的安全知識的說明,以及修復意見的提供。
   工作原理:
   Foritfy SCA 首先通過調用語言的編譯器或者解釋器把前端的語言代碼(如JAVA,C/C++源代碼)轉換成一種中間媒體文件NST(Normal Syntax Tree)將其源代碼之間的調用關係,執行環境,上下文等分析清楚。然後再通過上述的五大分析引擎從五個切面來分析這個NST,匹配所有規則庫中的漏洞特徵,一旦發現漏洞就抓取出來。最後形成包含詳細漏洞信息的結果文件。
   目前Fortify SCA可以掃描出約350種漏洞,Fortify將所有安全漏洞整理分類,根據開發語言分項目,再細分爲8個大類,約350個子類。
   IDA:記錄把跟蹤事件記錄在一個跟蹤緩存區中。跟蹤緩存區的大小可以設定爲無限大(此時你需要很多內存),或者固定的大小(這種情況下,新的跟蹤事件會覆蓋老的跟蹤事件)。
   IDA提供幾種不同的跟蹤機制:
   1、指令跟蹤:IDA將會記錄每一條指令的執行,並保存寄存器數值,通過使用這些信息,你可以找出應用程序的執行過程,並可找出哪條指令修改了哪個寄存器。
   2、函數跟蹤:IDA將會記錄所有的函數調用和函數返回。
   3、讀寫-寫-執行跟蹤:IDA將會記錄一個對指定地址的所有訪問。這種機制相當於是不停止的斷點。
   OllyDbg:具體步驟是首先加載啓動被分析軟件程序的二進制可執行文件,然後根據前一節中靜態分析的斷點列表信息設置斷點,結合函數調用關係圖(FCG)和控制流圖(CFG)等對程序的執行過程進行跟蹤,同時記錄程序執行的路徑以及數據流信息,接着通過人工經驗的分析,找到可疑的漏洞及漏洞可能產生的原因,最後通過注入相應的錯誤代碼來觸發漏洞,以是否發生異常去判斷該可疑的漏洞是否爲真實的漏洞。MS06-040漏洞的檢測即可以通過這個動靜結合的檢測方案被成功檢測出來的。
   windbg:是在windows平臺下,強大的用戶態和內核態調試工具
   總結:以上工具中IDA、OllyDbg有操作過,限於本人彙編很菜,沒有什麼使用體會;Rats、Flawfinder、Its4、Splint、Cqual、Cppcheck有使用過,並將這些工具融合到了一個分析平臺中;Foritfy SCA這個工具用過它的試用版,做的很優秀,可惜太貴,要一百多萬吧,不過可以先學習下它的漏洞分類,詳情參見https://www.fortify.com/vulncat/zh_CN/vulncat/index.html


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章