趙世斌,周天陽,朱俊虎,王清賢
數(shù)字工程與先進(jìn)計(jì)算國家重點(diǎn)實(shí)驗(yàn)室,鄭州 450002
現(xiàn)代操作系統(tǒng)功能結(jié)構(gòu)和程序邏輯復(fù)雜,開發(fā)人員難以為所有共享資源提供完善的保護(hù)機(jī)制,導(dǎo)致了由于設(shè)計(jì)缺陷和實(shí)現(xiàn)不當(dāng)產(chǎn)生的邏輯缺陷時有發(fā)生。這些邏輯缺陷被稱為競態(tài)漏洞,其不僅會導(dǎo)致程序本身運(yùn)行出錯和系統(tǒng)崩潰,還常被攻擊者惡意利用,實(shí)現(xiàn)遠(yuǎn)程命令執(zhí)行和本地提權(quán)等攻擊效果[1]。目前,Web服務(wù)、殺毒軟件等應(yīng)用程序,Linux、Android和IOS操作等系統(tǒng)內(nèi)核中潛藏的競態(tài)漏洞被頻繁曝光,競態(tài)漏洞日益成為威脅網(wǎng)絡(luò)信息系統(tǒng)安全的嚴(yán)重隱患。
競態(tài)漏洞與堆棧溢出、格式化字符串等傳統(tǒng)漏洞相比,具有隱蔽性強(qiáng)、難以調(diào)試、攻擊效果明顯等特點(diǎn)。目前,學(xué)者主要從程序競爭性行為分析以及由此觸發(fā)的破壞性結(jié)果兩個方面著手進(jìn)行研究。前者主要針對競態(tài)漏洞的發(fā)生條件進(jìn)行分析,后者主要針對漏洞觸發(fā)后漏洞利用過程中的程序異常行為進(jìn)行分析。因?yàn)槌绦虍惓P袨榉治龊透倯B(tài)漏洞的成因關(guān)系不密切,本文主要面向競態(tài)漏洞的發(fā)生條件進(jìn)行研究。1992年,Netzer和Miller論證指出,由競態(tài)程序行為導(dǎo)致的漏洞發(fā)現(xiàn)與定位是一個NP難問題[2]。
在漏洞挖掘與檢測領(lǐng)域,如何快速有效地檢測未知競態(tài)漏洞是一項(xiàng)極具挑戰(zhàn)性的研究工作。近年來,研究人員從不同系統(tǒng)特權(quán)級對競態(tài)漏洞的產(chǎn)生機(jī)理及其檢測技術(shù)展開了富有成效的研究,主要分為用戶態(tài)和內(nèi)核態(tài)兩個方向。其中,用戶態(tài)競態(tài)漏洞檢測研究重點(diǎn)是訪問共享資源的程序行為的邏輯關(guān)系[3-10],以及如何在有限條件下平衡檢測效率和準(zhǔn)確率之間的關(guān)系[11-17];內(nèi)核態(tài)競態(tài)漏洞檢測研究則側(cè)重于解決程序語義視圖缺失問題,同時盡量減少侵入式檢測方法對內(nèi)核平穩(wěn)高效運(yùn)行的影響。隨著系統(tǒng)虛擬化技術(shù)不斷成熟和應(yīng)用,研究人員嘗試?yán)锰摂M機(jī)監(jiān)控器(hypervisor)的特權(quán)級優(yōu)勢,從系統(tǒng)底層對操作系統(tǒng)程序行為進(jìn)行動態(tài)監(jiān)控和調(diào)試分析[18],取得了較好的檢測效果,為競態(tài)漏洞檢測研究探索了新方向。
本文從競態(tài)漏洞定義出發(fā),分析了不同類型程序競態(tài)缺陷以及由此引發(fā)競態(tài)漏洞的作用機(jī)理;在綜合研究各類競態(tài)漏洞檢測原理與實(shí)現(xiàn)技術(shù)的基礎(chǔ)上,提出了競態(tài)漏洞檢測基本范式和通用框架,深入分析了競態(tài)漏洞檢測涉及的關(guān)鍵技術(shù)環(huán)節(jié)及其需要解決的核心問題;依據(jù)不同檢測目的和實(shí)現(xiàn)方法,分別論述了用戶態(tài)、內(nèi)核態(tài)兩大類競態(tài)漏洞檢測研究中的技術(shù)思想及其發(fā)展脈絡(luò),指出了制約檢測效率的瓶頸問題以及可能的解決方法。本文對競態(tài)漏洞檢測技術(shù)的總結(jié)展望將為當(dāng)前及未來研究提供借鑒與參考。
如圖1所示,競態(tài)漏洞檢測技術(shù)是一個數(shù)據(jù)提取和分析的過程。進(jìn)行競態(tài)漏洞檢測首先需要選擇數(shù)據(jù)的類型,即共享資源操作軌跡,包括共享內(nèi)存讀寫、共享磁盤讀寫、信號量的使用、鎖的使用、設(shè)備的使用等;然后根據(jù)需要的數(shù)據(jù)類型采取合適的數(shù)據(jù)提取方法,包括日志記錄、插樁、虛擬化技術(shù)、Intel PT技術(shù)等;最后通過設(shè)計(jì)合適的數(shù)據(jù)分析方法對提取的數(shù)據(jù)進(jìn)行分析,得到正確的判決結(jié)果。其中操作軌跡提取和漏洞觸發(fā)識別組成了競態(tài)漏洞檢測的基本框架。
圖1 競態(tài)漏洞檢測整體框架示意圖
競態(tài)條件(race condition)是指這樣一種情形——多個線程或進(jìn)程在讀寫一個共享數(shù)據(jù)時結(jié)果依賴于它們執(zhí)行的相對時間。競態(tài)條件發(fā)生在多個進(jìn)程或者線程讀寫數(shù)據(jù)時,其最終的結(jié)果依賴于多個進(jìn)程的指令執(zhí)行順序。例如,在多個任務(wù)系統(tǒng)中,兩個連續(xù)的操作作用在同一個文件時,系統(tǒng)會按照競爭條件的原則做出決定。此時,兩個連續(xù)操作之間存在一定的時間間隔,如果攻擊者利用這個時間間隔對文件進(jìn)行了惡意篡改,則產(chǎn)生了競態(tài)漏洞利用。
競態(tài)條件漏洞,又名競爭條件漏洞,簡稱競態(tài)漏洞,其定義為事件的執(zhí)行時間或順序影響程序正確性的一種缺陷[2]。競態(tài)漏洞的定義是從程序執(zhí)行產(chǎn)生的結(jié)果進(jìn)行定義的,只有競態(tài)條件發(fā)生且造成正確性缺失的情況才會被稱為競態(tài)漏洞;當(dāng)競態(tài)條件發(fā)生,但是沒有對程序正確性造成影響,不能稱之為競態(tài)漏洞。
競態(tài)漏洞的定義可以看出,競態(tài)漏洞檢測的關(guān)鍵在于:一是及時發(fā)現(xiàn)并定位競爭性的資源訪問(可簡稱為競態(tài)條件的產(chǎn)生);二是已構(gòu)成競態(tài)條件時危害程序正確性的異常行為。由于危害程序正確性的行為復(fù)雜多樣,包括但不限于命令執(zhí)行、信息泄露、拒絕服務(wù)、本地提權(quán)等各類漏洞利用行為,難以通過單一的檢測方法實(shí)現(xiàn)所有異常行為的檢測,因此研究人員更傾向于從競態(tài)漏洞的產(chǎn)生原因(即競態(tài)條件)來進(jìn)行研究。不同原因產(chǎn)生的競態(tài)漏洞具有不同特點(diǎn),利用這些特點(diǎn)進(jìn)行檢測更有針對性。目前,針對競態(tài)條件的研究主要包括:數(shù)據(jù)競爭和TOCTTOU(Time Of Check To Time Of Use)兩類。
2.1.1 數(shù)據(jù)競爭
一個內(nèi)存訪問操作定義e為一個四元組(m,t,L,a),其中:m為內(nèi)存訪問操作的內(nèi)存地址;t為標(biāo)識內(nèi)存訪問操作的線程;L為操作所屬線程擁有的鎖集合;a為內(nèi)存訪問操作的類型(READ或WRITE)。
數(shù)據(jù)競爭IsRace(ei,ej)是滿足以下條件的兩個內(nèi)存訪問操作[19]:(1)內(nèi)存訪問位置相同;(2)兩者并發(fā)執(zhí)行;(3)至少有一個為寫操作;(4)未使用“互斥”的同步機(jī)制約束。表示為:
2016年被曝光的DirtyCow漏洞(CVE-2016-5195)是最為典型的數(shù)據(jù)競爭。該漏洞是由于Linux內(nèi)核在處理寫時復(fù)制的過程中沒有限制內(nèi)存的競爭性訪問,任意文件在寫時復(fù)制中可被惡意篡改,進(jìn)而被攻擊者用來進(jìn)行提權(quán)操作[20]。DirtyCow漏洞存在于Linux內(nèi)核2.6.22以上的所有版本中,危害范圍廣泛,包括絕大多數(shù)Linux服務(wù)器、主機(jī)以及安卓手機(jī)[21]。
如圖2所示,正常的程序流程三次調(diào)用了faultin_page函數(shù)完成了三個步驟,其中第二次進(jìn)入faultin_page主要是處理寫權(quán)限的頁錯誤問題,要求的寫權(quán)限標(biāo)志會被去掉,即去掉FOLL_WRITE標(biāo)志位,第三次調(diào)用faultin_page時已經(jīng)成功得到cow后的頁面,且flags已經(jīng)去掉FOLL_WRITE,因此不會再產(chǎn)生寫錯誤的處理,可以直接寫入cow的頁。但是如果在上述流程即第二次頁錯誤處理結(jié)束時,在一個新的線程調(diào)用madvise,會unmap掉前面cow的頁面,又進(jìn)入缺頁處理,這里不同的是在do_fault調(diào)用時,由于沒有了寫權(quán)限的要求,直接調(diào)用了do_read_fault讀取映射文件的內(nèi)存頁,而不是內(nèi)存頁副本,后續(xù)即可實(shí)現(xiàn)越權(quán)寫操作。在DirtyCow漏洞中,兩個線程競爭的資源是內(nèi)存頁,并且造成了程序正確性的影響,所以DirtyCow漏洞是數(shù)據(jù)競爭。
圖2 DirtyCow漏洞觸發(fā)流程圖
由定義分析可知,數(shù)據(jù)競爭是競態(tài)漏洞產(chǎn)生的必要條件,但不是充分條件。這是因?yàn)槟承?shù)據(jù)競爭發(fā)生時并不會影響程序的正確性,例如當(dāng)兩個進(jìn)程競爭的內(nèi)存共享資源和兩個進(jìn)程的邏輯完全無關(guān),則認(rèn)為構(gòu)成數(shù)據(jù)競爭但是不構(gòu)成競態(tài)漏洞。由此可見,只有那些影響程序正確性的競爭性數(shù)據(jù)訪問才可構(gòu)成競態(tài)漏洞產(chǎn)生的充分條件,DirtyCow正是由于在數(shù)據(jù)競爭發(fā)生之后導(dǎo)致任意文件被惡意篡改的危害性結(jié)果,才被研究人員歸結(jié)為競態(tài)漏洞。
2.1.2 TOCTTOU
TOCTTOU是競態(tài)條件的一種,指計(jì)算機(jī)系統(tǒng)中的資源與權(quán)限等狀態(tài)在檢查(安全授權(quán))和使用這個檢查結(jié)果之間,因?yàn)闄z查結(jié)果(如授權(quán)狀態(tài))在這段時間發(fā)生了改變而造成的漏洞產(chǎn)生[22]。TOCTTOU通常發(fā)生在文件系統(tǒng)的訪問時,特別是在UNIX操作系統(tǒng)中較為常見,文件系統(tǒng)訪問一般會要求對文件先檢查再寫入,這就導(dǎo)致檢查與讀寫操作之間存在時間間隔,攻擊者可利用這種時間間隔對文件系統(tǒng)展開攻擊,如寫入惡意代碼等。2010年爆出的KDE桌面本地提權(quán)漏洞(CVE-2010-0436),就發(fā)生在 kdebase-workspace-4.1.4/kdm/backend/ctrl.c的openctrl功能中,根據(jù)漏洞產(chǎn)生原因與實(shí)現(xiàn)機(jī)理研究人員將其歸結(jié)為一種TOCTTOU型競態(tài)漏洞[23]。
目前,針對類UNIX系統(tǒng)的競態(tài)漏洞檢測主要是利用其文件系統(tǒng)的TOCTTOU特點(diǎn)展開研究[24]。類Unix文件系統(tǒng)中存在TOCTTOU缺陷的根本原因在于文件名和文件對象之間的映射是可變的,如果symlink等操作的時機(jī)準(zhǔn)確,那么可以在文件的檢查和使用之間替換文件,從而導(dǎo)致錯誤發(fā)生。
如圖3所示是TOUCTTOU的典型例子Binmail。Binmail是一個setuid-to-root程序,在普通用戶權(quán)限下可以調(diào)用執(zhí)行root用戶權(quán)限的操作。在正常的讀取郵件的過場中,Binmail首先通過lstat函數(shù)查看文件mail的信息,如果mail文件是正常文件,不是符號鏈接則執(zhí)行open函數(shù)打開郵件。但是由于lstat和open函數(shù)不是原始操作,所以如果在lstat函數(shù)檢查完畢后,另外一個線程或者進(jìn)程可以通過unlink和symlink操作將mail文件替換為指向系統(tǒng)關(guān)鍵文件/etc/passwd等文件的鏈接,那么open的文件將會是替換后的系統(tǒng)關(guān)鍵文件,實(shí)現(xiàn)了任意文件讀取。
圖3 Binmail漏洞觸發(fā)流程圖
2.1.3 競態(tài)漏洞產(chǎn)生原因相互關(guān)系
由于不同進(jìn)程擁有各自不同的內(nèi)存、寄存器等資源,多進(jìn)程執(zhí)行產(chǎn)生競態(tài)條件繼而引發(fā)漏洞利用的可能性較小。大部分不同進(jìn)程之間發(fā)生競態(tài)漏洞的情況都是針對文件系統(tǒng)等多進(jìn)程間共享資源TOUTTOU類型的競態(tài)漏洞[25]。線程因?yàn)楣灿袃?nèi)存的緣故,使得大部分競態(tài)漏洞都是線程之間資源競爭導(dǎo)致的。在現(xiàn)有CVE披露的競態(tài)漏洞中,線程之間競態(tài)漏洞最主要的原因是內(nèi)存中數(shù)據(jù)競爭類型的競態(tài)漏洞[26]。
如韋恩圖(圖4)所示,因?yàn)閿?shù)據(jù)競爭并不一定會對程序的正確性造成影響,所以數(shù)據(jù)競爭和競態(tài)漏洞是交集的關(guān)系。在韋恩圖中,存在同時屬于數(shù)據(jù)競爭和競態(tài)漏洞的區(qū)域,指數(shù)據(jù)競爭影響了程序正確性并造成了危害,可以被視為競態(tài)漏洞;導(dǎo)致程序存在屬于數(shù)據(jù)競爭但是不屬于競態(tài)漏洞的部分,指數(shù)據(jù)競爭沒有對程序的正確性造成影響;也存在不屬于數(shù)據(jù)競爭但是屬于競態(tài)漏洞的部分,指不滿足數(shù)據(jù)競爭的四個條件但是卻影響了程序的正確性,如死鎖。在文獻(xiàn)[3]中,特別地討論了數(shù)據(jù)競爭中有害和無害的區(qū)分方法。TOCTTOU中檢查的過程是為了確保數(shù)據(jù)不會被更改而誕生的過程,如果在此之后對數(shù)據(jù)進(jìn)行了更改會違背檢查的目的,從而影響程序的正確性,所以TOCTTOU是競態(tài)漏洞的子集。
圖4 競態(tài)漏洞分類韋恩圖
在進(jìn)行競態(tài)漏洞檢測方法的研究過程中,不會研究對程序正確性無法造成影響的數(shù)據(jù)競爭,研究人員主要研究的競態(tài)漏洞產(chǎn)生原因?yàn)閿?shù)據(jù)競爭的有害部分和TOCTTOU。
競態(tài)漏洞與棧溢出、堆溢出、格式化字符串等傳統(tǒng)漏洞產(chǎn)生機(jī)理存在差異,是在開發(fā)之前由系統(tǒng)實(shí)現(xiàn)過程中對多進(jìn)程、多線程相互干擾問題考慮不當(dāng)而造成的安全隱患[27]。因此,競態(tài)漏洞具有較強(qiáng)的隱蔽性,模糊測試、符號執(zhí)行等傳統(tǒng)漏洞分析手段難以將其有效檢測出來[28];同時,由于競態(tài)漏洞主要發(fā)生在多進(jìn)程或多線程相互作用之時,競爭性的程序運(yùn)行環(huán)境給調(diào)試帶來很多挑戰(zhàn)。
根據(jù)對現(xiàn)有文獻(xiàn)研究,競態(tài)漏洞檢測基本框架主要包括兩個部分:操作軌跡提取和漏洞觸發(fā)識別[29]。操作軌跡提取是指從多進(jìn)程或多線程的運(yùn)行過程中提取共享資源的程序操作軌跡;漏洞觸發(fā)識別則是根據(jù)共享資源操作軌跡識別和判斷漏洞是否被觸發(fā)。不同競態(tài)漏洞的操作軌跡和漏洞觸發(fā)機(jī)理具有不同特點(diǎn),相應(yīng)的檢測思路也不盡相同,特別是在不同系統(tǒng)特權(quán)級環(huán)境下,檢測方法的實(shí)現(xiàn)方式差異較大。目前,在競態(tài)漏洞檢測框架的兩部分研究中,具體需要解決三個關(guān)鍵問題,分別是:數(shù)據(jù)種類選取、數(shù)據(jù)提取與管理以及檢測性能與準(zhǔn)確性平衡。如圖5所示,在競態(tài)漏洞檢測基本框架下,這三個關(guān)鍵問題彼此影響,相互制約。
圖5 競態(tài)漏洞檢測技術(shù)基本框架面臨的問題
2.2.1 數(shù)據(jù)種類選取
面向不同檢測對象,在不同操作系統(tǒng)特權(quán)級環(huán)境中,依據(jù)不同檢測策略選取的數(shù)據(jù)種類在競態(tài)漏洞檢測中發(fā)揮不同的作用。系統(tǒng)調(diào)用數(shù)據(jù)是最基礎(chǔ)的數(shù)據(jù)種類,監(jiān)控操作系統(tǒng)調(diào)用,為競態(tài)漏洞檢測提供分析數(shù)據(jù),是現(xiàn)在內(nèi)核態(tài)競態(tài)漏洞檢測中的基本方法[30];函數(shù)級別的數(shù)據(jù)是高語義級別的數(shù)據(jù),通常只能通過侵略式插樁的方式獲取,選取合適的函數(shù)進(jìn)行監(jiān)控,可以生成完整的共享資源操作軌跡供檢測系統(tǒng)分析,是現(xiàn)在用戶態(tài)競態(tài)漏洞檢測中較為成熟的方法。操作類型也是數(shù)據(jù)種類提取需要考慮的問題,在完整共享資源操作軌跡提取方法中,通常會將內(nèi)存、文件等共享資源操作區(qū)分為讀、寫、鎖[31]三種操作,按照邏輯順序排列后作為共享資源操作軌跡的記錄[32]。
2.2.2 數(shù)據(jù)提取與管理方式
數(shù)據(jù)的提取和管理方式是連接數(shù)據(jù)和分析系統(tǒng)的橋梁,是競態(tài)漏洞檢測技術(shù)基本框架需要研究的重要問題。數(shù)據(jù)提取的關(guān)鍵是對系統(tǒng)操作通過侵略式插樁[33]的方式進(jìn)行調(diào)試,常見的侵略式插樁的方式有動態(tài)插樁技術(shù)、重編譯技術(shù)、HOOK技術(shù)。動態(tài)插樁技術(shù)指在待分析二進(jìn)制程序中插入探針,通過探針的執(zhí)行進(jìn)行數(shù)據(jù)的提取與分析;重編譯技術(shù)指在源碼層面加入數(shù)據(jù)提取的代碼,將程序重新編譯的方式進(jìn)行數(shù)據(jù)的提??;HOOK技術(shù)指通過改寫需要檢測的關(guān)鍵函數(shù),使得程序首先運(yùn)行數(shù)據(jù)提取指令再恢復(fù)正常程序流程的方式實(shí)現(xiàn)數(shù)據(jù)提取。隨著硬件調(diào)試、虛擬化自省技術(shù)的快速發(fā)展,在系統(tǒng)外進(jìn)行數(shù)據(jù)提取的方式逐漸成熟起來[34],在特定場景和條件下取得了不錯的效果。數(shù)據(jù)管理是數(shù)據(jù)提取后需要解決的重要問題。對提取的數(shù)據(jù)進(jìn)行存儲有助于提高檢測的準(zhǔn)確率,但數(shù)據(jù)管理本身會產(chǎn)生額外性能開銷,需要進(jìn)一步展開研究,主要包括:數(shù)據(jù)存儲的數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)及其空間復(fù)雜度,數(shù)據(jù)的存、查、刪等操作策略及其時間復(fù)雜度等。
2.2.3 性能與準(zhǔn)確性的平衡
競態(tài)漏洞數(shù)據(jù)分析過程中的關(guān)鍵問題是性能和準(zhǔn)確性的平衡問題。競態(tài)漏洞是由兩個或兩個以上進(jìn)程/線程競爭資源造成的,因此數(shù)據(jù)分析需要對不同進(jìn)程或線程的操作進(jìn)行比較。操作系統(tǒng)內(nèi)部對共享資源的訪問操作具有頻率高、種類多的特點(diǎn)。為提高檢測的準(zhǔn)確性,應(yīng)盡可能比對所有相關(guān)操作,但這會造成檢測開銷大的問題。因此在設(shè)計(jì)檢測方法時,必須考慮比較不同操作的性能開銷。針對不同的檢測環(huán)境和檢測目標(biāo),在現(xiàn)有的競態(tài)漏洞檢測方法中出現(xiàn)了注重性能和注重準(zhǔn)確性兩種不同的理念。
用戶態(tài)競態(tài)漏洞檢測的本質(zhì)是動態(tài)地監(jiān)控并行程序多個線程的內(nèi)存訪問操作并進(jìn)行數(shù)據(jù)分析。檢測程序通過監(jiān)控用戶態(tài)程序在并發(fā)執(zhí)行過程中發(fā)生的內(nèi)存訪問操作和其使用的同步保護(hù)機(jī)制,使用算法推斷競態(tài)漏洞的發(fā)生,不同的檢測手段使用了不同的檢測與推斷的方法,而評價方法的三個最重要的因素是:漏報(bào)率、誤報(bào)率和額外性能開銷。漏報(bào)率指檢測方法所不能檢測到的競態(tài)漏洞占所有競態(tài)漏洞的比例;誤報(bào)率指檢測結(jié)果中不被確認(rèn)為競態(tài)漏洞占檢測結(jié)果數(shù)量的比例;額外性能開銷指引入檢測方法后系統(tǒng)運(yùn)行同樣的程序增長的時間占原運(yùn)行時間的比例。目前,用戶態(tài)競態(tài)漏洞檢測分為兩種思路:happens-before方法[2]和lock-set方法[11]。happens-before方法注重準(zhǔn)確性,誤報(bào)率低,但是無法檢測出所有潛在的競態(tài)漏洞,漏報(bào)率高,額外性能開銷大,研究人員的研究重點(diǎn)圍繞著性能優(yōu)化開展;lock-set方法注重效率,會產(chǎn)生虛警,誤報(bào)率高,系統(tǒng)額外開銷低,研究人員的研究重點(diǎn)圍繞著準(zhǔn)確性提高開展。
happens-before方法就是通過檢測兩個操作是否滿足happens-before關(guān)系來實(shí)現(xiàn)競態(tài)漏洞的檢測。如果在程序執(zhí)行過程中任意兩個操作都滿足happens-before關(guān)系則認(rèn)為不存在競態(tài)漏洞,反之則認(rèn)為存在。
happens-before關(guān)系最初在1978年Lamport提出,用來描述程序事件的一種偏序關(guān)系[2]。在兩個事件中,在一個事件發(fā)生前能夠確定另外一個事件的結(jié)果,則稱兩個事件滿足happens-before關(guān)系。如圖6所示,當(dāng)一個線程對共享資源v的操作使用了鎖,并且在之后一個不同的線程中對共享資源v再次申請了鎖并且使用完后釋放,那么率先使用鎖對共享資源v操作的線程和后續(xù)使用鎖的線程滿足happens-before關(guān)系。通過設(shè)置happens-before規(guī)則,在每個多線程進(jìn)程中檢測任意兩個操作之間是否滿足happens-before關(guān)系。如果存在兩個操作不滿足happens-before關(guān)系,則判定存在競態(tài)漏洞。因?yàn)閔appens-bofore方法能夠確保所有操作之間不會存在結(jié)果不確定的情況,所以happens-before方法誤報(bào)率低。20世紀(jì)90年代初期,Netzer對競態(tài)漏洞進(jìn)行了詳細(xì)地分類與說明[29],預(yù)估了檢測競態(tài)漏洞的難度[2],將競態(tài)漏洞檢測問題抽象成一個數(shù)學(xué)模型進(jìn)行了檢測方法的探討,并且率先基于Lamport的happens-before方法,使用信號量同步實(shí)現(xiàn)了競態(tài)漏洞的檢測[35]。
圖6 happens-before方法檢測案例
理想化的happens-before檢測模型需要記錄大量指令集操作并執(zhí)行推斷操作,以實(shí)現(xiàn)較高的檢測精度,但這會大大增加實(shí)際的程序開銷,嚴(yán)重影響檢測效率。檢測系統(tǒng)在實(shí)現(xiàn)過程中會使用向量時鐘(Vector Clock,VC)來記錄每個線程的共享資源操作軌跡數(shù)據(jù),來進(jìn)行happens-before關(guān)系的判斷。如果被測程序有n個線程,那么每個VC都需要O(n)的存儲空間,每個VC操作需要O(n)的時間進(jìn)行算法計(jì)算,而在操作系統(tǒng)中VC操作的數(shù)量每秒都可能數(shù)以千計(jì),所以時間復(fù)雜度和空間復(fù)雜度都在O(n)的情況下會對系統(tǒng)造成極大的額外性能開銷,嚴(yán)重影響檢測效率和用戶體驗(yàn)。
為了降低額外性能開銷,研究人員采用降低記錄VC操作數(shù)量的方法對happen-before進(jìn)行改進(jìn)。一種有效的思路是進(jìn)行數(shù)據(jù)采樣,通過降低監(jiān)測分析數(shù)據(jù)量,提高檢測性能,例如,文獻(xiàn)[4]利用微軟通用語言運(yùn)行庫(Common Language Runtime,CLR)設(shè)計(jì)了一種基于happens-before方法的檢測系統(tǒng)RaceTrack,該系統(tǒng)的每個檢測單元均維護(hù)了一個訪問歷史數(shù)據(jù)庫,為減少性能開銷,系統(tǒng)設(shè)置了檢測粒度和日志存儲量,通過對關(guān)鍵數(shù)據(jù)進(jìn)行記錄,不關(guān)鍵的數(shù)據(jù)進(jìn)行拋棄的方式有效地提升了檢測效率。文獻(xiàn)[3]則將數(shù)據(jù)競爭條件區(qū)分為有害和無害兩種類型,多線程執(zhí)行記錄分析[36]提高檢測效率。Maino等人對采樣方式進(jìn)一步優(yōu)化,只記錄小于2%訪存操作,可以檢測出70%以上的競態(tài)漏洞[37]。
happens-before使用采樣方法進(jìn)行優(yōu)化時,采樣的時機(jī)直接影響了性能和準(zhǔn)確率。為了準(zhǔn)確把握happensbefore的識別時機(jī),F(xiàn)lanagan設(shè)計(jì)了FastTrack系統(tǒng)[5],改進(jìn)了笨重的vectorclocks,采用了一種輕量級的vectorclocks,在沒有精度損失的情況下將監(jiān)控操作的時間復(fù)雜度從O(n)級別幾乎降至O(1)級別。Bond等人[6]設(shè)計(jì)的Pacer提供了高速的采樣機(jī)制,結(jié)合FastTrack實(shí)現(xiàn)了檢測的速率近似于取樣的速率,并將采樣產(chǎn)生的額外開銷降至1%~3%。后期研究人員繼續(xù)進(jìn)行采樣方法的創(chuàng)新和優(yōu)化。Poluri等人[8]使用DJIT+結(jié)合FastTrack的方式進(jìn)行了創(chuàng)新;Wilcox等人[9]為了進(jìn)一步優(yōu)化,基于FastTrack使用了Array Shadow State進(jìn)行了數(shù)據(jù)存取性能的優(yōu)化,與FastTrack相比提升了約35%的運(yùn)行效率。文獻(xiàn)[38]中分別針對漏洞研究者和軟件使用者分別設(shè)計(jì)了高效的RaceChaser和精確的Caper,區(qū)分了注重效率和注重性能的應(yīng)用場景。
除了努力提高檢測性能,研究人員還著重研究了檢測準(zhǔn)確性和檢測范圍等問題。Huang等人通過控制流抽象的方式提升了happens-before的完備性[10],而不是提高性能。通過提高準(zhǔn)確性和檢測范圍,happens-before方法的性能雖然會降低但是卻可以更好地為漏洞挖掘等不需要性能的應(yīng)用服務(wù)。
lock-set方法最早由Savage等人在Eraser系統(tǒng)中提出[11]。這種方法的基本思想是提取并記錄不同線程所申請的鎖的集合,當(dāng)每個線程訪問共享資源時,取不同線程針對該共享資源鎖的交集,如果兩個線程對該共享資源沒有使用同一個鎖保護(hù),那么兩個線程就可能同時對該共享資源進(jìn)行操作,認(rèn)為存在競態(tài)漏洞。
如圖7所示,在兩個線程中對相同的共享資源使用了不同的鎖進(jìn)行保護(hù),存在競態(tài)漏洞,會被lock-set方法檢測出來。lock-set方法的本質(zhì)是檢測由不同進(jìn)程或線程發(fā)出的沒有被相同鎖保護(hù)的沖突操作,其選取的數(shù)據(jù)種類是共享資源操作軌跡中的鎖操作,具有較快的數(shù)據(jù)提取效率;lock-set方法對數(shù)據(jù)進(jìn)行分析時采用的是集合的操作,具有較快的數(shù)據(jù)分析效率。因此,lock-set方法與happen-before方法相比,同時具有更高效的數(shù)據(jù)提取和分析效率,可以有效降低性能開銷,被看作是happen-before的替代方法。當(dāng)然,由于選取的數(shù)據(jù)片面,集合的判斷邏輯簡單,該方法存在虛警問題。由于lockset具有優(yōu)異的檢測效率,后續(xù)學(xué)者對其進(jìn)行了更深入的研究,例如Praun等人[12]針對多線程的JAVA程序,利用面對對象的特殊屬性,將變量級別的檢測提升到了對象級別,優(yōu)化了檢測的性能,減少了16%~129%的即時開銷,和75%以上的空間開銷;Nishiyama[13]則是通過read-barrier-based方法減少檢測數(shù)據(jù)競爭的必須檢查的內(nèi)存位置數(shù)量,針對SPEC基準(zhǔn)測試,開銷分別為57.8%至735.7%,對于Java Grande基準(zhǔn)測試則為0.6%至6 012.5%。
圖7 lock-set方法檢測案例
研究學(xué)者發(fā)現(xiàn)很難純粹通過算法優(yōu)化來同時獲得準(zhǔn)確率和性能的大幅度地提升,于是采取了與其他檢測手段或方法結(jié)合的方式來輔助lock-set方法進(jìn)行競態(tài)漏洞的檢測。Choi等人通過定義“weaker-than”關(guān)系過濾了一些冗余的訪存記錄,降低了訪存監(jiān)控開銷[5]。兩個已經(jīng)發(fā)生的訪存操作ei和ej滿足“weaker-than”關(guān)系,指對于任意將要發(fā)生的訪存操作ek來說,如果IsRace(ej,ek)發(fā)生可以推理出IsRace(ei,ek)發(fā)生,那么可以說ei“weaker-than”ej,即可以不考慮ei事件,將其從訪存記錄中刪除。美國伊利諾斯大學(xué)采取體系結(jié)果擴(kuò)展技術(shù)在硬件平臺上實(shí)現(xiàn)了鎖集合方法,將集合操作轉(zhuǎn)換為硬件的位圖操作,提高了效率,但是這種方法的誤報(bào)率仍然高達(dá)0.89[14]。
為了能夠有效地減少誤報(bào)率,降低虛警,研究人員開始通過犧牲一部分性能來換取準(zhǔn)確率。例如2007年出現(xiàn)的開源項(xiàng)目Helgrind[15],通過與happens-before結(jié)合的方式有效地提升了準(zhǔn)確率。Helgrind是Valgrind的一部分,項(xiàng)目的目的是針對C/C++和Fortran程序設(shè)計(jì)一款檢測數(shù)據(jù)競爭的工具,其采取的是Eraser中的lock-set算法,并使用了happens-before來減少虛警。其通過將二進(jìn)制文件轉(zhuǎn)換為中間語言,并使用即時編譯器執(zhí)行,并通過插件來進(jìn)行分析。Helgrind出現(xiàn)后,Jannesari和Tichy基于Helgrind實(shí)現(xiàn)了多線程程序中數(shù)據(jù)競爭檢測的方法[16]。
還有一部分學(xué)者將注意力集中在繼續(xù)提高lock-set的性能上。例如,來自清華的Tianwei Sheng等人基于lock-set設(shè)計(jì)了RACEZ,其通過硬件性能監(jiān)測裝置透明地獲取指令記錄[17],性能優(yōu)異,平均只有2.8%的額外開銷;而后在2015年,同一個團(tuán)隊(duì)使用了CPU硬件的PMU功能進(jìn)行監(jiān)控,識別對內(nèi)存的受保護(hù)的訪問和不受保護(hù)的訪問,對lock-set的性能進(jìn)一步進(jìn)行了優(yōu)化。
在現(xiàn)有研究中,研究人員針對happens-before方法和lock-set方法做了大量的性能優(yōu)化和準(zhǔn)確性提升的工作,取得了很多不錯的結(jié)果。但是在已有的方法中,仍然存在可以繼續(xù)深入研究和發(fā)展的空間。
3.3.1 智能精確的數(shù)據(jù)選取
在現(xiàn)有的方法中,通過取樣的方式進(jìn)行happensbefore方法的性能優(yōu)化是優(yōu)秀的性能、準(zhǔn)確性平衡的手段,但是取樣的方法是值得研究的問題,使用自適應(yīng)的方式進(jìn)行取樣是值得借鑒的一種嘗試。未來的檢測技術(shù)的研究手段中,可以使用機(jī)器學(xué)習(xí)、數(shù)據(jù)挖掘等更為智能的方法進(jìn)行數(shù)據(jù)的選取,精確地選取必要的數(shù)據(jù),以較小的數(shù)據(jù)量獲得較大的信息量,提高檢測的性能和準(zhǔn)確性[39]。
3.3.2 透明高效的數(shù)據(jù)提取
用戶態(tài)可以通過侵略式插樁的方式提取到高語義的共享資源操作軌跡數(shù)據(jù),但是提取方式不透明、效率低。不透明指在進(jìn)行數(shù)據(jù)提取的過程中,惡意進(jìn)程可能會發(fā)現(xiàn)檢測的痕跡從而和檢測系統(tǒng)形成對抗。效率低指數(shù)據(jù)提取的性能開銷大,影響程序的正常運(yùn)行。
針對以上問題,探索新的共享資源操作軌跡數(shù)據(jù)的提取方式是研究人員關(guān)心的問題。Sheng等人[17]、Kistler[40]等人的研究都對數(shù)據(jù)提取方式進(jìn)行了一些新的嘗試,從效果來看,基于硬件的方法取得了不錯的效果。在虛擬化技術(shù)飛速發(fā)展的今天,使用硬件虛擬化[41]、虛擬機(jī)自省技術(shù)[42]進(jìn)行高效率、高透明共享資源操作軌跡數(shù)據(jù)提取是一個很好的思路,趙躍華等人的工作[18]給出了利用硬件虛擬化技術(shù)進(jìn)行數(shù)據(jù)提取的嘗試?;谔摂M化自省技術(shù)、硬件虛擬化技術(shù),檢測系統(tǒng)可以通過設(shè)置客戶操作系統(tǒng)從ring3進(jìn)入ring0的調(diào)用作為VM Exit的條件實(shí)現(xiàn)低語義層級的系統(tǒng)調(diào)用監(jiān)控,在客戶機(jī)不知情的情況下訪問虛擬機(jī)系統(tǒng)的內(nèi)部狀態(tài),包括內(nèi)存、CPU寄存器、IO設(shè)備標(biāo)志;監(jiān)測特定事件,包括特權(quán)寄存器更改、設(shè)備狀態(tài)更改等;對監(jiān)測中的虛擬機(jī)進(jìn)行控制,如暫停、快照、重啟,這為程序調(diào)試分析特提供了極大便利[43]。
進(jìn)行漏洞檢測的時候,對共享資源操作軌跡數(shù)據(jù)存取和查詢的效率影響了檢測的性能。針對硬盤存儲的優(yōu)化,如何對內(nèi)存存儲部分、硬盤存儲部分的數(shù)據(jù)結(jié)構(gòu)進(jìn)行設(shè)計(jì),選取合適的數(shù)據(jù)結(jié)構(gòu)能夠兼顧數(shù)據(jù)的存取和查詢是未來的研究需要重點(diǎn)解決的問題[44]。
3.3.3 并行化共享資源操作軌跡數(shù)據(jù)分析
用戶態(tài)競態(tài)漏洞檢測的方法自19世紀(jì)80年代開始經(jīng)歷了30多年的推敲,很難再有大幅度的性能提高,利用現(xiàn)有云計(jì)算、集群計(jì)算、并行計(jì)算發(fā)展的計(jì)算優(yōu)勢設(shè)計(jì)并行化數(shù)據(jù)分析算法,提高數(shù)據(jù)分析的性能,是優(yōu)化競態(tài)漏洞檢測性能的一種方法,然而復(fù)雜的計(jì)算機(jī)系統(tǒng)環(huán)境給實(shí)現(xiàn)并行化的算法分析帶來了難題。
操作系統(tǒng)內(nèi)核與用戶態(tài)程序運(yùn)行環(huán)境相比更加復(fù)雜,用戶態(tài)競態(tài)漏洞檢測方法無法直接應(yīng)用于內(nèi)核態(tài)靜態(tài)漏洞檢測。一方面,內(nèi)核中系統(tǒng)調(diào)用頻繁,通過侵入性插樁記錄共享資源操作軌跡的檢測方法將導(dǎo)致大量額外開銷;另一方面,內(nèi)核程序語義更底層,以happenbefore方法為例,很難從兩個內(nèi)核操作直接判斷兩者之間的邏輯關(guān)系,因?yàn)橥粋€內(nèi)核線程的上下文執(zhí)行程序有多種可能——用戶模式進(jìn)程代碼、設(shè)備中段服務(wù)例程或是內(nèi)核延遲過程調(diào)用[45]。正如文獻(xiàn)[46]所論述的:通過理解內(nèi)核中復(fù)雜的同步機(jī)制原語語義來推斷happens-before關(guān)系或統(tǒng)計(jì)lock-set設(shè)置點(diǎn)都是相當(dāng)繁重的工作。目前,內(nèi)核態(tài)競態(tài)漏洞檢測的主要方法是對系統(tǒng)調(diào)用進(jìn)行簡單邏輯推理。
現(xiàn)有內(nèi)核態(tài)競態(tài)漏洞檢測方法主要分為兩種,一種是針對文件系統(tǒng)特別是UNIX風(fēng)格文件系統(tǒng)的TOCTTOU漏洞檢測方法,另外一種是通過實(shí)現(xiàn)部分用戶態(tài)競態(tài)漏洞檢測方法的輕量級方法。虛擬化技術(shù)出現(xiàn)之后,出現(xiàn)了基于虛擬化技術(shù)的競態(tài)漏洞檢測技術(shù),在原有檢測方法的基礎(chǔ)上,對競態(tài)漏洞檢測提供了高效透明的數(shù)據(jù)提取支持。
文件系統(tǒng)的競態(tài)檢測較為簡單,觀測方便,特別的是,UNIX風(fēng)格的文件系統(tǒng)中都有檢查的過程,很多學(xué)者針對TOCTTOU進(jìn)行了檢測方法的研究。Tsyrklevich等人最先提出了一種通過監(jiān)控系統(tǒng)調(diào)用檢測利用競態(tài)漏洞改寫文件的方法[47]。Uppuluri在監(jiān)視文件操作的基礎(chǔ)上,設(shè)置時間窗口來進(jìn)行競態(tài)漏洞的檢測[48],將虛警降到了3%,性能開銷小于8%,是對檢測性能和準(zhǔn)確率的顯著地提升。Wei等人基于Unix風(fēng)格系統(tǒng)設(shè)計(jì)一種防御機(jī)制EDGI[49],通過枚舉所有的文件系統(tǒng)調(diào)用并建立檢測模型,防止攻擊者在特定步驟對文件進(jìn)行篡改。攻擊者如果想要攻擊,那么在TOCTTOU即檢查和使用之間,需要修改文件路徑名到邏輯磁盤的映射。EDGI通過在這個特定步驟防止篡改,即可完成檢測。
因?yàn)閮?nèi)核態(tài)狀態(tài)下很難實(shí)現(xiàn)完整的happens-before或者lock-set方法,研究人員通過實(shí)現(xiàn)部分的happensbefore或者lock-set實(shí)現(xiàn)內(nèi)核態(tài)競態(tài)漏洞動態(tài)檢測。例如,Jeter等人借鑒lock-set的思想,通過一個全局的鎖來管理所有的共享內(nèi)存進(jìn)行檢測[50]。Erickson等人則是借鑒了happens-before與采樣的思想,設(shè)計(jì)了DataCollider[19]。DataCollider是一款優(yōu)秀的內(nèi)核態(tài)動態(tài)競態(tài)漏洞檢測工具,能夠同時用于漏洞檢測和漏洞挖掘,并且針對Windows 7的數(shù)據(jù)競爭進(jìn)行了實(shí)現(xiàn)。DataCollider沒有使用傳統(tǒng)的程序分析方法,而是使用了硬件結(jié)構(gòu)中的調(diào)試寄存器對復(fù)雜的內(nèi)核代碼進(jìn)行了數(shù)據(jù)競爭的檢測。DataColloder吸取了happens-before結(jié)合采樣來優(yōu)化性能的方法,通過采樣少量的訪存操作來降低系統(tǒng)運(yùn)行時開銷。DataCollider利用硬件斷點(diǎn)采樣一些內(nèi)存訪問指令,在這些指令斷點(diǎn)觸發(fā)的時候,取出其相應(yīng)的訪存地址,設(shè)置相應(yīng)的數(shù)據(jù)斷點(diǎn),掛起線程,等待設(shè)置的內(nèi)存斷點(diǎn)被觸發(fā)。一旦觸發(fā),則表示存在訪問沖突,即數(shù)據(jù)競爭。這種方法在性能與準(zhǔn)確率之間做了一個平衡,是一種優(yōu)秀的內(nèi)核態(tài)動態(tài)競態(tài)漏洞檢測方法,并且由于其采用的硬件斷點(diǎn),對上層操作系統(tǒng)具有一定的透明性,作者利用此方法挖出了若干Windows的競態(tài)漏洞。但是由于該工具基于閉源的Windows操作系統(tǒng),給其應(yīng)用帶來了不便。隨后,Jiang等人將DataCollider進(jìn)行了Linux版本的移植,并將之命名為DRDDR[30]。
現(xiàn)有競態(tài)漏洞檢測方法的瓶頸取決于內(nèi)核態(tài)提取的數(shù)據(jù)效率低、語義低,VT-X硬件虛擬化技術(shù)出現(xiàn)之后其對客戶機(jī)操作系統(tǒng)的高效透明的數(shù)據(jù)提取方式給現(xiàn)有的內(nèi)核態(tài)競態(tài)漏洞檢測方法帶來了很大的便利,有效地解決了效率問題。趙躍華,鄧淵浩使用了VT-X硬件虛擬化技術(shù)進(jìn)行了競態(tài)漏洞檢測的嘗試[18]。其通過硬件虛擬化技術(shù)監(jiān)控中斷監(jiān)視系統(tǒng)調(diào)用,設(shè)置關(guān)鍵內(nèi)存缺頁實(shí)現(xiàn)內(nèi)存監(jiān)控,又結(jié)合符號文件分析,從函數(shù)和棧中參數(shù)獲取內(nèi)存讀寫位置,通過判斷兩次對同內(nèi)存訪問的時間差判定內(nèi)核競態(tài)漏洞的存在性。使用硬件虛擬機(jī)化技術(shù)進(jìn)行競態(tài)漏洞檢測,可以高效且透明地進(jìn)行數(shù)據(jù)采集和系統(tǒng)調(diào)用監(jiān)控,給vector clock的生成提供了良好的支持,有效地解決了侵略性插樁的問題;但是使用硬件虛擬化技術(shù),同樣存在過于中斷頻繁,檢測算法不宜復(fù)雜的問題。
內(nèi)核態(tài)程序運(yùn)行數(shù)據(jù)提取的難度和性能要求是制約內(nèi)核態(tài)競態(tài)漏洞檢測的主要原因。只有解決內(nèi)核數(shù)據(jù)語義理解和數(shù)據(jù)分析效率等關(guān)鍵問題,內(nèi)核競態(tài)漏洞檢測才可能獲得突破性發(fā)展。
4.2.1 內(nèi)核態(tài)數(shù)據(jù)提取方式優(yōu)化
在內(nèi)核態(tài)能夠監(jiān)控的語義層級低,而且系統(tǒng)調(diào)用頻繁,頻發(fā)觸發(fā)檢測事件對系統(tǒng)的性能開銷過大。在未來的研究中,需要針對三個問題對內(nèi)核態(tài)的數(shù)據(jù)提取進(jìn)行優(yōu)化,數(shù)據(jù)提取效率問題、數(shù)據(jù)提取透明度問題以及能夠提取高語義層級數(shù)據(jù)的問題。
硬件虛擬化技術(shù)、虛擬機(jī)自省技術(shù)等虛擬機(jī)技術(shù)可以為數(shù)據(jù)提取的效率和透明度提供良好的解決方案。特別是在云虛擬平臺,利用虛擬機(jī)技術(shù)可以在客戶機(jī)不知情的情況下高效地提取出所需共享資源操作軌跡數(shù)據(jù),為下一步分析提供良好的數(shù)據(jù)基礎(chǔ)。但是使用此類方法提取的數(shù)據(jù)仍然是低語義級別的數(shù)據(jù),僅為系統(tǒng)調(diào)用層級,使得檢測方法的誤報(bào)率高、檢測漏洞的覆蓋范圍優(yōu)先。
在未來的研究過程中,研發(fā)出新的內(nèi)核層高語義數(shù)據(jù)提取方式是一個值得研究人員關(guān)心的方向,當(dāng)能夠提取的數(shù)據(jù)信息量足夠支撐內(nèi)核態(tài)運(yùn)行用戶態(tài)的檢測方法,會對內(nèi)核態(tài)競態(tài)漏洞的檢測準(zhǔn)確性帶來較大幅度的提升。在犧牲一部分透明性的前提下,通過侵略式插樁的方式實(shí)現(xiàn)某些關(guān)鍵函數(shù)的高語義級別的數(shù)據(jù)提取都是可行的方案。
4.2.2 低語義級別數(shù)據(jù)智能分析
研究低語義級別數(shù)據(jù)智能分析方法是解決內(nèi)核態(tài)競態(tài)漏洞數(shù)據(jù)語義級別低的方法之一。低語義級別數(shù)據(jù)分析可以從兩個方向進(jìn)行研究,從低語義級別數(shù)據(jù)還原高語義級別數(shù)據(jù)是方法之一,可以通過模式匹配、規(guī)則推理等方式利用現(xiàn)有的低語義級別數(shù)據(jù)還原出高語義級別數(shù)據(jù)[51],研究的關(guān)鍵問題是還原算法的設(shè)計(jì)、還原算法的效率和準(zhǔn)確率;直接從低語義級別進(jìn)行數(shù)據(jù)智能分析也是方法之一。文獻(xiàn)[52]通過VT-X硬件虛擬化技術(shù)提取了Windows操作系統(tǒng)的內(nèi)核對象分配、內(nèi)核內(nèi)存訪問、線程調(diào)度和函數(shù)調(diào)用數(shù)據(jù),并通過固定的規(guī)則從提取數(shù)據(jù)中分析漏洞是否觸發(fā),通過這種方式發(fā)現(xiàn)了45個Windows內(nèi)核漏洞。這種方式數(shù)據(jù)提取效率快,但是現(xiàn)在的方法只能通過簡單的規(guī)則限定檢測漏洞觸發(fā),漏報(bào)率和誤報(bào)率都很高。未來可以通過神經(jīng)網(wǎng)絡(luò)、深度學(xué)習(xí)等方式,將可以提取的數(shù)據(jù)類型作為特征,使用已有的漏洞提取數(shù)據(jù)作為學(xué)習(xí)樣本進(jìn)行深度學(xué)習(xí),訓(xùn)練后通過神經(jīng)網(wǎng)絡(luò)等方式智能推理實(shí)現(xiàn)漏報(bào)率誤報(bào)率較低的漏洞檢測方式,檢測出競態(tài)漏洞等更為復(fù)雜的漏洞。
現(xiàn)有的競態(tài)漏洞檢測技術(shù)在用戶態(tài)和內(nèi)核態(tài)存在顯著的差異。用戶態(tài)競態(tài)漏洞檢測經(jīng)過充分的發(fā)展已經(jīng)逐步成熟,內(nèi)核態(tài)競態(tài)漏洞檢測因?yàn)檠芯渴侄螁我?、語義層級低、性能開銷大等因素尚未形成完善的競態(tài)漏洞檢測方案,但是涌現(xiàn)了許多具有參考價值的嘗試和創(chuàng)新。總結(jié)研究人員對競態(tài)漏洞檢測的各類方法,可以對競態(tài)漏洞檢測技術(shù)的發(fā)展帶來指引和啟迪。
如表1列出的競態(tài)漏洞檢測工具所示,現(xiàn)有的用戶態(tài)競態(tài)漏洞檢測工具種類按照檢測方法分為happensbefore 類 別 和 lock-set類 別 。Racetrack[4]、LiteRace[37]、Fasttrack[5]、PACER[6]屬于 happens-before類別,此類工具是在happens-before基礎(chǔ)上通過取樣的方式進(jìn)行了性能優(yōu)化;Eraser[11]是屬于lock-set類別的檢測工具。內(nèi)核態(tài)競態(tài)漏洞檢測工具均是通過系統(tǒng)調(diào)用的監(jiān)控實(shí)現(xiàn)檢測,包括 RPS[53],DRDDR[30],RACEZ[17]和 HARD[14]。
表1 競態(tài)漏洞檢測工具匯總
用戶態(tài)的競態(tài)漏洞檢測方法趨于成熟,檢測技術(shù)整體框架完善;內(nèi)核態(tài)的競態(tài)漏洞檢測面臨兩個挑戰(zhàn):如何實(shí)現(xiàn)內(nèi)核態(tài)系統(tǒng)數(shù)據(jù)的提取,并保證數(shù)據(jù)提取操作的穩(wěn)定性、透明性和數(shù)據(jù)的高語義;如何實(shí)現(xiàn)適合內(nèi)核態(tài)數(shù)據(jù)的高效數(shù)據(jù)分析方法。目前來說,硬件虛擬化技術(shù)可以較好地解決第一個挑戰(zhàn)中的部分問題,能夠透明且高效地從客戶機(jī)中提取信息,但是信息的語義層級仍然較低,仍處于系統(tǒng)調(diào)用級別;解決第二個挑戰(zhàn)的關(guān)鍵是能否基于機(jī)器學(xué)習(xí)設(shè)計(jì)出適合內(nèi)核態(tài)數(shù)據(jù)的分析算法。
利用虛擬機(jī)化技術(shù)進(jìn)行數(shù)據(jù)提取是未來競態(tài)漏洞檢測技術(shù)的發(fā)展趨勢。虛擬機(jī)自省技術(shù)、硬件虛擬化技術(shù)、云虛擬化技術(shù)都可以有效地提高數(shù)據(jù)提取效率,并且使得提取數(shù)據(jù)的方式更加隱蔽,提取的數(shù)據(jù)更為真實(shí),在漏洞利用和漏洞檢測的對抗過程中獲得更大的優(yōu)勢。
利用機(jī)器學(xué)習(xí)的方式智能化分析數(shù)據(jù)之間的邏輯關(guān)系,定位操作與操作之間的矛盾之處,發(fā)現(xiàn)存在于程序之中的競態(tài)漏洞是未來競態(tài)漏洞數(shù)據(jù)的分析方法。神經(jīng)網(wǎng)絡(luò)、深度學(xué)習(xí)等機(jī)器學(xué)習(xí)方法能夠準(zhǔn)確、高效地進(jìn)行競態(tài)漏洞數(shù)據(jù)分析。未來可以利用已公開的漏洞生成訓(xùn)練數(shù)據(jù),分析系統(tǒng)在訓(xùn)練完成后,對虛擬化技術(shù)提取的數(shù)據(jù)進(jìn)行分析,實(shí)現(xiàn)智能化的邏輯漏洞檢測,彌補(bǔ)現(xiàn)有漏洞檢測技術(shù)中邏輯漏洞檢測的短板,改善目前嚴(yán)峻的內(nèi)核安全生態(tài)。
[1]Raheja S,Munjal G.Analysis of Linux kernel vulnerabilities[J].Indian Journal of Science and Technology,2016,9(48).
[2]Netzer R H B,Miller B P.What are race conditions?:Some issues and formalizations[J].ACM Letters on Programming Languages and Systems(LOPLAS),1992,1(1):74-88.
[3]Narayanasamy S,Wang Z,Tigani J,et al.Automatically classifying benign and harmful data races using replay analysis[C]//ACM Sigplan Notices,2007,42(6):22-31.
[4]Yu Y,Rodeheffer T,Chen W.Racetrack:Efficient detection of data race conditions via adaptive tracking[C]//ACM SIGOPS Operating Systems Review,2005,39(5):221-234.
[5]Flanagan C,F(xiàn)reund S N.FastTrack:Efficient and precise dynamic race detection[C]//ACM Sigplan Notices,2009,44(6):121-133.
[6]Bond M D,Coons K E,McKinley K S.PACER:Proportional detection of data races[C]//ACM Sigplan Notices,2010,45(6):255-268.
[7]Smaragdakis Y,Evans J,Sadowski C,et al.Sound predictive race detection in polynomial time[J].ACM Sigplan Notices,2012,47(1):387-400.
[8]Poluri S V,Ramanathan M K.Deterministic dynamic race detection across program versions[C]//2015 IEEE International Conference on Software Maintenance and Evolution(ICSME),2015:181-190.
[9]Wilcox J R,F(xiàn)inch P,F(xiàn)lanagan C,et al.Array shadow state compression for precise dynamic race detection(T)[C]//30th IEEE/ACM International Conference on Automated Software Engineering(ASE),2016:155-165.
[10]Huang J,Meredith P O N,Rosu G.Maximal sound predictive race detection with control flow abstraction[J].ACM Sigplan Notices,2014,49(6):337-348.
[11]Savage S,Burrows M,Nelson G,et al.Eraser:A dynamic data race detector for multithreaded programs[J].ACM Transactions on Computer Systems(TOCS),1997,15(4):391-411.
[12]Von Praun C,Gross T R.Object race detection[C]//ACM Sigplan Notices,2001,36(11):70-82.
[13]Nishiyama H.Detecting data races using dynamic escape analysis based on read barrier[C]//Virtual Machine Research and Technology Symposium,2004:127-138.
[14]Zhou P,Teodorescu R,Zhou Y.HARD:Hardware-assisted lockset-based race detection[C]//IEEE 13th International Symposium on High Performance Computer Architecture,2007:121-132.
[15]Serebryany K,Iskhodzhanov T.ThreadSanitizer:data race detection in practice[C]//Proceedings of the Workshop on Binary Instrumentation and Applications,2009:62-71.
[16]Jannesari A,Tichy W F.On-the-fly race detection in multithreaded programs[C]//Proceedings of the 6th Workshop on Parallel and Distributed Systems:Testing,Analysis,and Debugging,2008:6.
[17]Sheng T,Vachharajani N,Eranian S,et al.RACEZ:A lightweight and non-invasive race detection tool for production applications[C]//2011 33rd International Conference on Software Engineering(ICSE),2011:401-410.
[18]趙躍華,鄧淵浩.基于硬件虛擬化的內(nèi)核競態(tài)漏洞監(jiān)測技術(shù)研究與實(shí)現(xiàn)[J].軟件導(dǎo)刊,2015(5):161-164.
[19]Erickson J,Musuvathi M,Burckhardt S,et al.Effective data-race detection for the kernel[C]//Usenix Symposium on Operating Systems Design&Implementation,2010:151-162.
[20]Jimenez M,Papadakis M,Le Traon Y.Vulnerability prediction models:A case study on the linux kernel[C]//2016 IEEE 16th International Working Conference on Source Code Analysis and Manipulation(SCAM),2016:1-10.
[21]倪昀澤.移動智能終端安全漏洞攻防技術(shù)綜述[J].移動通信,2017,41(7):30-34.
[22]Payer M,Gross T R.Protecting applications against TOCTTOU races by user-space caching of file metadata[C]//ACM Sigplan Notices,2012,47(7):215-226.
[23]Wei J,Pu C.TOCTTOU vulnerabilities in UNIX-Style file systems:An anatomical study[C]//Conference on Usenix Conference on File&Storage Technologies,2015,29(8):12.
[24]Bratus S,D’Cunha N,Sparks E,et al.TOCTOU,traps,and trusted computing[C]//International Conference on Trusted Computing.Berlin Heidelberg:Springer,2008:14-32.
[25]Lamport L.Correctly executes multiprocess progranm[J].IEEE Transactions on Computers,1979,28(9).
[26]Li X,Chang X,Board J A,et al.A novel approach for software vulnerability classification[C]//2017 Annual Reliability and Maintainability Symposium(RAMS),2017:1-7.
[27]Whyman P A.Automatic endpoint vulnerability detection of Linux and open source using the National Vulnerability Database[D].Colorado State University,2007.
[28]Koziol J,Litchfield D,Aitel D,et al.The Shellcoder’s handbook[M].Indianapolis:Wiley,2004.
[29]Netzer R H B.Race condition detection for debugging shared-memory parallel programs[D].University of Wisconsin-Madison,1991.
[30]Jiang Y,Yang Y,Xiao T,et al.DRDDR:A lightweight method to detect data racesin Linux kernel[J].The Journal of Supercomputing,2016,72(4):1645-1659.
[31]Jiang Y,Yang Y,Xiao T,et al.Kernel data race detection using debug register in Linux[C]//COOL Chips XVII,2014:1-3.
[32]Lamport L.Time,clocks,and the ordering of events in a distributed system[J].Communications of the ACM,1978,21(7):558-565.
[33]Flanagan C,F(xiàn)reund S N.Type-based race detection for Java[C]//ACM Sigplan Notices,2000,35(5):219-232.
[34]Gupta S,Sultan F,Cadambi S,et al.Using hardware transactional memory for data race detection[C]//IEEE International Symposium on Parallel& Distributed Processing,2009:1-11.
[35]Netzer R H B,Ghosh S.Efficient race condition detection for shared-memory programs with post/wait synchronization[D].University of Wisconsin-Madison,1992.
[36]Bhansali S,Chen W K,De Jong S,et al.Framework for instruction-level tracing and analysis of program executions[C]//Proceedingsofthe 2nd International Conference on Virtual Execution Environments,2006:154-163.
[37]Marino D,Musuvathi M,Narayanasamy S.LiteRace:effective sampling for lightweight data-race detection[C]//ACM Sigplan Notices,2009,44(6):134-143.
[38]Biswas S,Cao M,Zhang M,et al.Lightweight data race detection for production runs[C]//Proceedings of the 26th International Conference on Compiler Construction,2017:11-21.
[39]Witten I H,F(xiàn)rank E,Hall M A,et al.Data mining:Practical machine learning tools and techniques[M].[S.l.]:Morgan Kaufmann,2016.
[40]Kistler M,Brokenshire D.Detecting race conditions in asynchronous DMA operations with full system simulation[C]//2011 IEEE International Symposium on Performance Analysis of Systems and Software(ISPASS),2011:207-215.
[41]Srivastava A,Giffin J.Automatic discovery of parasitic malware[C]//International Workshop on Recent Advances in Intrusion Detection.Berlin Heidelberg:Springer,2010:97-117.
[42]Garfinkel T,Rosenblum M.A virtual machine introspection based architecture for intrusion detection[C]//Proceedings of the Network&Distributed Systems Secuity Symposium,2003:191-206.
[43]王麗娜,高漢軍,劉煒,等.利用虛擬機(jī)監(jiān)視器檢測及管理隱藏進(jìn)程[J].計(jì)算機(jī)研究與發(fā)展,2011,48(8):1534-1541.
[44]Singhal M,Kshemkalyani A.An efficient implementation of vector clocks[J].Information Processing Letters,1992,43(1):47-52.
[45]Gaur D,Connor P,Jenison L,et al.Driver having multiple deferred procedure calls for interrupt processing and method for interrupt processing:U.S.Patent Application 09/823,155[P].2001-03-29.
[46]Love R.Linux kernel development[M].[S.l.]:Novell Press,2005.
[47]Tsyrklevich E,Yee B.Dynamic detection and prevention of race conditions in file accesses[C]//Proceedings of Usenix Security Symposium,2003,4(2):17.
[48]Uppuluri P,Joshi U,Ray A.Preventing race condition attacks on file-systems[C]//Proceedings of the 2005 ACM Symposium on Applied Computing,2005:346-353.
[49]Wei J,Pu C.Modeling and preventing TOCTTOU vulnerabilities in Unix-style file systems[J].Computers&Security,2010,29(8):815-830.
[50]Jeter R E,Potter K H.Memory controller that tracks queue operations to detect race conditions:U.S.Patent 7,254,687[P].2007-08-07.
[51]Jiang X,Wang X,Xu D.Stealthy malware detection through vmm-based out-of-the-box semantic view reconstruction[C]//Proceedings of the 14th ACM Conference on Computer and Communications Security,2007:128-138.
[52]Pan J,Yan G,F(xiàn)an X.Digtool:A virtualization-based framework for detecting kernel vulnerabilities[C]//26th{USENIX}Security Symposium({USENIX}Security 17),USENIX Association,2017.
[53]Park J,Lee G,Lee S,et al.RPS:An extension of reference monitor to prevent race-attacks[J].Advances in Multimedia Information Processing-PCM 2004,2005:556-563.