龍剛 何建安 高嵩曾奕 張生林
摘要:通過比較國內(nèi)外C/C++源代碼安全檢測技術(shù)的發(fā)展?fàn)顩r,闡述了研制C/C++源代碼安全檢測系統(tǒng)的必要性。討論了C/C++源代碼安全檢測領(lǐng)域的關(guān)鍵技術(shù),描述了C/C++源代碼安全檢測系統(tǒng)的主要功能、系統(tǒng)架構(gòu)和實(shí)現(xiàn)途徑,并指出了C/C++源代碼安全檢測系統(tǒng)下一步的改進(jìn)方向。
關(guān)鍵詞:源代碼 軟件安全性 靜態(tài)分析
中圖分類號:TP311 文獻(xiàn)標(biāo)識碼:A 文章編號:1007-9416(2016)06-0150-02
Abstract:Through the development status of domestic and foreign C/C++ source code security detection technology, this paper expounds the necessity of the development of C/C++ source code security detection system. Discuss the key technology in the field of C/C++ source code security detection, describes the C/C++ source code security detection system, the main function, system architecture and realization method, and points out that the C/C++ source code security detection system further improvement direction.
Key Words:source code; software security; static analysis
隨著軟件技術(shù)和網(wǎng)絡(luò)技術(shù)在各個(gè)行業(yè)的廣泛應(yīng)用,以及以Linux操作系統(tǒng)為標(biāo)志的自由軟件的大量存在和應(yīng)用,人們面臨的軟件安全問題也日漸增多。研究表明,相當(dāng)數(shù)量的安全問題都是由于軟件自身存著的安全漏洞引起的,惡意的攻擊者利用這些安全漏洞提升權(quán)限,訪問未授權(quán)資源,甚至破壞敏感數(shù)據(jù),從而造成重大損失,近期發(fā)生的Struts2安全事件和OpenSSL出現(xiàn)“Heartbleed”安全漏洞均造成了很大影響。存在于計(jì)算機(jī)系統(tǒng)中的軟件安全漏洞已經(jīng)成為信息安全的一個(gè)核心問題。
1 國內(nèi)外研究現(xiàn)狀
目前,對于軟件的安全性分析挖掘,以美國為代表的信息化發(fā)達(dá)國家已經(jīng)全面起步:美國國土安全部作為美國風(fēng)險(xiǎn)評估的領(lǐng)路者,擁有龐大的研究力量,幾乎影響著全世界在風(fēng)險(xiǎn)評估領(lǐng)域的概念、觀念和理念。上個(gè)世紀(jì)90年代末,美國開始把風(fēng)險(xiǎn)評估的范疇延伸到軟件源代碼上,在政府、學(xué)術(shù)界和產(chǎn)業(yè)界開展源碼安全分析與同源性測試。2004年由國土安全部主持了兩個(gè)大型安全項(xiàng)目DETER和EMIST,用以建設(shè)軟件安全測試床,開發(fā)科學(xué)、嚴(yán)格的攻擊和預(yù)防機(jī)制,研究軟件安全測試評估框架和方法,實(shí)施軟件漏洞分析與風(fēng)險(xiǎn)評估工作。2005年,美國總統(tǒng)信息技術(shù)咨詢委員會關(guān)于信息安全的年度報(bào)告中指出,美國政府部門和軍方等敏感部門使用的軟件產(chǎn)品,必須加強(qiáng)漏洞分析和風(fēng)險(xiǎn)評估,尤其提到這些軟件產(chǎn)品應(yīng)進(jìn)行源碼安全分析測評。在美國國土安全部的資助下,NIST設(shè)立了軟件保證度量和工具測量項(xiàng)目(Software Assurance Metrics And Tool Evaluation,SAMATE),其核心就是對軟件安全性進(jìn)行分析研究。為了減少開源軟件的源碼缺陷,2006年初美國國土安全部設(shè)立了一個(gè)長期的開源軟件源代碼安全測試計(jì)劃,對包含Linux等在內(nèi)的1750多萬行開源軟件的源代碼進(jìn)行缺陷測試,以有力地保障這些軟件的安全性。在企業(yè)界,包括微軟、AT&T、Dell、Oracle、蘋果等世界知名軟件公司都已經(jīng)或正在部署軟件源代碼安全性檢測系統(tǒng)。此外,微軟公司還提出了安全開發(fā)生命周期(SDL)的概念,將安全開發(fā)貫穿軟件生命周期的整個(gè)過程。它的基本原則是:安全的設(shè)計(jì)、安全的開發(fā)、安全的部署,通過SDL可以在很大程度上降低軟件安全風(fēng)險(xiǎn)[1-3]。
而國內(nèi)對軟件的安全性檢查和驗(yàn)證研究,還比較少,關(guān)于源代碼的靜態(tài)分析工具的研制應(yīng)用主要是致力于某類缺陷的檢測,沒有集成的環(huán)境進(jìn)行支撐。因此,開展C/C++源代碼的檢測技術(shù)的集成研究和工具化勢在必行[4-5]。
2 關(guān)鍵技術(shù)
C/C++源代碼靜態(tài)分析中主要涉及的關(guān)鍵技術(shù)包括:C++源代碼解析、路徑敏感的過程間遍歷算法的設(shè)計(jì)以及狀態(tài)緩存機(jī)制等。
(1)使用GCC作為源代碼解析的工具,由GCC負(fù)責(zé)進(jìn)行源代碼的詞法語法分析與CFG生成。
(2)使用基于變量安全狀態(tài)跟蹤的模型進(jìn)行C/C++的漏洞的檢測。一般而言,是指:使用基于有限狀態(tài)機(jī)的漏洞狀態(tài)機(jī)描述程序變量安全狀態(tài)的轉(zhuǎn)換規(guī)則;檢測工具對程序各可能執(zhí)行路徑進(jìn)行路徑敏感的過程間的靜態(tài)遍歷并識別當(dāng)前操作;對當(dāng)前操作所涉及的程序變量根據(jù)狀態(tài)機(jī)賦予其對應(yīng)的安全狀態(tài)。在檢查點(diǎn)處,檢測工具檢測相關(guān)操作數(shù)據(jù)是否具有期望的安全狀態(tài),若出現(xiàn)與期望安全狀態(tài)不符的情況,則表示發(fā)現(xiàn)了一個(gè)可能的安全漏洞。
(3)路徑敏感的過程間遍歷算法的設(shè)計(jì)。路徑敏感的遍歷是指根據(jù)代碼實(shí)際的可能執(zhí)行路徑的遍歷,而不是直接按照源代碼自上而下的遍歷。過程間的遍歷是指當(dāng)遍歷遇到一個(gè)用戶定義的函數(shù)時(shí),能夠進(jìn)入該函數(shù),處理完該函數(shù)之后返回到調(diào)用點(diǎn)繼續(xù)遍歷。路徑敏感和過程間的遍歷是提高靜態(tài)分析精確度、減少漏報(bào)和誤報(bào)的有效手段。
(4)狀態(tài)緩存機(jī)制,基本塊層面的基于歷史狀態(tài)檢測的方法在過程內(nèi)檢測中能夠很好的處理不同路徑上狀態(tài)一致以及循環(huán)停止的問題,但是在過程間檢測中就可能出現(xiàn)問題。應(yīng)該以歷史狀態(tài)為基礎(chǔ),針對過程間分析進(jìn)一步完善緩存機(jī)制。
(5)采用一種基于內(nèi)存模擬的方法實(shí)現(xiàn)別名分析。具體的說,就是為每個(gè)對象(指針變量)分配一個(gè)內(nèi)存區(qū)域,該區(qū)域中保存該對象的狀態(tài)、字段等信息;如果兩個(gè)對象互為別名,就讓這兩個(gè)對象指向同一個(gè)內(nèi)存區(qū)域。
3 系統(tǒng)概述
C/C++源代碼安全檢測系統(tǒng)適用于任何行業(yè)軟件C/C++源代碼的檢測工作,它為用戶的主機(jī)應(yīng)用系統(tǒng)和基于WEB網(wǎng)站的業(yè)務(wù)系統(tǒng)提供全方位的基于源代碼的安全審計(jì)。在裝備類軟件、金融、政府等大型復(fù)雜應(yīng)用系統(tǒng)的軟件開發(fā)、測試等階段,均可使用該系統(tǒng)進(jìn)行源代碼審計(jì)工作,包括如下的內(nèi)容:源代碼的缺陷和錯誤檢查;分析并找到缺陷、錯誤引發(fā)的安全漏洞,提供代碼修訂措施和建議,幫助用戶節(jié)約開發(fā)成本,最大程度地保證了系統(tǒng)的健壯性,輔助軟件企業(yè)提升生產(chǎn)效率。
C/C++源代碼安全檢測系統(tǒng)的分析過程采用C/S架構(gòu),分析結(jié)果的展示以B/S架構(gòu)來實(shí)現(xiàn)。能夠與各類開發(fā)環(huán)境相集成。源代碼解析為基礎(chǔ),缺陷分析為核心,結(jié)果構(gòu)建為手段,人機(jī)界面、項(xiàng)目管理、擴(kuò)展接口為支撐和輔助,系統(tǒng)架構(gòu)如圖1所示。
4 功能設(shè)計(jì)與實(shí)現(xiàn)
整個(gè)C/C++源代碼缺陷分析系統(tǒng)要實(shí)現(xiàn)如下子模塊。(如表1)
4.1 源代碼解析模塊的實(shí)現(xiàn)
基于源代碼的靜態(tài)代碼分析技術(shù)對于編譯技術(shù)的借鑒主要集中在編譯前端部分,即在詞法分析和語法分析環(huán)節(jié)??紤]到本模塊要處理的C/C++涵蓋Visual C++和GNU C++兩個(gè)平臺,因此設(shè)計(jì)實(shí)現(xiàn)一個(gè)常規(guī)的能同時(shí)覆蓋兩個(gè)平臺的C++編譯前端。
源代碼預(yù)處理的流程如圖2所示。
經(jīng)過源代碼預(yù)處理之后,不管是VC++項(xiàng)目源文件還是GCC/G++項(xiàng)目源文件,都通過GCC前端進(jìn)行解析,生成CFG以及中間表示形式等數(shù)據(jù)結(jié)構(gòu)。圖3展示了一個(gè)由gcc生成的CFG的示例:
4.2 缺陷分析模塊的實(shí)現(xiàn)
C/C++源代碼靜態(tài)分析系統(tǒng)的缺陷分析由兩部分組成:基于語義的缺陷分析和基于控制流的缺陷分析。其中基于語義的缺陷分析對變量未使用、函數(shù)未使用、變量未初始、類型轉(zhuǎn)換化以及C/C++特性相關(guān)的三種缺陷(關(guān)鍵性變量被聲明為公共的、關(guān)鍵性公共域缺乏適當(dāng)?shù)奈鰳?gòu)處理、異常處理中缺乏一般化例外的捕獲)進(jìn)行檢測;基于控制流的缺陷分析對內(nèi)存泄露、兩次釋放、釋放后再使用、返回空值、空指針引用、資源未釋放、競爭條件、拒絕服務(wù)、格式化字符串、整數(shù)溢出、死代碼、以及堆棧溢出、數(shù)組訪問越界等缺陷的檢測。
類型轉(zhuǎn)換雖然也屬于基于語義的缺陷分析,卻是在構(gòu)造CFG完成的基礎(chǔ)上,遍歷CFG中的語句,根據(jù)一定的配置規(guī)則進(jìn)行檢測的;其余的基于語義的缺陷分析均是利用解析前端實(shí)現(xiàn)的。
在基于控制流的缺陷分析中,我們進(jìn)一步將缺陷細(xì)分為基于控制流的安全狀態(tài)跟蹤(包括內(nèi)存泄露、競爭條件等7種缺陷)、基于數(shù)據(jù)流的污點(diǎn)傳播跟蹤檢測(拒絕服務(wù)、格式化字符串、整數(shù)溢出)、死代碼、基于數(shù)據(jù)流的安全狀態(tài)跟蹤(堆棧溢出、數(shù)組越界訪問)。
基于數(shù)據(jù)流的污點(diǎn)傳播跟蹤檢測是首先確定污點(diǎn)數(shù)據(jù)源,如從網(wǎng)絡(luò)、文件、用戶輸入等讀取數(shù)據(jù)的方法,將接受所獲取的臟數(shù)據(jù)的變量標(biāo)記為Signed,然后根據(jù)控制流進(jìn)行污點(diǎn)傳播,在檢查點(diǎn)處判斷相關(guān)變量是否保持Signed狀態(tài),如果是,這報(bào)告一個(gè)相應(yīng)的缺陷。數(shù)據(jù)源函數(shù)、傳播函數(shù)、檢查點(diǎn)函數(shù)等從檢測規(guī)則集中獲取。具體的檢測流程如圖4所示。
死代碼的檢測是利用約束求解技術(shù),判斷對于每條路徑都不可行的代碼塊,這些代碼塊即被認(rèn)定為死代碼。
基于數(shù)據(jù)流的安全狀態(tài)跟蹤(堆棧溢出、數(shù)組越界訪問)檢測技術(shù)與死代碼的檢測具有相關(guān)性,都是使用約束求解技術(shù)。所不同的是,死代碼是根據(jù)已有的路徑條件判斷新遇到的路徑條件是否可行,而堆棧溢出和數(shù)組越界訪問則是利用路徑條件判斷檢查點(diǎn)處的各相關(guān)變量之間的關(guān)系是否滿足所定義的規(guī)則,然后根據(jù)規(guī)則確定是否存在缺陷。在遍歷方式,死代碼使用了非路徑敏感的流敏感遍歷方式,而堆棧溢出的檢測是路徑敏感的遍歷方式;同時(shí),死代碼無需外部規(guī)則,堆棧溢出需要規(guī)則定義數(shù)據(jù)流向、緩沖區(qū)的改變以及檢查點(diǎn)的設(shè)置等。
4.3 結(jié)果輸出模塊實(shí)現(xiàn)
結(jié)果輸出模塊與缺陷分析模塊進(jìn)行交互,當(dāng)缺陷分析模塊發(fā)現(xiàn)源代碼中的缺陷時(shí)會調(diào)用本模塊保存分析結(jié)果。保存結(jié)果應(yīng)包含缺陷涉及的變量、缺陷的完整觸發(fā)路徑、數(shù)據(jù)傳播途徑、缺陷位置、缺陷類型(以上均可以從變量信息中獲得)、缺陷描述、可能的修補(bǔ)手段及危險(xiǎn)級別等信息(后面這三項(xiàng)內(nèi)容從XML規(guī)則文檔中提取)。
4.4 項(xiàng)目管理模塊實(shí)現(xiàn)
對被測源碼按照項(xiàng)目進(jìn)行管理,提供項(xiàng)目配置功能,包括源碼分析范圍,分析級別、分析缺陷類型定制等。提供項(xiàng)目結(jié)果輸出配置,包括輸出缺陷類型、級別、輸出形式等。
4.5 人機(jī)界面模塊實(shí)現(xiàn)
提供可視化界面,便于用戶進(jìn)行操作。
4.6 擴(kuò)展接口模塊實(shí)現(xiàn)
支持與主流開發(fā)環(huán)境的集成,如windows平臺上的VS系列、中標(biāo)麒麟平臺上的Eclipse和QT等。
5 結(jié)語
C/C++源代碼安全檢測系統(tǒng)現(xiàn)在已經(jīng)可以在傳統(tǒng)的X86平臺下運(yùn)行使用,目前正在向國產(chǎn)化軟件平臺進(jìn)行移植。后期還需要開展的工作包括:與中標(biāo)麒麟操作系統(tǒng)進(jìn)行適配、與國產(chǎn)硬件平臺進(jìn)行適配優(yōu)化和對核心源碼分析模塊進(jìn)行重構(gòu)等。
參考文獻(xiàn)
[1]EVANS D,LAROCHELLE D.Improving security using extensible light-weight static analysis[J].IEEE Software, 2002,19(1):42-51.
[2]BRIAN C. Static analysis for security[J].IEEE Security & Privacy,2004,7(4):32-36.
[3]Institute ANS. ISO programming language C++[S].2003.
[4]李曉南,范明鈺,王光衛(wèi).基于靜態(tài)檢測工具的源代碼安全缺陷檢測技術(shù)[J].計(jì)算機(jī)應(yīng)用研究,2011,28 (8):2997-2998.
[5]林銳,韓永泉.高質(zhì)量程序設(shè)計(jì)指南—C/C++語言[M].北京電子工業(yè)出版社,2008:240-247.