賈疏桐 桂燦 蘇星宇
摘要:如今,信息技術(shù)高速發(fā)展,各式各樣的軟件如雨后春筍一般出現(xiàn)。然而,由于軟件自身存在的漏洞而被攻擊的事件也屢見不鮮,緩沖區(qū)溢出漏洞便是其中的代表之一。伴隨信息安全技術(shù)的不斷發(fā)展,緩沖區(qū)溢出漏洞的檢測技術(shù)也在不斷發(fā)展。該文將首先介紹有關(guān)緩沖區(qū)及緩沖區(qū)溢出漏洞的知識(shí),再闡述近幾年關(guān)于緩沖區(qū)溢出漏洞檢測的新技術(shù),最后是對(duì)關(guān)于緩沖區(qū)未來可能發(fā)展地探討,以期讀者可以對(duì)緩沖區(qū)溢出漏洞及其相關(guān)檢測技術(shù)有大致的認(rèn)識(shí)。
關(guān)鍵詞:緩沖區(qū);緩沖區(qū)溢出漏洞;緩沖區(qū)漏洞檢測技術(shù)
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2020)13-0057-03
1緒言
今天的大多數(shù)計(jì)算機(jī)系統(tǒng)都給予馮·諾依曼體系結(jié)構(gòu),其中一個(gè)重要思想就是將數(shù)據(jù)和程序均放到同樣的存儲(chǔ)空間中,使得攻擊者很容易利用緩沖區(qū)溢出漏洞進(jìn)行攻擊。而且C/c++迄今為止仍然是最流行的語言,將其作為開發(fā)語言的項(xiàng)目和軟件也不計(jì)其數(shù)。然而C/C++提供了大量的封裝函數(shù)使得技術(shù)人員可以直接或間接的手動(dòng)操作和分配內(nèi)存,這也恰恰造成了緩沖區(qū)溢出漏洞的產(chǎn)生。一旦數(shù)據(jù)的移動(dòng),API的調(diào)用缺少所需的邊界檢測或輸入長度驗(yàn)證時(shí)就極易發(fā)生緩沖區(qū)溢出漏洞,輕則會(huì)使編輯器拋出異常,程序無法正常執(zhí)行,重則會(huì)造成內(nèi)存泄漏,數(shù)據(jù)被惡意篡改,甚至被黑客利用以達(dá)到不法目的。
根據(jù)CNNVD 2020年以來每周的漏洞報(bào)告文檔中,緩沖區(qū)溢出漏洞的所占總漏洞數(shù)量的百分比一直高居前五。360CERT發(fā)布2017年漏洞態(tài)勢一回顧及分析中緩沖區(qū)溢出漏洞所占的比例高達(dá)16.66%。在中國科學(xué)院大學(xué)國家計(jì)算機(jī)網(wǎng)絡(luò)入侵防范中心發(fā)布的2019年1月十大重要安全漏洞分析中將緩沖區(qū)溢出漏洞作為第九名,在2019年2月十大重要安全漏洞分析也有多個(gè)漏洞問題涉及緩沖區(qū)。因此本文針對(duì)近幾年出現(xiàn)的緩沖區(qū)溢出漏洞技術(shù)進(jìn)行整理、分析、探討和總結(jié),以期幫助科技人員進(jìn)行更好的研究及應(yīng)用。
本文將首先介紹有關(guān)緩沖區(qū)溢出漏洞的基本知識(shí),幫助讀者建立一個(gè)基本的知識(shí)框架,其次將近幾年新出現(xiàn)的緩沖區(qū)漏洞溢出檢測技術(shù)進(jìn)行分類并在分類的基礎(chǔ)上對(duì)一些典型或新出現(xiàn)的技術(shù)進(jìn)行闡述,最后對(duì)論文進(jìn)行總結(jié),并提出未來可能的熱點(diǎn)研究方向。
2緩沖區(qū)溢出漏洞的基礎(chǔ)知識(shí)
2.1棧緩沖區(qū)溢出
緩沖區(qū)溢出是指當(dāng)計(jì)算機(jī)要填充的數(shù)據(jù)長度超過緩沖區(qū)自身所規(guī)定容量,溢出的數(shù)據(jù)覆蓋了合法數(shù)據(jù)或影響到了指令的執(zhí)行。在實(shí)際情況下,絕大多數(shù)程序都會(huì)假設(shè)所提供的數(shù)據(jù)長度小于等于所分配的緩沖區(qū)空間,且一般不會(huì)主動(dòng)檢測邊界條件。這就為緩沖區(qū)溢出漏洞的產(chǎn)生埋下了伏筆。操作系統(tǒng)使用的緩沖區(qū),主要為堆和堆棧,緩沖區(qū)漏洞溢出最致命的即“堆和堆棧溢出”。
堆棧(簡稱棧)是操作系統(tǒng)提供的一種先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu),操作系統(tǒng)一般提供了兩個(gè)專門的寄存器來存儲(chǔ)棧頂指針和棧底指針,其中ESP寄存器存儲(chǔ)指向棧頂?shù)闹羔槪珽BP寄存器存儲(chǔ)指向棧底的指針,EIP寄存器存儲(chǔ)了下一條指令執(zhí)行的地址。棧緩沖區(qū)溢出的本質(zhì)即某個(gè)棧幀發(fā)生溢出,且溢出的內(nèi)容覆蓋了EIP寄存器的內(nèi)容,改變了原本下一條指令的地址,從而導(dǎo)致程序無法正常執(zhí)行或被黑客利用執(zhí)行惡意代碼m。因此棧溢出多發(fā)生在程序調(diào)用或?qū)彌_區(qū)操作的情況下。
2.2堆緩沖區(qū)溢出
堆也是一種基本的數(shù)據(jù)結(jié)構(gòu),它是可由程序員自行分配,由低地址向高地址增長的不連續(xù)的線性內(nèi)存區(qū)域。堆溢出是指程序向某個(gè)堆塊中寫入的字節(jié)數(shù)超過了堆塊本身可使用的字節(jié)數(shù)(之所以是可使用而不是用戶申請(qǐng)的字節(jié)數(shù),是因?yàn)橄到y(tǒng)會(huì)對(duì)用戶所申請(qǐng)的字節(jié)數(shù)進(jìn)行調(diào)整,這也導(dǎo)致可利用的字節(jié)數(shù)都不小于用戶申請(qǐng)的字節(jié)數(shù)),因而導(dǎo)致了數(shù)據(jù)溢出,并覆蓋到物理相鄰的高地址的下一個(gè)堆塊。堆緩沖區(qū)溢出并不像棧緩沖區(qū)溢出一樣可以控制EIP,其精髓為精心構(gòu)造的數(shù)據(jù)去溢出下一個(gè)塊的塊首,改寫塊首中的前向指針和后向指針,從而訪問任意內(nèi)存區(qū)域。
3靜態(tài)檢測技術(shù)
緩沖區(qū)溢出漏洞一直是計(jì)算機(jī)研究領(lǐng)域的一個(gè)活躍的研究主題,關(guān)于其檢測技術(shù)亦不斷更新。靜態(tài)檢測技術(shù)擁有無須運(yùn)行程序,消耗資源少,直接分析程序源碼并定準(zhǔn)問題所在位置,從而便于程序人員進(jìn)行修改等優(yōu)勢。然而由于缺乏程序運(yùn)行所能提供的信息,所以如何減少靜態(tài)檢測的誤報(bào)率和漏報(bào)率一直是評(píng)判靜態(tài)檢測技術(shù)的兩個(gè)重要指標(biāo)嘲。除此之外,吞吐量也是檢驗(yàn)靜態(tài)檢測技術(shù)是否實(shí)時(shí)、高效的標(biāo)準(zhǔn)之一。
Peng Luo等人通過研究發(fā)現(xiàn)有1/3的緩沖區(qū)溢出漏洞是有循環(huán)引起的,因此他們使用CIL實(shí)現(xiàn)了DBloop用來定位可以引起緩沖區(qū)溢出的循環(huán)。DBloop主要使用數(shù)組和指針分析循環(huán)和數(shù)據(jù)移動(dòng)的相應(yīng)操作,以定位循環(huán)緩沖區(qū)溢出(BoF)。DBloop的關(guān)鍵步驟是首先獲取緩沖區(qū)的大小,例如數(shù)組或分配的堆內(nèi)存塊的大小,然后檢查目標(biāo)循環(huán)的數(shù)據(jù)移動(dòng)是否超出了緩沖區(qū)的范圍。具體來說,DBloop包含四個(gè)步驟來本地化循環(huán)BoF:(1)使用數(shù)組或指針識(shí)別包含數(shù)據(jù)移動(dòng)操作的可疑循環(huán)。(2)對(duì)目標(biāo)循環(huán)應(yīng)用代碼切片,并根據(jù)循環(huán)是否嵌套以及循環(huán)是否包含路徑對(duì)目標(biāo)循環(huán)進(jìn)行分類。(3)執(zhí)行可追蹤性分析以獲得緩沖區(qū)的界限。使用約束求解標(biāo)識(shí)BoF。他們使用DBloop分析從60個(gè)應(yīng)用程序中收集到的68個(gè)漏洞并與商業(yè)工具Checkmarx和開放源代碼工具Splint分析出的結(jié)果進(jìn)行對(duì)比,DBloop成功定位了由循環(huán)引起的57個(gè)BoF而Checkmarx和SDlint僅分別檢測到4個(gè)或3個(gè)。
Lili xu等人則將研究重點(diǎn)放在整數(shù)溢出導(dǎo)致到緩沖區(qū)溢出(IO2801)漏洞。他們認(rèn)為盡管已經(jīng)進(jìn)行了許多工作來減輕整數(shù)溢出,但是現(xiàn)有工具要么誤報(bào)率很高,要么吞吐量很低。為了解決這些問題,他們提出了一種新的靜態(tài)分析框架(LAID)。它首先利用過程間數(shù)據(jù)流分析和污點(diǎn)分析來準(zhǔn)確識(shí)別潛在的102BO漏洞。然后,它使用輕量級(jí)方法進(jìn)一步濾除誤報(bào)。具體來說,它生成表示可以觸發(fā)潛在102BO漏洞的條件的約束((int)check+1>INT_MAXAtrue∧(check==(inI)check)),并將約束反饋到SMT求解器以決定其可滿足性。他們已經(jīng)實(shí)現(xiàn)了基于LLVM的原型系統(tǒng)LAID,并在NIST的SAMATE Juliet測試套件的228個(gè)程序和現(xiàn)實(shí)世界中的6個(gè)已知的102BO漏洞中進(jìn)行了評(píng)估。實(shí)驗(yàn)結(jié)果表明,他們的提出的新的靜態(tài)框架可以有效地檢測所有已知的102BO漏洞。
周艷艷職極借鑒機(jī)器學(xué)習(xí)的思想和方法,并采用隨機(jī)森林算法構(gòu)建多顆決策樹對(duì)樣本進(jìn)行訓(xùn)練并預(yù)測。并針對(duì)決策樹算法的屬性分裂節(jié)點(diǎn)過程,將C4.5和分類回歸樹(CART)算法中選擇最優(yōu)屬性的信息熵理論計(jì)算方式進(jìn)行線性組合,從而形成一個(gè)最佳的計(jì)算最優(yōu)屬性的公式,進(jìn)而更好的選擇分類屬性,構(gòu)造決策樹。最終通過對(duì)決策樹采用多數(shù)投票機(jī)制對(duì)數(shù)據(jù)集進(jìn)行分類,在綜合考慮每個(gè)決策樹的權(quán)重因子的基礎(chǔ)上,得出最佳的分類結(jié)果。測試結(jié)果表明改進(jìn)后的隨機(jī)森林算法HWRF在分類精度、召回率、F度量值、AUC方面明顯優(yōu)于RF算法,CART算法和NB算法。HWRF算法能夠有效地檢測出緩沖區(qū)溢出攻擊,并且其識(shí)別的緩沖區(qū)溢出攻擊重要變量也能提高RF算法和NB算法的檢測性能。但在仿真實(shí)驗(yàn)部分,HWRF模型的創(chuàng)建時(shí)間略高于RF模型。
4動(dòng)態(tài)測試技術(shù)
動(dòng)態(tài)測試則類似于黑盒測試,依賴于充足的測試樣例,從而檢驗(yàn)程序的實(shí)際運(yùn)行記過與預(yù)期結(jié)果是否一致的分析方法。總的來講一些動(dòng)態(tài)測試技術(shù)通過提供大量生成的輸入來識(shí)別BoF,而另一些動(dòng)態(tài)技術(shù)則通過將特殊代碼插入程序或結(jié)合上述兩種方法來識(shí)別BoFVl。相比于靜態(tài)檢測技術(shù),動(dòng)態(tài)檢測技術(shù)的優(yōu)勢在于誤報(bào)率較低,也可以得知程序的實(shí)際運(yùn)行效果。但缺點(diǎn)是難以生成覆蓋全面的測試樣例,且消耗資源較多,漏報(bào)率較高。
Rui Zhang等人針對(duì)衛(wèi)星軟件中堆棧溢出的普遍問題,對(duì)RTEMS操作系統(tǒng)進(jìn)行了改進(jìn),以支持實(shí)時(shí)堆棧使用深度和溢出檢測。以基于TSC690F處理器的板載軟件為例,通過使用處理器提供的內(nèi)存訪問保護(hù)機(jī)制為每個(gè)線程堆棧設(shè)置可訪問區(qū)域和不可訪問區(qū)域。改進(jìn)的RTEMS通過上下文切換在線程之間共享訪問保護(hù)機(jī)制。陷阱處理程序旨在接管寫保護(hù)錯(cuò)誤陷阱,計(jì)算堆棧使用深度并實(shí)時(shí)監(jiān)視堆棧溢出。核心模塊性能測試和堆棧檢測實(shí)例驗(yàn)證表明,改進(jìn)的RTEMS對(duì)軟件性能的影響很小,因此軟件可以在線和實(shí)時(shí)檢測堆棧深度。通過使用這種方法,即使在堆棧溢出而不是失控崩潰的情況下,該軟件仍然是可管理的,并且提高了軟件的可靠性。
具體的檢測原理是:在RTEMS線程控制塊(TCB)中增加訪問保護(hù)寄存器作為變量的定義,即擴(kuò)展線程上下文的定義,使單個(gè)線程在運(yùn)行時(shí)可以獨(dú)占地使用處理器的訪問保護(hù)寄存器。不同的線程通過切換線程上下文共享處理器的訪問保護(hù)機(jī)制。在初始化期間,線程堆棧分為初始可訪問和不可訪問區(qū)域。隨著堆棧的增長,當(dāng)堆棧超過初始可訪問區(qū)域并試圖將數(shù)據(jù)寫入不可訪問區(qū)域時(shí),處理器將立即產(chǎn)生一個(gè)陷阱(type 0x9)。通過掛接相應(yīng)的陷阱處理程序,軟件重置線程不可訪問的堆棧區(qū)域,以擴(kuò)展可訪問區(qū)域。該方法能夠滿足堆棧的增長,保證軟件的正常運(yùn)行。該軟件可以根據(jù)可達(dá)區(qū)域的擴(kuò)展計(jì)算出當(dāng)前堆棧的深度。隨著堆棧的增長,當(dāng)軟件觸發(fā)陷阱并發(fā)現(xiàn)不可訪問區(qū)域小于或等于1k字節(jié)時(shí),假設(shè)線程堆棧即將溢出。此時(shí),軟件可以設(shè)計(jì)從堆棧溢出的特定恢復(fù)措施,例如線程重新啟動(dòng)、軟件重置、切換到備份計(jì)算機(jī)工作等。
5未來研究熱點(diǎn)展望
本文認(rèn)為未來針對(duì)緩沖區(qū)溢出漏洞檢測技術(shù)的主要熱點(diǎn)應(yīng)在于以下三個(gè)方向:
(1)結(jié)合機(jī)器學(xué)習(xí)思想。機(jī)器學(xué)習(xí)的主要思想在于通過不斷的訓(xùn)練,提取出訓(xùn)練集的特征,并達(dá)到可以精準(zhǔn)預(yù)測的目的。而緩沖區(qū)溢出漏洞確有規(guī)律可循,可以將代碼根據(jù)數(shù)組的定義與預(yù)算,指針的聲明,函數(shù)的調(diào)用等將代碼分解成若干片段,利用機(jī)器學(xué)習(xí)并結(jié)合上下文語義進(jìn)行訓(xùn)練,減少靜態(tài)測試中的漏報(bào)和誤報(bào)問題。
(2)將高級(jí)語言轉(zhuǎn)化為底層語言如匯編或二進(jìn)制代碼。根據(jù)以往的文獻(xiàn)來看針對(duì)緩沖區(qū)漏洞檢測的語言多位C/C++等高級(jí)語言,對(duì)于匯編或二進(jìn)制代碼檢測技術(shù)卻少之又少。然而作為更適合與計(jì)算機(jī)使用的語言,如果有針對(duì)性的檢測技術(shù),應(yīng)該能極大地減少誤報(bào)率和漏報(bào)率。
(3)綜合運(yùn)用各項(xiàng)技術(shù)。多一重技術(shù)就等于多一門保險(xiǎn),根據(jù)前文的論述可知無論是靜態(tài)檢測技術(shù)和動(dòng)態(tài)檢測技術(shù)都有其本身的優(yōu)勢和缺點(diǎn),因此如果能綜合利用靜態(tài)檢測技術(shù)、動(dòng)態(tài)檢測和本文未涉及的漏洞修復(fù)技術(shù)等將更加有利于防范緩沖區(qū)溢出漏洞,保障程序的正常運(yùn)行。