版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(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é)信息學(xué)院北京100872)(數(shù)據(jù)工程與知識(shí)工程教育部重點(diǎn)試驗(yàn)室 北京100872)摘要:現(xiàn)有的采用基于源代碼分析的漏洞靜態(tài)檢測(cè)方法中存在的主要問(wèn)題是誤報(bào)率和漏報(bào)率較高。主要原 因z是缺乏對(duì)數(shù)據(jù)介法性檢查與非可信數(shù)據(jù)源等程序安全相關(guān)元素的精確冇效的識(shí)別分析。木文提出了 -種基于數(shù)據(jù)安全狀態(tài)跟蹤和檢查的安全漏洞靜態(tài)檢測(cè)方法。該方法對(duì)漏洞狀態(tài)機(jī)模型的狀態(tài)空間進(jìn)行了 擴(kuò)展,使用対應(yīng)多個(gè)安全和關(guān)屬性的向量標(biāo)識(shí)變量安全狀態(tài),細(xì)化了狀態(tài)轉(zhuǎn)換的粒度以提供更為精確的程 序安全行為識(shí)別;在漏洞狀態(tài)機(jī)屮引入了對(duì)合法性檢查的識(shí)別,
2、有效降低了課報(bào)的發(fā)生;建立了系統(tǒng)化的 非可信數(shù)據(jù)鑒別方法,可防止由于遺漏非可信數(shù)據(jù)源而產(chǎn)生的漏報(bào)?;诖朔椒ǖ脑拖到y(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)中圖分類(lèi)號(hào):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本課題得到國(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年生,|専士,教授,
9、|専士生導(dǎo)師,主 要研究方向?yàn)樾畔踩?、可信?jì)算與系統(tǒng)軟件。梁朝暉,女,1968年生,講師,主要研究方向?yàn)樾畔踩?、網(wǎng)絡(luò)通信。1引言人多數(shù)信息安全事件的根源在于計(jì)算機(jī)軟件系統(tǒng)屮存在有安全漏洞(vulnerability)。要杜絕這類(lèi)安 全事件,最根本的辦法在于在軟件發(fā)布前檢測(cè)出安全漏洞并修正。為了提高漏洞檢測(cè)的效率,安全界對(duì)自 動(dòng)化的漏洞檢測(cè)技術(shù)進(jìn)行了研究,主要有動(dòng)態(tài)分析(dynamic analysis)和靜態(tài)分析(sicanalysis)兩類(lèi)。 動(dòng)態(tài)檢測(cè)工具使用較容易,且確實(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)各種安全漏洞,例如緩沖區(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è)方法和工具,fi 前己在操作系統(tǒng)等復(fù)雜系統(tǒng)的漏洞檢測(cè)屮得以應(yīng)用。但仍然存在著誤報(bào)率和漏報(bào)率較高的問(wèn)題,影響著靜 態(tài)漏洞檢測(cè)方法進(jìn)一步推廣應(yīng)用。這與檢測(cè)模型和安全相關(guān)程序特征的識(shí)別有著密切的
11、關(guān)系。首先,現(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)。f1前的檢測(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)的合法性檢查,消除
12、了其導(dǎo)致危險(xiǎn)操作的對(duì)能性。因此,這種混淆的后果會(huì)將大量安全的 非可信數(shù)據(jù)操作識(shí)別為安全漏洞,將導(dǎo)致大量的安全程序片段被錯(cuò)誤地檢測(cè)為含冇安全漏洞,從而產(chǎn)生大 量的誤報(bào)。例如,根據(jù)文獻(xiàn)數(shù)據(jù),johnson等人使用cqual系統(tǒng)對(duì)linux內(nèi)核代碼進(jìn)行的用戶(hù)態(tài)/內(nèi)核態(tài) 指針引用漏洞檢測(cè),山于缺乏対合法性檢查的有效識(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)。以斯坦福e
13、ngler等人研 發(fā)的靜態(tài)漏洞檢測(cè)系統(tǒng)mc所采用的方法為例,mc小用于檢測(cè)內(nèi)存操作長(zhǎng)度越界漏洞的range checker 中引入了対非可信數(shù)據(jù)的上/下界檢查的識(shí)別,山于模型表示空間的限制,其僅僅檢測(cè)長(zhǎng)度參數(shù)是否經(jīng)過(guò)了 相應(yīng)的算術(shù)比較,而并不關(guān)心參與比較的上/下界值的類(lèi)型。而入侵者能利用一個(gè)負(fù)值的整數(shù)繞開(kāi)與常量或 有符號(hào)上界值進(jìn)行的上界比較,觸發(fā)安全漏洞。在現(xiàn)實(shí)世界屮,最近幾年此類(lèi)安全漏洞已經(jīng)人量出現(xiàn)在各 種平臺(tái)系統(tǒng)中,例如linux內(nèi)核中的藍(lán)牙設(shè)備驅(qū)動(dòng)有符號(hào)緩沖區(qū)索引安全漏洞。山于缺乏必要的檢査有效 性識(shí)別,mc未能檢測(cè)出此漏洞。此外,現(xiàn)有靜態(tài)檢測(cè)方法對(duì)于數(shù)據(jù)可信性的鑒別也缺乏清晰的概念模型
14、,在實(shí)際應(yīng)用屮容易遺漏一些 較隱蔽的非可信數(shù)據(jù)源,導(dǎo)致對(duì)部分非可信數(shù)據(jù)跟蹤分析的缺失而產(chǎn)生漏報(bào)。以mc所采用的方法為例, 在其對(duì)linux內(nèi)核的漏洞檢測(cè)中,遺漏了內(nèi)核對(duì)用戶(hù)文件的裝載解析這一非町信數(shù)據(jù)源,導(dǎo)致了對(duì)對(duì)執(zhí)行 文件解析所引發(fā)的安全漏洞的誤報(bào)。針對(duì)以上問(wèn)題,本文提出了一種對(duì)程序數(shù)據(jù)安全狀態(tài)進(jìn)行跟蹤檢查的漏洞靜態(tài)檢測(cè)方法。在此方法小, 使用有限狀態(tài)機(jī)模型描述程序數(shù)據(jù)安全性質(zhì)的變化,対描述數(shù)據(jù)安全狀態(tài)的狀態(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í)別
15、。在此基礎(chǔ)上,利用多元的 安全狀態(tài)設(shè)置在跟蹤分析數(shù)據(jù)可信性的同吋引入了對(duì)合法性檢查及其有效性的識(shí)別,有效降低了山此引起 的誤報(bào)和漏報(bào)的發(fā)生。此外,在本文方法中還引入了可信邊界為可信邊界入口的概念,以可信邊界的界定 為線(xiàn)索建立了系統(tǒng)化的非可信數(shù)據(jù)鑒別方法,防止了山于遺漏非可信數(shù)據(jù)源而產(chǎn)生的漏報(bào)。為驗(yàn)證方法的linux kernel bluetooth signed buffer index vulnerability h(tp://cgi-bin/cvename.cgi?name=cve-2005-0750 有效性,作者基于編譯技術(shù)實(shí)現(xiàn)了 個(gè)可實(shí)際運(yùn)行的原型檢測(cè)系統(tǒng)de
16、lta (detect vulnerability with static analysis)o使丿1j 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)的跟蹤和檢査
17、。如圖1所示,在木文中將使用基于有限狀態(tài)機(jī) 模型的漏洞狀態(tài)機(jī)描述程序變量安全狀態(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è)可能的安全漏洞。圖1檢測(cè)方法示;迸圖以拷貝超長(zhǎng)數(shù)據(jù)所導(dǎo)致的緩沖區(qū)溢出漏洞為例,當(dāng)使用內(nèi)存拷貝函數(shù)memcpy根據(jù)一個(gè)未經(jīng)上界檢杳的 用戶(hù)輸入的操作長(zhǎng)度參數(shù)復(fù)制超長(zhǎng)的數(shù)據(jù)至冃標(biāo)緩沖區(qū)時(shí),將發(fā)生緩沖區(qū)溢
18、出。此時(shí),安全漏洞的相關(guān)要 素為:安全相關(guān)操作一一內(nèi)存拷貝函數(shù);操作數(shù)據(jù)狀態(tài)用戶(hù)輸入的(非可信的)、未經(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è)用戶(hù)輸入的數(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í),如mc和 xgcc®等。在木文中,為
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è)sap集合元素個(gè)數(shù)為n,屬 性被賦予1至n的編號(hào); 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編號(hào)集的幕集上的一個(gè)映射,標(biāo)識(shí)s70中 的元素所對(duì)應(yīng)的相關(guān)srp屬性編號(hào)集;
20、opv sto x 1,2,砒f 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, y,£so,z>漏洞狀態(tài)機(jī)各元素的定義如下: s:安全狀態(tài)集,為對(duì)應(yīng)srp集的維布爾向量集,即:s = true, false'1 = (小,仏 ,)丨$= true 或 false其中,分量/對(duì)應(yīng)編號(hào)為i的srp屬性; j7:狀態(tài)機(jī)控制字符集,
21、為狀態(tài)機(jī)對(duì)應(yīng)安全漏洞的安全相關(guān)操作,即=sto;廣s xy -> s,狀態(tài)轉(zhuǎn)換函數(shù),表示在當(dāng)前狀態(tài)卜-實(shí)施一個(gè)安全相關(guān)操作后的后續(xù)安全狀態(tài)。對(duì)于一個(gè)安全狀態(tài)s = g1, s2,及一個(gè)sto操作op,設(shè)心,op) = s' = gt,匕',,時(shí)),其中:時(shí)=幾當(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)由對(duì)應(yīng)s
22、rp集元素的布爾向雖表示,標(biāo)識(shí)程序變雖是否具備相關(guān)安全屬性 或被執(zhí)行了什么操作。srp集的設(shè)置由具體的id標(biāo)系統(tǒng)與待檢測(cè)的漏洞類(lèi)型決定,主要由3部分構(gòu)成:(1)變量值是否為一非可信的數(shù)據(jù),即此數(shù)據(jù)是否有可能被惡意用戶(hù)所控制對(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è)安全漏洞的重?;A(chǔ)。在實(shí)際檢測(cè)中,主要將對(duì)非可信數(shù)據(jù)進(jìn)行跟蹤,安全狀態(tài)布爾向量小將設(shè) 置一個(gè)分量標(biāo)
23、識(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è)不同。即使是同一漏洞類(lèi)型,各系統(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)的合法性檢查構(gòu)成,設(shè)置與z 對(duì)應(yīng)的多個(gè)變量安全
24、和關(guān)屬性,用于標(biāo)識(shí)f1標(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)潔高效。安全狀態(tài)-true/falsetrue/
25、falsetrue/false、i1h1hh合法性檢含合法性檢査步驟圖2合法性檢查細(xì)化貝別如若使用一元的安全狀態(tài)描述機(jī)制,必將需要在較大的粒度上對(duì)合法性檢查進(jìn)行分析判斷,這盂 要相應(yīng)的程序模式歸納。而涉及合法性檢查的各種可能的構(gòu)成形式及排列次序很難歸納為相對(duì)固定的 表示序列,這必將導(dǎo)致対合法性檢查程序模式的部分缺失。例如,有符號(hào)整數(shù)的有效上界檢查就可能 包含多種構(gòu)成形式。每種形式都可能包含多個(gè)次序可以任意變換的步驟,如通過(guò)判斷整數(shù)是否非負(fù)和 是否小于一個(gè)常量上界來(lái)進(jìn)行檢杳。多元的安全狀態(tài)描述機(jī)制能夠較自然地容納對(duì)這種不定次序的多 步驟檢查的識(shí)別。而在采用一元安全狀態(tài)描述機(jī)制的mc中,整數(shù)上界檢
26、查被作為一個(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)釋放后指針引用、多次釋放等漏洞類(lèi)型還涉及到對(duì)目標(biāo)變量操作實(shí)施的流程,特別是對(duì)指針型變 量的操作流程。為此,在sap中還設(shè)置了相應(yīng)的元素標(biāo)識(shí)對(duì)口標(biāo)變量已實(shí)施的操作,例如針對(duì)釋放后 指針引用類(lèi)型漏洞,設(shè)置了標(biāo)識(shí)指針已被釋放的狀態(tài)元素。從以上分析描述可見(jiàn),對(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ù)/的確定。變最在聲明后,其初始安全狀態(tài)為 $0,其后續(xù)狀態(tài)根據(jù)其上所實(shí)施的相關(guān)操作(27中元素)確定。當(dāng)變量被直接或間接賦予一個(gè)可能被惡意用 戶(hù)所控制的數(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)成了可信邊界入口。在界定了可信邊界后,以其為 線(xiàn)索可確定可信邊界入口?,F(xiàn)代軟件系統(tǒng),特別是系統(tǒng)軟件,一般將英所提供的底層服務(wù)集成在-個(gè)相対 獨(dú)立的核心組件中,通過(guò)接口對(duì)外提供服務(wù)。以操作系統(tǒng)為例,其內(nèi)核通過(guò)系統(tǒng)調(diào)川接口為應(yīng)用程序提供 了底層的計(jì)算服務(wù),內(nèi)核屮的數(shù)據(jù)生成與操作不受用戶(hù)態(tài)應(yīng)用程序控制。這種共性的體系結(jié)構(gòu)為可信邊界 的界定提供r良好的棊礎(chǔ),可結(jié)介待檢測(cè)漏洞的特性對(duì)hl標(biāo)系統(tǒng)體系結(jié)構(gòu)進(jìn)行安全性分析,界定具體的可 信邊界。可信邊界入口不僅僅是系統(tǒng)服務(wù)
29、的調(diào)用接口,還包括所有可能的外部數(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)換操作集s7'0,即epusto。不失一般性,假設(shè)標(biāo)識(shí)非町信數(shù)據(jù)的s/?p屬性編號(hào)為1,即安全狀態(tài)向雖:中的 第1個(gè)分量用于標(biāo)識(shí)數(shù)據(jù)是否可信。對(duì)于變量力對(duì)應(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通過(guò)可信邊界入口接收了外部數(shù)據(jù)后, 英狀態(tài)向雖中的除第1個(gè)分雖外的其它分雖都被初始化
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á)式的左值(lwkic)時(shí),其安全狀態(tài)將由表達(dá)式右值(rvnluc)表達(dá)式安全狀態(tài)決定。對(duì)于各種形式的右值表達(dá)式s,其安全狀態(tài)sstate (5)按以下情形計(jì)算: 當(dāng)s為單個(gè)變量x時(shí),sstate (s) = statex)y其中state (x)為變量x的安全狀態(tài); 當(dāng)s為單個(gè)常量時(shí),sstate (s) = s0; 當(dāng)s為對(duì)
31、函數(shù)/izn的調(diào)用吋,sstate (5) = state(return (fan),其中return筋)為函數(shù)加1當(dāng)前調(diào) 用實(shí)例的返回值; 當(dāng)s由多個(gè)子表達(dá)式組成,如s,和s2,當(dāng)first_component(sstate(sl) = true或 first_component(sstate(s2) = true 時(shí),sstate (s) = (true, false,., false),否則 sstate (s) = 其 中first component (s)為狀態(tài)向量s的第1個(gè)分量。在賦值傳遞屮,考慮到安全漏洞檢測(cè)的特殊性,對(duì)于由多個(gè)了表達(dá)式纟fl成的右值表達(dá)式,木方法 采取一種較為
32、激進(jìn)的方法,表達(dá)式安全狀態(tài)將只考慮各子表達(dá)式是否會(huì)引入非可信的數(shù)據(jù),而忽略其 它sap屬性的傳播。(2) 內(nèi)存拷貝傳播除了肓接賦值以外,內(nèi)存的拷貝操作也會(huì)引起安全狀態(tài)的傳播,源內(nèi)存區(qū)域數(shù)據(jù)的安全狀態(tài)將目 的內(nèi)存區(qū)域數(shù)據(jù)的安全狀態(tài)。以?xún)?nèi)存拷貝函數(shù)memcpy為例,進(jìn)行memcpy (j, 5, 用后,指針d指 向的數(shù)據(jù)的安全狀態(tài)將等于指針5指向的數(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é)各種漏洞類(lèi)型相關(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-nenative以上srp集由
34、4個(gè)元素組成,分別對(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)為so,表示其未被非可信數(shù)據(jù)污染并且未經(jīng)過(guò)任何安全檢查;當(dāng)此變量被賦了了一個(gè)非可信值后狀 態(tài)轉(zhuǎn)換到gwfals匕false, false),表示其受到非可信數(shù)據(jù)污染;在處于非可信狀態(tài)的變量經(jīng)過(guò)了上界檢查 后,其狀態(tài)轉(zhuǎn)換到true, true, false, false)或(true, false, true, false
35、),表示一個(gè)非口j信整數(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 jalsejalse),類(lèi)似 的,若變量被賦了了一個(gè)可信值,具狀態(tài)變?yōu)橥?。上界檢查與整型變量的符號(hào)類(lèi)型和密切相關(guān)。對(duì)于一個(gè)非可信的無(wú)符號(hào)整型變量,如果通過(guò)了一個(gè)與 其它數(shù)據(jù)進(jìn)行的上界比較判斷,貝u其狀態(tài)轉(zhuǎn)換為(tme, true, true/false, true/false) 對(duì)于非可信的有符號(hào)的整 型變最,需根據(jù)與之進(jìn)行比較的數(shù)據(jù)類(lèi)型決定其
36、狀態(tài)轉(zhuǎn)換: 通過(guò)了與常量進(jìn)行的上界比較判斷,則狀態(tài)轉(zhuǎn)換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 i 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, true/false, true/false,
37、 true)。圖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)整型變暈?zāi)芡ㄟ^(guò)使用帶符號(hào)比較判斷的上界合法性檢杏,但當(dāng)其被作為 內(nèi)存操作函數(shù)的長(zhǎng)度實(shí)參或數(shù)組索引時(shí),將被解禪為一個(gè)非常人的無(wú)符號(hào)正值從而導(dǎo)致一個(gè)緩沖區(qū)溢出或 非法地址訪(fǎng)問(wèn)漏洞。由于歷史原因,程序員往往忽視了這種有符號(hào)變量利無(wú)符號(hào)變量混用的危險(xiǎn),導(dǎo)致此 類(lèi)安全漏洞層出不窮。由此,在內(nèi)存操作(例如加幼7中,)和數(shù)組下標(biāo)等檢查點(diǎn)上,相關(guān)變量的合法安全
38、狀 態(tài)應(yīng)為以卜之一: s(); (true, true, truelfalse, true/false),標(biāo)識(shí)其通過(guò)了 一個(gè)無(wú)符號(hào)上界檢查; true, false, true, true),當(dāng)變量?jī)H僅通過(guò)了一個(gè)帶符號(hào)上界檢查吋,期望其為一非負(fù)值。否則將表明發(fā)現(xiàn)了一個(gè)可能的安全漏洞,例如將狀態(tài)mtrue, false, truejalse)變量作為memcpy函數(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)換。若
39、在檢查系統(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)化。如表i所示,對(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)變量為無(wú)符號(hào)數(shù)時(shí):任意上界比較(s, true, s3, $4)(s, 52, $3, $4)變量為有符號(hào)數(shù)時(shí):簾量上界比較、有符號(hào)上界比較g 仏"w $4)變量為有符號(hào)數(shù)時(shí):無(wú)符號(hào)上界比較(i'b true. s3.
40、54)2.5檢查點(diǎn)在使川漏洞狀態(tài)機(jī)対程序數(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)存分配、拷操作長(zhǎng)度、操操作長(zhǎng)度和操作地址緩沖區(qū)溢出、信kmalloc、kmem cache alloc 、貝,設(shè)置等操作地址若為非可信數(shù)據(jù),必息泄漏、非法內(nèi)memcpy >copyj'romuser 、作須經(jīng)過(guò)上界檢查或訪(fǎng)存訪(fǎng)問(wèn)等copyjo_iiser > me
41、mset 問(wèn)合法性檢查;數(shù)組索引索引非可信的索引數(shù)值應(yīng)非法內(nèi)存訪(fǎng)問(wèn)、數(shù)組元素引用,如arrayx經(jīng)過(guò)上界檢查非法函數(shù)調(diào)用等指針引用操作指針指針未被釋放過(guò)釋放后指針引用指針引用,如*”、p>q、循環(huán)循環(huán)次數(shù)非可信的索引數(shù)值應(yīng)死循環(huán)導(dǎo)致的拒經(jīng)過(guò)上界檢查絕服務(wù)需要特別指出的是,在linux內(nèi)核屮,copyjrom_user等函數(shù)既是可信邊界的入口,又是安全漏洞檢測(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ǔ)言開(kāi)發(fā)實(shí)際的目標(biāo)系統(tǒng)的漏洞檢測(cè)實(shí)驗(yàn)。3.1系統(tǒng)結(jié)構(gòu)圖4 delta系統(tǒng)結(jié)構(gòu)如圖4所示,delta系統(tǒng)首先對(duì)待檢
42、測(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)可能的安全漏洞將輸出相應(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ù)處理
43、工具將模擬真實(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、yacc描述腳本為基礎(chǔ)牛成相應(yīng)的詞法與語(yǔ)法分析器。在語(yǔ)法分析結(jié)朿后,將根據(jù)所獲得的語(yǔ)法元 索牛成靜態(tài)單賦值(static single assignment, ssa)形式的屮間代碼,屮間代碼將以基本塊(basic block)的形式組織在一起。 靜態(tài)檢測(cè)引擎靜態(tài)檢測(cè)引擎將首先根據(jù)源代碼函數(shù)間的調(diào)用圖(ca
44、ll 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è)對(duì)能的邏輯執(zhí)行路徑。在狀態(tài)機(jī)運(yùn)行過(guò)程中,引 擎將根據(jù)當(dāng)前操作和各個(gè)變量的安全狀態(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è)町能的安全漏洞,引擎將向用戶(hù)輸出和關(guān)漏洞上下文信息(主耍包括漏洞位置、數(shù)據(jù) 傳播路徑等)。在很多情況卜安全漏洞的產(chǎn)主跨越多個(gè)函數(shù)過(guò)
45、程,戾至是多個(gè)源文件。為了能有效檢測(cè)出這類(lèi) 安全漏洞,分析引擎應(yīng)能實(shí)施過(guò)程間(inter-procedural analysis)和文件間分析(inter-file analysis)0 過(guò)程間分析需要對(duì)暢數(shù)調(diào)用進(jìn)行跟蹤分析。若當(dāng)前語(yǔ)句為一個(gè)函數(shù)調(diào)用時(shí),將跟蹤被調(diào)用函數(shù)(callee) 的中間代碼:在分析完畢后,返回到調(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中,
46、每一種漏洞類(lèi)型模式對(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è)引擎將在這些點(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)
47、,完全源于內(nèi)核中的數(shù)據(jù)的安全性不會(huì)被用戶(hù)態(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)的可信邊界入 口類(lèi)型如表3所示:表3 linux內(nèi)核可信邊界入口可信邊界入口引入的非可信數(shù)據(jù)實(shí)例系統(tǒng)調(diào)用接口用戶(hù)態(tài)程序提供的調(diào)用參數(shù)sys_open、sys_read、 sysvvrite、sys_mknod>、sys_ioctll 等內(nèi)核態(tài)/用戶(hù)態(tài)數(shù)據(jù)交換例程拷貝自用戶(hù)態(tài)內(nèi)存的數(shù)據(jù)copymm_user get_us
48、er 等可執(zhí)行程序等用戶(hù)文件裝載解析載入內(nèi)核的用戶(hù)可構(gòu)造的文件數(shù)據(jù)linux binpnn->buf等在上表中所包括的可信邊界入口中,文件的裝載解析最容易被遺漏而導(dǎo)致漏報(bào)。事實(shí)上,linux內(nèi)核在 裝載可執(zhí)行程序等文件時(shí),會(huì)從這些文件中引入影響內(nèi)核操作的數(shù)據(jù)。例如,裝載執(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ì)最為常見(jiàn)的漏洞類(lèi)型,作者實(shí)現(xiàn)了 5個(gè)基于漏洞狀態(tài)機(jī)的檢杳器,分別用于檢測(cè)緩沖區(qū)溢出、非 法數(shù)組下標(biāo)與非法指針引用、空指針引用、內(nèi)存泄漏等類(lèi)型漏洞,相應(yīng)的漏洞檢測(cè)設(shè)置見(jiàn)表4。表
49、4漏洞檢測(cè)設(shè)置漏洞類(lèi)型描述漏洞狀態(tài)機(jī)設(shè)置檢查點(diǎn)操作長(zhǎng)度引發(fā)當(dāng)根據(jù)一個(gè)未經(jīng)上界檢驗(yàn)的非可非可信數(shù)據(jù)源設(shè)置merncpy .copy_from_user 、 getuser *的緩沖區(qū)溢出信操作長(zhǎng)度數(shù)進(jìn)行內(nèi)存拷貝時(shí),可見(jiàn)表2;非可信上界_copy_from_userji等內(nèi)核兩數(shù),期望狀態(tài)為能會(huì)引發(fā)內(nèi)核堆/棧緩沖區(qū)溢出檢杳數(shù)據(jù)狀態(tài)轉(zhuǎn)換參見(jiàn)2.4節(jié)so、(true, true, truelfalse, 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)存訪(fǎng) 問(wèn)和內(nèi)存耗盡同上km
50、allocy kmemjcache_alloc memset 等內(nèi)核函 數(shù),期望狀態(tài)同上倍息泄露當(dāng)根據(jù)一個(gè)未經(jīng)上界檢驗(yàn)的非可 信操作長(zhǎng)度數(shù)進(jìn)行內(nèi)核態(tài)至用戶(hù) 態(tài)數(shù)據(jù)交換時(shí),可能會(huì)引發(fā)關(guān)鍵的 內(nèi)核書(shū)記泄露同上copyjojuser put_iiser、_copyjo_userjl 內(nèi) 核函數(shù),期望狀態(tài)同上非法數(shù)組下標(biāo)將一個(gè)未經(jīng)上界檢驗(yàn)的非可信數(shù)同上數(shù)組元索引用,arrayx,期望狀態(tài)同上;及循環(huán)次數(shù)據(jù)作為數(shù)組下標(biāo)時(shí)可能會(huì)引發(fā)菲 法內(nèi)存訪(fǎng)問(wèn);當(dāng)將其作為循環(huán)次數(shù)(上界)時(shí)會(huì)引發(fā)死循環(huán)循環(huán)次數(shù)判斷,當(dāng)循環(huán)變量與循環(huán)上界比較為 無(wú)符號(hào)比較時(shí),期望狀態(tài)同上,否則期望狀態(tài) 為呦、(true, true, tr
51、ue/false, true/false)或(true, true/false, true, true/false)引用釋放后的通過(guò)一個(gè)已經(jīng)釋放了的指針訪(fǎng)問(wèn)當(dāng)一指針被釋放后,指針引用,如*p、p->q等,期望狀態(tài)為(false)指針數(shù)據(jù),可能引發(fā)非法內(nèi)存訪(fǎng)問(wèn)其狀態(tài)被置為(皿), 在重新掛指針后其 狀態(tài)置為血/影)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è)為例,如下表所
52、示,delta 檢測(cè)出了 7個(gè)真實(shí)的漏洞,準(zhǔn)確率達(dá)到了 31.8%0和cqual與coverity對(duì)linux內(nèi)核檢測(cè)結(jié)果的比較如表5所示。表5緩沖區(qū)溢出漏洞檢測(cè)結(jié)果及比較檢測(cè)系統(tǒng)報(bào)告漏洞數(shù)真實(shí)漏洞數(shù)準(zhǔn)確率delta2273l8%cqual26462.2%coverity1241512%delta所檢測(cè)出的所有漏洞分布情況是:操作長(zhǎng)度引發(fā)的緩沖區(qū)溢出7個(gè),非法內(nèi)存操作個(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)道。由上表可見(jiàn),delta系統(tǒng)對(duì)linux內(nèi)核的檢測(cè)準(zhǔn)確率高于cqual cove
53、rity系統(tǒng),即具有較低的誤報(bào)率。和對(duì)于coverity ifu g, delta檢測(cè)出的安全漏洞總數(shù)較少。原因 在于:coverity實(shí)施了超過(guò)50個(gè)的檢查器,在對(duì)緩沖區(qū)溢出的檢測(cè)方面,覆蓋了各種引發(fā)緩沖區(qū)溢出的因 索。而delta的主要口標(biāo)在于檢驗(yàn)本文方法在降低漏報(bào)與誤報(bào)方面的效果,僅實(shí)現(xiàn)了對(duì)操作長(zhǎng)度引發(fā)的緩 沖區(qū)溢岀漏洞的檢測(cè)。雖然如此,在同樣覆蓋的漏洞類(lèi)型上,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ū)溢出漏洞,雖然在
54、copy_from_user兩數(shù)引用有符號(hào)整型變量len前對(duì)具進(jìn)行了合法性檢查(將其與一個(gè)常量 elf_prargsz進(jìn)行比較,程序1228行),但通過(guò)賦予其一個(gè)負(fù)的長(zhǎng)度值就能繞開(kāi)此檢杏。因 此,當(dāng)調(diào)用copyjrom_user函數(shù)時(shí)(程序1230行)將會(huì)引發(fā)一個(gè)內(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對(duì)上述代碼進(jìn)行檢測(cè)時(shí),變量07來(lái)白2個(gè)非可信數(shù)據(jù)的計(jì)算結(jié)果(程序1227行), 這是因?yàn)橛脩?hù)能夠通過(guò)裝載一個(gè)惡意構(gòu)造的二進(jìn)制文件來(lái)控制當(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彳亍的判斷為 假時(shí),表明其通過(guò)了一個(gè)有符號(hào)的上界檢查,安全狀態(tài)轉(zhuǎn)換為(true, false, true, false)delta在 copyjrom_user函數(shù)處設(shè)置了檢查點(diǎn),対其笫3個(gè)參數(shù)安全狀態(tài)進(jìn)行檢查,期望對(duì)應(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ù)中,存在一個(gè)非法內(nèi)存訪(fǎng)問(wèn)漏洞和一個(gè)內(nèi)核緩沖區(qū)溢出漏洞。與上例類(lèi)似,rdwr_arg.nmsgs為一個(gè)非可信數(shù) 據(jù),其未經(jīng)檢查就被引用為循環(huán)上限和數(shù)組下標(biāo),將導(dǎo)致非法地址訪(fǎng)問(wèn)或死循環(huán);此外,笫279 行使用未經(jīng)檢杏的非可信數(shù)據(jù)作為copyjrom_user的操作長(zhǎng)度參數(shù),將導(dǎo)致一個(gè)緩沖區(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特別重要的是,實(shí)驗(yàn)還發(fā)現(xiàn)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《修改DIY飾品坊》課件
- 醫(yī)院財(cái)務(wù)自糾報(bào)告范文
- 影像學(xué)診斷兒童肝膽疾病
- 2025年西安貨運(yùn)從業(yè)資格證模擬考試下載什么軟件
- 2025年遵義貨車(chē)從業(yè)資格證考什么
- 教師硬筆書(shū)法培訓(xùn)講座
- 2025年安徽貨運(yùn)從業(yè)資格證技巧
- 《故宮博物院公開(kāi)》課件
- 《魚(yú)類(lèi)的營(yíng)養(yǎng)價(jià)值》課件
- 《保障安全發(fā)展》課件
- 包裝裝潢承印五項(xiàng)制度登記表
- 可比樓盤(pán)量化定價(jià)法
- xxxxx年豬文化節(jié)
- 鋼結(jié)構(gòu)項(xiàng)目技術(shù)服務(wù)和售后服務(wù)內(nèi)容及措施
- 第二語(yǔ)言習(xí)得理論概述
- 水景施工工藝(包括防水)
- DAC數(shù)模轉(zhuǎn)換實(shí)驗(yàn)報(bào)告
- 散貨船持證清單
- 公路巡查記錄表格模板
- 師德師風(fēng)整改臺(tái)賬23668
- 河海大學(xué)水資源規(guī)劃及利用復(fù)習(xí)知識(shí)點(diǎn).
評(píng)論
0/150
提交評(píng)論