摘 要:軟件受到攻擊后將在所執(zhí)行的系統(tǒng)調(diào)用狀況中有所體現(xiàn),因此可將基于系統(tǒng)調(diào)用的入侵檢測技術(shù)應(yīng)用于軟件漏洞的檢測。本文針對無源碼的可執(zhí)行程序,引入系統(tǒng)調(diào)用節(jié)點(diǎn)和系統(tǒng)調(diào)用上下文信息的概念來刻畫軟件行為的動態(tài)特性和漏洞的位置信息,利用改進(jìn)的STIDE算法構(gòu)造軟件正常行為特征庫來檢測并定位漏洞。實(shí)驗(yàn)結(jié)果表明該方法能夠準(zhǔn)確獲取軟件行為信息,且具有較強(qiáng)的漏洞檢測能力。
關(guān)鍵詞:漏洞檢測;行為建模;系統(tǒng)調(diào)用短序列;STIDE算法;函數(shù)調(diào)用鏈
中圖分類號:TP393.08 文獻(xiàn)標(biāo)識碼:A
1 引言(Introduction)
軟件漏洞是存在于軟件系統(tǒng)內(nèi)的一組弱點(diǎn)或缺陷,這組弱點(diǎn)或缺陷被惡意主體(攻擊者或攻擊程序)加以利用,可達(dá)到訪問未授權(quán)信息或損壞系統(tǒng)的目的。軟件由于其功能及行為的復(fù)雜性不可避免地存在一些漏洞,這給整個軟件系統(tǒng)帶來了極大的隱患。傳統(tǒng)的漏洞檢測技術(shù)分為針對源代碼進(jìn)行檢查的靜態(tài)檢測技術(shù)和在缺少源代碼的情況下對軟件漏洞進(jìn)行檢測和防護(hù)的動態(tài)檢測技術(shù),但這些技術(shù)僅能檢測出已知漏洞類型,能檢測的對象有限,且存在檢測規(guī)模大、誤報率高等缺點(diǎn)[1]。
研究表明,軟件受到攻擊后將在所執(zhí)行的系統(tǒng)調(diào)用狀況中有所體現(xiàn),并且系統(tǒng)調(diào)用之間的關(guān)系也在一定程度上反映了軟件的分支結(jié)構(gòu)。考慮到軟件系統(tǒng)在未遭到攻擊時,安全漏洞(而非引起系統(tǒng)崩潰的錯誤)并未給系統(tǒng)造成損失,可在軟件系統(tǒng)交付使用后,當(dāng)其遭到攻擊的時候攔截攻擊并檢測出漏洞以便日后進(jìn)行修補(bǔ)[2-5]。因此將基于系統(tǒng)調(diào)用的入侵檢測技術(shù)應(yīng)用于軟件漏洞的檢測是很有必要的。
本文針對無源碼的可執(zhí)行程序,提出一種基于系統(tǒng)調(diào)用短序列的軟件漏洞檢測方法。將目標(biāo)程序在安全環(huán)境下運(yùn)行,監(jiān)測其系統(tǒng)調(diào)用序列和堆棧信息,利用改進(jìn)的STIDE算法將系統(tǒng)調(diào)用序列“分割”為短序列,并建立正常行為特征庫和位置信息庫。再將目標(biāo)程序暴露于攻擊下,采用同樣的算法得到短序列進(jìn)行模式匹配,通過計算橫向異常值和縱向異常值來判斷是否發(fā)生行為偏離。當(dāng)行為偏離超過閾值時告警,并根據(jù)可疑系統(tǒng)調(diào)用的位置特征與位置信息庫中的位置特征進(jìn)行比對,定位漏洞。
2 相關(guān)研究(Correlational research)
目前對軟件行為的動態(tài)檢測大多采用異常檢測方式,在可信環(huán)境下通過靜態(tài)分析軟件代碼或者動態(tài)監(jiān)控軟件實(shí)例,從中提取軟件行為特征建立軟件的正常行為模型,然后監(jiān)控軟件的實(shí)際運(yùn)行,提取其行為特征并與正常行為模型進(jìn)行比較。如果軟件行為發(fā)生的偏差超過指定閾值,則判定軟件行為不可信。
目前軟件行為模型已經(jīng)取得了一些研究成果,按照不同的組織模式,相關(guān)研究主要包括基于短序列的N-gram模型[5]、Var-gram模型[6],以及引入系統(tǒng)調(diào)用頻率特性[7]、數(shù)據(jù)挖掘理論或隱式馬爾可夫鏈的模型;基于自動機(jī)的FSA模型、Abstract Stack模型、Call Graph模型、Execution Graph模型;基于系統(tǒng)調(diào)用參數(shù)的Dyck模型、DTEMSB-BTCS模型;基于虛擬路徑的Vt-Path模型、VPstatic模型。
現(xiàn)有研究將基于系統(tǒng)調(diào)用的入侵檢測模型應(yīng)用于漏洞檢測技術(shù),具體方法為:采用動態(tài)訓(xùn)練方式,結(jié)合系統(tǒng)調(diào)用的PC值構(gòu)造出程序執(zhí)行路徑的有限狀態(tài)自動機(jī),自動機(jī)的節(jié)點(diǎn)為系統(tǒng)調(diào)用對應(yīng)的PC值,而狀態(tài)轉(zhuǎn)換為系統(tǒng)調(diào)用。當(dāng)每個系統(tǒng)調(diào)用發(fā)生時,在檢測程序中存儲當(dāng)前的函數(shù)堆棧,根據(jù)異常發(fā)生的狀態(tài)機(jī)所屬函數(shù)來判斷可能的函數(shù)漏洞在哪個函數(shù)中?;跔顟B(tài)機(jī)的漏洞檢測方法需要建立自動機(jī),存在時間、空間消耗較大及不可能路徑等問題。
針對上述已有技術(shù)存在的不足,本文將基于系統(tǒng)調(diào)用短序列模型和STIDE算法加以改進(jìn)并應(yīng)用于軟件漏洞檢測,其目的在于發(fā)揮短序列模型匯聚時間短、運(yùn)行時間負(fù)載較低的優(yōu)勢,同時克服由于缺乏定位信息和系統(tǒng)調(diào)用上下文信息導(dǎo)致模型對上下文不敏感、粒度粗等缺點(diǎn),增強(qiáng)了模型的檢測能力。
3 基于系統(tǒng)調(diào)用短序列的軟件漏洞檢測模型
(Software vulnerability detection model based on
short sequence of system calls)
3.1 基本概念
定義1:系統(tǒng)調(diào)用短序列SCS(System Call Sequence)是指包含一定數(shù)量的系統(tǒng)調(diào)用節(jié)點(diǎn)的有序集合:
其中,n表示短序列長度,SC表示系統(tǒng)調(diào)用節(jié)點(diǎn)。
定義2:系統(tǒng)調(diào)用節(jié)點(diǎn)SC(System Call)是指含有系統(tǒng)調(diào)用相關(guān)信息的一個系統(tǒng)調(diào)用向量:
其中,SCI表示系統(tǒng)調(diào)用基本信息,SCP表示系統(tǒng)調(diào)用屬性,SCC表示系統(tǒng)調(diào)用上下文。這三個向量值唯一標(biāo)識一個系統(tǒng)調(diào)用節(jié)點(diǎn)。
定義3:系統(tǒng)調(diào)用基本信息SCI(System Call Information):
其中,SysCall_No表示系統(tǒng)調(diào)用號,SysCall_Name表示系統(tǒng)調(diào)用名。
定義4:系統(tǒng)調(diào)用屬性SCP(System Call Properties):
其中,n()表示系統(tǒng)調(diào)用參數(shù)個數(shù),SysCallArg表示系統(tǒng)調(diào)用參數(shù)。
定義5:系統(tǒng)調(diào)用上下文信息SCC(System Call Context):
其中,PC表示當(dāng)前系統(tǒng)調(diào)用發(fā)生時的PC值,CSV表示函數(shù)調(diào)用鏈值,通過如下算式得到:
CS(Call Stack)為函數(shù)調(diào)用鏈,當(dāng)系統(tǒng)調(diào)用發(fā)生時,記錄函數(shù)堆棧里的返回地址所對應(yīng)的函數(shù)名稱,并將其存于位置信息庫CS_Table中,作為該表索引:
即調(diào)用了,調(diào)用了,…,調(diào)用了。其中,n表示函數(shù)調(diào)用鏈的長度。
上述系統(tǒng)調(diào)用信息的獲取采用修改中斷向量表的方法,準(zhǔn)確高效。函數(shù)返回地址與名稱的對應(yīng)方法參考ELF文件格式分析方法,從可執(zhí)行ELF文件中提取出相對地址對應(yīng)的函數(shù)名稱。
3.2 模型概述
基于系統(tǒng)調(diào)用短序列的軟件安全漏洞檢測模型,如圖1所示,分為兩個階段:離線訓(xùn)練階段與在線檢測階段。離線訓(xùn)練階段要求目標(biāo)軟件在安全環(huán)境下運(yùn)行,在線檢測階段則將目標(biāo)軟件曝露于惡意攻擊中。
(1)離線訓(xùn)練
在離線訓(xùn)練階段,由于系統(tǒng)調(diào)用序列是動態(tài)生成的,因此采用STIDE算法以固定長度值為n的滑動窗口對正常行為序列進(jìn)行掃描,將生成的一系列短序列存儲到正常行為特征庫中。正常行為特征庫是由一系列上述系統(tǒng)調(diào)用短序列組成的,n為滑動窗口大小也即短序列長度。此外,還需維護(hù)一個位置信息庫CS_Table,記錄函數(shù)調(diào)用鏈,其索引是。
(2)在線檢測
在線檢測階段中,同樣采用STIDE滑動窗口機(jī)制,STIDE算法使用計算海明距離的方法來判定待測序列中的異常發(fā)生情況。此外,針對系統(tǒng)調(diào)用節(jié)點(diǎn)SC的變動,相應(yīng)改進(jìn)STIDE匹配算法,給出定位算法。
3.3 改進(jìn)的STIDE算法及定位算法
第一步,采用長度為n、步長為1的滑動窗口機(jī)制對正常行為產(chǎn)生的系統(tǒng)調(diào)用序列進(jìn)行掃描,并記錄每個窗口內(nèi)各個系統(tǒng)調(diào)用節(jié)點(diǎn)從自身i開始到其后n-1個位置所生成的短序列。,以這種包含系統(tǒng)調(diào)用節(jié)點(diǎn)之間的位置關(guān)系信息的短序列SCS為結(jié)果建立特征庫,并將其存儲至描述正常行為的特征庫中。
第二步,用同樣的方式將未知行為的系統(tǒng)調(diào)用序列進(jìn)行劃分,與已建立的包含正常行為的數(shù)據(jù)庫進(jìn)行短序列元素關(guān)系匹配,匹配算法如下:
(1)系統(tǒng)調(diào)用節(jié)點(diǎn)匹配算法:對待測的系統(tǒng)調(diào)用節(jié)點(diǎn)SC,計算系統(tǒng)調(diào)用偏差值D。
其中,為當(dāng)前待匹配的系統(tǒng)調(diào)用節(jié)點(diǎn)元素的字符串拼接,為特征庫中系統(tǒng)調(diào)用節(jié)點(diǎn)元素的字符串拼接。
當(dāng)時,系統(tǒng)調(diào)用無偏差,與匹配;
當(dāng)時,系統(tǒng)調(diào)用無偏差,與匹配;
當(dāng)時,系統(tǒng)調(diào)用有偏差,與不匹配。
的取值與Hash函數(shù)的選擇有關(guān),在實(shí)現(xiàn)時采用安全套接層工具包OpenSSL包默認(rèn)的散列函數(shù)來計算系統(tǒng)調(diào)用上下文值。
(2)系統(tǒng)調(diào)用短序列偏差值算法:對待測系統(tǒng)調(diào)用短序列,計算其與特征庫中短序列的系統(tǒng)調(diào)用短序列偏差值。
其中,為滑動窗口大小,為短序列中第個系統(tǒng)調(diào)用節(jié)點(diǎn)與中第個系統(tǒng)調(diào)用節(jié)點(diǎn)的系統(tǒng)調(diào)用偏差值。
(3)對待測序列采用滑動窗口機(jī)制劃分系統(tǒng)調(diào)用短序列,計算該序列對比特征庫中每條短序列的海明距離,記錄最小值,記為待測短序列的最小海明距離。
其中,為短序列與中系統(tǒng)調(diào)用節(jié)點(diǎn)的不匹配個數(shù),匹配算法采用系統(tǒng)調(diào)用節(jié)點(diǎn)匹配算法。
(4)找到特征庫中與待測短序列匹配后海明距離最小的,記為。采用系統(tǒng)調(diào)用短序列偏差值算法,計算與的系統(tǒng)調(diào)用短序列偏差值??赡艽嬖诙鄠€,選取最小的系統(tǒng)調(diào)用短序列偏差值,記為待測短序列的最小系統(tǒng)調(diào)用短序列偏差值。
(5)計算橫向異常值和縱向異常值。
其中,為待測系統(tǒng)調(diào)用短序列,橫向異常值記錄當(dāng)前所有待測系統(tǒng)調(diào)用短序列的最小海明距離的最大值。縱向異常值記錄當(dāng)前所有待測系統(tǒng)調(diào)用短序列的最小系統(tǒng)調(diào)用短序列偏差值的最大值。
(6)當(dāng)橫向異常值和縱向異常值超過一定閾值,則掛起用戶進(jìn)程。兩個閾值的選取分別基于滑動窗口大小和(1)中值的大小。接著從最近一次未超過閾值的短序列中,找到系統(tǒng)調(diào)用偏差值D最大的系統(tǒng)調(diào)用節(jié)點(diǎn)的值,并在位置信息庫CS_Table中找出對應(yīng)的函數(shù)調(diào)用鏈CS到當(dāng)前系統(tǒng)調(diào)用節(jié)點(diǎn)的函數(shù)調(diào)用鏈CS,這之間判為可疑漏洞的位置。
4 實(shí)驗(yàn)及分析(Experiment and analysis)
4.1 實(shí)驗(yàn)環(huán)境及實(shí)驗(yàn)方法
實(shí)驗(yàn)主機(jī)的硬件配置為:CPU為主頻2.53GHz的Intel(R) Core(TM)2 Duo T9400,內(nèi)存為4.00 GB;運(yùn)行內(nèi)核版本為2.6.32的redhat 6.5操作系統(tǒng),編譯器版本為gcc4.4.7。
在上述實(shí)驗(yàn)環(huán)境下進(jìn)行了模型實(shí)現(xiàn),實(shí)現(xiàn)方法如下:在離線階段,首先為系統(tǒng)新增一個LKM模塊,用來修改中斷向量表和恢復(fù)中斷服務(wù)程序。其次獲取當(dāng)前系統(tǒng)調(diào)用并保存相關(guān)信息。隨后將截獲的系統(tǒng)調(diào)用劃分成短序列,并輸出到短序列集合文件中。最后讀入該文件,構(gòu)造系統(tǒng)調(diào)用短序列森林,形成正常行為特征庫。
在線檢測階段采用CVE漏洞庫中sendmail進(jìn)程的exploit來攻擊sendmail進(jìn)程,獲得異常數(shù)據(jù)。獲取異常行為與離線階段的方法一致。此外,獲取當(dāng)前系統(tǒng)調(diào)用時的ebp進(jìn)行?;厮?,將函數(shù)堆棧的所有返回地址存于返回地址集合文件,并根據(jù)改進(jìn)的STIDE算法在特征庫中進(jìn)行匹配,主要工作如下:
①計算橫向異常值和縱向異常值;
②根據(jù)異常值偏差程度報告漏洞檢測結(jié)果;
③如果異常值未超出閾值,則調(diào)用原系統(tǒng)調(diào)用;如果超出閾值,則報警并結(jié)束進(jìn)程。
圖2和圖3分別展示了離線訓(xùn)練階段和在線檢測階段的實(shí)現(xiàn)流程。
4.2 閾值確定
本文針對sendmail漏洞進(jìn)行了實(shí)驗(yàn),實(shí)驗(yàn)常值如表1所示。
針對不同的異常值取值,選取部分漏洞和正常數(shù)據(jù)進(jìn)行異常度測試,統(tǒng)計同一閾值下各漏洞的異常度,計算其標(biāo)準(zhǔn)偏差的方差。實(shí)驗(yàn)采用大小為30的局部幀,異常度為不匹配數(shù)目。
實(shí)驗(yàn)結(jié)果表明縱向異常值閾值取3、橫向異常值閾值取36時,方差最小,異常度聚合程度最高。
4.3 漏洞檢測能力
根據(jù)上述閾值,針對不同漏洞檢測其漏洞所在函數(shù)及函數(shù)所在文件,實(shí)驗(yàn)結(jié)果如表2所示。
參照漏洞標(biāo)準(zhǔn)描述,其中四個漏洞所在函數(shù)和存在文件與披露的漏洞所在文件一致,其余兩個漏洞未披露漏洞所在文件,但檢測報告中函數(shù)調(diào)用鏈與披露的漏洞成因一致。
5 結(jié)論(Conclusion)
目前基于系統(tǒng)調(diào)用的軟件行為研究方興未艾,漏洞的在線檢測方法更是研究熱點(diǎn)之一?;谙到y(tǒng)調(diào)用短序列的軟件漏洞檢測模型引入系統(tǒng)調(diào)用節(jié)點(diǎn)和系統(tǒng)調(diào)用上下文信息的概念來刻畫軟件行為的動態(tài)特性和漏洞的位置信息,利用改進(jìn)的STIDE算法構(gòu)造軟件正常行為特征庫來檢測并定位漏洞。實(shí)驗(yàn)結(jié)果表明模型能夠準(zhǔn)確獲取軟件行為信息,也具有較強(qiáng)的漏洞檢測能力。
參考文獻(xiàn)(References)
[1] Simple Nomad.Sendmail 8.12.x-'X-header' Remote Heap Buffer Overflow Vulnerability[EB/OL].https://www.exploit-db.com/exploits/32995.
[2] redsand.Sendmail<=8.13.5-Remote Signal Handling Exploit PoC[EB/OL].[2014-6-12].https://www.exploit-db.com/exploits/2051.
[3] Giffin J T,et al.Environment-Sensitive Intrusion Detection[J].Lecture Notes in Computer Science,2006:185-206.
[4] 傅建明,等.基于對象的軟件行為模型[J].軟件學(xué)報,2011,
22(11):2716-2728.
[5] 忽朝儉,等.基于可執(zhí)行代碼的漏洞檢測技術(shù)[J].清華大學(xué)學(xué)報:自然科學(xué)版,2009,S2:225-233.
[6] 張林,曾慶凱.軟件安全漏洞的靜態(tài)檢測技術(shù)[J].計算機(jī)工程,2008,(12):157-159.
[7] 單國棟,戴英俠,王航.計算機(jī)漏洞分類研究[J].計算機(jī)工程,2002,28(10):3-6.
作者簡介:
葛立欣(1970-),男,碩士,副教授.研究領(lǐng)域:計算機(jī)網(wǎng)絡(luò),
軟件工程.