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

下載本文檔

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

文檔簡介

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

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

3、于此方法的原型系統(tǒng)的檢測實(shí)驗(yàn)表明:本文方法能夠有效檢測出軟件系統(tǒng)中存在的緩沖區(qū)溢出等安全漏洞,誤報率明顯降低,并能避免現(xiàn)有主流靜態(tài)檢測方法中存在的一些嚴(yán)重漏報。關(guān)鍵詞:漏洞檢測;靜態(tài)分析;狀態(tài)機(jī);漏報;誤報中圖分類號: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ī)軟件系統(tǒng)中存在有安全漏洞(Vulnerability)1。要杜絕這類安全事件,最根本的辦法在于在軟件發(fā)布前檢測出安全漏洞并修正。為了提高漏洞檢測的效率,安全界對自動化的漏洞檢測技術(shù)進(jìn)行了研究,主要有動態(tài)分析(Dynamic Analysis)和靜態(tài)分析(Static Analysis)兩類。動態(tài)檢測工具使用較容易2,且確實(shí)能夠發(fā)現(xiàn)一些安全漏洞,但測試用例對程序邏輯的覆蓋率問題限制了動態(tài)檢測工具的發(fā)掘能力,難于發(fā)現(xiàn)隱藏較深的安全漏

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

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

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

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

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

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

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

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

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

19、發(fā)展的數(shù)據(jù)安全性質(zhì)(主要為數(shù)據(jù)的可信性和合法性檢查狀態(tài)),對漏洞狀態(tài)機(jī)的狀態(tài)空間進(jìn)行了擴(kuò)展。首先給出以下模型元素: SRP:變量安全相關(guān)屬性集,SRP包含各種細(xì)化后的安全漏洞相關(guān)變量特征,例如數(shù)據(jù)來源、已經(jīng)經(jīng)過的合法性檢查(可能為多個)、指針釋放與否等。不失一般性,設(shè)SRP集合元素個數(shù)為n,屬性被賦予1至n的編號; 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編號集的冪集上的一個映射,標(biāo)識STO中的元素所對應(yīng)的相關(guān)SRP屬性編號集; opv: STO &

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

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

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

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

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

26、數(shù)上界檢查被作為一個整體進(jìn)行識別判斷,此判斷只能在一個不全面的上界檢查特征歸納基礎(chǔ)上進(jìn)行,不可避免地會降低識別分析的精度。對Linux內(nèi)核藍(lán)牙設(shè)備驅(qū)動安全漏洞的漏報就是一個直接的后果。(3)變量的操作實(shí)施狀態(tài)釋放后指針引用、多次釋放等漏洞類型還涉及到對目標(biāo)變量操作實(shí)施的流程,特別是對指針型變量的操作流程。為此,在SRP中還設(shè)置了相應(yīng)的元素標(biāo)識對目標(biāo)變量已實(shí)施的操作,例如針對釋放后指針引用類型漏洞,設(shè)置了標(biāo)識指針已被釋放的狀態(tài)元素。從以上分析描述可見,對安全狀態(tài)空間進(jìn)行的多元化擴(kuò)展并不是數(shù)量上簡單的增加,而是為了更好地符合程序設(shè)計自然規(guī)律、提高檢測精確度所進(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)變量被直接或間接賦予一個可能被惡意用戶所控制的數(shù)值時,將設(shè)置其安全狀態(tài)中的相關(guān)分量,標(biāo)識其為一非可信的數(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ù),即通過明確外部數(shù)據(jù)輸入途徑來確定哪些數(shù)據(jù)源自非可信的外部世界??尚胚吔缟系乃袃?nèi)外數(shù)據(jù)通道構(gòu)成了可信邊界入口。在界定了可信邊界后,以其為線索可確定可信邊界入口?,F(xiàn)代軟件系統(tǒng),特別是系統(tǒng)軟件,一般將其所提供的底層服務(wù)集成在一個相對獨(dú)立的核心組件中,通過接口對外提供服務(wù)。以操作系統(tǒng)為例,其內(nèi)核通過系統(tǒng)調(diào)用接口為應(yīng)用程序提供了底層的計算服務(wù),內(nèi)核中的數(shù)據(jù)生成與操作不受用戶態(tài)應(yīng)用程序控制。這種共性的體系結(jié)構(gòu)為可信邊界的界定提供了良好的基礎(chǔ),可結(jié)合待檢測漏洞的特性對目標(biāo)系統(tǒng)體系結(jié)構(gòu)進(jìn)行安全性分析,界定具體的可信邊界??尚胚吔缛肟诓粌H僅是系統(tǒng)服務(wù)的調(diào)用接口,還包括所有可能的外

29、部數(shù)據(jù)輸入機(jī)制,例如操作系統(tǒng)內(nèi)核協(xié)議棧中對遠(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ù)據(jù)的SRP屬性編號為1,即安全狀態(tài)向量中的第1個分量用于標(biāo)識數(shù)據(jù)是否可信。對于變量v,對應(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通過可信邊界入口接收了外部數(shù)據(jù)后,其狀態(tài)向量中的除第1個分量外的其它分量都被初始化為false。

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

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

32、的方法,表達(dá)式安全狀態(tài)將只考慮各子表達(dá)式是否會引入非可信的數(shù)據(jù),而忽略其它SRP屬性的傳播。(2)內(nèi)存拷貝傳播除了直接賦值以外,內(nèi)存的拷貝操作也會引起安全狀態(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ù)合法性檢查為提高識別的準(zhǔn)確性,合法性檢查被分解成一序列相關(guān)的子步驟進(jìn)行識別,當(dāng)非可信變量通過了子步驟相應(yīng)的判斷后,變量安全狀態(tài)向量中將相應(yīng)的分量設(shè)置為true,標(biāo)識其通過了對應(yīng)的合法性檢查步驟。對非可信數(shù)據(jù)的合法性檢查主要有兩種

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

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

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

36、類型決定其狀態(tài)轉(zhuǎn)換: 通過了與常量進(jìn)行的上界比較判斷,則狀態(tài)轉(zhuǎn)換為(true, true/false, true, true/false); 通過了與有符號變量進(jìn)行的上界比較判斷,則狀態(tài)轉(zhuǎn)換為(true, true/false, true, true/false); 通過了與無符號變量進(jìn)行的上界比較判斷,則狀態(tài)轉(zhuǎn)換為(true, true, true/false, true/false);此外,如果有符號整型變量為非負(fù)整數(shù)(通過了一個非負(fù)判斷,例如判斷是否不小于0),可以將其作為一個無符號整型變量對待。因此,需要在安全狀態(tài)向量中加以標(biāo)識,通過非負(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)換圖在合法性檢查的識別中進(jìn)行這樣的區(qū)分有著非常重要的現(xiàn)實(shí)意義。這是因?yàn)樵谶M(jìn)行帶符號的比較判斷時,一個負(fù)值一定小于正值。而在C/C+語言中,內(nèi)存操作函數(shù)的長度參數(shù)和數(shù)組索引將被作為無符號整型處理。一個被賦予負(fù)值的有符號整型變量能通過使用帶符號比較判斷的上界合法性檢查,但當(dāng)其被作為內(nèi)存操作函數(shù)的長度實(shí)參或數(shù)組索引時,

38、將被解釋為一個非常大的無符號正值從而導(dǎo)致一個緩沖區(qū)溢出或非法地址訪問漏洞。由于歷史原因,程序員往往忽視了這種有符號變量和無符號變量混用的危險,導(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)識其通過了一個無符號上界檢查; (true, false, true, true),當(dāng)變量僅僅通過了一個帶符號上界檢查時,期望其為一非負(fù)值。否則將表明發(fā)現(xiàn)了一個可能的安全漏洞,例如將狀態(tài)為(true, false, true, false)的變量作為m

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

40、s1, s2, s3, s4)變量為無符號數(shù)時:任意上界比較(s1, true, s3, s4)變量為有符號數(shù)時:常量上界比較、有符號上界比較(s1, s2, true, s4)變量為有符號數(shù)時:無符號上界比較(s1, true, s3, s4)非負(fù)判斷(s1, s2, s3, true)2.5 檢查點(diǎn)在使用漏洞狀態(tài)機(jī)對程序數(shù)據(jù)安全狀態(tài)進(jìn)行跟蹤的基礎(chǔ)上,對安全漏洞檢測的實(shí)施將通過在一些安全攸關(guān)的操作點(diǎn)上對當(dāng)前操作所涉及的數(shù)據(jù)變量的安全狀態(tài)進(jìn)行檢查來進(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è)置等操作操作長度、操作地址操作長度和操作地址若為非可信數(shù)據(jù),必須經(jīng)過上界檢查或訪問合法性檢查;緩沖區(qū)溢出、信息泄漏、非法內(nèi)存訪問等kmalloc、kmem_cache_alloc、memcpy、copy_from_user、copy_to_user、 memset、.數(shù)組索引索引非可信的索引數(shù)值應(yīng)經(jīng)過上界檢查非法內(nèi)存訪問、非法函數(shù)調(diào)用等數(shù)組元素引用,如arrayx指針引用操作指針指針未被釋放過釋放后指針引用指針引用,如*p 、p->q 、循環(huán)循環(huán)次數(shù)非可信的索引數(shù)值應(yīng)經(jīng)過上界檢查死循環(huán)導(dǎo)致的拒絕服務(wù)需要特別指出的是,在Linux內(nèi)核中,copy_from_user等函數(shù)既

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

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

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

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

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

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

49、裝載執(zhí)行一個惡意構(gòu)造的可執(zhí)行二進(jìn)制文件,會間接地影響內(nèi)核task_struct等關(guān)鍵數(shù)據(jù)結(jié)構(gòu)中某些域值,對這些域值的不適當(dāng)處理可能會導(dǎo)致安全漏洞。針對最為常見的漏洞類型,作者實(shí)現(xiàn)了5個基于漏洞狀態(tài)機(jī)的檢查器,分別用于檢測緩沖區(qū)溢出、非法數(shù)組下標(biāo)與非法指針引用、空指針引用、內(nèi)存泄漏等類型漏洞,相應(yīng)的漏洞檢測設(shè)置見表4。表4 漏洞檢測設(shè)置漏洞類型描述漏洞狀態(tài)機(jī)設(shè)置檢查點(diǎn)操作長度引發(fā)的緩沖區(qū)溢出當(dāng)根據(jù)一個未經(jīng)上界檢驗(yàn)的非可信操作長度數(shù)進(jìn)行內(nèi)存拷貝時,可能會引發(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ù)一個未經(jīng)上界檢驗(yàn)的非可信操作長度數(shù)進(jìn)行內(nèi)存分配、設(shè)置等操作時,可能會引發(fā)非法內(nèi)存訪問和內(nèi)存耗盡同上kmalloc、kmem_cache_alloc、memset等內(nèi)核函數(shù),期望狀態(tài)同上信息泄露當(dāng)根據(jù)一個未經(jīng)上界檢驗(yàn)的非可信操作長度數(shù)進(jìn)行內(nèi)核態(tài)至用戶態(tài)數(shù)據(jù)交換時,可能會引發(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ù)將一個未經(jīng)上界檢驗(yàn)的非可信數(shù)據(jù)作為數(shù)組下標(biāo)時可能會引發(fā)非法內(nèi)存訪問;當(dāng)將其作為循環(huán)次數(shù)(上界)時會引發(fā)死循環(huán)同上數(shù)組元素引用,如arrayx,期望狀態(tài)同上;循環(huán)次數(shù)判斷,當(dāng)循環(huán)變量與循環(huán)上界比較為無符號比較時,期望狀態(tài)同上,否則期望狀態(tài)為s0、(true, true, true/false, true/false) 或 (true, true/false, true, true/false)引用釋放后的指針通過一個已經(jīng)釋放了的指針訪問數(shù)據(jù),可能引發(fā)非法內(nèi)存訪問當(dāng)一指針被釋放后,其狀態(tài)被置為(true),在重新掛指針后其狀態(tài)置為(false)指針引用,如*p 、p-&

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

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

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

55、因此,當(dāng)調(diào)用copy_from_user函數(shù)時(程序1230行)將會引發(fā)一個內(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_psar

56、gs,(const char _user *)mm->arg_start, len);.1419 fill_psinfo(psinfo, current->group_leader, current->mm);使用DELTA對上述代碼進(jìn)行檢測時,變量len來自2個非可信數(shù)據(jù)的計算結(jié)果(程序1227行),這是因?yàn)橛脩裟軌蛲ㄟ^裝載一個惡意構(gòu)造的二進(jìn)制文件來控制當(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行的判斷為假時,表明其通過了一個有符號的上界檢查,安

57、全狀態(tài)轉(zhuǎn)換為(true, false, true, false)。DELTA在copy_from_user函數(shù)處設(shè)置了檢查點(diǎn),對其第3個參數(shù)安全狀態(tài)進(jìn)行檢查,期望對應(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ù)中,存在一個非法內(nèi)存訪問漏洞和一個內(nèi)核緩沖區(qū)

溫馨提示

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

評論

0/150

提交評論