国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

程序逆向分析在軟件供應(yīng)鏈污染檢測(cè)中的應(yīng)用研究綜述

2020-03-06 12:55武振華顏學(xué)雄
計(jì)算機(jī)應(yīng)用 2020年1期
關(guān)鍵詞:污點(diǎn)靜態(tài)程序

武振華,張 超,孫 賀,顏學(xué)雄

(1.戰(zhàn)略支援部隊(duì)信息工程大學(xué) 數(shù)學(xué)工程與先進(jìn)計(jì)算國(guó)家重點(diǎn)實(shí)驗(yàn)室,鄭州 450001;2.清華大學(xué) 網(wǎng)絡(luò)科學(xué)與網(wǎng)絡(luò)空間研究院,北京 100084; 3.陸軍工程大學(xué) 指揮控制工程學(xué)院,南京 210007)

0 引言

近年來,軟件供應(yīng)鏈(Software Supply Chain, SSC)安全問題頻發(fā),在給用戶的隱私和財(cái)產(chǎn)帶來巨大損失的同時(shí),也對(duì)軟件供應(yīng)鏈的安全防護(hù)提出了新的考驗(yàn)和挑戰(zhàn)。有別于傳統(tǒng)的針對(duì)軟件自身程序漏洞進(jìn)行的攻擊,軟件供應(yīng)鏈攻擊者側(cè)重利用軟件供應(yīng)鏈上的安全漏洞,在合法軟件的開發(fā)編譯、分發(fā)交付以及安裝使用等環(huán)節(jié)中進(jìn)行劫持或篡改,借助用戶和軟件供應(yīng)商之間的信任關(guān)系,在合法軟件的外衣下,突破安全產(chǎn)品的防線,獲得用戶的信任,悄然實(shí)施攻擊[1]。這種攻擊的結(jié)果導(dǎo)致了軟件供應(yīng)鏈污染。

目前關(guān)于軟件供應(yīng)鏈安全的研究剛剛起步,文獻(xiàn)[2]列舉了多個(gè)宏觀層面的研究,概述了軟件供應(yīng)鏈定義、安全威脅、防御手段等方面的內(nèi)容。在具體技術(shù)方面,文獻(xiàn)[1]對(duì)軟件供應(yīng)鏈污染技術(shù)、軟件供應(yīng)鏈污染主動(dòng)防御方法以及針對(duì)WordPress的供應(yīng)鏈安全污染檢測(cè)技術(shù)進(jìn)行了研究。目前尚未有工作對(duì)軟件供應(yīng)鏈安全研究的其他問題進(jìn)行研究和綜述。

文獻(xiàn)[3]指出,自動(dòng)化程序分析技術(shù)是軟件供應(yīng)鏈安全研究的重點(diǎn)內(nèi)容,但是當(dāng)前多數(shù)軟件供應(yīng)鏈污染檢測(cè)研究仍處于手工或半自動(dòng)分析階段。多數(shù)工作利用手動(dòng)分析或自動(dòng)化分析工具輔助分析的方法進(jìn)行研究,鮮有工作能夠?qū)崿F(xiàn)自動(dòng)化分析并檢測(cè)軟件是否被污染。

自動(dòng)化程序逆向分析技術(shù)一直是信息安全領(lǐng)域研究的熱點(diǎn)和重點(diǎn)問題之一,已有大量工作對(duì)程序逆向分析和惡意代碼檢測(cè)技術(shù)進(jìn)行了研究。在基礎(chǔ)程序分析方法方面,文獻(xiàn)[4]對(duì)靜態(tài)分析方法進(jìn)行了深入研究;文獻(xiàn)[5]對(duì)動(dòng)態(tài)分析方法進(jìn)行了綜述;在現(xiàn)今主流的程序分析技術(shù)方面,文獻(xiàn)[6]對(duì)符號(hào)執(zhí)行和污點(diǎn)分析技術(shù)進(jìn)行了綜述;在程序分析技術(shù)的應(yīng)用方面,文獻(xiàn)[7]對(duì)惡意代碼分析技術(shù)進(jìn)行了全面的研究,但是尚未有工作系統(tǒng)性地分析現(xiàn)有程序逆向分析方法及其應(yīng)用技術(shù)(惡意代碼檢測(cè))是否可以滿足軟件供應(yīng)鏈安全研究的需要。

本文主要關(guān)注針對(duì)二進(jìn)制程序的軟件供應(yīng)鏈的污染檢測(cè)技術(shù),在軟件供應(yīng)鏈下游發(fā)現(xiàn)供應(yīng)鏈中存在的污染問題。本文主要工作及貢獻(xiàn)包括:

1)對(duì)軟件供應(yīng)鏈污染檢測(cè)問題進(jìn)行了深入剖析和闡述;

2)指出了軟件供應(yīng)鏈污染檢測(cè)問題與傳統(tǒng)惡意程序分析和檢測(cè)問題的聯(lián)系和區(qū)別;

3)介紹了目前使用的程序逆向分析方法及其在軟件供應(yīng)鏈污染檢測(cè)中的應(yīng)用;

4)展望了軟件供應(yīng)鏈污染檢測(cè)中亟待解決的問題及若干可行并值得進(jìn)一步研究的課題。

針對(duì)上述問題,本文詳細(xì)分析了22個(gè)軟件供應(yīng)鏈污染事件;對(duì)97篇高水平論文進(jìn)行了分析和介紹,文獻(xiàn)主要來自中文核心期刊以及中國(guó)計(jì)算機(jī)學(xué)會(huì)(China Computer Federation, CCF)A類會(huì)議、期刊;內(nèi)容涵蓋了程序分析技術(shù)以及軟件供應(yīng)鏈污染研究前沿研究。論文搜索關(guān)鍵詞包括(中英文的)程序分析、逆向工程、靜態(tài)分析、動(dòng)態(tài)分析、符號(hào)執(zhí)行、污點(diǎn)分析、軟件供應(yīng)鏈、軟件供應(yīng)鏈污染等。絕大多數(shù)論文下載自谷歌學(xué)術(shù)、知網(wǎng)、百度學(xué)術(shù)等知名學(xué)術(shù)搜索平臺(tái),內(nèi)容涵蓋了信息學(xué)科下主流數(shù)據(jù)庫(kù),包括國(guó)際計(jì)算機(jī)協(xié)會(huì)(Association for Computing Machinery, ACM)、電氣和電子工程師協(xié)會(huì)(Institute of Electrical and Electronics Engineers, IEEE)、愛思唯爾、斯普林格等。

1 軟件供應(yīng)鏈污染檢測(cè)問題

1.1 研究背景

軟件供應(yīng)鏈?zhǔn)侵杠浖能浖?yīng)商到達(dá)用戶手中并被用戶使用的整個(gè)過程中相關(guān)環(huán)節(jié)的連接,從軟件設(shè)計(jì)開始,到代碼編寫與軟件生成,再到軟件分發(fā)與用戶下載,并最終由用戶使用的一個(gè)軟件供應(yīng)商與軟件用戶之間,緊密圍繞軟件,由開發(fā)環(huán)節(jié)(上游)、交付環(huán)節(jié)(中游)和使用環(huán)節(jié)(下游)三大環(huán)節(jié)所組成的鏈狀結(jié)構(gòu)[1,8]。軟件供應(yīng)鏈攻擊是指攻擊者利用軟件供應(yīng)商與最終用戶之間的信任關(guān)系,在合法軟件的開發(fā)、傳播和升級(jí)過程中進(jìn)行劫持或篡改,從而繞過傳統(tǒng)安全產(chǎn)品檢查并達(dá)到非法目的的攻擊類型[1,9]。如圖1所示,軟件供應(yīng)鏈攻擊可能發(fā)生在軟件供應(yīng)鏈的任意環(huán)節(jié)。軟件供應(yīng)鏈攻擊的結(jié)果是造成了軟件供應(yīng)鏈污染,攻擊者在用戶運(yùn)行了被污染的軟件后開始實(shí)施后續(xù)攻擊。與傳統(tǒng)的漏洞挖掘利用和終端病毒感染不同,軟件供應(yīng)鏈污染更加強(qiáng)調(diào)由于第三方原因造成的軟件供應(yīng)鏈上的軟件產(chǎn)品的安全威脅,主要包括攻擊者攻擊造成的軟件篡改或使用第三方代碼庫(kù)而引入的惡意代碼及安全漏洞。表1中總結(jié)了近幾年軟件供應(yīng)鏈安全事件中,攻擊者使用的攻擊方式和最終導(dǎo)致污染的位置。

主動(dòng)防御和被動(dòng)檢測(cè)是保障軟件安全的兩種重要手段。其中,主動(dòng)防御側(cè)重于阻斷攻擊者的攻擊,主要包括針對(duì)軟件開發(fā)商、開源軟件管理平臺(tái)、軟件發(fā)布平臺(tái)和用戶終端的安全防護(hù),旨在從源頭上遏制惡意代碼的植入和擴(kuò)散。文獻(xiàn)[10]對(duì)軟件供應(yīng)鏈各個(gè)環(huán)節(jié)的主動(dòng)防御策略進(jìn)行了較為詳細(xì)的闡述。

圖1 軟件供應(yīng)鏈攻擊示意圖Fig. 1 Schematic diagram of SSC attack

表1 軟件供應(yīng)鏈污染事件污染方式總結(jié) Tab. 1 Summary of pollution methods of SSC pollution events

續(xù)表

被動(dòng)檢測(cè)是假定可能有攻擊存在,在生成的軟件中檢測(cè)是否存在污染。軟件供應(yīng)鏈污染檢測(cè)屬于被動(dòng)檢測(cè),主要包括對(duì)開源代碼、開源軟件包、軟件安裝包和軟件可執(zhí)行程序的安全性檢測(cè)。這其中,安全性檢測(cè)又包括惡意代碼檢測(cè)和漏洞挖掘,檢測(cè)對(duì)象包括程序源代碼和程序可執(zhí)行文件。程序逆向分析技術(shù)是安全性檢測(cè)的基礎(chǔ),文獻(xiàn)[11]對(duì)其進(jìn)行了詳細(xì)闡述。文獻(xiàn)[5]對(duì)惡意程序檢測(cè)技術(shù)進(jìn)行了全面的綜述。文獻(xiàn)[12]對(duì)軟件安全漏洞檢測(cè)技術(shù)進(jìn)行了總結(jié)。

1.2 軟件供應(yīng)鏈下游的污染檢測(cè)

軟件供應(yīng)鏈下游的污染檢測(cè)是針對(duì)軟件的可執(zhí)行文件或提供的服務(wù)進(jìn)行的污染檢測(cè)。檢測(cè)目標(biāo)是表1中“污染位置”列所示的軟件形態(tài)。由于軟件供應(yīng)鏈污染檢測(cè)涵蓋內(nèi)容過于繁雜,涉及不同編程語(yǔ)言、編譯環(huán)境、運(yùn)行環(huán)境等,后文主要針對(duì)傳統(tǒng)的C/C++語(yǔ)言編寫、編譯得到的程序進(jìn)行闡述。

1.2.1 研究意義

軟件供應(yīng)鏈上游的軟件廠商和中游的分發(fā)平臺(tái)可能受到成本、效率和利潤(rùn)等因素的制約,不可避免地遺留一些安全漏洞。這些漏洞可能被攻擊者利用,導(dǎo)致軟件供應(yīng)鏈的污染,因此軟件供應(yīng)鏈的污染源很難被完全消除,仍需要在軟件發(fā)布之后,即在軟件供應(yīng)鏈下游對(duì)發(fā)行的軟件進(jìn)行污染檢測(cè)。

同時(shí),在軟件供應(yīng)鏈下游的污染檢測(cè)能夠發(fā)現(xiàn)上游、中游的所有污染。從表1中很容易看出,軟件供應(yīng)鏈污染的代碼最終必須要在下游用戶端執(zhí)行才能發(fā)揮其效用,因此,軟件供應(yīng)鏈下游的污染檢測(cè)能夠極大彌補(bǔ)主動(dòng)防御的不足,對(duì)軟件進(jìn)行更加全面的掃描。

再者,軟件供應(yīng)鏈下游的軟件樣本比較容易獲取。研究人員可以更加容易地獲取軟件樣本進(jìn)行研究。

1.2.2 問題分析

軟件供應(yīng)鏈下游的軟件供應(yīng)鏈污染檢測(cè)問題與惡意代碼檢測(cè)問題沒有本質(zhì)區(qū)別,都是對(duì)程序是否惡意的判定。檢測(cè)流程是,首先搜集軟件特征,之后對(duì)特征進(jìn)行結(jié)果判定。目前主流的人工智能(Artificial Intelligence, AI)技術(shù)完全可以實(shí)現(xiàn)高精度的結(jié)果判定,但是,其前提條件是要能夠搜集到完整的或者關(guān)鍵的軟件特征。如果無法搜集到污染代碼或污染行為,即使是最先進(jìn)的AI技術(shù)也無法作出準(zhǔn)確的判斷。然而,在搜集軟件特征方面,軟件供應(yīng)鏈污染檢測(cè)比傳統(tǒng)的惡意代碼檢測(cè)更加復(fù)雜,表現(xiàn)在如下幾方面。

首先,軟件供應(yīng)鏈下游的污染檢測(cè)比傳統(tǒng)的惡意代碼更為隱蔽,被植入的代碼常與正常程序代碼混淆在一起,當(dāng)軟件供應(yīng)鏈上游被污染時(shí),惡意代碼還可能帶有合法的軟件廠商的簽名。由于多數(shù)安全防護(hù)軟件使用白名單機(jī)制過濾掉可信任廠商發(fā)布的軟件,因此其中的污染代碼比傳統(tǒng)惡意代碼更難被發(fā)現(xiàn)。

其次,很多被污染的軟件會(huì)提示用戶在使用過程中關(guān)閉安全防護(hù)軟件從而實(shí)施攻擊,導(dǎo)致程序難以被安全防護(hù)軟件集成的云查殺系統(tǒng)發(fā)現(xiàn),導(dǎo)致被污染軟件可以長(zhǎng)期在網(wǎng)絡(luò)上傳播。

再次,軟件供應(yīng)鏈上的安全檢測(cè)目標(biāo)不僅包括軟件的可執(zhí)行程序,還包括軟件的安裝程序,然而軟件的安裝過程往往需要借助用戶交互來完成;同時(shí),很多軟件廠商使用自定義的打包工具發(fā)布軟件安裝包,且不支持靜默安裝,對(duì)于大量存在的此類安裝包,現(xiàn)有方法很難實(shí)現(xiàn)自動(dòng)化的用戶交互并完成軟件安裝過程,因此導(dǎo)致其中的污染代碼難以被發(fā)現(xiàn)。

最后,攻擊者還可能在軟件中植入惡意代碼,這些代碼可能隱藏在軟件程序的任何角落中,只有當(dāng)用戶通過用戶界面(User Interface, UI)使用軟件的特定功能,這些代碼才能被觸發(fā)。此時(shí),這些惡意代碼極難被分析人員發(fā)現(xiàn)。

1.2.3 程序逆向分析與軟件供應(yīng)鏈污染檢測(cè)

傳統(tǒng)的惡意代碼分析技術(shù)使用的特征主要分為語(yǔ)法特征和語(yǔ)義特征兩大類。程序的語(yǔ)法特征需要通過解析程序的二進(jìn)制執(zhí)行,并轉(zhuǎn)換為高級(jí)語(yǔ)言(反匯編、反編譯)。程序的語(yǔ)義特征主要包括應(yīng)用程序接口(Application Programming Interface, API)調(diào)用和執(zhí)行過程中的系統(tǒng)狀態(tài)改變情況。

然而由于代碼混淆技術(shù)的廣泛使用,惡意代碼經(jīng)常主動(dòng)識(shí)別當(dāng)前的運(yùn)行環(huán)境,或者設(shè)置觸發(fā)條件來執(zhí)行惡意行為。

傳統(tǒng)的單純依靠被動(dòng)監(jiān)控程序執(zhí)行的方法很難搜集到惡意代碼的真實(shí)語(yǔ)義,所以,對(duì)于帶有反分析技術(shù)的惡意代碼,無論搜集其語(yǔ)法特征還是語(yǔ)義特征,都需要用到程序逆向分析技術(shù)。又由于軟件供應(yīng)鏈下游的污染檢測(cè)目標(biāo)主要為可執(zhí)行程序,因此,需要用到程序逆向分析技術(shù)對(duì)其進(jìn)行分析。

后文將首先介紹當(dāng)前程序逆向分析技術(shù)在軟件供應(yīng)鏈下游的污染檢測(cè)中的應(yīng)用,并分析當(dāng)前技術(shù)在解決軟件供應(yīng)鏈污染檢測(cè)問題時(shí)仍存在的具體問題,最后提出了若干可行的解決思路。

2 程序逆向分析技術(shù)的應(yīng)用

現(xiàn)有的程序分析方法主要包括靜態(tài)分析、動(dòng)態(tài)分析、符號(hào)執(zhí)行和污點(diǎn)分析。靜態(tài)分析和動(dòng)態(tài)分析是檢測(cè)代碼安全的基本方法,兩者的區(qū)別在于獲取信息的方式不同:靜態(tài)分析方法的數(shù)據(jù)源是可執(zhí)行文件中的數(shù)據(jù),動(dòng)態(tài)分析的數(shù)據(jù)源是動(dòng)態(tài)執(zhí)行過程中獲取的運(yùn)行時(shí)數(shù)據(jù)。符號(hào)執(zhí)行和污點(diǎn)分析技術(shù)是應(yīng)用最廣泛的二進(jìn)制程序分析技術(shù),靜態(tài)分析方法和動(dòng)態(tài)分析方法均可以實(shí)現(xiàn)這兩種技術(shù)。

本文總結(jié)了近十年來國(guó)內(nèi)外發(fā)生的百余起軟件供應(yīng)鏈安全事件,標(biāo)注了安全人員在分析事件樣本時(shí)使用的程序分析方法,部分結(jié)果如表2所示。

傳統(tǒng)的靜態(tài)分析方法在目前軟件供應(yīng)鏈污染檢測(cè)中起到了非常重要的作用,分析人員在事件的分析過程中無一例外地使用了交互式反匯編器專業(yè)版(Interactive Disassembler Professional, IDA Pro)[35]工具查看反匯編、反編譯代碼以及程序中各個(gè)函數(shù)的控制流圖。大多數(shù)事件的分析過程也用到了動(dòng)態(tài)分析方法,表2標(biāo)注了事件分析中使用的具體的動(dòng)態(tài)分析方法。同時(shí),符號(hào)執(zhí)行和污點(diǎn)分析兩欄標(biāo)注了自動(dòng)化分析該事件的樣本時(shí)否需要該項(xiàng)技術(shù),例如對(duì)不存在對(duì)抗的樣本可以直接用動(dòng)態(tài)跟蹤技術(shù)跟蹤程序行為,而對(duì)存在對(duì)抗的樣本,如“隱魂”木馬,在自動(dòng)化分析時(shí)則要借助符號(hào)執(zhí)行和污點(diǎn)分析技術(shù)實(shí)現(xiàn)。目前供應(yīng)鏈污染問題的檢測(cè)尚處于人工分析階段,在現(xiàn)有軟件供應(yīng)鏈污染事件報(bào)告中很少提及自動(dòng)化分析技術(shù)的應(yīng)用。

表2 軟件供應(yīng)鏈安全事件中使用的程序逆向分析方法 Tab. 2 Program reverse analysis method used in SSC security events

2.1 靜態(tài)分析

靜態(tài)分析以靜態(tài)反匯編[36]技術(shù)為核心。靜態(tài)反匯編技術(shù)是指將程序可執(zhí)行文件中保存的二進(jìn)制機(jī)器碼(machine code)解碼為匯編代碼的過程。主流的靜態(tài)分析算法包括線性掃描和遞歸沉降算法[37]。區(qū)別是遞歸沉降算法解析控制流轉(zhuǎn)移指令的目標(biāo)地址,下一條要解析的指令地址是上一條指令的控制流后繼指令的地址,而不是該指令的結(jié)束地址。IDA Pro[35]、Capstone[38]、Binary ninja[39]和Ghidra[40]等是使用比較廣泛的反匯編及逆向分析工具。

靜態(tài)分析的最大優(yōu)勢(shì)是能夠?qū)φ麄€(gè)程序的指令進(jìn)行全面的分析。表2中所示幾乎所有軟件供應(yīng)鏈安全分析工作都使用了靜態(tài)反匯編或靜態(tài)分析工具。這些靜態(tài)分析工具均除提供反匯編功能外,還提供了基于反匯編指令的進(jìn)一步分析結(jié)果,包括可執(zhí)行文件結(jié)構(gòu)解析、控制流分析[41]、數(shù)據(jù)流分析[42]、庫(kù)函數(shù)識(shí)別[43]、反編譯等。

可執(zhí)行文件結(jié)構(gòu)包含了大量有利于逆向分析的信息,不同平臺(tái)的可執(zhí)行文件結(jié)構(gòu)的不同,以Windows PE結(jié)構(gòu)為例,其中的段屬性信息指示了數(shù)據(jù)的類型,反匯編方案只需要針對(duì)可執(zhí)行屬性的數(shù)據(jù)進(jìn)行分析;導(dǎo)入表信息指示了程序使用的動(dòng)態(tài)鏈接庫(kù)及動(dòng)態(tài)鏈接函數(shù)。

控制流分析主要是識(shí)別函數(shù)中的基本塊以及基本塊間的流轉(zhuǎn)關(guān)系。數(shù)據(jù)流分析主要識(shí)別指令操作數(shù)間的依賴關(guān)系,一般基于控制流分析實(shí)現(xiàn)。數(shù)據(jù)依賴分析是現(xiàn)在應(yīng)用最廣泛的數(shù)據(jù)流分析方法,程序切片[44]、污點(diǎn)分析[45]、約束求解[46](符號(hào)執(zhí)行[47])等技術(shù)都直接或間接地應(yīng)用了數(shù)據(jù)依賴分析技術(shù)。同時(shí),主流的靜態(tài)分析工具在靜態(tài)反匯編過程中都會(huì)默認(rèn)實(shí)現(xiàn)控制流和數(shù)據(jù)流分析,用于獲取控制流圖和代碼間的引用關(guān)系。

庫(kù)函數(shù)識(shí)別是靜態(tài)分析方法優(yōu)勢(shì)的重要體現(xiàn)。靜態(tài)鏈接庫(kù)函數(shù)體嵌入在程序代碼中,由于二進(jìn)制程序中沒有符號(hào)表信息,靜態(tài)鏈接庫(kù)函數(shù)需要用特定的方式進(jìn)行識(shí)別。目前通用的方法是通過對(duì)已知靜態(tài)鏈接庫(kù)函數(shù)建模得到唯一的特征,并在程序分析時(shí)分析各個(gè)庫(kù)函數(shù),查看其特征是否與已知靜態(tài)鏈接庫(kù)函數(shù)的特征一致。例如在CCleaner事件[27]中,奇安信安全團(tuán)隊(duì)通過分析異常庫(kù)函數(shù)發(fā)現(xiàn)惡意代碼被植入在C語(yǔ)言動(dòng)態(tài)運(yùn)行庫(kù)(C Run-Time library, CRT)中[48],進(jìn)而推斷出實(shí)施攻擊的方法。

反編譯是將匯編代碼翻譯成高級(jí)語(yǔ)言的過程,目前主流反編譯工作需識(shí)別不同的處理器架構(gòu),僅支持一部分架構(gòu)的匯編語(yǔ)言。高級(jí)語(yǔ)言能夠幫助分析人員更好地理解程序邏輯,極大地提高了人工分析樣本的效率;但是,惡意程序常在運(yùn)行過程中動(dòng)態(tài)解密、釋放指令或數(shù)據(jù)[49-50],靜態(tài)分析方法很難檢測(cè)該問題。Oh等[51]為提高靜態(tài)分析的準(zhǔn)確度,提出了基于貝葉斯優(yōu)化的自適應(yīng)學(xué)習(xí)方案,并以此建立面向數(shù)據(jù)流和上下文的部分靜態(tài)分析工具。Jeong等[52]通過非線性的上下文選擇,建立識(shí)別上下文敏感函數(shù)的學(xué)習(xí)方法,并設(shè)計(jì)了數(shù)據(jù)驅(qū)動(dòng)的上下文敏感的指針分析方案。但這兩種方案并不能從根本上解決問題,動(dòng)態(tài)分析方法更適合對(duì)其進(jìn)行分析。

2.2 動(dòng)態(tài)分析

動(dòng)態(tài)分析以動(dòng)態(tài)跟蹤技術(shù)為核心。在動(dòng)態(tài)跟蹤過程中獲取原始數(shù)據(jù),之后再利用這些數(shù)據(jù)進(jìn)行后續(xù)分析。動(dòng)態(tài)跟蹤可以獲得不同語(yǔ)法語(yǔ)義級(jí)別的數(shù)據(jù),跟蹤過程中可以按照指令、基本塊、函數(shù)等不同粒度搜集程序本身的語(yǔ)法信息,也可以在程序運(yùn)行過程中搜集系統(tǒng)信息,根據(jù)系統(tǒng)狀態(tài)的變化來表征程序行為;或在運(yùn)行時(shí)搜集系統(tǒng)調(diào)用信息,用來刻畫程序行為;或者監(jiān)控內(nèi)存權(quán)限變化,例如先寫后執(zhí)行(execute-after-write)[53-54]或先重構(gòu)導(dǎo)入表信息再執(zhí)行(execute-after-rebuild)[55]等特征來表征程序的自脫殼行為。

目前主流的動(dòng)態(tài)分析平臺(tái)主要采用三種方式構(gòu)建運(yùn)行環(huán)境。第一種是基于QEMU[56]的全系統(tǒng)模擬方案。混合符號(hào)執(zhí)行(concolic execution)方案S2E(Selective Symbolic Execution)[57]、TEMU(BitBlaze[58]的動(dòng)態(tài)跟蹤模塊)均基于QEMU實(shí)現(xiàn)。全系統(tǒng)模擬的好處是能夠獲得整個(gè)系統(tǒng)的信息。例如表2中列舉的“隱魂”“異鬼”木馬病毒事件,惡意代碼與正常程序安裝包捆綁發(fā)布,并注冊(cè)系統(tǒng)服務(wù)或安裝程序驅(qū)動(dòng),借助服務(wù)或驅(qū)動(dòng)實(shí)現(xiàn)惡意代碼持久化以及其他部分功能。此時(shí),基于全系統(tǒng)模擬的分析平臺(tái)能夠在動(dòng)態(tài)分析過程中發(fā)現(xiàn)這些行為。

第二種方式是使用代碼插樁的方式進(jìn)行動(dòng)態(tài)跟蹤,包括動(dòng)態(tài)插樁和靜態(tài)插樁兩種方式。動(dòng)態(tài)代碼插樁是在程序運(yùn)行過程中插入分析代碼。Intel Pin[59]是使用最廣泛的動(dòng)態(tài)插樁方式,例如DynamoRIO[60]、Mayhem[61]等均基于Pin實(shí)現(xiàn)。此外DynInst[62]和Valgind[63]也是比較著名的動(dòng)態(tài)插樁工具。靜態(tài)插樁方法主要以二進(jìn)制重寫(Binary Rewrite)為核心,代表性的工作包括MIL[64]和Pebil[65]等。由于動(dòng)態(tài)插樁需要在程序執(zhí)行時(shí)執(zhí)行額外操作,以調(diào)用執(zhí)行跟蹤的回調(diào)函數(shù),因此靜態(tài)插樁方法的開銷普遍低于動(dòng)態(tài)插樁方法;但是由于靜態(tài)插樁方式在程序執(zhí)行之前完成插樁,當(dāng)惡意程序引用惡意的第三方庫(kù),或存在自修改代碼,或靜態(tài)分析被干擾時(shí),該方法將造成漏報(bào)。

第三種方式是使用硬件特性記錄程序的執(zhí)行序列。典型工作是Intel Processor Tracing (PT)[66],信息搜集工作位于硬件CPU上,需要主機(jī)提供硬件支持。由于該技術(shù)采用硬件機(jī)制實(shí)現(xiàn),因此跟蹤速度最快,特別適用于構(gòu)建基于Fuzzing技術(shù)的漏洞挖掘方案;但是PT獲取的信息不完整,跟蹤得到的信息需要額外計(jì)算時(shí)間進(jìn)行解碼。

絕大多數(shù)軟件供應(yīng)鏈安全威脅檢測(cè)都需要借助動(dòng)態(tài)分析方法來完成,表2中標(biāo)注了各個(gè)事件的分析過程中具體涉及的動(dòng)態(tài)分析方法,包括了在動(dòng)態(tài)執(zhí)行過程中對(duì)程序本身以及各種系統(tǒng)資源,如系統(tǒng)資源、服務(wù)、驅(qū)動(dòng)、流量信息等的監(jiān)控。此外,表2中標(biāo)注的“動(dòng)態(tài)字符串提取”和“監(jiān)控代碼動(dòng)態(tài)釋放”是指污染代碼會(huì)在動(dòng)態(tài)執(zhí)行過程中從數(shù)據(jù)段解密出敏感API名稱字符串和敏感操作指令,從而對(duì)抗靜態(tài)分析;“溯源分析”和“系統(tǒng)日志分析”是指利用攻擊者在系統(tǒng)或軟件中留下的痕跡定位污點(diǎn)源的過程,常用于軟件供應(yīng)鏈污染源頭定位工作。

動(dòng)態(tài)分析方法的瓶頸在于分析覆蓋率有限,很容易受到惡意程序作者的惡意干擾。例如“隱魂”木馬使用多種反分析技術(shù),防止分析系統(tǒng)搜集到程序惡意行為。對(duì)此,研究者們提出了路徑探索[67]和透明分析[68]技術(shù)。其中路徑探索技術(shù)是應(yīng)用最廣泛的提高動(dòng)態(tài)分析覆蓋率的方法。該技術(shù)通過求解不同路徑約束的程序輸入,引導(dǎo)程序控制流向更高覆蓋率方向轉(zhuǎn)移。透明分析著力于構(gòu)建被分析樣本無法感知的分析系統(tǒng),防止被分析程序因?yàn)闄z測(cè)到分析環(huán)境而不再執(zhí)行惡意行為。當(dāng)程序設(shè)定只有在滿足特定條件時(shí)才會(huì)觸發(fā)惡意代碼時(shí),例如分布式拒絕服務(wù)(Distributed Denial of Service, DDoS)[69]攻擊程序,透明分析平臺(tái)依然無法搜集到惡意行為,因此,路徑探索技術(shù)更適用于惡意程序分析工作,該技術(shù)已經(jīng)成為符號(hào)執(zhí)行引擎的內(nèi)置模塊,能夠顯著減少人工分析的工作量。

2.3 符號(hào)執(zhí)行

動(dòng)態(tài)符號(hào)執(zhí)行又稱混合符號(hào)執(zhí)行(concolic execution)。其核心思想是在程序執(zhí)行過程中搜集路徑約束[47],之后根據(jù)路徑探索策略[70]選擇一個(gè)需要繼續(xù)探索的路徑,并且求解[71]滿足該路徑的約束的程序輸入,使得控制流向目標(biāo)路徑轉(zhuǎn)移。絕大多數(shù)符號(hào)執(zhí)行引擎會(huì)將指令轉(zhuǎn)換為中間語(yǔ)言(Intermediate Language, IL),在中間語(yǔ)言上實(shí)施符號(hào)執(zhí)行。IR能夠消除復(fù)雜指令集中存在的指令二義性問題[58]。目前使用最廣泛的IR包括Vex[63]、底層虛擬機(jī)(Low-Level Virtual Machine, LLVM)[72]等,但文獻(xiàn)[73]指出將指令lift為IR會(huì)影響分析的效率,進(jìn)而提出了直接針對(duì)特定指令的快速混合符號(hào)執(zhí)行和模糊測(cè)試方法。

程序執(zhí)行路徑的路徑約束可以在程序執(zhí)行過程中獲取,如S2E[57],被稱作在線分析;也可以在程序執(zhí)行結(jié)束后對(duì)得到的指令trace進(jìn)行分析后獲取,如Sage[74],被稱作離線分析。離線分析模式需要每次從程序入口點(diǎn)開始執(zhí)行程序進(jìn)行分析,好處是分析系統(tǒng)不需要維護(hù)程序狀態(tài),減少了由于保存程序狀態(tài)而造成的內(nèi)存開銷;在線分析模式不需要重復(fù)執(zhí)行不同路徑間的重復(fù)指令,但是會(huì)隨著正在分析的路徑數(shù)目增大逐漸耗盡系統(tǒng)資源。對(duì)此,Mayhem[61]提出了混合模式的符號(hào)執(zhí)行方法。

符號(hào)執(zhí)行技術(shù)依靠路徑探索策略選擇下一個(gè)需要分析的路徑及需要求解的路徑約束。根據(jù)不同應(yīng)用,符號(hào)執(zhí)行引擎會(huì)選擇不同的路徑探索策略,例如:在惡意程序分析和模糊測(cè)試應(yīng)用中,廣度優(yōu)先和深度優(yōu)先策略應(yīng)用最為廣泛;而在漏洞挖掘應(yīng)用中,敏感操作優(yōu)先策略應(yīng)用更多。具體應(yīng)用可以定義自己的敏感操作規(guī)則,從而使能夠引導(dǎo)控制流至敏感操作的路徑被優(yōu)先分析。例如S2E提出了一種面向符號(hào)化數(shù)據(jù)(data-based selection)的路徑探索策略,優(yōu)先執(zhí)行對(duì)污點(diǎn)進(jìn)行操作的路徑。

由于符號(hào)執(zhí)行會(huì)造成較大的時(shí)間開銷,文獻(xiàn)[75]中提出了選擇符號(hào)執(zhí)行的概念,并實(shí)現(xiàn)了能夠在動(dòng)態(tài)執(zhí)行過程中選擇部分代碼進(jìn)行符號(hào)執(zhí)行,而剩余代碼具體執(zhí)行(concrete execution)。Chipounov等[57]根據(jù)這一思想實(shí)現(xiàn)了著名的符號(hào)執(zhí)行引擎S2E,并從一致性角度提出了針對(duì)不同應(yīng)用的六種分析模型[76]。此外,一些符號(hào)執(zhí)行引擎通過靜態(tài)方法獲取元數(shù)據(jù),但是也實(shí)現(xiàn)混合符號(hào)執(zhí)行的功能。例如二進(jìn)制程序分析框架Angr[77]首先將程序可執(zhí)行文件中所有二進(jìn)制碼轉(zhuǎn)換為vex語(yǔ)言,并實(shí)施一系列靜態(tài)分析方法,包括控制流圖分析和程序依賴圖分析,之后再實(shí)施符號(hào)執(zhí)行。通過解釋執(zhí)行的方法彌補(bǔ)靜態(tài)分析產(chǎn)生的誤差。

符號(hào)執(zhí)行的兩大難題是路徑空間爆炸和約束求解,程序切片[78-79]、程序抽象[80]和等價(jià)路徑約減[81]等方式可以通過控制約束輸入范圍來減小程序路徑空間,有效緩解路徑空間爆炸問題;文獻(xiàn)[82-83]利用查詢緩存和重用的方式,在調(diào)用求解器前優(yōu)化查詢路徑條件,以此來減少求解器的調(diào)用次數(shù),降低求解時(shí)間,然而卻對(duì)非線性算數(shù)運(yùn)算的約束無能為力;文獻(xiàn)[84]將約束轉(zhuǎn)換為滿足函數(shù),并以此獲取滿足相應(yīng)約束的值。

符號(hào)執(zhí)行是實(shí)現(xiàn)路徑探索、提高動(dòng)態(tài)分析覆蓋率的主要技術(shù)。表2中標(biāo)注了符號(hào)執(zhí)行的事件均需要借助路徑探索技術(shù)才能搜集到表達(dá)程序真實(shí)意圖的執(zhí)行路徑。在現(xiàn)有軟件供應(yīng)鏈污染分析報(bào)告中,絕大多數(shù)還依靠人工分析實(shí)現(xiàn)對(duì)程序執(zhí)行路徑的探索。Sun等[85]提出了面向深度學(xué)習(xí)的動(dòng)態(tài)符號(hào)執(zhí)行方法,該符號(hào)執(zhí)行方法將測(cè)試需求表示為量化線性運(yùn)算(quantified linear arithmetic),以神經(jīng)元覆蓋為目標(biāo)測(cè)試深度神經(jīng)網(wǎng)絡(luò)的魯棒性。符號(hào)執(zhí)行策略的更加智能化[86]、與其他技術(shù)在不同層面的密切結(jié)合[73,87-88]以及面向大規(guī)模軟件的高效的符號(hào)執(zhí)行方法是下一步研究的重點(diǎn)和難點(diǎn),也是符號(hào)執(zhí)行的研究趨勢(shì)。

2.4 污點(diǎn)分析

動(dòng)態(tài)污點(diǎn)分析的主要流程是選擇程序的某些輸入標(biāo)記為污點(diǎn),在程序運(yùn)行過程中根據(jù)污點(diǎn)傳播規(guī)則標(biāo)記數(shù)據(jù)依賴于污點(diǎn)的內(nèi)存或寄存器。如果從程序中的敏感操作涉及到的數(shù)據(jù)被標(biāo)記為污點(diǎn),則需要對(duì)該操作進(jìn)行進(jìn)一步分析。

污點(diǎn)分析的一般步驟如下:首先,污點(diǎn)分析系統(tǒng)需要根據(jù)實(shí)際需求確定污染源。一般以程序外部輸入作為污點(diǎn)源,包括程序命令行輸入、網(wǎng)絡(luò)輸入、I/O、API返回值、系統(tǒng)狀態(tài)(如注冊(cè)表、進(jìn)程控制塊、線程控制塊)等。文獻(xiàn)[89]主張?jiān)趷阂獬绦蚍治鲞^程中考慮盡可能多的程序輸入作為污點(diǎn)源;其次,污點(diǎn)傳播規(guī)則定義了在何種情況進(jìn)行污點(diǎn)傳播。一般來說滿足數(shù)據(jù)依賴于污點(diǎn)數(shù)據(jù)的指令的目的操作數(shù)會(huì)被標(biāo)記為污點(diǎn);最后,污點(diǎn)分析系統(tǒng)還需要指定需要執(zhí)行進(jìn)一步的敏感操作。一般來說,間接控制流轉(zhuǎn)移(包括間接跳轉(zhuǎn)和間接函數(shù)調(diào)用指令)、網(wǎng)絡(luò)傳出操作、I/O寫操作等都會(huì)被標(biāo)記為敏感操作。在漏洞挖掘應(yīng)用中,可能產(chǎn)生漏洞的API調(diào)用也會(huì)被標(biāo)記為敏感操作。

動(dòng)態(tài)污點(diǎn)分析系統(tǒng)需要克服污點(diǎn)傳播過程中可能發(fā)生的欠污染和過污染問題,文獻(xiàn)[45,97]對(duì)此進(jìn)行了比較詳細(xì)的探討,但是目前尚未有完全精確的解決方案。Yadegari等[98]提出了比特級(jí)污點(diǎn)分析方案,并將其應(yīng)用于提高針對(duì)混淆代碼的符號(hào)執(zhí)行工作中[94],通過污點(diǎn)分析方法搜集能夠引發(fā)控制流轉(zhuǎn)移的路徑約束。該方案還被用于進(jìn)行控制流圖化簡(jiǎn)[89]和分析由程序異常引發(fā)的控制流轉(zhuǎn)移的程序路徑[99]。文獻(xiàn)[100]中提出了基于逆向計(jì)算的細(xì)粒度污點(diǎn)分析方法,通過規(guī)定逆向計(jì)算規(guī)則,考慮語(yǔ)句的語(yǔ)義邏輯,推算污點(diǎn)傳播策略,有效減少了代碼冗余和污點(diǎn)的過度傳播。

隨著技術(shù)的發(fā)展,污點(diǎn)分析和符號(hào)執(zhí)行工作的界限越來越模糊,因?yàn)榉?hào)執(zhí)行中對(duì)路徑約束的搜集和求解在本質(zhì)上也是數(shù)據(jù)依賴分析,并且例如上述Yadegari的幾個(gè)工作,利用污點(diǎn)分析幫助符號(hào)執(zhí)行技術(shù)完成路徑約束的搜集。此外,符號(hào)執(zhí)行和污點(diǎn)分析都可以通過前向或后向的方式實(shí)現(xiàn)。文獻(xiàn)[95]實(shí)現(xiàn)了反向符號(hào)執(zhí)行方法,如果在后向回溯一定步數(shù)內(nèi),沒有發(fā)現(xiàn)能夠引導(dǎo)新控制流的程序輸入,則判定目標(biāo)約束為無透明謂詞。其后向回溯的過程既可以被看作逆向符號(hào)執(zhí)行過程,也可以看作是逆向污點(diǎn)傳播過程,因此可以認(rèn)為,污點(diǎn)分析工作可以用作或者輔助符號(hào)執(zhí)行的約束搜集方法獲得更準(zhǔn)確的路徑約束。

污點(diǎn)分析的思想在軟件供應(yīng)鏈污染檢測(cè)中使用非常廣泛,特別是在存在信息泄露的事件中。將敏感數(shù)據(jù)標(biāo)注為污點(diǎn)源,如果污點(diǎn)數(shù)據(jù)被網(wǎng)絡(luò)發(fā)送,則說明發(fā)生了信息泄露。表2中標(biāo)注了污點(diǎn)分析的事件多數(shù)發(fā)生了信息泄露。同樣的,目前類似問題仍多數(shù)由人工檢測(cè)完成。

2.5 現(xiàn)有工作的綜合對(duì)比

現(xiàn)有二進(jìn)制程序逆向分析工作或在上述某一方面進(jìn)行了深入研究,或設(shè)計(jì)實(shí)現(xiàn)統(tǒng)一的分析平臺(tái),提供各種技術(shù)的調(diào)用接口。表3中列舉了10余個(gè)經(jīng)典的或近年來發(fā)表在高水平期刊、會(huì)議的二進(jìn)制程序分析工具,總結(jié)了這些工作的適用場(chǎng)景、測(cè)試數(shù)據(jù)集以及對(duì)比方法。研究人員可以有針對(duì)性地在這些平臺(tái)上進(jìn)行軟件供應(yīng)鏈污染檢測(cè)工作研究。

表3 二進(jìn)制程序分析工具的適用場(chǎng)景 Tab. 3 Suitable scenarios for binary program analysis tools

續(xù)表

3 仍存在的問題

1.2.2節(jié)對(duì)軟件供應(yīng)鏈下游的污染檢測(cè)問題進(jìn)行了分析,本章聚焦于程序逆向分析方法,分析現(xiàn)有技術(shù)在解決軟件供應(yīng)鏈下游的污染檢測(cè)問題中仍存在的問題及挑戰(zhàn)。

3.1 程序逆向分析方法自身的局限性

在對(duì)程序的逆向分析時(shí),準(zhǔn)確識(shí)別程序中所有代碼或行為至關(guān)重要,只有在獲取程序中所有代碼的基礎(chǔ)上,才能進(jìn)一步實(shí)現(xiàn)惡意代碼檢測(cè)工作;然而現(xiàn)有技術(shù)在這方面仍存在一些局限性。

3.1.1 傳統(tǒng)逆向分析技術(shù)的局限

首先,文獻(xiàn)[101-103]總結(jié)了靜態(tài)分析方法分析對(duì)抗樣本時(shí)的不足。例如,加殼[104]或代碼自修改(self-modification)技術(shù)[49-50]的使用,可以將執(zhí)行惡意行為的代碼變成數(shù)據(jù)存儲(chǔ)在二進(jìn)制文件中,只有程序執(zhí)行后原始代碼才會(huì)被執(zhí)行,靜態(tài)分析方法很難準(zhǔn)確通過指令解釋執(zhí)行的方法分析出原始程序代碼;代碼混淆技術(shù)[105],例如控制流扁平化、不透明謂詞、花指令、API混淆等也會(huì)干擾靜態(tài)分析的分析結(jié)果,導(dǎo)致誤報(bào)或漏報(bào);別名分析(Alias Analysis)、值域分析(Value Set Analysis)[106]等分析方法在反向數(shù)據(jù)流分析、間接控制流轉(zhuǎn)移的目標(biāo)預(yù)測(cè)等任務(wù)中均無法達(dá)到較高的實(shí)用性,準(zhǔn)確率也偏低,進(jìn)而導(dǎo)致靜態(tài)分析方法無法有效準(zhǔn)確地判定控制流可達(dá)性和發(fā)現(xiàn)控制流轉(zhuǎn)移目標(biāo),最終導(dǎo)致靜態(tài)分析方法出現(xiàn)漏報(bào)或誤報(bào)。

此外,文獻(xiàn)[107]對(duì)多種反匯編工作在x86/x64架構(gòu)下的反匯編能力進(jìn)行了全面深入的分析,總結(jié)了反匯編工作仍存在的問題。由于反匯編是所有靜態(tài)分析方法的基礎(chǔ),反匯編能力有限在惡意程序分析領(lǐng)域影響更大。

其次,雖然符號(hào)執(zhí)行、路徑探索技術(shù)能夠提高動(dòng)態(tài)分析的覆蓋率,惡意程序依然可以通過隱藏路徑約束[94]、利用復(fù)雜數(shù)學(xué)變換攻擊約束求解器[108]、使用單向函數(shù)阻礙約束求解[109]等技術(shù)干擾分析,使得動(dòng)態(tài)分析方法很難搜集到程序的惡意行為。此外,符號(hào)執(zhí)行技術(shù)還存在路徑爆炸的問題,當(dāng)程序中存在循環(huán),或者圈復(fù)雜度非常大時(shí),程序的所有可執(zhí)行路徑條數(shù)將過于龐大,無法逐一分析。此外,動(dòng)態(tài)分析過程中缺乏全局信息,很難在動(dòng)態(tài)執(zhí)行過程中準(zhǔn)確識(shí)別靜態(tài)鏈接庫(kù)函數(shù)。

3.1.2 緩解技術(shù)及其局限

為緩解上述問題,研究人員提出了大量緩解技術(shù),以提高程序逆向分析技術(shù)的能力;但是這些技術(shù)仍然不能完全解決傳統(tǒng)程序逆向分析技術(shù)在分析混淆代碼時(shí)的問題。

首先,動(dòng)靜結(jié)合的分析方法能夠從很大程度上克服動(dòng)態(tài)分析覆蓋率不足的缺點(diǎn)。傳統(tǒng)的基于特征碼的惡意代碼檢測(cè)、基于熵的分析方法以及靜態(tài)間接控制流轉(zhuǎn)移識(shí)別能夠輔助惡意代碼檢測(cè)或指導(dǎo)動(dòng)態(tài)分析朝著目標(biāo)區(qū)域進(jìn)行動(dòng)態(tài)執(zhí)行和分析。其中,基于特征碼的方法能夠從程序代碼中找出包含惡意行為特征的字節(jié)序列,從而快速完成已知惡意代碼的掃描;基于熵的方法能夠幫助分析系統(tǒng)標(biāo)注可能存在加殼行為的代碼片段,動(dòng)態(tài)分析應(yīng)該盡量朝著能夠加載或者執(zhí)行這些數(shù)據(jù)或代碼的方向運(yùn)行;間接控制流轉(zhuǎn)移指令指示了靜態(tài)分析的分析盲區(qū),動(dòng)態(tài)分析方法需要對(duì)這些指令的位置作定向分析,以確定控制流轉(zhuǎn)移目標(biāo),彌補(bǔ)靜態(tài)分析的不足。文獻(xiàn)[110]中提出了一種深度的動(dòng)靜結(jié)合分析框架,并實(shí)現(xiàn)了針對(duì)惡意程序的路徑探索策略;但是該工作效率較低,不適用于大型軟件的分析。目前尚未有工作實(shí)現(xiàn)了針對(duì)大型軟件的深度的動(dòng)靜結(jié)合分析方法。文獻(xiàn)[111]中提出了超集反匯編(Superset Disassembly)的方法,從任意一個(gè)可能成為合法指令的地址開始反匯編,從一定程度上緩解了靜態(tài)反匯編方法無法獲取間接控制流轉(zhuǎn)移地址的問題,也能為提高動(dòng)態(tài)分析覆蓋率提供導(dǎo)向依據(jù)。

在API識(shí)別方面,文獻(xiàn)[112]中提出了基于模式匹配的API識(shí)別方案,該方案雖然受到人工先驗(yàn)知識(shí)的制約,漏報(bào)率較高,但具備很強(qiáng)的可擴(kuò)展性;不同于傳統(tǒng)的靜態(tài)分析方法需要比對(duì)完整的函數(shù)代碼的簽名來實(shí)現(xiàn)庫(kù)函數(shù)識(shí)別,文獻(xiàn)[113]中提出了一種基于函數(shù)參數(shù)識(shí)別的針對(duì)混淆程序的API識(shí)別方法,能夠識(shí)別被混淆的API調(diào)用,該方案的準(zhǔn)確性受制于函數(shù)參數(shù)識(shí)別的準(zhǔn)確率,但其識(shí)別準(zhǔn)確率較高,能夠極大提高分析效率。

在控制流圖恢復(fù)方面,文獻(xiàn)[114]中提出了一種基于靜態(tài)符號(hào)執(zhí)行的,針對(duì)控制圖扁平化的控制流圖還原方案,針對(duì)LLVM混淆器(Obfuscator-LLVM, OLLVM)[102]的控制流扁平化結(jié)果較好,但是受制于靜態(tài)符號(hào)執(zhí)行中存在復(fù)雜約束無法求解問題。文獻(xiàn)[115]中提出了基于強(qiáng)制執(zhí)行的路徑探索、異?;謴?fù)以及控制流圖還原方案。文獻(xiàn)[94]中提出了符號(hào)執(zhí)行技術(shù)的增強(qiáng)方案,用于發(fā)現(xiàn)符號(hào)執(zhí)行過程中被隱藏的路徑約束,從而發(fā)現(xiàn)更多的隱藏的控制流轉(zhuǎn)移。文獻(xiàn)[99]中提出了一種針對(duì)異常處理機(jī)制的符號(hào)執(zhí)行方法,能夠發(fā)現(xiàn)被程序作者故意隱藏的基于異常的控制流轉(zhuǎn)移。文獻(xiàn)[95]中提出了不透明謂詞檢測(cè)手段,以判定路徑可達(dá)性,從而去除控制流圖中的不可達(dá)部分。

然而這些工作也都各自存在一些局限,只有惡意代碼滿足其提出的模型時(shí)才能取得較高的準(zhǔn)確性。例如文獻(xiàn)[94]需要flags寄存器參與計(jì)算才能準(zhǔn)確識(shí)別路徑約束并實(shí)現(xiàn)符號(hào)執(zhí)行;文獻(xiàn)[99]需要在動(dòng)態(tài)觸發(fā)異常的條件下才能實(shí)現(xiàn)異常控制流轉(zhuǎn)移的準(zhǔn)確識(shí)別;文獻(xiàn)[95]的方法受制于反向回溯的步長(zhǎng)限制,超過預(yù)設(shè)步長(zhǎng),該方法將出現(xiàn)漏報(bào)。其次,沒有工作顯示上述方法能夠集成在同一個(gè)平臺(tái)中執(zhí)行,其檢測(cè)目標(biāo)均為單個(gè)可執(zhí)行文件程序,沒有工作顯示這些方法能夠在大型商用軟件中高效執(zhí)行。

綜上所述,現(xiàn)有的程序逆向分析技術(shù)在對(duì)混淆代碼的檢測(cè)中仍存在諸多局限,惡意程序作者可以利用這些局限對(duì)抗分析,造成分析系統(tǒng)的漏報(bào)。特別是在軟件供應(yīng)鏈污染場(chǎng)景下,被測(cè)樣本規(guī)模遠(yuǎn)大于惡意程序,給程序逆向分析技術(shù)帶來了更多挑戰(zhàn)。

3.2 程序逆向分析技術(shù)在SSC應(yīng)用中存在的挑戰(zhàn)

傳統(tǒng)的惡意代碼檢測(cè)方案多僅針對(duì)單一可執(zhí)行文件進(jìn)行分析,導(dǎo)致使用程序分析方法進(jìn)行軟件供應(yīng)鏈下游的污染檢測(cè)時(shí)存在諸多挑戰(zhàn)。

首先,從表1可知,軟件供應(yīng)鏈污染的目標(biāo)包括軟件安裝包和軟件可執(zhí)行程序,但是大型軟件的發(fā)布形式十分多樣。為了檢測(cè)可能存在的捆綁安裝、內(nèi)置后門等問題,分析系統(tǒng)需要能夠處理任何一種軟件發(fā)布形式,并從中提取相應(yīng)的程序進(jìn)行分析。

例如,大多數(shù)官方的Windows軟件發(fā)布為一個(gè)獨(dú)立的安裝程序,需先運(yùn)行安裝程序,將軟件運(yùn)行所需要的所有文件釋放到指定目錄,并在系統(tǒng)中注冊(cè)相關(guān)軟件信息,才能使用該軟件。同時(shí)一些軟件也會(huì)以綠色壓縮版的形式發(fā)布,即將所有程序運(yùn)行所需文件打包在一個(gè)壓縮包中,用戶只需解壓這些文件即可使用軟件。這種綠色免安裝的方式極易被攻擊,但是由于使用方便無需安裝,仍有大量用戶使用。

分析系統(tǒng)需要能夠自動(dòng)執(zhí)行或解壓縮安裝包,成功釋放程序可執(zhí)行文件,并監(jiān)控整個(gè)安裝和程序執(zhí)行過程。目前尚未有工作能夠?qū)崿F(xiàn)自動(dòng)、穩(wěn)定的大規(guī)模軟件安裝方法來獲取程序分析的二進(jìn)制文件。

第二,商用軟件往往包含多個(gè)模塊、多個(gè)組件以及多種語(yǔ)言編寫的代碼,需要提出高效和統(tǒng)一的分析框架用于深入程序分析。此外,市場(chǎng)上的防病毒軟件多使用白名單機(jī)制,如果程序的簽名在白名單中則不再對(duì)其進(jìn)行分析,而在軟件供應(yīng)鏈開發(fā)環(huán)節(jié)中植入的惡意代碼,在下游程序簽名發(fā)布之后往往會(huì)逃避防病毒軟件的檢測(cè)。由于無法保證軟件供應(yīng)鏈上游代碼的安全性,傳統(tǒng)的基于黑白名單的啟發(fā)式分析策略在軟件供應(yīng)鏈安全研究中并不適用,需要對(duì)整個(gè)程序中所有的代碼深入分析。

第三,商用軟件多包含多種程序輸入,例如配置文件、UI交互、網(wǎng)絡(luò)通信、與操作系統(tǒng)交互等。這將導(dǎo)致動(dòng)態(tài)分析方法將很難自動(dòng)發(fā)現(xiàn)并提供有效的程序輸入,從而引起與程序輸入相關(guān)的代碼無法正常執(zhí)行,最終造成動(dòng)態(tài)分析方法的分析覆蓋率很難提升,進(jìn)而導(dǎo)致惡意代碼檢測(cè)或漏洞挖掘方法出現(xiàn)漏報(bào)。同時(shí),異步處理機(jī)制是常用的編程技術(shù),而尚未有靜態(tài)分析方法工作能夠做到自動(dòng)理解各種異步編程模型,并準(zhǔn)確還原程序邏輯或控制流轉(zhuǎn)移關(guān)系。

第四,現(xiàn)有工作多處于語(yǔ)法分析層面,鮮有工作能夠自動(dòng)準(zhǔn)確理解程序語(yǔ)義,而程序語(yǔ)義理解在惡意代碼檢測(cè)和軟件邏輯漏洞檢測(cè)方面非常重要?;跈C(jī)器學(xué)習(xí)和AI技術(shù)的惡意代碼分析和檢測(cè)工作能夠部分緩解語(yǔ)義理解補(bǔ)充的問題,但是該方法依賴大量樣本,而除C/C++語(yǔ)言外,其他編程語(yǔ)言的惡意代碼樣本量均達(dá)不到模型訓(xùn)練要求。在漏洞挖掘領(lǐng)域,針對(duì)邏輯漏洞的挖掘大多依靠人工完成,尚未有可靠的自動(dòng)化方法完成該任務(wù)。在具有多模塊的大型軟件中,邏輯漏洞的挖掘變得更加困難,目前沒有較為理想的解決方案。

4 總結(jié)與展望

對(duì)于發(fā)生在軟件供應(yīng)鏈上的安全事件,安全分析人員往往采取綜合利用傳統(tǒng)的程序逆向分析方法來分析還原事件真相,然而此方法大多依賴于手工的調(diào)查取證,很難實(shí)現(xiàn)對(duì)軟件供應(yīng)鏈上的軟件進(jìn)行快速、安全、自動(dòng)的檢測(cè)。針對(duì)軟件供應(yīng)鏈安全問題的特殊性以及現(xiàn)有的程序逆向分析方法的局限,可采取以下可行方案來彌補(bǔ)程序逆向分析方法在軟件供應(yīng)鏈安全研究中存在的缺陷和不足:

首先,在軟件供應(yīng)鏈下游進(jìn)行研究的數(shù)據(jù)源為軟件安裝包或綠色版軟件壓縮包,因此,要進(jìn)行該項(xiàng)研究,必須解決軟件自動(dòng)安裝獲取其可執(zhí)行文件的問題。目前對(duì)軟件自動(dòng)安裝的研究很少??尚械姆桨赴ǎ?)基于規(guī)則的自動(dòng)安裝;2)借助文字識(shí)別的基于規(guī)則的自動(dòng)安裝;3)借助機(jī)器學(xué)習(xí)方法的自動(dòng)安裝;4)基于生成對(duì)抗網(wǎng)絡(luò)的自動(dòng)安裝。

第二,在軟件自動(dòng)安裝之后,結(jié)合Lehman軟件進(jìn)化法則[116]進(jìn)行軟件的家族分類和血統(tǒng)分析[117],此外,也可結(jié)合機(jī)器學(xué)習(xí)方法,可以利用已知版本號(hào)的軟件及其元數(shù)據(jù)特征,訓(xùn)練血統(tǒng)預(yù)測(cè)模型,實(shí)現(xiàn)對(duì)未知軟件的血統(tǒng)分析。將血統(tǒng)分析后的待測(cè)軟件與同一家族中上一版本軟件進(jìn)行對(duì)比,獲取待測(cè)軟件中的差異代碼;然而傳統(tǒng)的惡意程序家族分類方法僅針對(duì)單個(gè)可執(zhí)行文件進(jìn)行分析,而商用軟件大多包括多個(gè)可執(zhí)行文件和配置信息,目前尚未有工作實(shí)現(xiàn)針對(duì)大型軟件的家族分類和血統(tǒng)分析工作。尤其是針對(duì)綠色版軟件,可執(zhí)行文件釋放到磁盤后并不會(huì)在系統(tǒng)配置信息中留下痕跡,例如版本號(hào)信息等,對(duì)于這類軟件的血統(tǒng)分析工作需要進(jìn)一步研究。

第三,獲取待測(cè)軟件的差異性代碼后,只需利用程序逆向分析方法對(duì)這些差異代碼進(jìn)行檢測(cè)分析,以此來過濾掉軟件中大量的安全代碼,極大減少分析的代碼量,提高檢測(cè)效率。在軟件代碼深入分析方面,可以利用動(dòng)靜結(jié)合的分析框架、基于非一致執(zhí)行的分析方法可以幫助分析系統(tǒng)部分解決深層次路徑無法覆蓋的問題。

第四,對(duì)于基于異步模型的代碼觸發(fā)問題,分別針對(duì)UI、網(wǎng)絡(luò)連接等常見場(chǎng)景進(jìn)行各個(gè)擊破是可行的解決辦法。基于反饋的UI自動(dòng)觸發(fā)技術(shù)可以避開代碼層面的異步觸發(fā)模型,通過監(jiān)控模擬鼠標(biāo)點(diǎn)擊的程序狀態(tài)改變以及代碼片段間的數(shù)據(jù)依賴關(guān)系,可以提高帶UI界面程序的代碼覆蓋率。通過劫持系統(tǒng)調(diào)用,可以控制程序的網(wǎng)絡(luò)連接狀態(tài),自動(dòng)填充模擬數(shù)據(jù)報(bào)文,并結(jié)合基于二進(jìn)制代碼分析的協(xié)議逆向技術(shù)[118],可以推斷報(bào)文格式,進(jìn)而更好地實(shí)現(xiàn)模糊測(cè)試、生成程序輸入報(bào)文。

第五,針對(duì)程序的語(yǔ)義理解問題,可以通過API調(diào)用來表征程序語(yǔ)義,并自動(dòng)查詢API手冊(cè)得到API的具體解釋,通過拼接API解釋的方法,將程序表征為自然語(yǔ)言文字。一方面可以利用自然語(yǔ)言表示輔助程序語(yǔ)義理解;另一方面,由于在不同編程語(yǔ)言中具有相同功能的API的自然語(yǔ)言解釋十分相近,可以通過該方式實(shí)現(xiàn)跨編程語(yǔ)言的程序分析。

猜你喜歡
污點(diǎn)靜態(tài)程序
最新進(jìn)展!中老鐵路開始靜態(tài)驗(yàn)收
莫讓“污點(diǎn)”變“終點(diǎn)”
靜態(tài)隨機(jī)存儲(chǔ)器在軌自檢算法
動(dòng)得多,還要坐得少——評(píng)WHO《身體活動(dòng)與靜態(tài)行為指南》
給Windows添加程序快速切換欄
黑螞蟻
試論我國(guó)未決羈押程序的立法完善
猜猜他是誰(shuí)
污點(diǎn)
“程序猿”的生活什么樣