摘要:傳統(tǒng)的惡意代碼檢測工具一般都是基于惡意代碼的單次執(zhí)行,但是有些惡意的活動只是在一些特定的環(huán)境下才能被觸發(fā)。本文提出了一個探索多種運(yùn)行分支的方法,這個方法不但能發(fā)現(xiàn)傳統(tǒng)惡意代碼能檢測出來的運(yùn)行分支,還能識別只在遇到某種特定環(huán)境才會觸發(fā)的惡意行為。
關(guān)鍵詞:惡意代碼
快照
惡意行為
惡意代碼,是所有帶有惡意的各類代碼的通稱(比如病毒、蠕蟲、特洛伊木馬)。惡意代碼不僅僅對電腦用戶的隱私構(gòu)成威脅,它還能造成電腦用戶巨額的經(jīng)濟(jì)損失。這個問題的嚴(yán)重性已經(jīng)使非計(jì)算機(jī)專業(yè)的人都知道了CodeRed(紅色代碼)或者Sasser(震蕩波),這是因?yàn)榘踩珕栴}已經(jīng)影響到了幾百萬人,而且還成為了主流新聞。
一、傳統(tǒng)惡意代碼的檢測方法和缺陷
惡意代碼檢測的傳統(tǒng)方法是在一個在虛擬的計(jì)算機(jī)環(huán)境下運(yùn)行這個程序,當(dāng)程序運(yùn)行時跟操作系統(tǒng)之間的活動都會被記錄下來,同時還記錄哪些系統(tǒng)調(diào)用和參數(shù)被使用。然后自動報(bào)告這個程序已經(jīng)創(chuàng)建或訪問過的系統(tǒng)資源,如文件或者注冊表項(xiàng)。但是,傳統(tǒng)的分析系統(tǒng)有一個很嚴(yán)重的缺陷:它們僅僅是基于單次跟蹤執(zhí)行的,也就是說,它們的報(bào)告只能顯示這個軟件在特定的測試環(huán)境下一段時期內(nèi)被發(fā)現(xiàn)的活動,因此,這個方法有可能不會知道在改變了的環(huán)境中會有那些行為。
二、解決傳統(tǒng)惡意代碼檢測缺陷的方法
為了解決這個問題,就需要擴(kuò)大測試范圍。在不同的環(huán)境中運(yùn)行程序,或者使用不同的操作系統(tǒng)版本、安裝不同的軟件和不同的時間設(shè)置。這就需要以下兩個主要步驟:第一,需要追蹤程序怎么使用輸入的數(shù)據(jù)。第二,當(dāng)找到一個重要的分支點(diǎn),需要保存當(dāng)前的程序狀態(tài)并且能在將來重新載入這個狀態(tài),以便于執(zhí)行另外一條分支。
1,跟蹤輸入的數(shù)據(jù)
在傳統(tǒng)的基于Taint模式的系統(tǒng)中,通過輸入一兩個值就能很容易的知道某個內(nèi)存地址。要想獲得這個信息,需要依賴三個因素:一個污點(diǎn)源、一個影像存儲器和傳播Taint信息的機(jī)器指令擴(kuò)展。
可以依賴傳統(tǒng)的污點(diǎn)系統(tǒng)來追蹤程序讀入的數(shù)據(jù)。我們使用很多系統(tǒng)準(zhǔn)備讀入的并且作了標(biāo)簽的污點(diǎn)源,同時還用影像存儲器來跟蹤被指定到每一個內(nèi)存地址的當(dāng)前標(biāo)簽。當(dāng)系統(tǒng)調(diào)用被程序使用,我們就可以為每一個收到結(jié)果的內(nèi)存地址指定一個標(biāo)簽。
2,保存和重新載入程序快照
存儲輸入信息的每一個內(nèi)存地址都會附上一個標(biāo)簽,約束系統(tǒng)可以知道具有不同標(biāo)簽的值之間是怎么聯(lián)系的?;谶@些信息,我們就呵以探索程序的多個運(yùn)行分支了,肖一個分支被識別,就可以創(chuàng)建當(dāng)前程序狀態(tài)的快照。
當(dāng)前運(yùn)行狀態(tài)的快照包含了使用中的完整的虛擬地址空間內(nèi)容。程序被允許繼續(xù)執(zhí)行以前,還必須保證條件運(yùn)算本身也被考慮到了,原因是在實(shí)際中,無論那條分支被執(zhí)行,條件運(yùn)算在一系列可能的標(biāo)簽參數(shù)的值中執(zhí)行了一個約束。我們把這個約束稱為分支約束。當(dāng)標(biāo)簽的值被重寫的時候必須考慮和記著這個分支約束。否則,我們可能創(chuàng)建一個不統(tǒng)一的狀態(tài)或者運(yùn)行到一個不可能的分支。當(dāng)if分支執(zhí)行的時候,條件被直接使用與分支約束。否則,當(dāng)else分支被執(zhí)行,約束條件在被加到約束系統(tǒng)之前必須被重置。
當(dāng)程序狀態(tài)被重載的時候,需要載入以前保存的內(nèi)容,這些內(nèi)容包括程序的地址空間和用存儲的值覆蓋當(dāng)前的值。這樣我們就可以發(fā)現(xiàn)惡意代碼的程序分支。接著,我們就可以檢測約束系統(tǒng)來確定在哪種情況下這個分支被執(zhí)行。
三、結(jié)論
本文討論了一個探索惡意代碼多運(yùn)行分支的方法,目的就是對未知的程序可能執(zhí)行的動作做一個更綜合的概述。
我們可以通過追蹤程序輸入的數(shù)據(jù)(如本地時間、文件檢查和從網(wǎng)絡(luò)上讀取資料等)來對程序的條件分支進(jìn)行動態(tài)的分析。當(dāng)程序沿著一個分支執(zhí)行時,就對當(dāng)前狀態(tài)創(chuàng)建一個快照,當(dāng)程序隨后結(jié)束時,我們就重置回先前所保存的那個狀態(tài)并且修改條件的參數(shù),使另外的分支被執(zhí)行。