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

下載本文檔

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

文檔簡介

1、一種基于安全狀態(tài)跟蹤檢查的漏洞靜態(tài)檢測方法研究與實施梁彬侯看看石文昌梁朝暉(中國人民大學(xué)信息學(xué)院北京100872)(數(shù)據(jù)工程與知識工程教育部重點試驗室 北京100872)摘要:現(xiàn)有的采用基于源代碼分析的漏洞靜態(tài)檢測方法中存在的主要問題是誤報率和漏報率較高。主要原 因z是缺乏對數(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ī)屮引入了對合法性檢查的識別,

2、有效降低了課報的發(fā)生;建立了系統(tǒng)化的 非可信數(shù)據(jù)鑒別方法,可防止由于遺漏非可信數(shù)據(jù)源而產(chǎn)生的漏報?;诖朔椒ǖ脑拖到y(tǒng)的檢測實驗表 明:本文方法能夠冇效檢測出軟件系統(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

3、 shi wen-chang liang zhao-hui(school of information, remning 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 fals

4、e positive and false negative one main reason is lack 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 prop

5、osed in 山is method, the state space of state machine 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 o

6、f program security-related behaviors; the recognition 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 so

7、urces the experimental results of a prototype system show that this method can effectively detect buffer overflow and other type's vulnerabilities in software systems, and with obviously lower false positive than existing mainstream static detection methods and avoid some serious false negative

8、of these methods.keywords vulnerabilities detection, static analysis, state machine, false negative, false positive本課題得到國家自然科學(xué)基金項目(60703102, 60873213)、北京市自然科學(xué)基金項目(4082018)和國家863項目 (2007aa01z414)的資助。梁彬,男,1973年牛,博士,副教授,主耍研究方向為信息安全與系統(tǒng)軟件,email: liangb. 侯看看,女,1986年生,碩士研究生,主耍研究方向為靜態(tài)分析。石文昌,男,1964年生,|専士,教授,

9、|専士生導(dǎo)師,主 要研究方向為信息安全、可信計算與系統(tǒng)軟件。梁朝暉,女,1968年生,講師,主要研究方向為信息安全、網(wǎng)絡(luò)通信。1引言人多數(shù)信息安全事件的根源在于計算機(jī)軟件系統(tǒng)屮存在有安全漏洞(vulnerability)。要杜絕這類安 全事件,最根本的辦法在于在軟件發(fā)布前檢測出安全漏洞并修正。為了提高漏洞檢測的效率,安全界對自 動化的漏洞檢測技術(shù)進(jìn)行了研究,主要有動態(tài)分析(dynamic analysis)和靜態(tài)分析(sicanalysis)兩類。 動態(tài)檢測工具使用較容易,且確實能夠發(fā)現(xiàn)一些安全漏洞,但測試用例對程序邏輯的覆蓋率問題限制了動 態(tài)檢測工具的發(fā)掘能力,難丁發(fā)現(xiàn)隱藏較深的安全漏洞。靜

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

11、關(guān)系。首先,現(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)生大量 的誤報。f1前的檢測方法僅僅集中于跟蹤分析數(shù)據(jù)的可信性,一元的安全性質(zhì)標(biāo)識往往被完全用于描述數(shù) 據(jù)的可信性,無法精確跟蹤對非可信數(shù)據(jù)所實施的合法性檢查,混淆了未經(jīng)合法性檢杳的和已經(jīng)過檢杳的 非可信數(shù)據(jù)?,F(xiàn)實屮,兒乎所有的軟件系統(tǒng)都要處理各種各樣的非可信數(shù)據(jù),而人部分非可信數(shù)據(jù)在引用 前都經(jīng)過了相應(yīng)的合法性檢查,消除

12、了其導(dǎo)致危險操作的對能性。因此,這種混淆的后果會將大量安全的 非可信數(shù)據(jù)操作識別為安全漏洞,將導(dǎo)致大量的安全程序片段被錯誤地檢測為含冇安全漏洞,從而產(chǎn)生大 量的誤報。例如,根據(jù)文獻(xiàn)數(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)檢測方法實現(xiàn)了部分的合法性檢杳識別,但對合法性檢杏是否有效缺乏必 要的深入分析,未能區(qū)分出實現(xiàn)上存在缺陷的無效的合法性檢查,從而產(chǎn)牛漏報。以斯坦福e

13、ngler等人研 發(fā)的靜態(tài)漏洞檢測系統(tǒng)mc所采用的方法為例,mc小用于檢測內(nèi)存操作長度越界漏洞的range checker 中引入了対非可信數(shù)據(jù)的上/下界檢查的識別,山于模型表示空間的限制,其僅僅檢測長度參數(shù)是否經(jīng)過了 相應(yīng)的算術(shù)比較,而并不關(guān)心參與比較的上/下界值的類型。而入侵者能利用一個負(fù)值的整數(shù)繞開與常量或 有符號上界值進(jìn)行的上界比較,觸發(fā)安全漏洞。在現(xiàn)實世界屮,最近幾年此類安全漏洞已經(jīng)人量出現(xiàn)在各 種平臺系統(tǒng)中,例如linux內(nèi)核中的藍(lán)牙設(shè)備驅(qū)動有符號緩沖區(qū)索引安全漏洞。山于缺乏必要的檢査有效 性識別,mc未能檢測出此漏洞。此外,現(xiàn)有靜態(tài)檢測方法對于數(shù)據(jù)可信性的鑒別也缺乏清晰的概念模型

14、,在實際應(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)的狀態(tài)空間進(jìn)行了擴(kuò)展,采用了 多元的狀態(tài)描述機(jī)制,使川一個對應(yīng)多個安全相關(guān)屬性的布爾向量標(biāo)識變量安全狀態(tài),更為清晰地反映了 變暈安全性質(zhì)的變化,細(xì)化了狀態(tài)轉(zhuǎn)換的粒度以提供更為精確的程序特征識別

15、。在此基礎(chǔ)上,利用多元的 安全狀態(tài)設(shè)置在跟蹤分析數(shù)據(jù)可信性的同吋引入了對合法性檢查及其有效性的識別,有效降低了山此引起 的誤報和漏報的發(fā)生。此外,在本文方法中還引入了可信邊界為可信邊界入口的概念,以可信邊界的界定 為線索建立了系統(tǒng)化的非可信數(shù)據(jù)鑒別方法,防止了山于遺漏非可信數(shù)據(jù)源而產(chǎn)生的漏報。為驗證方法的linux kernel bluetooth signed buffer index vulnerability h(tp://cgi-bin/cvename.cgi?name=cve-2005-0750 有效性,作者基于編譯技術(shù)實現(xiàn)了 個可實際運行的原型檢測系統(tǒng)de

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

17、。如圖1所示,在木文中將使用基于有限狀態(tài)機(jī) 模型的漏洞狀態(tài)機(jī)描述程序變量安全狀態(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è)置檢查點(checkpoint),以檢測操作數(shù)據(jù)是否具冇 期望的安全狀態(tài),若出現(xiàn)與期望安全狀態(tài)不符的情況,則表示發(fā)現(xiàn)了一個可能的安全漏洞。圖1檢測方法示;迸圖以拷貝超長數(shù)據(jù)所導(dǎo)致的緩沖區(qū)溢出漏洞為例,當(dāng)使用內(nèi)存拷貝函數(shù)memcpy根據(jù)一個未經(jīng)上界檢杳的 用戶輸入的操作長度參數(shù)復(fù)制超長的數(shù)據(jù)至冃標(biāo)緩沖區(qū)時,將發(fā)生緩沖區(qū)溢

18、出。此時,安全漏洞的相關(guān)要 素為:安全相關(guān)操作一一內(nèi)存拷貝函數(shù);操作數(shù)據(jù)狀態(tài)用戶輸入的(非可信的)、未經(jīng)上界檢查的操作 長度參數(shù)。內(nèi)存拷貝操作將為一個安全檢查點,檢測系統(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)識,如mc和 xgcc®等。在木文中,為

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è)sap集合元素個數(shù)為n,屬 性被賦予1至n的編號; sto:安全狀態(tài)轉(zhuǎn)換操作集st0, sto包含各種導(dǎo)致變量安全相關(guān)屈性發(fā)牛變化的操作,例如賦值、 拷貝、數(shù)據(jù)比較檢査等; op/r. sto - p(1,2),安全狀態(tài)轉(zhuǎn)換操作到srp編號集的幕集上的一個映射,標(biāo)識s70中 的元素所對應(yīng)的相關(guān)srp屬性編號集;

20、opv sto x 1,2,砒f 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, y,£so,z>漏洞狀態(tài)機(jī)各元素的定義如下: s:安全狀態(tài)集,為對應(yīng)srp集的維布爾向量集,即:s = true, false'1 = (小,仏 ,)丨$= true 或 false其中,分量/對應(yīng)編號為i的srp屬性; j7:狀態(tài)機(jī)控制字符集,

21、為狀態(tài)機(jī)對應(yīng)安全漏洞的安全相關(guān)操作,即=sto;廣s xy -> s,狀態(tài)轉(zhuǎn)換函數(shù),表示在當(dāng)前狀態(tài)卜-實施一個安全相關(guān)操作后的后續(xù)安全狀態(tài)。對于一個安全狀態(tài)s = g1, s2,及一個sto操作op,設(shè)心,op) = s' = gt,匕',,時),其中:時=幾當(dāng) i 住 opp (op); si'=(o, i),當(dāng) i w opp (op) so = (false,false. . .false),初始狀態(tài),其所有元素為充皿,表示變量未具備任何安全相關(guān)特性 或被執(zhí)行了相關(guān)操作; z:終止?fàn)顟B(tài)集,在漏洞狀態(tài)機(jī)屮此集為空,即z = 0o在漏洞狀態(tài)機(jī)中,安全狀態(tài)由對應(yīng)s

22、rp集元素的布爾向雖表示,標(biāo)識程序變雖是否具備相關(guān)安全屬性 或被執(zhí)行了什么操作。srp集的設(shè)置由具體的id標(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)致實際的安全威脅°否則,其僅僅 是一個難以被觸發(fā)的編程錯誤而非一個安全漏洞。因此,對變量可信性的標(biāo)識是通過變屋狀態(tài)跟蹤以 檢測安全漏洞的重?;A(chǔ)。在實際檢測中,主要將對非可信數(shù)據(jù)進(jìn)行跟蹤,安全狀態(tài)布爾向量小將設(shè) 置一個分量標(biāo)

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

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

25、falsetrue/false、i1h1hh合法性檢含合法性檢査步驟圖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中,整數(shù)上界檢

26、查被作為一個整體進(jìn)行識 別判斷,此判斷只能在一個不全面的上界檢查特征歸納基礎(chǔ)上進(jìn)行,不可避免地會降低識別分析的精 度。對linux內(nèi)核藍(lán)牙設(shè)備驅(qū)動安全漏洞的漏報就是一個直接的后果。(3) 變量的操作實施狀態(tài)釋放后指針引用、多次釋放等漏洞類型還涉及到對目標(biāo)變量操作實施的流程,特別是對指針型變 量的操作流程。為此,在sap中還設(shè)置了相應(yīng)的元素標(biāo)識對口標(biāo)變量已實施的操作,例如針對釋放后 指針引用類型漏洞,設(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ù)/的確定。變最在聲明后,其初始安全狀態(tài)為 $0,其后續(xù)狀態(tài)根據(jù)其上所實施的相關(guān)操作(27中元素)確定。當(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ù)集成在-個相対 獨立的核心組件中,通過接口對外提供服務(wù)。以操作系統(tǒng)為例,其內(nèi)核通過系統(tǒng)調(diào)川接口為應(yīng)用程序提供 了底層的計算服務(wù),內(nèi)核屮的數(shù)據(jù)生成與操作不受用戶態(tài)應(yīng)用程序控制。這種共性的體系結(jié)構(gòu)為可信邊界 的界定提供r良好的棊礎(chǔ),可結(jié)介待檢測漏洞的特性對hl標(biāo)系統(tǒng)體系結(jié)構(gòu)進(jìn)行安全性分析,界定具體的可 信邊界??尚胚吔缛肟诓粌H僅是系統(tǒng)服務(wù)

29、的調(diào)用接口,還包括所有可能的外部數(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)換操作集s7'0,即epusto。不失一般性,假設(shè)標(biāo)識非町信數(shù)據(jù)的s/?p屬性編號為1,即安全狀態(tài)向雖:中的 第1個分量用于標(biāo)識數(shù)據(jù)是否可信。對于變量力對應(yīng)的漏洞狀態(tài)機(jī)狀態(tài)轉(zhuǎn)換函數(shù)/;為:/ep g ep, fv (5, ep) = (true, false,,false)其中/為y的當(dāng)前安全狀態(tài),需要注意的是,當(dāng)變量y通過可信邊界入口接收了外部數(shù)據(jù)后, 英狀態(tài)向雖中的除第1個分雖外的其它分雖都被初始化

30、為滄/加。這是因為當(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á)式的左值(lwkic)時,其安全狀態(tài)將由表達(dá)式右值(rvnluc)表達(dá)式安全狀態(tài)決定。對于各種形式的右值表達(dá)式s,其安全狀態(tài)sstate (5)按以下情形計算: 當(dāng)s為單個變量x時,sstate (s) = statex)y其中state (x)為變量x的安全狀態(tài); 當(dāng)s為單個常量時,sstate (s) = s0; 當(dāng)s為對

31、函數(shù)/izn的調(diào)用吋,sstate (5) = state(return (fan),其中return筋)為函數(shù)加1當(dāng)前調(diào) 用實例的返回值; 當(dāng)s由多個子表達(dá)式組成,如s,和s2,當(dāng)first_component(sstate(sl) = true或 first_component(sstate(s2) = true 時,sstate (s) = (true, false,., false),否則 sstate (s) = 其 中first component (s)為狀態(tài)向量s的第1個分量。在賦值傳遞屮,考慮到安全漏洞檢測的特殊性,對于由多個了表達(dá)式纟fl成的右值表達(dá)式,木方法 采取一種較為

32、激進(jìn)的方法,表達(dá)式安全狀態(tài)將只考慮各子表達(dá)式是否會引入非可信的數(shù)據(jù),而忽略其 它sap屬性的傳播。(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 (j, 5, 用后,指針d指 向的數(shù)據(jù)的安全狀態(tài)將等于指針5指向的數(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、兩種方式:邏輯運算判斷,例如檢查是否大于、小于、等于或不等于某 個值;合法性檢查例程,通過調(diào)用系統(tǒng)中內(nèi)建的合法性檢測例程進(jìn)行判斷。在實際實施中,將針對具體的 目標(biāo)系統(tǒng),總結(jié)各種漏洞類型相關(guān)的合法性檢查模式,細(xì)化為一系列對非可信數(shù)據(jù)的檢杳步驟,對應(yīng)著相 應(yīng)的狀態(tài)設(shè)宜,最終基于狀態(tài)機(jī)模型實現(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-nenative以上srp集由

34、4個元素組成,分別對應(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)為so,表示其未被非可信數(shù)據(jù)污染并且未經(jīng)過任何安全檢查;當(dāng)此變量被賦了了一個非可信值后狀 態(tài)轉(zhuǎn)換到gwfals匕false, false),表示其受到非可信數(shù)據(jù)污染;在處于非可信狀態(tài)的變量經(jīng)過了上界檢查 后,其狀態(tài)轉(zhuǎn)換到true, true, false, false)或(true, false, true, false

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

36、狀態(tài)轉(zhuǎn)換: 通過了與常量進(jìn)行的上界比較判斷,則狀態(tài)轉(zhuǎn)換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 i false, true/false);此外,如果冇符號整型變量為非負(fù)整數(shù)(通過了一個非負(fù)判斷,例如判斷是否不小于0),可以將其作 為一個無符號整型變量對待。因此,需要在安全狀態(tài)向量中加以標(biāo)識,通過非負(fù)判斷的非可信變量狀態(tài)將 轉(zhuǎn)換為(true, true/false, true/false,

37、 true)。圖3漏洞狀態(tài)機(jī)狀態(tài)轉(zhuǎn)換圖在合法性檢查的識別中進(jìn)行這樣的區(qū)分有曹非常重要的現(xiàn)實意義。這是因為在進(jìn)行帶符號的比較判斷 時,一個負(fù)值一定小于疋值。而在c/c+語言中,內(nèi)存操作函數(shù)的長度參數(shù)和數(shù)組索引將被作為無符號整 型處理。一個被賦予負(fù)值的有符號整型變暈?zāi)芡ㄟ^使用帶符號比較判斷的上界合法性檢杏,但當(dāng)其被作為 內(nèi)存操作函數(shù)的長度實參或數(shù)組索引時,將被解禪為一個非常人的無符號正值從而導(dǎo)致一個緩沖區(qū)溢出或 非法地址訪問漏洞。由于歷史原因,程序員往往忽視了這種有符號變量利無符號變量混用的危險,導(dǎo)致此 類安全漏洞層出不窮。由此,在內(nèi)存操作(例如加幼7中,)和數(shù)組下標(biāo)等檢查點上,相關(guān)變量的合法安全

38、狀 態(tài)應(yīng)為以卜之一: s(); (true, true, truelfalse, true/false),標(biāo)識其通過了 一個無符號上界檢查; true, false, true, true),當(dāng)變量僅僅通過了一個帶符號上界檢查吋,期望其為一非負(fù)值。否則將表明發(fā)現(xiàn)了一個可能的安全漏洞,例如將狀態(tài)mtrue, false, truejalse)變量作為memcpy函數(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)換。若

39、在檢查系統(tǒng)中直接記錄并實現(xiàn)所有的狀態(tài)轉(zhuǎn)換規(guī)則,必定會導(dǎo)致實現(xiàn)及 效率上問題,并會大大影響系統(tǒng)的可擴(kuò)展性。但由于大部分狀態(tài)轉(zhuǎn)換僅僅改變安全狀態(tài)向量中的一個分量, 狀態(tài)轉(zhuǎn)換規(guī)則可被大大簡化。如表i所示,對于以上狀態(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)變量為無符號數(shù)時:任意上界比較(s, true, s3, $4)(s, 52, $3, $4)變量為有符號數(shù)時:簾量上界比較、有符號上界比較g 仏"w $4)變量為有符號數(shù)時:無符號上界比較(i'b true. s3.

40、54)2.5檢查點在使川漏洞狀態(tài)機(jī)対程序數(shù)據(jù)安全狀態(tài)進(jìn)行跟蹤的慕礎(chǔ)上,對安全漏洞檢測的實施將通過在一些安全 攸關(guān)的操作點上對當(dāng)前操作所涉及的數(shù)據(jù)變量的安全狀態(tài)進(jìn)行檢查來進(jìn)行。一些在本文實驗中所采用的檢 查點及在linux系統(tǒng)中的部分實例如表2所示。表2檢查點檢査點相關(guān)參數(shù)狀態(tài)檢查相關(guān)安全漏洞實例(linux內(nèi)核)內(nèi)存分配、拷操作長度、操操作長度和操作地址緩沖區(qū)溢出、信kmalloc、kmem cache alloc 、貝,設(shè)置等操作地址若為非可信數(shù)據(jù),必息泄漏、非法內(nèi)memcpy >copyj'romuser 、作須經(jīng)過上界檢查或訪存訪問等copyjo_iiser > me

41、mset 問合法性檢查;數(shù)組索引索引非可信的索引數(shù)值應(yīng)非法內(nèi)存訪問、數(shù)組元素引用,如arrayx經(jīng)過上界檢查非法函數(shù)調(diào)用等指針引用操作指針指針未被釋放過釋放后指針引用指針引用,如*”、p>q、循環(huán)循環(huán)次數(shù)非可信的索引數(shù)值應(yīng)死循環(huán)導(dǎo)致的拒經(jīng)過上界檢查絕服務(wù)需要特別指出的是,在linux內(nèi)核屮,copyjrom_user等函數(shù)既是可信邊界的入口,又是安全漏洞檢測 的檢査點。3原型系統(tǒng)為檢驗以上檢測方法的效能,作者實現(xiàn)了一個針對系統(tǒng)軟件的靜態(tài)檢測系統(tǒng)原型delta,能支持對 c/c+語言開發(fā)實際的目標(biāo)系統(tǒng)的漏洞檢測實驗。3.1系統(tǒng)結(jié)構(gòu)圖4 delta系統(tǒng)結(jié)構(gòu)如圖4所示,delta系統(tǒng)首先對待檢

42、測的系統(tǒng)源代碼進(jìn)行預(yù)處理和代碼解析,并形成屮間代碼形式輸 出至一個靜態(tài)分析引擎。引擎將在漏洞模式(狀態(tài)機(jī))支持下進(jìn)行安全漏洞檢測,主要機(jī)制為通過遍歷代 碼屮的執(zhí)行路徑驅(qū)動漏洞狀態(tài)機(jī)運行來跟蹤變量的安金狀態(tài),并在檢查點上將相關(guān)變雖的安全狀態(tài)與期望 安全狀態(tài)進(jìn)行比對。若發(fā)現(xiàn)可能的安全漏洞將輸出相應(yīng)的漏洞上下文信息。delta系統(tǒng)基于編譯技術(shù)實現(xiàn): 預(yù)處理器與解析器預(yù)處理器解析器相當(dāng)于編譯器的前端(front-end),負(fù)責(zé)將原始源代碼文件轉(zhuǎn)換成檢測引擎能夠 識別處理的形式。原始的程序源代碼文件往往引用了其他一些說明性的文件,如c/c+語言中的頭文 件。這些文件通過語言的包含機(jī)制相互連接起來。預(yù)處理

43、工具將模擬真實編譯器編譯鏈接過程,識別 根文件,以根文件為基礎(chǔ)將相關(guān)的源文件整合在一起,形成完整的分析單位。解析器將對預(yù)處理過的 文件進(jìn)行詞法分析與語法分析,并生成面向靜態(tài)分析的中間代碼。delta屮的預(yù)處理器與解析器基于gcc編譯器的前端實現(xiàn),利用了 gcc屮的c/c+語言標(biāo)準(zhǔn)的 lex、yacc描述腳本為基礎(chǔ)牛成相應(yīng)的詞法與語法分析器。在語法分析結(jié)朿后,將根據(jù)所獲得的語法元 索牛成靜態(tài)單賦值(static single assignment, ssa)形式的屮間代碼,屮間代碼將以基本塊(basic block)的形式組織在一起。 靜態(tài)檢測引擎靜態(tài)檢測引擎將首先根據(jù)源代碼函數(shù)間的調(diào)用圖(ca

44、ll graph, cg)確定根函數(shù)(root function), 并構(gòu)建控制流圖(control flow graph, cfg)。以根函數(shù)為起始點,用cfg驅(qū)動漏洞狀態(tài)機(jī)運行,模 擬源碼文件的實際操作,遍歷其相應(yīng)中間代碼的各個對能的邏輯執(zhí)行路徑。在狀態(tài)機(jī)運行過程中,引 擎將根據(jù)當(dāng)前操作和各個變量的安全狀態(tài)決定其的示繼狀態(tài)。若當(dāng)前程序點為一個漏洞檢杏點時,引 擎還將對相關(guān)變雖的當(dāng)前安全狀態(tài)進(jìn)行檢查。若出現(xiàn)不符合當(dāng)前檢查點對變量的安全要求的情況,則 表示發(fā)現(xiàn)了一個町能的安全漏洞,引擎將向用戶輸出和關(guān)漏洞上下文信息(主耍包括漏洞位置、數(shù)據(jù) 傳播路徑等)。在很多情況卜安全漏洞的產(chǎn)主跨越多個函數(shù)過

45、程,戾至是多個源文件。為了能有效檢測出這類 安全漏洞,分析引擎應(yīng)能實施過程間(inter-procedural analysis)和文件間分析(inter-file analysis)0 過程間分析需要對暢數(shù)調(diào)用進(jìn)行跟蹤分析。若當(dāng)前語句為一個函數(shù)調(diào)用時,將跟蹤被調(diào)用函數(shù)(callee) 的中間代碼:在分析完畢后,返回到調(diào)用點繼續(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中,

46、每一種漏洞類型模式對應(yīng)著一個漏洞狀態(tài)機(jī)。檢測引擎中可同時運行多個漏洞狀態(tài) 機(jī),以同時檢測多種安全漏洞。在實際應(yīng)用屮,可根據(jù)資源情況選擇裝載待檢測的漏洞狀態(tài)機(jī)。delta 系統(tǒng)中的漏洞狀態(tài)機(jī)以檢查器(checker)鏈接庫形式實現(xiàn)。在靜態(tài)檢測引擎中設(shè)置了鉤子(hook)函 數(shù),涵蓋狀態(tài)轉(zhuǎn)換、狀態(tài)傳播和檢查點等程序節(jié)點,檢測引擎將在這些點上調(diào)川已裝載的檢查器屮的 實施函數(shù)。3.2系統(tǒng)配置為驗證上述方法及原型的有效性,作者選樣了 linux內(nèi)核作為實驗對象,使用delta對其進(jìn)行了漏洞 檢測實驗。作為檢測的慕礎(chǔ),首先需要確定linux系統(tǒng)可信邊界和可信邊界入口。根據(jù)linux操作系統(tǒng)內(nèi)核的結(jié)構(gòu) 特點

47、,完全源于內(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)核可信邊界入口可信邊界入口引入的非可信數(shù)據(jù)實例系統(tǒng)調(diào)用接口用戶態(tài)程序提供的調(diào)用參數(shù)sys_open、sys_read、 sysvvrite、sys_mknod>、sys_ioctll 等內(nèi)核態(tài)/用戶態(tài)數(shù)據(jù)交換例程拷貝自用戶態(tài)內(nèi)存的數(shù)據(jù)copymm_user get_us

48、er 等可執(zhí)行程序等用戶文件裝載解析載入內(nèi)核的用戶可構(gòu)造的文件數(shù)據(jù)linux binpnn->buf等在上表中所包括的可信邊界入口中,文件的裝載解析最容易被遺漏而導(dǎo)致漏報。事實上,linux內(nèi)核在 裝載可執(zhí)行程序等文件時,會從這些文件中引入影響內(nèi)核操作的數(shù)據(jù)。例如,裝載執(zhí)行一個惡意構(gòu)造的可 執(zhí)行二進(jìn)制文件,會間接地影響內(nèi)核task_struct等關(guān)鍵數(shù)據(jù)結(jié)構(gòu)中某些域值,對這些域值的不適當(dāng)處理可 能會導(dǎo)致安全漏洞。針對最為常見的漏洞類型,作者實現(xiàn)了 5個基于漏洞狀態(tài)機(jī)的檢杳器,分別用于檢測緩沖區(qū)溢出、非 法數(shù)組下標(biāo)與非法指針引用、空指針引用、內(nèi)存泄漏等類型漏洞,相應(yīng)的漏洞檢測設(shè)置見表4。表

49、4漏洞檢測設(shè)置漏洞類型描述漏洞狀態(tài)機(jī)設(shè)置檢查點操作長度引發(fā)當(dāng)根據(jù)一個未經(jīng)上界檢驗的非可非可信數(shù)據(jù)源設(shè)置merncpy .copy_from_user 、 getuser *的緩沖區(qū)溢出信操作長度數(shù)進(jìn)行內(nèi)存拷貝時,可見表2;非可信上界_copy_from_userji等內(nèi)核兩數(shù),期望狀態(tài)為能會引發(fā)內(nèi)核堆/棧緩沖區(qū)溢出檢杳數(shù)據(jù)狀態(tài)轉(zhuǎn)換參見2.4節(jié)so、(true, true, truelfalse, true/false)或(true, false, true, true)非法內(nèi)存操作當(dāng)根據(jù)一個未經(jīng)上界檢驗的非可 信操作長度數(shù)進(jìn)行內(nèi)存分配、設(shè)置 等操作時,可能會引發(fā)非法內(nèi)存訪 問和內(nèi)存耗盡同上km

50、allocy kmemjcache_alloc memset 等內(nèi)核函 數(shù),期望狀態(tài)同上倍息泄露當(dāng)根據(jù)一個未經(jīng)上界檢驗的非可 信操作長度數(shù)進(jìn)行內(nèi)核態(tài)至用戶 態(tài)數(shù)據(jù)交換時,可能會引發(fā)關(guān)鍵的 內(nèi)核書記泄露同上copyjojuser put_iiser、_copyjo_userjl 內(nèi) 核函數(shù),期望狀態(tài)同上非法數(shù)組下標(biāo)將一個未經(jīng)上界檢驗的非可信數(shù)同上數(shù)組元索引用,arrayx,期望狀態(tài)同上;及循環(huán)次數(shù)據(jù)作為數(shù)組下標(biāo)時可能會引發(fā)菲 法內(nèi)存訪問;當(dāng)將其作為循環(huán)次數(shù)(上界)時會引發(fā)死循環(huán)循環(huán)次數(shù)判斷,當(dāng)循環(huán)變量與循環(huán)上界比較為 無符號比較時,期望狀態(tài)同上,否則期望狀態(tài) 為呦、(true, true, tr

51、ue/false, true/false)或(true, true/false, true, true/false)引用釋放后的通過一個已經(jīng)釋放了的指針訪問當(dāng)一指針被釋放后,指針引用,如*p、p->q等,期望狀態(tài)為(false)指針數(shù)據(jù),可能引發(fā)非法內(nèi)存訪問其狀態(tài)被置為(皿), 在重新掛指針后其 狀態(tài)置為血/影)4實驗基于以上設(shè)置,作者對linux內(nèi)核的一些了系統(tǒng)進(jìn)行了實驗檢測。實驗結(jié)果表明木方法和原型系統(tǒng)能 冇效檢測出隱藏較深的安全漏洞,其中一些是其他靜態(tài)檢測方法未能發(fā)現(xiàn)的。此外,實驗表明delta還能 有效避免缺乏對有效合法性檢查的識別所帶來的誤報。以緩沖區(qū)溢出漏洞檢測為例,如下表所

52、示,delta 檢測出了 7個真實的漏洞,準(zhǔn)確率達(dá)到了 31.8%0和cqual與coverity對linux內(nèi)核檢測結(jié)果的比較如表5所示。表5緩沖區(qū)溢出漏洞檢測結(jié)果及比較檢測系統(tǒng)報告漏洞數(shù)真實漏洞數(shù)準(zhǔn)確率delta2273l8%cqual26462.2%coverity1241512%delta所檢測出的所有漏洞分布情況是:操作長度引發(fā)的緩沖區(qū)溢出7個,非法內(nèi)存操作個,信息 泄露1個,非法數(shù)組下標(biāo)及循環(huán)次數(shù)2個,引用禪放后的指針1個。表5屮cqual與coverity對linux 的檢測結(jié)果數(shù)據(jù)來自其相關(guān)文獻(xiàn)報道。由上表可見,delta系統(tǒng)對linux內(nèi)核的檢測準(zhǔn)確率高于cqual cove

53、rity系統(tǒng),即具有較低的誤報率。和對于coverity ifu g, delta檢測出的安全漏洞總數(shù)較少。原因 在于:coverity實施了超過50個的檢查器,在對緩沖區(qū)溢出的檢測方面,覆蓋了各種引發(fā)緩沖區(qū)溢出的因 索。而delta的主要口標(biāo)在于檢驗本文方法在降低漏報與誤報方面的效果,僅實現(xiàn)了對操作長度引發(fā)的緩 沖區(qū)溢岀漏洞的檢測。雖然如此,在同樣覆蓋的漏洞類型上,delta仍然檢測岀coverity所未能檢測出的 漏洞,避免了漏報。delta系統(tǒng)所檢測出的2個典型漏洞實例如下:(1)如下列代碼所示,在2.6.9版本內(nèi)核fs/binfmt_elf.c文件中,存在一個內(nèi)核緩沖區(qū)溢出漏洞,雖然在

54、copy_from_user兩數(shù)引用有符號整型變量len前對具進(jìn)行了合法性檢查(將其與一個常量 elf_prargsz進(jìn)行比較,程序1228行),但通過賦予其一個負(fù)的長度值就能繞開此檢杏。因 此,當(dāng)調(diào)用copyjrom_user函數(shù)時(程序1230行)將會引發(fā)一個內(nèi)核棧緩沖區(qū)溢出。static void fill_psinfo(struct elf_prpsinfo *psinfor struct task_struct *p, struct mmstruct *mm)1222 int ir len; 1227 len = mm->arg_end mm->arg_start;122

55、8 if (len >= elf_prargsz)1229 len = elf_prargsz-1;1230 copy_f rom_user (&psinf o->pr_psargs,(const char _user *)mm->arg_startz len);1419 fill_psinfo(psinfor current->group_leader/ current->mm);使用delta對上述代碼進(jìn)行檢測時,變量07來白2個非可信數(shù)據(jù)的計算結(jié)果(程序1227行), 這是因為用戶能夠通過裝載一個惡意構(gòu)造的二進(jìn)制文件來控制當(dāng)前進(jìn)程(cuwnf宏)內(nèi)核

56、數(shù)據(jù)結(jié)構(gòu) task_struct中的一些域,變雖len的女全狀態(tài)將轉(zhuǎn)換(true, false, false, false)當(dāng)程序1228彳亍的判斷為 假時,表明其通過了一個有符號的上界檢查,安全狀態(tài)轉(zhuǎn)換為(true, false, true, false)delta在 copyjrom_user函數(shù)處設(shè)置了檢查點,対其笫3個參數(shù)安全狀態(tài)進(jìn)行檢查,期望對應(yīng)參數(shù)的安全狀態(tài)為 為 so、(true, true, true/false, true/false)或(true, false, true, true)o 參數(shù)變量 len 的安全狀態(tài)不符合此要求, delta將輸出發(fā)現(xiàn)一可能安全漏洞的信息,

57、和應(yīng)程序執(zhí)行路徑為t1419p.t1227t 12289123()。(2)如下列代碼所示,在2.4.20版本內(nèi)核dj*ivers/i2c/i2c-dev.c文件的i2cclev_ioctl函數(shù)中,存在一個非法內(nèi)存訪問漏洞和一個內(nèi)核緩沖區(qū)溢出漏洞。與上例類似,rdwr_arg.nmsgs為一個非可信數(shù) 據(jù),其未經(jīng)檢查就被引用為循環(huán)上限和數(shù)組下標(biāo),將導(dǎo)致非法地址訪問或死循環(huán);此外,笫279 行使用未經(jīng)檢杏的非可信數(shù)據(jù)作為copyjrom_user的操作長度參數(shù),將導(dǎo)致一個緩沖區(qū)溢岀。252if (copy_f ro(n_user (&rdwr_argz253(struct i2c_rdwr_ioc11_data *)arg.254sizeof(rdwr_arg)255return -efault;264for( i=0;i<rdwr_arg nmsgs;coverily inc report. analysis of the linux kernel. dec 2004.265279if(copy_from_user(rdwr_paibuf,280281rdwr_argmsgsibuf, rdwr_pailen)282特別重要的是,實驗還發(fā)現(xiàn)

溫馨提示

  • 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

提交評論