一種基于安全狀態(tài)跟蹤檢查的漏洞靜態(tài)檢測(cè)方法研究與實(shí)施(_第1頁(yè)
一種基于安全狀態(tài)跟蹤檢查的漏洞靜態(tài)檢測(cè)方法研究與實(shí)施(_第2頁(yè)
一種基于安全狀態(tài)跟蹤檢查的漏洞靜態(tài)檢測(cè)方法研究與實(shí)施(_第3頁(yè)
一種基于安全狀態(tài)跟蹤檢查的漏洞靜態(tài)檢測(cè)方法研究與實(shí)施(_第4頁(yè)
一種基于安全狀態(tài)跟蹤檢查的漏洞靜態(tài)檢測(cè)方法研究與實(shí)施(_第5頁(yè)
已閱讀5頁(yè),還剩9頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、一種基于安全狀態(tài)跟蹤檢查的漏洞靜態(tài)檢測(cè)方法研究與實(shí)施 本課題得到國(guó)家自然科學(xué)基金項(xiàng)目(60703102, 60873213)、北京市自然科學(xué)基金項(xiàng)目(4082018)和國(guó)家863 項(xiàng)目(2007AA01Z414)的資助。梁彬,男,1973年生,博士,副教授,主要研究方向?yàn)樾畔踩c系統(tǒng)軟件,Email: liangb. 侯看看,女,1986年生,碩士研究生,主要研究方向?yàn)殪o態(tài)分析。石文昌,男,1964年生,博士,教授,博士生導(dǎo)師,主要研究方向?yàn)樾畔踩?、可信?jì)算與系統(tǒng)軟件。梁朝暉,女,1968年生,博士,講師,主要研究方向?yàn)樾畔踩⒕W(wǎng)絡(luò)通信。梁彬 侯看看 石文昌 梁朝暉(中國(guó)人民大學(xué)信息學(xué)院

2、 北京100872)(數(shù)據(jù)工程與知識(shí)工程教育部重點(diǎn)試驗(yàn)室 北京100872)摘 要:現(xiàn)有的采用基于源代碼分析的漏洞靜態(tài)檢測(cè)方法中存在的主要問(wèn)題是誤報(bào)率和漏報(bào)率較高。主要原因之一是缺乏對(duì)數(shù)據(jù)合法性檢查與非可信數(shù)據(jù)源等程序安全相關(guān)元素的精確有效的識(shí)別分析。本文提出了一種基于數(shù)據(jù)安全狀態(tài)跟蹤和檢查的安全漏洞靜態(tài)檢測(cè)方法。該方法對(duì)漏洞狀態(tài)機(jī)模型的狀態(tài)空間進(jìn)行了擴(kuò)展,使用對(duì)應(yīng)多個(gè)安全相關(guān)屬性的向量標(biāo)識(shí)變量安全狀態(tài),細(xì)化了狀態(tài)轉(zhuǎn)換的粒度以提供更為精確的程序安全行為識(shí)別;在漏洞狀態(tài)機(jī)中引入了對(duì)合法性檢查的識(shí)別,有效降低了誤報(bào)的發(fā)生;建立了系統(tǒng)化的非可信數(shù)據(jù)鑒別方法,可防止由于遺漏非可信數(shù)據(jù)源而產(chǎn)生的漏報(bào)?;?/p>

3、于此方法的原型系統(tǒng)的檢測(cè)實(shí)驗(yàn)表明:本文方法能夠有效檢測(cè)出軟件系統(tǒng)中存在的緩沖區(qū)溢出等安全漏洞,誤報(bào)率明顯降低,并能避免現(xiàn)有主流靜態(tài)檢測(cè)方法中存在的一些嚴(yán)重漏報(bào)。關(guān)鍵詞:漏洞檢測(cè);靜態(tài)分析;狀態(tài)機(jī);漏報(bào);誤報(bào)中圖分類號(hào):TP309Research and Enforcement of a Static Vulnerabilities Detection MethodBased on Security State Tracing and CheckingLIANG Bin Hou Kan-Kan SHI Wen-Chang LIANG Zhao-Hui(School of Information,

4、 Renming University of China, Beijing 100872)(MOE Key Laboratory of Data Engineering and Knowledge Engineering, Beijing 100872)Abstract The main problem of existing static vulnerability detection methods based source code analysis is their high false positive and false negative. One main reason is l

5、ack of accurate and effective identification and analysis of security-related program elements, e.g. data validation checking, tainted data source, etc. A static vulnerability detection method based on data security state tracing and checking is proposed. In this method, the state space of state mac

6、hine model is extended; the security state of a variable is identified by a vector that may correspond to multiple security-related properties rather than by a single property; fine-grained state transition is provided to support accurate recognition of program security-related behaviors; the recogn

7、ition of validation checking is introduced in vulnerability state machine to reduce false positives; and a systematic discrimination mechanism for untrustworthy data is constructed to prevent false negatives result from neglecting untrustworthy data sources. The experimental results of a prototype s

8、ystem show that this method can effectively detect buffer overflow and other types vulnerabilities in software systems, and with obviously lower false positive than existing mainstream static detection methods and avoid some serious false negative of these methods.Keywords vulnerabilities detection,

9、 static analysis, state machine, false negative, false positive1 引言大多數(shù)信息安全事件的根源在于計(jì)算機(jī)軟件系統(tǒng)中存在有安全漏洞(Vulnerability)1。要杜絕這類安全事件,最根本的辦法在于在軟件發(fā)布前檢測(cè)出安全漏洞并修正。為了提高漏洞檢測(cè)的效率,安全界對(duì)自動(dòng)化的漏洞檢測(cè)技術(shù)進(jìn)行了研究,主要有動(dòng)態(tài)分析(Dynamic Analysis)和靜態(tài)分析(Static Analysis)兩類。動(dòng)態(tài)檢測(cè)工具使用較容易2,且確實(shí)能夠發(fā)現(xiàn)一些安全漏洞,但測(cè)試用例對(duì)程序邏輯的覆蓋率問(wèn)題限制了動(dòng)態(tài)檢測(cè)工具的發(fā)掘能力,難于發(fā)現(xiàn)隱藏較深的安全漏

10、洞。靜態(tài)漏洞分析技術(shù)主要通過(guò)對(duì)系統(tǒng)代碼進(jìn)行程序分析(Program Analysis)以發(fā)現(xiàn)各種安全漏洞3,例如緩沖區(qū)溢出、非法指針引用、競(jìng)爭(zhēng)條件等等。與動(dòng)態(tài)分析相比,靜態(tài)分析技術(shù)能夠支持更為有效的深度漏洞檢測(cè)。漏報(bào)(False Negative)和誤報(bào)(False Positive)是各種安全漏洞檢測(cè)技術(shù)所要共同面對(duì)的問(wèn)題。近年來(lái),漏洞靜態(tài)檢測(cè)技術(shù)已經(jīng)取得了很大的進(jìn)展,研究人員已經(jīng)提出和實(shí)現(xiàn)了一些漏洞靜態(tài)檢測(cè)方法和工具,目前已在操作系統(tǒng)等復(fù)雜系統(tǒng)的漏洞檢測(cè)中得以應(yīng)用4。但仍然存在著誤報(bào)率和漏報(bào)率較高的問(wèn)題,影響著靜態(tài)漏洞檢測(cè)方法進(jìn)一步推廣應(yīng)用。這與檢測(cè)模型和安全相關(guān)程序特征的識(shí)別有著密切的關(guān)

11、系。首先,現(xiàn)有靜態(tài)檢測(cè)方法采用單一的性質(zhì)標(biāo)識(shí)對(duì)程序數(shù)據(jù)安全性質(zhì)進(jìn)行描述,這種一元的描述機(jī)制難以進(jìn)行細(xì)粒度的數(shù)據(jù)狀態(tài)分析和精確跟蹤分析多種平行發(fā)展的數(shù)據(jù)安全相關(guān)性質(zhì),不能很好地全面覆蓋安全漏洞的激發(fā)條件。直接導(dǎo)致的一個(gè)嚴(yán)重問(wèn)題是缺乏對(duì)非可信數(shù)據(jù)合法性檢查的有效識(shí)別,從而產(chǎn)生大量的誤報(bào)。目前的檢測(cè)方法僅僅集中于跟蹤分析數(shù)據(jù)的可信性,一元的安全性質(zhì)標(biāo)識(shí)往往被完全用于描述數(shù)據(jù)的可信性,無(wú)法精確跟蹤對(duì)非可信數(shù)據(jù)所實(shí)施的合法性檢查,混淆了未經(jīng)合法性檢查的和已經(jīng)過(guò)檢查的非可信數(shù)據(jù)?,F(xiàn)實(shí)中,幾乎所有的軟件系統(tǒng)都要處理各種各樣的非可信數(shù)據(jù),而大部分非可信數(shù)據(jù)在引用前都經(jīng)過(guò)了相應(yīng)的合法性檢查,消除了其導(dǎo)致危險(xiǎn)操作

12、的可能性。因此,這種混淆的后果會(huì)將大量安全的非可信數(shù)據(jù)操作識(shí)別為安全漏洞,將導(dǎo)致大量的安全程序片段被錯(cuò)誤地檢測(cè)為含有安全漏洞,從而產(chǎn)生大量的誤報(bào)。例如,根據(jù)文獻(xiàn)5數(shù)據(jù),Johnson等人使用CQUAL系統(tǒng)對(duì)Linux內(nèi)核代碼進(jìn)行的用戶態(tài)/內(nèi)核態(tài)指針引用漏洞檢測(cè),由于缺乏對(duì)合法性檢查的有效識(shí)別,誤報(bào)率在95%以上。如此高的誤報(bào)率需要投入大量的資源進(jìn)行后期人工分析,大大增加了漏洞靜態(tài)檢測(cè)技術(shù)推廣應(yīng)用的難度。其次,雖然個(gè)別的漏洞靜態(tài)檢測(cè)方法實(shí)現(xiàn)了部分的合法性檢查識(shí)別,但對(duì)合法性檢查是否有效缺乏必要的深入分析,未能區(qū)分出實(shí)現(xiàn)上存在缺陷的無(wú)效的合法性檢查,從而產(chǎn)生漏報(bào)。以斯坦福Engler等人研發(fā)的靜態(tài)

13、漏洞檢測(cè)系統(tǒng)MC所采用的方法為例6,MC中用于檢測(cè)內(nèi)存操作長(zhǎng)度越界漏洞的Range Checker中引入了對(duì)非可信數(shù)據(jù)的上/下界檢查的識(shí)別,由于模型表示空間的限制,其僅僅檢測(cè)長(zhǎng)度參數(shù)是否經(jīng)過(guò)了相應(yīng)的算術(shù)比較,而并不關(guān)心參與比較的上/下界值的類型。而入侵者能利用一個(gè)負(fù)值的整數(shù)繞開與常量或有符號(hào)上界值進(jìn)行的上界比較,觸發(fā)安全漏洞。在現(xiàn)實(shí)世界中,最近幾年此類安全漏洞已經(jīng)大量出現(xiàn)在各種平臺(tái)系統(tǒng)中,例如Linux內(nèi)核中的藍(lán)牙設(shè)備驅(qū)動(dòng)有符號(hào)緩沖區(qū)索引安全漏洞 Linux Kernel Bluetooth Signed Buffer Index Vulnerability. http:/cve.mitre.

14、org/cgi-bin/cvename.cgi?name=CVE-2005-0750。由于缺乏必要的檢查有效性識(shí)別,MC未能檢測(cè)出此漏洞。此外,現(xiàn)有靜態(tài)檢測(cè)方法對(duì)于數(shù)據(jù)可信性的鑒別也缺乏清晰的概念模型,在實(shí)際應(yīng)用中容易遺漏一些較隱蔽的非可信數(shù)據(jù)源,導(dǎo)致對(duì)部分非可信數(shù)據(jù)跟蹤分析的缺失而產(chǎn)生漏報(bào)。以MC所采用的方法為例,在其對(duì)Linux內(nèi)核的漏洞檢測(cè)中,遺漏了內(nèi)核對(duì)用戶文件的裝載解析這一非可信數(shù)據(jù)源,導(dǎo)致了對(duì)可執(zhí)行文件解析所引發(fā)的安全漏洞的誤報(bào)。針對(duì)以上問(wèn)題,本文提出了一種對(duì)程序數(shù)據(jù)安全狀態(tài)進(jìn)行跟蹤檢查的漏洞靜態(tài)檢測(cè)方法。在此方法中,使用有限狀態(tài)機(jī)模型描述程序數(shù)據(jù)安全性質(zhì)的變化,對(duì)描述數(shù)據(jù)安全狀態(tài)

15、的狀態(tài)空間進(jìn)行了擴(kuò)展,采用了多元的狀態(tài)描述機(jī)制,使用一個(gè)對(duì)應(yīng)多個(gè)安全相關(guān)屬性的布爾向量標(biāo)識(shí)變量安全狀態(tài),更為清晰地反映了變量安全性質(zhì)的變化,細(xì)化了狀態(tài)轉(zhuǎn)換的粒度以提供更為精確的程序特征識(shí)別。在此基礎(chǔ)上,利用多元的安全狀態(tài)設(shè)置在跟蹤分析數(shù)據(jù)可信性的同時(shí)引入了對(duì)合法性檢查及其有效性的識(shí)別,有效降低了由此引起的誤報(bào)和漏報(bào)的發(fā)生。此外,在本文方法中還引入了可信邊界與可信邊界入口的概念,以可信邊界的界定為線索建立了系統(tǒng)化的非可信數(shù)據(jù)鑒別方法,防止了由于遺漏非可信數(shù)據(jù)源而產(chǎn)生的漏報(bào)。為驗(yàn)證方法的有效性,作者基于編譯技術(shù)實(shí)現(xiàn)了一個(gè)可實(shí)際運(yùn)行的原型檢測(cè)系統(tǒng)DELTA(DEtect vuLnerability

16、with sTatic Analysis)。使用DELTA對(duì)Linux內(nèi)核代碼的漏洞檢測(cè)實(shí)驗(yàn)表明,本文方法能夠有效檢測(cè)出系統(tǒng)中存在的安全漏洞,并能避免其他主流靜態(tài)檢測(cè)工具中存在的漏報(bào)和誤報(bào),為提高軟件質(zhì)量及安全性提供了有效可行的方法及工具。本文第2節(jié)給出了一種基于程序安全狀態(tài)的安全漏洞檢測(cè)方法;第3節(jié)描述了DELTA的設(shè)計(jì)及實(shí)現(xiàn);第4節(jié)描述了對(duì)Linux操作系統(tǒng)內(nèi)核源代碼的靜態(tài)檢測(cè)實(shí)驗(yàn),展示了方法的應(yīng)用效果;第5節(jié)介紹相關(guān)工作并進(jìn)行了分析比較;最后是全文的總結(jié)。2 檢測(cè)方法2.1 概述本文檢測(cè)方法的基本思想是對(duì)程序狀態(tài)的跟蹤和檢查。如圖1所示,在本文中將使用基于有限狀態(tài)機(jī)模型的漏洞狀態(tài)機(jī)描述程

17、序變量安全狀態(tài)的轉(zhuǎn)換規(guī)則,針對(duì)待檢測(cè)漏洞設(shè)置相應(yīng)的漏洞狀態(tài)機(jī)規(guī)定相關(guān)數(shù)據(jù)的狀態(tài)轉(zhuǎn)換;并對(duì)程序各可能執(zhí)行路徑進(jìn)行靜態(tài)遍歷并識(shí)別當(dāng)前操作,對(duì)當(dāng)前操作所涉及的程序變量根據(jù)狀態(tài)機(jī)賦予其對(duì)應(yīng)的安全狀態(tài);在安全相關(guān)操作處設(shè)置檢查點(diǎn)(Checkpoint),以檢測(cè)操作數(shù)據(jù)是否具有期望的安全狀態(tài),若出現(xiàn)與期望安全狀態(tài)不符的情況,則表示發(fā)現(xiàn)了一個(gè)可能的安全漏洞。安全檢查點(diǎn)安全狀態(tài)檢查安全狀態(tài)轉(zhuǎn)換漏洞狀態(tài)機(jī)變量安全狀態(tài)程序執(zhí)行路徑安全漏洞信息圖1 檢測(cè)方法示意圖以拷貝超長(zhǎng)數(shù)據(jù)所導(dǎo)致的緩沖區(qū)溢出漏洞為例,當(dāng)使用內(nèi)存拷貝函數(shù)memcpy根據(jù)一個(gè)未經(jīng)上界檢查的用戶輸入的操作長(zhǎng)度參數(shù)復(fù)制超長(zhǎng)的數(shù)據(jù)至目標(biāo)緩沖區(qū)時(shí),將發(fā)生緩

18、沖區(qū)溢出。此時(shí),安全漏洞的相關(guān)要素為:安全相關(guān)操作內(nèi)存拷貝函數(shù);操作數(shù)據(jù)狀態(tài)用戶輸入的(非可信的)、未經(jīng)上界檢查的操作長(zhǎng)度參數(shù)。內(nèi)存拷貝操作將為一個(gè)安全檢查點(diǎn),檢測(cè)系統(tǒng)所期望的操作長(zhǎng)度參數(shù)為一個(gè)可信數(shù)據(jù)或經(jīng)過(guò)上界檢查的非可信數(shù)據(jù)。當(dāng)一個(gè)用戶輸入的數(shù)據(jù)進(jìn)入系統(tǒng)處理流程時(shí),將被標(biāo)識(shí)為非可信數(shù)據(jù)。若經(jīng)過(guò)了有效的上界檢查,其狀態(tài)中將加入通過(guò)上界檢查的標(biāo)識(shí);否則,在作為內(nèi)存拷貝操作長(zhǎng)度參數(shù)時(shí),檢測(cè)系統(tǒng)將認(rèn)為其不具有期望的安全狀態(tài),會(huì)引發(fā)一個(gè)緩沖區(qū)溢出漏洞。2.2 漏洞狀態(tài)機(jī)模型在傳統(tǒng)漏洞靜態(tài)檢查中所采用的狀態(tài)機(jī)模型中,數(shù)據(jù)的安全狀態(tài)使用單個(gè)屬性值標(biāo)識(shí),如MC6和XGCC7等。在本文中,為精確跟蹤多種平行

19、發(fā)展的數(shù)據(jù)安全性質(zhì)(主要為數(shù)據(jù)的可信性和合法性檢查狀態(tài)),對(duì)漏洞狀態(tài)機(jī)的狀態(tài)空間進(jìn)行了擴(kuò)展。首先給出以下模型元素: SRP:變量安全相關(guān)屬性集,SRP包含各種細(xì)化后的安全漏洞相關(guān)變量特征,例如數(shù)據(jù)來(lái)源、已經(jīng)經(jīng)過(guò)的合法性檢查(可能為多個(gè))、指針釋放與否等。不失一般性,設(shè)SRP集合元素個(gè)數(shù)為n,屬性被賦予1至n的編號(hào); STO:安全狀態(tài)轉(zhuǎn)換操作集STO,STO包含各種導(dǎo)致變量安全相關(guān)屬性發(fā)生變化的操作,例如賦值、拷貝、數(shù)據(jù)比較檢查等; opp: STO P (1, 2 , n),安全狀態(tài)轉(zhuǎn)換操作到SRP編號(hào)集的冪集上的一個(gè)映射,標(biāo)識(shí)STO中的元素所對(duì)應(yīng)的相關(guān)SRP屬性編號(hào)集; opv: STO &

20、#215; 1, 2 , n true, false, 標(biāo)識(shí)一個(gè)STO操作對(duì)相關(guān)的某個(gè)SRP屬性的狀態(tài)設(shè)置,為true表明此STO操作導(dǎo)致變量具備了相關(guān)的屬性或被執(zhí)行了相關(guān)操作。在漏洞狀態(tài)機(jī)中,將使用一個(gè)對(duì)應(yīng)SRP集元素的布爾向量描述變量安全狀態(tài)。基于有限狀態(tài)機(jī)模型,一個(gè)漏洞狀態(tài)機(jī)為以下一個(gè)五元組:VM = <S, , f, s0, Z>漏洞狀態(tài)機(jī)各元素的定義如下: S:安全狀態(tài)集,為對(duì)應(yīng)SRP集的n維布爾向量集,即:S = true, falsen = (s1, s2, , sn)÷ si = true 或 false其中,分量si對(duì)應(yīng)編號(hào)為i的SRP屬性; :狀態(tài)機(jī)控

21、制字符集,為狀態(tài)機(jī)對(duì)應(yīng)安全漏洞的安全相關(guān)操作,即 = STO; f : S × S,狀態(tài)轉(zhuǎn)換函數(shù),表示在當(dāng)前狀態(tài)下實(shí)施一個(gè)安全相關(guān)操作后的后續(xù)安全狀態(tài)。對(duì)于一個(gè)安全狀態(tài)s = (s1, s2, , sn)及一個(gè)STO操作op,設(shè)f (s, op) = s = (s1, s2, , sn),其中:si = si, 當(dāng) i Ï opp (op);si = opv (op, i), 當(dāng) i Î opp (op) s0 (false, false, , false),初始狀態(tài),其所有元素為false,表示變量未具備任何安全相關(guān)特性或被執(zhí)行了相關(guān)操作; Z:終止?fàn)顟B(tài)集,在漏

22、洞狀態(tài)機(jī)中此集為空,即 Z Ø。在漏洞狀態(tài)機(jī)中,安全狀態(tài)由對(duì)應(yīng)SRP集元素的布爾向量表示,標(biāo)識(shí)程序變量是否具備相關(guān)安全屬性或被執(zhí)行了什么操作。SRP集的設(shè)置由具體的目標(biāo)系統(tǒng)與待檢測(cè)的漏洞類型決定,主要由3部分構(gòu)成:(1)變量值是否為一非可信的數(shù)據(jù),即此數(shù)據(jù)是否有可能被惡意用戶所控制對(duì)于軟件系統(tǒng)而言,其存在的每一個(gè)安全相關(guān)編程錯(cuò)誤不一定能最終導(dǎo)致對(duì)系統(tǒng)安全的危害,只有當(dāng)攻擊者構(gòu)造的惡意數(shù)據(jù)能夠觸及到有缺陷的代碼時(shí),方可能導(dǎo)致實(shí)際的安全威脅。否則,其僅僅是一個(gè)難以被觸發(fā)的編程錯(cuò)誤而非一個(gè)安全漏洞。因此,對(duì)變量可信性的標(biāo)識(shí)是通過(guò)變量狀態(tài)跟蹤以檢測(cè)安全漏洞的重要基礎(chǔ)。在實(shí)際檢測(cè)中,主要將對(duì)非

23、可信數(shù)據(jù)進(jìn)行跟蹤,安全狀態(tài)布爾向量中將設(shè)置一個(gè)分量標(biāo)識(shí)變量是否源自一個(gè)非可信數(shù)據(jù)。(2)變量通過(guò)了的合法性檢查實(shí)際系統(tǒng)中,在引用外部非可信數(shù)據(jù)前,往往需要進(jìn)行合法性檢查,例如對(duì)外部指定的內(nèi)存操作長(zhǎng)度進(jìn)行上界檢查。在靜態(tài)檢測(cè)中對(duì)合法性檢查的識(shí)別較為復(fù)雜,對(duì)于不同的待檢測(cè)漏洞,所涉及的合法性檢測(cè)不同。即使是同一漏洞類型,各系統(tǒng)中實(shí)現(xiàn)的合法性檢測(cè)的靜態(tài)表現(xiàn)形式也存在差異。此外,合法性檢查還可由多個(gè)步驟組成,如首先檢查操作長(zhǎng)度變量的符號(hào),再檢查其上界。如圖2所示,為了能較準(zhǔn)確地識(shí)別合法性檢查,擬細(xì)化合法性檢查的識(shí)別粒度,將合法性檢查分解成一序列相關(guān)的子步驟進(jìn)行識(shí)別。在SRP中,將針對(duì)具體的漏洞相關(guān)的合

24、法性檢查構(gòu)成,設(shè)置與之對(duì)應(yīng)的多個(gè)變量安全相關(guān)屬性,用于標(biāo)識(shí)目標(biāo)變量所經(jīng)過(guò)的合法性檢查步驟。而且,每個(gè)步驟可細(xì)化為對(duì)應(yīng)著一個(gè)檢測(cè)引擎可單步識(shí)別的基本語(yǔ)法單位,從而保證了精確識(shí)別。安全狀態(tài)布爾向量中的相應(yīng)分量用于標(biāo)識(shí)此變量是否通過(guò)了相應(yīng)的合法性檢測(cè)步驟。此外,合法性檢查各階段的檢查結(jié)果被單獨(dú)記錄在變量的安全狀態(tài)中,各階段的檢查結(jié)果互不覆蓋,在檢查點(diǎn)上再對(duì)變量是否具有期望的安全狀態(tài)進(jìn)行檢查。從而不必前攝性地規(guī)定合法性檢查各步驟的排列次序,符合實(shí)際系統(tǒng)程序設(shè)計(jì)的規(guī)律。如此,可將合法性檢查的識(shí)別與變量狀態(tài)的跟蹤統(tǒng)一到漏洞狀態(tài)機(jī)中,既提高了合法性檢查的識(shí)別準(zhǔn)確性,又保證了漏洞檢測(cè)機(jī)制的簡(jiǎn)潔高效。true/

25、false安全狀態(tài)合法性檢查步驟合法性檢查true/falsetrue/false圖2 合法性檢查細(xì)化識(shí)別如若使用一元的安全狀態(tài)描述機(jī)制,必將需要在較大的粒度上對(duì)合法性檢查進(jìn)行分析判斷,這需要相應(yīng)的程序模式歸納。而涉及合法性檢查的各種可能的構(gòu)成形式及排列次序很難歸納為相對(duì)固定的表示序列,這必將導(dǎo)致對(duì)合法性檢查程序模式的部分缺失。例如,有符號(hào)整數(shù)的有效上界檢查就可能包含多種構(gòu)成形式。每種形式都可能包含多個(gè)次序可以任意變換的步驟,如通過(guò)判斷整數(shù)是否非負(fù)和是否小于一個(gè)常量上界來(lái)進(jìn)行檢查。多元的安全狀態(tài)描述機(jī)制能夠較自然地容納對(duì)這種不定次序的多步驟檢查的識(shí)別。而在采用一元安全狀態(tài)描述機(jī)制的MC中6,整

26、數(shù)上界檢查被作為一個(gè)整體進(jìn)行識(shí)別判斷,此判斷只能在一個(gè)不全面的上界檢查特征歸納基礎(chǔ)上進(jìn)行,不可避免地會(huì)降低識(shí)別分析的精度。對(duì)Linux內(nèi)核藍(lán)牙設(shè)備驅(qū)動(dòng)安全漏洞的漏報(bào)就是一個(gè)直接的后果。(3)變量的操作實(shí)施狀態(tài)釋放后指針引用、多次釋放等漏洞類型還涉及到對(duì)目標(biāo)變量操作實(shí)施的流程,特別是對(duì)指針型變量的操作流程。為此,在SRP中還設(shè)置了相應(yīng)的元素標(biāo)識(shí)對(duì)目標(biāo)變量已實(shí)施的操作,例如針對(duì)釋放后指針引用類型漏洞,設(shè)置了標(biāo)識(shí)指針已被釋放的狀態(tài)元素。從以上分析描述可見,對(duì)安全狀態(tài)空間進(jìn)行的多元化擴(kuò)展并不是數(shù)量上簡(jiǎn)單的增加,而是為了更好地符合程序設(shè)計(jì)自然規(guī)律、提高檢測(cè)精確度所進(jìn)行的必然選擇。2.3 非可信數(shù)據(jù)鑒別漏

27、洞狀態(tài)機(jī)的核心是狀態(tài)轉(zhuǎn)換的處理,即狀態(tài)轉(zhuǎn)換函數(shù)f的確定。變量在聲明后,其初始安全狀態(tài)為s0,其后續(xù)狀態(tài)根據(jù)其上所實(shí)施的相關(guān)操作(中元素)確定。當(dāng)變量被直接或間接賦予一個(gè)可能被惡意用戶所控制的數(shù)值時(shí),將設(shè)置其安全狀態(tài)中的相關(guān)分量,標(biāo)識(shí)其為一非可信的數(shù)據(jù)。數(shù)據(jù)可信性的確定與具體目標(biāo)系統(tǒng)的結(jié)構(gòu)和數(shù)據(jù)處理機(jī)制密切相關(guān),基于軟件系統(tǒng)的一般結(jié)構(gòu)特征,引入以下概念支持非可信數(shù)據(jù)的鑒別:定義一:可信邊界(Trusted Boundary)是目標(biāo)系統(tǒng)不受外界影響的數(shù)據(jù)生成處理邊界,在可信邊界內(nèi)生成的數(shù)據(jù)不受外部操作的影響。定義二:可信邊界入口(Entry Point)是外部數(shù)據(jù)進(jìn)入可信邊界的通道。界定可信邊界最

28、重要的目的在于鑒別非可信數(shù)據(jù),即通過(guò)明確外部數(shù)據(jù)輸入途徑來(lái)確定哪些數(shù)據(jù)源自非可信的外部世界。可信邊界上的所有內(nèi)外數(shù)據(jù)通道構(gòu)成了可信邊界入口。在界定了可信邊界后,以其為線索可確定可信邊界入口?,F(xiàn)代軟件系統(tǒng),特別是系統(tǒng)軟件,一般將其所提供的底層服務(wù)集成在一個(gè)相對(duì)獨(dú)立的核心組件中,通過(guò)接口對(duì)外提供服務(wù)。以操作系統(tǒng)為例,其內(nèi)核通過(guò)系統(tǒng)調(diào)用接口為應(yīng)用程序提供了底層的計(jì)算服務(wù),內(nèi)核中的數(shù)據(jù)生成與操作不受用戶態(tài)應(yīng)用程序控制。這種共性的體系結(jié)構(gòu)為可信邊界的界定提供了良好的基礎(chǔ),可結(jié)合待檢測(cè)漏洞的特性對(duì)目標(biāo)系統(tǒng)體系結(jié)構(gòu)進(jìn)行安全性分析,界定具體的可信邊界。可信邊界入口不僅僅是系統(tǒng)服務(wù)的調(diào)用接口,還包括所有可能的外

29、部數(shù)據(jù)輸入機(jī)制,例如操作系統(tǒng)內(nèi)核協(xié)議棧中對(duì)遠(yuǎn)程網(wǎng)絡(luò)數(shù)據(jù)包的接收等??尚胚吔缛肟趯⒈蛔鳛榉强尚艛?shù)據(jù)源。若目標(biāo)系統(tǒng)中的可信邊界入口集為EP,其應(yīng)屬于安全狀態(tài)轉(zhuǎn)換操作集STO,即EP Í STO。不失一般性,假設(shè)標(biāo)識(shí)非可信數(shù)據(jù)的SRP屬性編號(hào)為1,即安全狀態(tài)向量中的第1個(gè)分量用于標(biāo)識(shí)數(shù)據(jù)是否可信。對(duì)于變量v,對(duì)應(yīng)的漏洞狀態(tài)機(jī)狀態(tài)轉(zhuǎn)換函數(shù)fv為:"ep EP,fv (s, ep) = (true, false, . , false)其中s為v的當(dāng)前安全狀態(tài),s S。需要注意的是,當(dāng)變量v通過(guò)可信邊界入口接收了外部數(shù)據(jù)后,其狀態(tài)向量中的除第1個(gè)分量外的其它分量都被初始化為false。

30、這是因?yàn)楫?dāng)變量被非可信數(shù)據(jù)感染后,其以前所通過(guò)的合法性檢查等安全狀態(tài)設(shè)置需要重新計(jì)算。除了在可信邊界入口處標(biāo)識(shí)非可信數(shù)據(jù)外,還需要考慮變量間的安全狀態(tài)傳播,其核心是非可信數(shù)據(jù)的轉(zhuǎn)播。變量間的狀態(tài)轉(zhuǎn)播主要包含以下2種情況:(1)賦值傳播當(dāng)一變量作為一賦值表達(dá)式的左值(LValue)時(shí),其安全狀態(tài)將由表達(dá)式右值(RValue)表達(dá)式安全狀態(tài)決定。對(duì)于各種形式的右值表達(dá)式S,其安全狀態(tài)sstate (S)按以下情形計(jì)算: 當(dāng)S為單個(gè)變量x時(shí),sstate (S) = state(x), 其中state (x)為變量x的安全狀態(tài); 當(dāng)S為單個(gè)常量時(shí),sstate (S) = s0; 當(dāng)S為對(duì)函數(shù)fun

31、的調(diào)用時(shí),sstate (S) = state(return (fun),其中return (fun)為函數(shù)fun當(dāng)前調(diào)用實(shí)例的返回值; 當(dāng)S由多個(gè)子表達(dá)式組成,如S1和S2,當(dāng)first_component(sstate(S1) = true 或first_component(sstate(S2) = true時(shí),sstate (S) = (true, false, . , false),否則 sstate (S) = s0,其中first_component (S)為狀態(tài)向量S的第1個(gè)分量。在賦值傳遞中,考慮到安全漏洞檢測(cè)的特殊性,對(duì)于由多個(gè)子表達(dá)式組成的右值表達(dá)式,本方法采取一種較為激進(jìn)

32、的方法,表達(dá)式安全狀態(tài)將只考慮各子表達(dá)式是否會(huì)引入非可信的數(shù)據(jù),而忽略其它SRP屬性的傳播。(2)內(nèi)存拷貝傳播除了直接賦值以外,內(nèi)存的拷貝操作也會(huì)引起安全狀態(tài)的傳播,源內(nèi)存區(qū)域數(shù)據(jù)的安全狀態(tài)將目的內(nèi)存區(qū)域數(shù)據(jù)的安全狀態(tài)。以內(nèi)存拷貝函數(shù)memcpy為例,進(jìn)行memcpy (d, s, len)調(diào)用后,指針d指向的數(shù)據(jù)的安全狀態(tài)將等于指針s指向的數(shù)據(jù)的安全狀態(tài)。2.4 數(shù)據(jù)合法性檢查為提高識(shí)別的準(zhǔn)確性,合法性檢查被分解成一序列相關(guān)的子步驟進(jìn)行識(shí)別,當(dāng)非可信變量通過(guò)了子步驟相應(yīng)的判斷后,變量安全狀態(tài)向量中將相應(yīng)的分量設(shè)置為true,標(biāo)識(shí)其通過(guò)了對(duì)應(yīng)的合法性檢查步驟。對(duì)非可信數(shù)據(jù)的合法性檢查主要有兩種

33、方式:邏輯運(yùn)算判斷,例如檢查是否大于、小于、等于或不等于某個(gè)值;合法性檢查例程,通過(guò)調(diào)用系統(tǒng)中內(nèi)建的合法性檢測(cè)例程進(jìn)行判斷。在實(shí)際實(shí)施中,將針對(duì)具體的目標(biāo)系統(tǒng),總結(jié)各種漏洞類型相關(guān)的合法性檢查模式,細(xì)化為一系列對(duì)非可信數(shù)據(jù)的檢查步驟,對(duì)應(yīng)著相應(yīng)的狀態(tài)設(shè)置,最終基于狀態(tài)機(jī)模型實(shí)現(xiàn)合法性檢查的識(shí)別與變量的狀態(tài)轉(zhuǎn)換。下面以操作長(zhǎng)度越界引發(fā)的內(nèi)存非法操作漏洞為例進(jìn)行具體的解釋。相應(yīng)漏洞狀態(tài)機(jī)的SRP集設(shè)置如下:SRP = tainted, unsinged upper-bound checked, singed upper-bound checked, non-negative以上SRP集由4個(gè)元素組

34、成,分別對(duì)應(yīng)數(shù)據(jù)是否非可信、通過(guò)了無(wú)符號(hào)上界檢查、通過(guò)了有符號(hào)上界檢查、通過(guò)了非負(fù)判斷等,對(duì)應(yīng)編號(hào)為1至4。在以上SRP集下,可能的安全狀態(tài)向量共有16個(gè)(24),完全的狀態(tài)轉(zhuǎn)換圖較為復(fù)雜。為了描述方便,圖3給出了一個(gè)簡(jiǎn)化的狀態(tài)轉(zhuǎn)換示意圖。一個(gè)整型變量的初始狀態(tài)為s0, 表示其未被非可信數(shù)據(jù)污染并且未經(jīng)過(guò)任何安全檢查;當(dāng)此變量被賦予了一個(gè)非可信值后狀態(tài)轉(zhuǎn)換到 (true, false, false, false),表示其受到非可信數(shù)據(jù)污染;在處于非可信狀態(tài)的變量經(jīng)過(guò)了上界檢查后,其狀態(tài)轉(zhuǎn)換到 (true, true, false, false) 或 (true, false, true, fa

35、lse),表示一個(gè)非可信整數(shù)通過(guò)了相應(yīng)的無(wú)符號(hào)或帶符號(hào)上界檢查;若此變量為一有符號(hào)整型,還可能對(duì)其進(jìn)行非負(fù)判斷,狀態(tài)將轉(zhuǎn)換至 (true, false, true, true);在任何狀態(tài)下,若變量受到非可信數(shù)據(jù)污染,其狀態(tài)都將轉(zhuǎn)換到 (true, false, false, false),類似的,若變量被賦予了一個(gè)可信值,其狀態(tài)變?yōu)閟0。上界檢查與整型變量的符號(hào)類型和密切相關(guān)。對(duì)于一個(gè)非可信的無(wú)符號(hào)整型變量,如果通過(guò)了一個(gè)與其它數(shù)據(jù)進(jìn)行的上界比較判斷,則其狀態(tài)轉(zhuǎn)換為(true, true, true/false, true/false);對(duì)于非可信的有符號(hào)的整型變量,需根據(jù)與之進(jìn)行比較的數(shù)據(jù)

36、類型決定其狀態(tài)轉(zhuǎn)換: 通過(guò)了與常量進(jìn)行的上界比較判斷,則狀態(tài)轉(zhuǎn)換為(true, true/false, true, true/false); 通過(guò)了與有符號(hào)變量進(jìn)行的上界比較判斷,則狀態(tài)轉(zhuǎn)換為(true, true/false, true, true/false); 通過(guò)了與無(wú)符號(hào)變量進(jìn)行的上界比較判斷,則狀態(tài)轉(zhuǎn)換為(true, true, true/false, true/false);此外,如果有符號(hào)整型變量為非負(fù)整數(shù)(通過(guò)了一個(gè)非負(fù)判斷,例如判斷是否不小于0),可以將其作為一個(gè)無(wú)符號(hào)整型變量對(duì)待。因此,需要在安全狀態(tài)向量中加以標(biāo)識(shí),通過(guò)非負(fù)判斷的非可信變量狀態(tài)將轉(zhuǎn)換為(true, tru

37、e/false, true/false, true)。S0(true, false, false, false)(true, true, false, false)(true, false, true, true)(true, false, true, false)圖3漏洞狀態(tài)機(jī)狀態(tài)轉(zhuǎn)換圖在合法性檢查的識(shí)別中進(jìn)行這樣的區(qū)分有著非常重要的現(xiàn)實(shí)意義。這是因?yàn)樵谶M(jìn)行帶符號(hào)的比較判斷時(shí),一個(gè)負(fù)值一定小于正值。而在C/C+語(yǔ)言中,內(nèi)存操作函數(shù)的長(zhǎng)度參數(shù)和數(shù)組索引將被作為無(wú)符號(hào)整型處理。一個(gè)被賦予負(fù)值的有符號(hào)整型變量能通過(guò)使用帶符號(hào)比較判斷的上界合法性檢查,但當(dāng)其被作為內(nèi)存操作函數(shù)的長(zhǎng)度實(shí)參或數(shù)組索引時(shí),

38、將被解釋為一個(gè)非常大的無(wú)符號(hào)正值從而導(dǎo)致一個(gè)緩沖區(qū)溢出或非法地址訪問(wèn)漏洞。由于歷史原因,程序員往往忽視了這種有符號(hào)變量和無(wú)符號(hào)變量混用的危險(xiǎn),導(dǎo)致此類安全漏洞層出不窮。由此,在內(nèi)存操作(例如memcpy)和數(shù)組下標(biāo)等檢查點(diǎn)上,相關(guān)變量的合法安全狀態(tài)應(yīng)為以下之一: s0; (true, true, true/false, true/false),標(biāo)識(shí)其通過(guò)了一個(gè)無(wú)符號(hào)上界檢查; (true, false, true, true),當(dāng)變量?jī)H僅通過(guò)了一個(gè)帶符號(hào)上界檢查時(shí),期望其為一非負(fù)值。否則將表明發(fā)現(xiàn)了一個(gè)可能的安全漏洞,例如將狀態(tài)為(true, false, true, false)的變量作為m

39、emcpy函數(shù)的長(zhǎng)度實(shí)參。圖3中僅僅給出了一部分可能的安全狀態(tài)間的一個(gè)不完全的狀態(tài)轉(zhuǎn)換圖,所有16個(gè)可能狀態(tài)間的轉(zhuǎn)換遠(yuǎn)比圖3中所示的情況復(fù)雜。特別是SRP集還可能引入新的元素以識(shí)別更多的合法性檢查,例如下界檢查。這將導(dǎo)致更為復(fù)雜的狀態(tài)轉(zhuǎn)換。若在檢查系統(tǒng)中直接記錄并實(shí)現(xiàn)所有的狀態(tài)轉(zhuǎn)換規(guī)則,必定會(huì)導(dǎo)致實(shí)現(xiàn)及效率上問(wèn)題,并會(huì)大大影響系統(tǒng)的可擴(kuò)展性。但由于大部分狀態(tài)轉(zhuǎn)換僅僅改變安全狀態(tài)向量中的一個(gè)分量,狀態(tài)轉(zhuǎn)換規(guī)則可被大大簡(jiǎn)化。如表1所示,對(duì)于以上狀態(tài)機(jī),其所有合法性檢查相關(guān)的狀態(tài)轉(zhuǎn)換規(guī)則可被簡(jiǎn)化為4條。2.3節(jié)中涉及到的其余狀態(tài)轉(zhuǎn)換規(guī)則也可同理簡(jiǎn)化。表1合法性檢查相關(guān)狀態(tài)轉(zhuǎn)換規(guī)則前狀態(tài)STO后狀態(tài)(

40、s1, s2, s3, s4)變量為無(wú)符號(hào)數(shù)時(shí):任意上界比較(s1, true, s3, s4)變量為有符號(hào)數(shù)時(shí):常量上界比較、有符號(hào)上界比較(s1, s2, true, s4)變量為有符號(hào)數(shù)時(shí):無(wú)符號(hào)上界比較(s1, true, s3, s4)非負(fù)判斷(s1, s2, s3, true)2.5 檢查點(diǎn)在使用漏洞狀態(tài)機(jī)對(duì)程序數(shù)據(jù)安全狀態(tài)進(jìn)行跟蹤的基礎(chǔ)上,對(duì)安全漏洞檢測(cè)的實(shí)施將通過(guò)在一些安全攸關(guān)的操作點(diǎn)上對(duì)當(dāng)前操作所涉及的數(shù)據(jù)變量的安全狀態(tài)進(jìn)行檢查來(lái)進(jìn)行。一些在本文實(shí)驗(yàn)中所采用的檢查點(diǎn)及在Linux系統(tǒng)中的部分實(shí)例如表2所示。表2 檢查點(diǎn)檢查點(diǎn)相關(guān)參數(shù)狀態(tài)檢查相關(guān)安全漏洞實(shí)例(Linux內(nèi)核)內(nèi)

41、存分配、拷貝,設(shè)置等操作操作長(zhǎng)度、操作地址操作長(zhǎng)度和操作地址若為非可信數(shù)據(jù),必須經(jīng)過(guò)上界檢查或訪問(wèn)合法性檢查;緩沖區(qū)溢出、信息泄漏、非法內(nèi)存訪問(wèn)等kmalloc、kmem_cache_alloc、memcpy、copy_from_user、copy_to_user、 memset、.數(shù)組索引索引非可信的索引數(shù)值應(yīng)經(jīng)過(guò)上界檢查非法內(nèi)存訪問(wèn)、非法函數(shù)調(diào)用等數(shù)組元素引用,如arrayx指針引用操作指針指針未被釋放過(guò)釋放后指針引用指針引用,如*p 、p->q 、循環(huán)循環(huán)次數(shù)非可信的索引數(shù)值應(yīng)經(jīng)過(guò)上界檢查死循環(huán)導(dǎo)致的拒絕服務(wù)需要特別指出的是,在Linux內(nèi)核中,copy_from_user等函數(shù)既

42、是可信邊界的入口,又是安全漏洞檢測(cè)的檢查點(diǎn)。3 原型系統(tǒng)為檢驗(yàn)以上檢測(cè)方法的效能,作者實(shí)現(xiàn)了一個(gè)針對(duì)系統(tǒng)軟件的靜態(tài)檢測(cè)系統(tǒng)原型DELTA,能支持對(duì)C/C+語(yǔ)言開發(fā)實(shí)際的目標(biāo)系統(tǒng)的漏洞檢測(cè)實(shí)驗(yàn)。3.1 系統(tǒng)結(jié)構(gòu)源碼代碼解析靜態(tài)分析引擎漏洞模式漏洞上下文信息預(yù)處理圖4 DELTA系統(tǒng)結(jié)構(gòu)如圖4所示,DELTA系統(tǒng)首先對(duì)待檢測(cè)的系統(tǒng)源代碼進(jìn)行預(yù)處理和代碼解析,并形成中間代碼形式輸出至一個(gè)靜態(tài)分析引擎。引擎將在漏洞模式(狀態(tài)機(jī))支持下進(jìn)行安全漏洞檢測(cè),主要機(jī)制為通過(guò)遍歷代碼中的執(zhí)行路徑驅(qū)動(dòng)漏洞狀態(tài)機(jī)運(yùn)行來(lái)跟蹤變量的安全狀態(tài),并在檢查點(diǎn)上將相關(guān)變量的安全狀態(tài)與期望安全狀態(tài)進(jìn)行比對(duì)。若發(fā)現(xiàn)可能的安全漏洞將

43、輸出相應(yīng)的漏洞上下文信息。DELTA系統(tǒng)基于編譯技術(shù)實(shí)現(xiàn): 預(yù)處理器與解析器預(yù)處理器與解析器相當(dāng)于編譯器的前端(Front-end),負(fù)責(zé)將原始源代碼文件轉(zhuǎn)換成檢測(cè)引擎能夠識(shí)別處理的形式。原始的程序源代碼文件往往引用了其他一些說(shuō)明性的文件,如C/C+語(yǔ)言中的頭文件。這些文件通過(guò)語(yǔ)言的包含機(jī)制相互連接起來(lái)。預(yù)處理工具將模擬真實(shí)編譯器編譯鏈接過(guò)程,識(shí)別根文件,以根文件為基礎(chǔ)將相關(guān)的源文件整合在一起,形成完整的分析單位。解析器將對(duì)預(yù)處理過(guò)的文件進(jìn)行詞法分析與語(yǔ)法分析,并生成面向靜態(tài)分析的中間代碼。DELTA中的預(yù)處理器與解析器基于GCC 編譯器的前端實(shí)現(xiàn),利用了GCC中的C/C+語(yǔ)言標(biāo)準(zhǔn)的lex、y

44、acc描述腳本為基礎(chǔ)生成相應(yīng)的詞法與語(yǔ)法分析器。在語(yǔ)法分析結(jié)束后,將根據(jù)所獲得的語(yǔ)法元素生成靜態(tài)單賦值(Static Single Assignment,SSA)形式的中間代碼8,中間代碼將以基本塊(Basic Block)的形式組織在一起。 靜態(tài)檢測(cè)引擎靜態(tài)檢測(cè)引擎將首先根據(jù)源代碼函數(shù)間的調(diào)用圖(Call Graph,CG)確定根函數(shù)(Root Function),并構(gòu)建控制流圖(Control Flow Graph,CFG)。以根函數(shù)為起始點(diǎn),用CFG驅(qū)動(dòng)漏洞狀態(tài)機(jī)運(yùn)行,模擬源碼文件的實(shí)際操作,遍歷其相應(yīng)中間代碼的各個(gè)可能的邏輯執(zhí)行路徑。在狀態(tài)機(jī)運(yùn)行過(guò)程中,引擎將根據(jù)當(dāng)前操作和各個(gè)變量的安

45、全狀態(tài)決定其的后繼狀態(tài)。若當(dāng)前程序點(diǎn)為一個(gè)漏洞檢查點(diǎn)時(shí),引擎還將對(duì)相關(guān)變量的當(dāng)前安全狀態(tài)進(jìn)行檢查。若出現(xiàn)不符合當(dāng)前檢查點(diǎn)對(duì)變量的安全要求的情況,則表示發(fā)現(xiàn)了一個(gè)可能的安全漏洞,引擎將向用戶輸出相關(guān)漏洞上下文信息(主要包括漏洞位置、數(shù)據(jù)傳播路徑等)。在很多情況下,安全漏洞的產(chǎn)生跨越多個(gè)函數(shù)過(guò)程,甚至是多個(gè)源文件。為了能有效檢測(cè)出這類安全漏洞,分析引擎應(yīng)能實(shí)施過(guò)程間(Inter-procedural Analysis)和文件間分析(Inter-file Analysis)。過(guò)程間分析需要對(duì)函數(shù)調(diào)用進(jìn)行跟蹤分析。若當(dāng)前語(yǔ)句為一個(gè)函數(shù)調(diào)用時(shí),將跟蹤被調(diào)用函數(shù)(Callee)的中間代碼;在分析完畢后,返

46、回到調(diào)用點(diǎn)繼續(xù)分析調(diào)用函數(shù)(Caller)。文件間分析的基礎(chǔ)是過(guò)程間分析,即當(dāng)調(diào)用函數(shù)與被調(diào)用函數(shù)位于不同源文件時(shí),應(yīng)能跨越源文件進(jìn)行過(guò)程間分析。文件間分析需要逐個(gè)解析待分析的源文件,然后聯(lián)立多個(gè)文件的解析結(jié)果并構(gòu)建跨文件的全局CG,確定根函數(shù)后進(jìn)行過(guò)程間分析。在DELTA中,每一種漏洞類型模式對(duì)應(yīng)著一個(gè)漏洞狀態(tài)機(jī)。檢測(cè)引擎中可同時(shí)運(yùn)行多個(gè)漏洞狀態(tài)機(jī),以同時(shí)檢測(cè)多種安全漏洞。在實(shí)際應(yīng)用中,可根據(jù)資源情況選擇裝載待檢測(cè)的漏洞狀態(tài)機(jī)。DELTA系統(tǒng)中的漏洞狀態(tài)機(jī)以檢查器(Checker)鏈接庫(kù)形式實(shí)現(xiàn)。在靜態(tài)檢測(cè)引擎中設(shè)置了鉤子(Hook)函數(shù),涵蓋狀態(tài)轉(zhuǎn)換、狀態(tài)傳播和檢查點(diǎn)等程序節(jié)點(diǎn),檢測(cè)引擎將

47、在這些點(diǎn)上調(diào)用已裝載的檢查器中的實(shí)施函數(shù)。3.2 系統(tǒng)配置為驗(yàn)證上述方法及原型的有效性,作者選擇了Linux內(nèi)核作為實(shí)驗(yàn)對(duì)象,使用DELTA對(duì)其進(jìn)行了漏洞檢測(cè)實(shí)驗(yàn)。作為檢測(cè)的基礎(chǔ),首先需要確定Linux系統(tǒng)可信邊界和可信邊界入口。根據(jù)Linux操作系統(tǒng)內(nèi)核的結(jié)構(gòu)特點(diǎn),完全源于內(nèi)核中的數(shù)據(jù)的安全性不會(huì)被用戶態(tài)操作所影響,可信邊界可依據(jù)系統(tǒng)內(nèi)核邊界界定。但需要特別注意的是,雖然基于內(nèi)核良好的結(jié)構(gòu)化可較容易地確定可信邊界,但Linux內(nèi)核中外部數(shù)據(jù)輸入途徑并不都是直接明晰的,需要依據(jù)可信邊界深入進(jìn)行分析歸納。通過(guò)分析,Linux內(nèi)核相應(yīng)的可信邊界入口類型如表3所示:表3 Linux內(nèi)核可信邊界入口可

48、信邊界入口引入的非可信數(shù)據(jù)實(shí)例系統(tǒng)調(diào)用接口用戶態(tài)程序提供的調(diào)用參數(shù)sys_open、sys_read、sys_write、sys_mknod、sys_ioctll等內(nèi)核態(tài)/用戶態(tài)數(shù)據(jù)交換例程拷貝自用戶態(tài)內(nèi)存的數(shù)據(jù)copy_from_user、get_user等網(wǎng)絡(luò)包讀取源自網(wǎng)絡(luò)協(xié)議棧傳入的遠(yuǎn)程網(wǎng)絡(luò)包數(shù)據(jù)sk_buff->data等可執(zhí)行程序等用戶文件裝載解析載入內(nèi)核的用戶可構(gòu)造的文件數(shù)據(jù)linux_binprm->buf等在上表中所包括的可信邊界入口中,文件的裝載解析最容易被遺漏而導(dǎo)致漏報(bào)。事實(shí)上,Linux內(nèi)核在裝載可執(zhí)行程序等文件時(shí),會(huì)從這些文件中引入影響內(nèi)核操作的數(shù)據(jù)。例如,

49、裝載執(zhí)行一個(gè)惡意構(gòu)造的可執(zhí)行二進(jìn)制文件,會(huì)間接地影響內(nèi)核task_struct等關(guān)鍵數(shù)據(jù)結(jié)構(gòu)中某些域值,對(duì)這些域值的不適當(dāng)處理可能會(huì)導(dǎo)致安全漏洞。針對(duì)最為常見的漏洞類型,作者實(shí)現(xiàn)了5個(gè)基于漏洞狀態(tài)機(jī)的檢查器,分別用于檢測(cè)緩沖區(qū)溢出、非法數(shù)組下標(biāo)與非法指針引用、空指針引用、內(nèi)存泄漏等類型漏洞,相應(yīng)的漏洞檢測(cè)設(shè)置見表4。表4 漏洞檢測(cè)設(shè)置漏洞類型描述漏洞狀態(tài)機(jī)設(shè)置檢查點(diǎn)操作長(zhǎng)度引發(fā)的緩沖區(qū)溢出當(dāng)根據(jù)一個(gè)未經(jīng)上界檢驗(yàn)的非可信操作長(zhǎng)度數(shù)進(jìn)行內(nèi)存拷貝時(shí),可能會(huì)引發(fā)內(nèi)核堆/棧緩沖區(qū)溢出非可信數(shù)據(jù)源設(shè)置見表2;非可信上界檢查數(shù)據(jù)狀態(tài)轉(zhuǎn)換參見2.4節(jié)memcpy、copy_from_user、get_user

50、、_copy_from_user_ll等內(nèi)核函數(shù),期望狀態(tài)為s0、(true, true, true/false, true/false) 或 (true, false, true, true)非法內(nèi)存操作當(dāng)根據(jù)一個(gè)未經(jīng)上界檢驗(yàn)的非可信操作長(zhǎng)度數(shù)進(jìn)行內(nèi)存分配、設(shè)置等操作時(shí),可能會(huì)引發(fā)非法內(nèi)存訪問(wèn)和內(nèi)存耗盡同上kmalloc、kmem_cache_alloc、memset等內(nèi)核函數(shù),期望狀態(tài)同上信息泄露當(dāng)根據(jù)一個(gè)未經(jīng)上界檢驗(yàn)的非可信操作長(zhǎng)度數(shù)進(jìn)行內(nèi)核態(tài)至用戶態(tài)數(shù)據(jù)交換時(shí),可能會(huì)引發(fā)關(guān)鍵的內(nèi)核書記泄露同上copy_to_user、put_user、_copy_to_user_ll等內(nèi)核函數(shù),期望狀

51、態(tài)同上非法數(shù)組下標(biāo)及循環(huán)次數(shù)將一個(gè)未經(jīng)上界檢驗(yàn)的非可信數(shù)據(jù)作為數(shù)組下標(biāo)時(shí)可能會(huì)引發(fā)非法內(nèi)存訪問(wèn);當(dāng)將其作為循環(huán)次數(shù)(上界)時(shí)會(huì)引發(fā)死循環(huán)同上數(shù)組元素引用,如arrayx,期望狀態(tài)同上;循環(huán)次數(shù)判斷,當(dāng)循環(huán)變量與循環(huán)上界比較為無(wú)符號(hào)比較時(shí),期望狀態(tài)同上,否則期望狀態(tài)為s0、(true, true, true/false, true/false) 或 (true, true/false, true, true/false)引用釋放后的指針通過(guò)一個(gè)已經(jīng)釋放了的指針訪問(wèn)數(shù)據(jù),可能引發(fā)非法內(nèi)存訪問(wèn)當(dāng)一指針被釋放后,其狀態(tài)被置為(true),在重新掛指針后其狀態(tài)置為(false)指針引用,如*p 、p-&

52、gt;q 等,期望狀態(tài)為(false)4 實(shí)驗(yàn)基于以上設(shè)置,作者對(duì)Linux內(nèi)核的一些子系統(tǒng)進(jìn)行了實(shí)驗(yàn)檢測(cè)。實(shí)驗(yàn)結(jié)果表明本方法和原型系統(tǒng)能有效檢測(cè)出隱藏較深的安全漏洞,其中一些是其他靜態(tài)檢測(cè)方法未能發(fā)現(xiàn)的。此外,實(shí)驗(yàn)表明DELTA還能有效避免缺乏對(duì)有效合法性檢查的識(shí)別所帶來(lái)的誤報(bào)。以緩沖區(qū)溢出漏洞檢測(cè)為例,如下表所示,DELTA檢測(cè)出了7個(gè)真實(shí)的漏洞,準(zhǔn)確率達(dá)到了31.8%。和CQUAL與Coverity對(duì)Linux內(nèi)核檢測(cè)結(jié)果的比較如表5所示。表5 緩沖區(qū)溢出漏洞檢測(cè)結(jié)果及比較檢測(cè)系統(tǒng)報(bào)告漏洞數(shù)真實(shí)漏洞數(shù)準(zhǔn)確率DELTA22731.8%CQUAL26462.2%Coverity1241512

53、%DELTA所檢測(cè)出的所有漏洞分布情況是:操作長(zhǎng)度引發(fā)的緩沖區(qū)溢出7個(gè),非法內(nèi)存操作1個(gè),信息泄露1個(gè),非法數(shù)組下標(biāo)及循環(huán)次數(shù)2個(gè),引用釋放后的指針1個(gè)。表5中CQUAL與Coverity對(duì)Linux的檢測(cè)結(jié)果數(shù)據(jù)來(lái)自其相關(guān)文獻(xiàn)報(bào)道5 Coverity Inc. Report. Analysis of the Linux Kernel. Dec. 2004.。由上表可見,DELTA系統(tǒng)對(duì)Linux內(nèi)核的檢測(cè)準(zhǔn)確率高于CQUAL與Coverity系統(tǒng),即具有較低的誤報(bào)率。相對(duì)于Coverity而言,DELTA檢測(cè)出的安全漏洞總數(shù)較少。原因在于:Coverity實(shí)施了超過(guò)50個(gè)的檢查器,在對(duì)緩沖區(qū)

54、溢出的檢測(cè)方面,覆蓋了各種引發(fā)緩沖區(qū)溢出的因素。而DELTA的主要目標(biāo)在于檢驗(yàn)本文方法在降低漏報(bào)與誤報(bào)方面的效果,僅實(shí)現(xiàn)了對(duì)操作長(zhǎng)度引發(fā)的緩沖區(qū)溢出漏洞的檢測(cè)。雖然如此,在同樣覆蓋的漏洞類型上,DELTA仍然檢測(cè)出Coverity所未能檢測(cè)出的漏洞,避免了漏報(bào)。DELTA系統(tǒng)所檢測(cè)出的2個(gè)典型漏洞實(shí)例如下:(1) 如下列代碼所示,在2.6.9版本內(nèi)核fs/binfmt_elf.c文件中,存在一個(gè)內(nèi)核緩沖區(qū)溢出漏洞,雖然在copy_from_user函數(shù)引用有符號(hào)整型變量len前對(duì)其進(jìn)行了合法性檢查(將其與一個(gè)常量ELF_PRARGSZ進(jìn)行比較,程序1228行),但通過(guò)賦予其一個(gè)負(fù)的長(zhǎng)度值就能繞

55、開此檢查。因此,當(dāng)調(diào)用copy_from_user函數(shù)時(shí)(程序1230行)將會(huì)引發(fā)一個(gè)內(nèi)核棧緩沖區(qū)溢出。static void fill_psinfo(struct elf_prpsinfo *psinfo, struct task_struct *p, struct mm_struct *mm)1222int i, len;.1227len = mm->arg_end - mm->arg_start;1228if (len >= ELF_PRARGSZ)1229len = ELF_PRARGSZ-1;1230copy_from_user(&psinfo->pr

56、_psargs,(const char _user *)mm->arg_start, len);.1419 fill_psinfo(psinfo, current->group_leader, current->mm);使用DELTA對(duì)上述代碼進(jìn)行檢測(cè)時(shí),變量len來(lái)自2個(gè)非可信數(shù)據(jù)的計(jì)算結(jié)果(程序1227行),這是因?yàn)橛脩裟軌蛲ㄟ^(guò)裝載一個(gè)惡意構(gòu)造的二進(jìn)制文件來(lái)控制當(dāng)前進(jìn)程(current宏)內(nèi)核數(shù)據(jù)結(jié)構(gòu)task_struct中的一些域,變量len的安全狀態(tài)將轉(zhuǎn)換為(true, false, false, false)。當(dāng)程序1228行的判斷為假時(shí),表明其通過(guò)了一個(gè)有符號(hào)的上

57、界檢查,安全狀態(tài)轉(zhuǎn)換為(true, false, true, false)。DELTA在copy_from_user函數(shù)處設(shè)置了檢查點(diǎn),對(duì)其第3個(gè)參數(shù)安全狀態(tài)進(jìn)行檢查,期望對(duì)應(yīng)參數(shù)的安全狀態(tài)為為s0、(true, true, true/false, true/false) 或 (true, false, true, true)。參數(shù)變量len的安全狀態(tài)不符合此要求,DELTA將輸出發(fā)現(xiàn)一可能安全漏洞的信息,相應(yīng)程序執(zhí)行路徑為à1419àà1227à1228à1230。(2) 如下列代碼所示,在2.4.20版本內(nèi)核drivers/i2c/i2c-dev.c文件的i2cdev_ioctl函數(shù)中,存在一個(gè)非法內(nèi)存訪問(wèn)漏洞和一個(gè)內(nèi)核緩沖區(qū)溢

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論