陳 昱 劉中金 趙威威 馬 原 石志強(qiáng) 孫利民
1(物聯(lián)網(wǎng)信息安全技術(shù)北京市重點(diǎn)實(shí)驗(yàn)室(中國科學(xué)院信息工程研究所) 北京 100093) 2(中國科學(xué)院信息工程研究所 北京 100093) 3(中國科學(xué)院大學(xué)網(wǎng)絡(luò)空間安全學(xué)院 北京 100093) 4(國家計(jì)算機(jī)網(wǎng)絡(luò)應(yīng)急技術(shù)處理協(xié)調(diào)中心 北京 100029) 5 (蘭州大學(xué)信息科學(xué)與工程學(xué)院 蘭州 730000) (shizhiqiang@iie.ac.cn)
隨著物聯(lián)網(wǎng)的發(fā)展,嵌入式系統(tǒng)在人們的日常生活中無處不在.根據(jù)Gartner發(fā)布的市場(chǎng)報(bào)告,到2020年,物聯(lián)網(wǎng)設(shè)備的數(shù)量將達(dá)到208億[1].與此同時(shí),物聯(lián)網(wǎng)設(shè)備也遭遇了越來越多的網(wǎng)絡(luò)攻擊,給國家安全以及人民生命財(cái)產(chǎn)安全帶來了巨大威脅.例如2017年10月出現(xiàn)的物聯(lián)網(wǎng)惡意軟件“IoT_reaper”[2]利用9個(gè)固件漏洞進(jìn)行代碼植入與傳播,目前已感染的物聯(lián)網(wǎng)設(shè)備超過200萬臺(tái),并且每天以新增1萬臺(tái)的速度在網(wǎng)絡(luò)空間迅速蔓延.
最近的網(wǎng)絡(luò)安全事件表明:來自于同一廠商甚至不同廠商的多種物聯(lián)網(wǎng)設(shè)備經(jīng)常被相同的惡意軟件感染,造成這種現(xiàn)象的主要原因?yàn)榻陙砦锫?lián)網(wǎng)廠商越來越多地使用開源共享代碼.正是由于物聯(lián)網(wǎng)設(shè)備固件中存在廣泛的代碼重用,當(dāng)某個(gè)固件被爆出漏洞二進(jìn)制文件時(shí),包含該同源二進(jìn)制文件的其他固件也將處于高風(fēng)險(xiǎn)中.例如被物聯(lián)網(wǎng)蠕蟲SHELLBIND所利用的SambaCry漏洞(CVE-2017-7494)影響了物聯(lián)網(wǎng)設(shè)備長達(dá)7年之久,直到2017年5月才被安全研究人員發(fā)現(xiàn).因此當(dāng)安全事件發(fā)生時(shí),知道哪些廠商、哪些設(shè)備的固件中包含有Samba組件對(duì)于物聯(lián)網(wǎng)安全應(yīng)急響應(yīng)意義重大.
目前,同源代碼分析在代碼反侵權(quán)[3-5],二進(jìn)制搜索[6-8]以及惡意軟件家族鑒定[9-11]等領(lǐng)域已經(jīng)有了較為深入的研究.但是缺少面向嵌入式設(shè)備固件的大規(guī)模同源二進(jìn)制文件檢索方法的研究.存在的挑戰(zhàn)有3個(gè)方面:1)物聯(lián)網(wǎng)固件在編譯時(shí)擁有比傳統(tǒng)軟件更多的編譯配置選項(xiàng),例如不同指令集架構(gòu)、不同的編譯器等,導(dǎo)致相同的源代碼在不同的編譯配置下可能編譯生成非常不同的二進(jìn)制代碼;2)動(dòng)態(tài)分析物聯(lián)網(wǎng)固件是很困難的,因?yàn)楹茈y模擬外圍硬件的反饋;3)當(dāng)在一個(gè)固件中發(fā)現(xiàn)漏洞二進(jìn)制文件,需要及時(shí)通知相關(guān)廠商發(fā)布相關(guān)的安全補(bǔ)丁.然而,目前市場(chǎng)上有著數(shù)以百萬計(jì)的物聯(lián)網(wǎng)固件,傳統(tǒng)方法[12]的時(shí)間復(fù)雜度是O(N),在一臺(tái)雙核計(jì)算機(jī)上完成該任務(wù)可能需要數(shù)日甚至數(shù)周的時(shí)間.
本文設(shè)計(jì)和實(shí)現(xiàn)了一種時(shí)間復(fù)雜度為O(lgN)的面向物聯(lián)網(wǎng)設(shè)備固件的同源二進(jìn)制文件檢索方法.該方法的核心思想是通過深度學(xué)習(xí)網(wǎng)絡(luò)編碼二進(jìn)制文件中的可讀字符串,然后對(duì)編碼向量生成局部敏感Hash從而實(shí)現(xiàn)快速檢索.方法共包括3個(gè)步驟:1)我們從二進(jìn)制文件中提取所有的可讀字符串;2)采用基于雙層雙向Bi-GRU[13]的深度學(xué)習(xí)網(wǎng)絡(luò)模型將過濾后的字符串編碼成固定長度的編碼向量;3)采用局部敏感Hash(local sensitive Hash, LSH)方法構(gòu)建索引,提高檢索速度.
我們按照16種不同的編譯參數(shù)編譯了893個(gè)開源組件,共生成71 129對(duì)帶標(biāo)簽的二進(jìn)制文件來訓(xùn)練和測(cè)試網(wǎng)絡(luò)模型.結(jié)果表明該方法的ROC特性遠(yuǎn)好于傳統(tǒng)方法.此外,實(shí)際應(yīng)用案例表明該方法只需不到1 s的時(shí)間即可完成一次針對(duì)22 594個(gè)固件的同源二進(jìn)制文件檢索任務(wù).
本文的主要貢獻(xiàn)有3個(gè)方面:
1) 設(shè)計(jì)、實(shí)現(xiàn)和評(píng)估了一個(gè)時(shí)間復(fù)雜度為O(lgN)的大規(guī)模同源二進(jìn)制文件檢索方法.實(shí)驗(yàn)結(jié)果表明,該方法不僅比傳統(tǒng)方法快了3個(gè)數(shù)量級(jí),而且結(jié)果更加準(zhǔn)確.
2) 在實(shí)際應(yīng)用案例中對(duì)52個(gè)廠商共22 594個(gè)固件進(jìn)行了同源漏洞組件安全評(píng)估,并公布了分析結(jié)果.
3) 本文編譯的數(shù)據(jù)集是第1個(gè)具有標(biāo)簽的同源二進(jìn)制文件數(shù)據(jù)集,我們承諾在論文收錄后將其公開,供其他研究人員研究使用.
物聯(lián)網(wǎng)組件的源代碼中通常包含有大量的可讀字符串,例如調(diào)試字符串、標(biāo)語字符串、錯(cuò)誤信息字符串、日志消息字符串等,如表1所示:
Table 1 Examples of Strings in Binary
根據(jù)大量的實(shí)驗(yàn)觀察,這些可讀字符串擁有“編譯不變性”,即在不同的編譯配置下編譯而生成的多個(gè)同源二進(jìn)制文件中,可讀字符串的內(nèi)容和順序基本保持一致.本文正是利用可讀的字符串的這種“編譯不變性”來實(shí)現(xiàn)同源二進(jìn)制文件的檢索.即若2個(gè)二進(jìn)制文件的可讀字符串內(nèi)容和順序基本一致,則它們有很大可能是同源的.該思想雖然簡(jiǎn)單,但在將其轉(zhuǎn)化為高效的實(shí)用方法前,還需要解決2個(gè)主要問題:
1) 如何提取更多的字符串?鑒于物聯(lián)網(wǎng)設(shè)備的國際化和全球化市場(chǎng),在二進(jìn)制文件中使用Unicode字符串是較普遍的現(xiàn)象.但是,目前的字符串提取工具(如Linux中的strings命令)只能從二進(jìn)制代碼中提取ASCII格式的字符串.此外,在局部變量中定義和存儲(chǔ)的字符串,其字符通常存在于壓棧指令的操作數(shù)中,傳統(tǒng)方法同樣無法提取這種類型的字符串.
2) 如何將可讀字符串序列編碼成特征向量?該問題是實(shí)現(xiàn)本文方法所面臨的最大的挑戰(zhàn).因?yàn)榫幋a出的特征向量需要能夠用于局部敏感Hash(LSH)[14]構(gòu)造反向索引庫,只有這樣才能實(shí)現(xiàn)時(shí)間復(fù)雜度僅為O(lgN)的文件檢索.
本文提出的同源二進(jìn)制文件檢索框架如圖1所示,包括3個(gè)階段:1)字符串提取與過濾;2)字符串編碼;3)LSH相似度Hash索引.
在字符串提取與過濾階段,提取每個(gè)輸入二進(jìn)制文件中的可讀字符串并進(jìn)行過濾.有關(guān)字符串提取和過濾方法的詳細(xì)介紹參見2.1節(jié).
在字符串編碼階段,利用訓(xùn)練好的雙層雙向Bi-GRU模型對(duì)字符串序列進(jìn)行編碼,生成擁有LSH函數(shù)族[15]的距離測(cè)度編碼.本文采用的是余弦距離測(cè)度,并將采用其他距離測(cè)度的研究放在未來工作中.有關(guān)雙層雙向Bi-GRU模型的詳細(xì)介紹參見2.2節(jié).
在LSH相似度Hash索引階段,使用面向余弦距離的LSH函數(shù)族計(jì)算出每個(gè)特征向量的相似度Hash,最后以給定的同源性閾值為參數(shù)對(duì)相似度Hash構(gòu)造倒排索引數(shù)據(jù)庫.構(gòu)建LSH相似度Hash索引的詳細(xì)介紹參見2.3節(jié).
上述3個(gè)階段中,階段2為本文的主要貢獻(xiàn),通過該模塊編碼的二進(jìn)制文件特征向量可以用于LSH Hash構(gòu)造反向索引庫從而可實(shí)現(xiàn)時(shí)間復(fù)雜度僅為O(lgN)的文件檢索.
Fig. 1 Homologous binary file retrieval framework圖1 同源二進(jìn)制文件檢索框架
該框架在應(yīng)用時(shí)存在2個(gè)數(shù)據(jù)處理過程:1)離線索引過程;2)在線檢索過程.圖1虛線箭頭連接的是離線過程,實(shí)線箭頭連接的是在線過程.
在離線索引過程中,離線對(duì)二進(jìn)制文件庫中的所有二進(jìn)制文件進(jìn)行編碼并生成LSH相似度Hash,最后對(duì)所有的相似度Hash進(jìn)行倒排索引,構(gòu)建倒排索引庫.
在線檢索過程中,只需先對(duì)待查二進(jìn)制文件生成相似度Hash,然后將其在倒排索引庫中做一次查詢即可得到二進(jìn)制文件庫中所有與其同源的二進(jìn)制文件.
如果一個(gè)字符串至少由n個(gè)連續(xù)的可讀字符組成,并且以NULL或換行符結(jié)尾,則該字符串被視為可讀字符串.在本文中,我們根據(jù)經(jīng)驗(yàn)將n設(shè)置為6.為了過濾來自于指令的可讀無序字符串, 在使用strings工具時(shí)通過不指定‘-a’選項(xiàng)將提取范圍限制為數(shù)據(jù)段.物聯(lián)網(wǎng)設(shè)備固件中的二進(jìn)制文件存在3種類型的可讀字符串:數(shù)據(jù)段中的ASCII格式字符串、數(shù)據(jù)段中的Unicode格式字符串、代碼段中的ASCII格式的字符串.介紹3種字符串的提取方法:
1) 數(shù)據(jù)段中的ASCII格式字符串.我們使用Linux下的字符串提取工具strings來提取數(shù)據(jù)段中的ASCII格式字符串.同時(shí)采用strings的‘-d’選項(xiàng)來限制只提取數(shù)據(jù)段中存在的字符串,并使用‘bytes’選項(xiàng)來指定只能提取包含多于6個(gè)可讀字符的字符串.
2) 代碼段中的ASCII格式字符串.正如本節(jié)之前所討論的,當(dāng)代碼段被定義并存儲(chǔ)在局部變量中時(shí),可讀字符串也可能存在于代碼段中.在這種情況下,可讀字符串被分成幾個(gè)連續(xù)指令的操作數(shù)中存在的字符.首先我們識(shí)別連續(xù)入棧指令;然后從這些連續(xù)指令中提取指令操作數(shù),構(gòu)造棧幀字節(jié)流;最后判斷棧幀字節(jié)流中是否有連續(xù)可讀的ASCII格式字符,若有則將它們拼接成可讀字符串.
3) 數(shù)據(jù)段中的Unicode字符串.與ASCII格式的字符串不同,數(shù)據(jù)段中的Unicode格式字符串不能通過判斷它們是否包含連續(xù)的可打印字符來識(shí)別,因?yàn)榇蠖鄶?shù)雙字節(jié)單元都可以用相同或不同語系的Unicode編碼打印.但是,在同一固件中語系通常是一致的.因此,我們可以通過判斷是否包含連續(xù)一致語系編碼的字節(jié)單元來識(shí)別Unicode格式的字符串.
通過上述字符串提取過程,我們得到了二進(jìn)制文件中的可讀字符串序列.但是上述字符串中包含了與SDK或指令集平臺(tái)相關(guān)的字符串以及庫函數(shù)符號(hào)表字符串,前者降低了同源檢索的準(zhǔn)確率,而后者則增加了同源檢索的誤報(bào)率.我們通過將上述2種字符串添加入黑名單,并用該黑名單對(duì)字符串序列中的字符串進(jìn)行過濾.黑名單的生成過程步驟描述如下:1)使用 buildroot工具交叉編譯千余種常用的嵌入式開源組件源碼包到ARM,MIPS,PowerPC等平臺(tái);2)提取不同平臺(tái)但同源的二進(jìn)制代碼中的可讀字符串,并對(duì)每個(gè)字符串計(jì)算其信息增益:
IG(s)=[P(s,Ci)lgP(s,Ci)+
(1-P(s,Ci))lg(1-P(s,Ci))],
其中,Ci是目標(biāo)平臺(tái),P(Ci) 是Ci的二進(jìn)制文件與全部二進(jìn)制文件的比率,P(s)是包含s的二進(jìn)制文件與全部二進(jìn)制文件的比率,P(s,Ci)是Ci中包含s的二進(jìn)制文件與全部二進(jìn)制文件的比率.若某字符串的增益大于預(yù)定的的閾值μ,則將其納入到黑名單中.除此之外,位于內(nèi)核級(jí)和系統(tǒng)級(jí)庫(如lib,usrlib目錄下的庫文件)的符號(hào)字符串也被加入到黑名單中.
傳統(tǒng)基于最小Hash的字符串編碼方法由于缺失了字符串序列的順序信息,會(huì)導(dǎo)致準(zhǔn)確率下降.由于Bi-GRU模型能夠?qū)W習(xí)到時(shí)序輸入數(shù)據(jù)中的上下文信息,因此為了將字符串序列順序信息編碼進(jìn)特征向量,本文提出了一種基于雙層雙向Bi-GRU模型的字符串序列編碼方法.
本節(jié)首先給出二進(jìn)制文件編碼問題的形式化定義,然后介紹本文所提出的深度學(xué)習(xí)模型的結(jié)構(gòu)與訓(xùn)練方法.
2.2.1 編碼問題定義
用b1,b2表示2個(gè)二進(jìn)制文件,用π表示同源性計(jì)算算子,π(b1,b2)=1表示b1和b2同源,π(b1,b2)=-1表示b1和b2不同源.給定數(shù)據(jù)集T{(〈b1,b2〉,π(b1,b2))|b1和b2由多編譯參數(shù)交叉編譯得到,通過人工標(biāo)記π(b1,b2)的取值}其中,多編譯參數(shù)交叉編譯是指按照不同編譯器,不同編譯優(yōu)化選項(xiàng)等編譯參數(shù)將同一份源碼交叉編譯成不同指令集架構(gòu)的二進(jìn)制文件,其中人工標(biāo)記π(b1,b2)的原則為:當(dāng)b1和b2為同一份源碼編譯得到的則π(b1,b2)=1,否則π(b1,b2)=-1.然后按照一定比例將數(shù)據(jù)集T劃分為訓(xùn)練集Train Set、評(píng)估集Validation Set和測(cè)試集Test Set.
我們的目標(biāo)是設(shè)計(jì)一個(gè)基于深度學(xué)習(xí)的編碼模型ζ將二進(jìn)制文件b編碼成特征向量v,即ζ(b)→v,同時(shí)保證2個(gè)v之間可以用簡(jiǎn)單的余弦距離Cosine來度量它們所表示的二進(jìn)制文件之間的同源性.模型ζ的參數(shù)P在Train Set中進(jìn)行訓(xùn)練,訓(xùn)練的目標(biāo)是:
模型ζ的超參數(shù)調(diào)整在Validation Set中進(jìn)行,模型ζ的效果評(píng)估在Test Set中進(jìn)行.
2.2.2 模型結(jié)構(gòu)與訓(xùn)練方法
本節(jié)將詳細(xì)介紹2.2.1節(jié)中定義的字符串編碼模型.模型的輸入為代表二進(jìn)制文件的字符串序列,模型的輸出為編碼向量.如圖2所示,模型主要由詞嵌入網(wǎng)絡(luò)(embedding layer)[16]、雙層雙向循環(huán)神經(jīng)網(wǎng)絡(luò)(Bi-GRU layer)和全連接編碼網(wǎng)絡(luò)(encoding layer)三部分構(gòu)成.采用詞嵌入網(wǎng)絡(luò)的目的是盡可能保留字符串的語義信息;采用雙層雙向循環(huán)神經(jīng)網(wǎng)絡(luò)的目的是從2個(gè)方向提取字符串序列的上下文信息;采用全連接編碼網(wǎng)絡(luò)的目的是將特征向量編碼成特定長度的編碼向量.
詞嵌入網(wǎng)絡(luò)采用了文獻(xiàn)[17]中的模型并使用二進(jìn)制文件中提取出的字符串序列作為預(yù)料進(jìn)行預(yù)訓(xùn)練.字符串序列在經(jīng)過詞嵌入網(wǎng)絡(luò)后被編碼成512×TS的中間張量,其中TS為輸入字符串序列的長度.
Fig. 2 Two layer Bi-GRU encoding model圖2 雙層雙向Bi-GRU編碼模型
雙層雙向循環(huán)神經(jīng)網(wǎng)絡(luò)由2層Bi-GRU網(wǎng)絡(luò)構(gòu)成.如圖2所示,詞向量序列在經(jīng)過第1層左邊的Bi-GRU模塊后生成了256×TS的臨時(shí)張量;接著將詞向量反序后輸入第1層右邊的Bi-GRU模塊生成另一個(gè)256×TS的臨時(shí)張量;然后將上述2個(gè)臨時(shí)張量合并,生成512×TS的中間張量.采用完全一致的過程將上述中間張量送入第2層Bi-GRU網(wǎng)絡(luò)進(jìn)行處理,將結(jié)果張量中的最后一列抽取出來得到512維的特征向量.
全連接編碼網(wǎng)絡(luò)負(fù)責(zé)將512維的特征向量映射為編碼長度為p的編碼向量,關(guān)于p取值的影響見3.4節(jié)中的討論.本文中采用簡(jiǎn)單的單層全連接網(wǎng)絡(luò)作為編碼網(wǎng)絡(luò)的實(shí)現(xiàn).
然而如2.2.1節(jié)所述,圖2所示的模型并不能單獨(dú)訓(xùn)練,需要根據(jù)如圖3所示的Siamese架構(gòu)將2個(gè)共享參數(shù)的編碼模型結(jié)合在一起訓(xùn)練,從而保證編碼結(jié)果可以用簡(jiǎn)單的余弦距離Cosine來度量它們所表示的二進(jìn)制文件之間的同源性.
Fig. 3 Siamese architecture圖3 Siamese架構(gòu)
給定一個(gè)待查詢的二進(jìn)制文件和一個(gè)二進(jìn)制文件庫,在線搜索的任務(wù)是從二進(jìn)制文件庫中檢索出所有與待查二進(jìn)制文件同源性大于某給定閾值的二進(jìn)制文件.直接計(jì)算2個(gè)二進(jìn)制文件特征向量之間的余弦距離便可度量這2個(gè)文件的同源性.但這種“一對(duì)一”的匹配方法,因其時(shí)間復(fù)雜度為O(n),不適用于第4節(jié)提出的大規(guī)模同源二進(jìn)制文件檢索的應(yīng)用場(chǎng)景.本文借鑒了信息檢索領(lǐng)域中基于Hash的近似最近鄰搜索的思想,利用LSH技術(shù)將時(shí)間復(fù)雜度降低至O(lgN).由于上述方法不是本文的主要貢獻(xiàn),所以在本節(jié)剩下的內(nèi)容中僅對(duì)該方法的主要流程做一個(gè)大致的介紹.首先對(duì)二進(jìn)制文件庫中的每個(gè)二進(jìn)制文件用訓(xùn)練好的深度學(xué)習(xí)模型編碼成特征向量,然后使用事先構(gòu)造好的面向余弦距離的LSH函數(shù)族計(jì)算出每個(gè)特征向量的相似度Hash,最后以給定的同源性閾值為參數(shù)對(duì)相似度Hash構(gòu)造倒排索引數(shù)據(jù)庫.需要注意的是上述這些步驟均可以離線完成,無需消耗在線搜索時(shí)間.當(dāng)收到在線搜索任務(wù)后,首先對(duì)待查詢的二進(jìn)制文件采用與離線時(shí)相同的方法生成相似度Hash,然后在倒排索引數(shù)據(jù)庫中對(duì)相似度Hash進(jìn)行時(shí)間復(fù)雜度僅為O(lgN)的檢索,最終得到庫中所有滿足閾值條件的同源二進(jìn)制文件.
在本節(jié)中,首先介紹數(shù)據(jù)集的構(gòu)建方法,然后將本文方法與具有代表性的基于模糊Hash的方法sdhash進(jìn)行性能和時(shí)間開銷的對(duì)比,最后將展示作為本文方法核心的編碼模型的訓(xùn)練細(xì)節(jié).
由2.2.1節(jié)問題定義可知,訓(xùn)練模型需要人工標(biāo)記大量的同源性計(jì)算算子π作用到二進(jìn)制文件對(duì)后的取值.人工標(biāo)記的原則為:當(dāng)2個(gè)文件是由同一份源碼編譯生成的,π取值+1,否則π取值-1.參與編譯的源碼共涉及893個(gè)從開源社區(qū)收集得到的開源組件,包含聲音、壓縮與解壓、加密、數(shù)據(jù)庫、文件系統(tǒng)、圖形、硬件處理、javascript、JSONXML、日志、多媒體、網(wǎng)絡(luò)、安全、文字與終端處理等類別,涵蓋嵌入式設(shè)備中常見的組件,如openssl,binutils,libmad,boa,web,server,sudo,openssh,ntp,nginx,tcpdump,libgd,libxml2等.編譯參數(shù)包括不同的平臺(tái)(ARM,MIPS,PowerPC,X86,X64)、不同的編譯器(gcc,clang,icc)以及不同的編譯優(yōu)化級(jí)別(-O0,-O1,-O2,-O3,-Os).數(shù)據(jù)集中包含的二進(jìn)制文件概況如表2所示:
Table 2 Dataset Overview
訓(xùn)練集共29 981個(gè)二進(jìn)制文件,驗(yàn)證集共4 620個(gè)二進(jìn)制文件,測(cè)試集共4 618個(gè)二進(jìn)制文件.值得注意的是,在劃分文件到上述3個(gè)文件集的過程中,我們確保3個(gè)文件集是沒有“交集”的,即編譯自同一份源碼的多個(gè)二進(jìn)制文件不允許同時(shí)存在于2個(gè)不同的文件集中,這樣可以檢驗(yàn)?zāi)P蛯?duì)訓(xùn)練集中沒有遇到過的二進(jìn)制文件的編碼能力.最后按照π取值為+1與-1的文件對(duì)數(shù)量比例大致相等的原則對(duì)上述二進(jìn)制文件進(jìn)行配對(duì)處理,共生成55 253個(gè)文件對(duì)用于訓(xùn)練模型,共生成7 543個(gè)文件對(duì)用于在每個(gè)Epoch后對(duì)模型的編碼性能進(jìn)行驗(yàn)證,共生成8 333個(gè)文件對(duì)用于測(cè)試訓(xùn)練和調(diào)參等步驟完成后模型最終能達(dá)到的編碼性能.
本文方法與sdhash方法在測(cè)試集中的ROC曲線性能對(duì)比如圖4所示:
Fig. 4 ROC curves for our method and sdhash method圖4 ROC曲線性能對(duì)比
由圖4可知,本文方法比sdhash方法的ROC性能更好.例如當(dāng)假陽率為0.05時(shí),本文方法的真陽率為0.85而sdhash只有0.67;當(dāng)假陽率為0.1時(shí),本文方法的真陽率達(dá)到了0.91而sdhash只有0.78.除此之外,從圖4中描點(diǎn)的密度分布可知,本文方法在真陽率較高的階段點(diǎn)密度顯著高于sdhash,說明本文方法對(duì)閾值的選擇更具有魯棒性,因此穩(wěn)定性更好.
從本質(zhì)上講,本文方法與sdhash方法均為基于簽名的方法.即需要先計(jì)算簽名然后再進(jìn)行簽名的檢索.在實(shí)際應(yīng)用中,簽名計(jì)算是可以離線進(jìn)行的,而簽名的檢索必須在線進(jìn)行.因此在線檢索速度比離線簽名速度重要的多.2種方法的時(shí)間開銷對(duì)比如表3所示.本文方法平均每個(gè)二進(jìn)制的離線簽名時(shí)間約為sdhash的一半,更重要的是在對(duì)百萬量級(jí)二進(jìn)制文件庫進(jìn)行檢索時(shí)本文方法的速度比sdhash快了3個(gè)數(shù)量級(jí).
Table3ComparisonofOfflineSignaturesandOnlineSearch
TimeCosts
表3 離線簽名和在線檢索時(shí)間開銷對(duì)比 s
我們將模型訓(xùn)練50個(gè)epoch,并在每個(gè)epoch結(jié)束后打印損失函數(shù)的數(shù)值,同時(shí)在驗(yàn)證集中對(duì)AUC值進(jìn)行評(píng)估.損失函數(shù)變化趨勢(shì)和AUC變化趨勢(shì)分別如圖5和圖6所示:
Fig. 5 Loss versus number of epochs圖5 損失函數(shù)變化趨勢(shì)
Fig. 6 AUC versus number of epochs圖6 AUC變化趨勢(shì)
從圖5中可以看出,經(jīng)過10個(gè)左右的epoch訓(xùn)練后,損失函數(shù)下降到一個(gè)較低的水平,然后幾乎保持不變.從圖6中可以看出AUC也有類似的趨勢(shì),在10個(gè)左右的epoch訓(xùn)練后穩(wěn)定在一個(gè)較高的數(shù)值上.因此,我們得出這樣的結(jié)論:模型可以快速訓(xùn)練,只需要10個(gè)左右的epoch,即30 min的離線訓(xùn)練可達(dá)到很高的編碼性能.
為了考察編碼長度p對(duì)編碼性能的影響,我們將編碼長度分別取16,32,64和128時(shí)模型的ROC性能曲線放在一起進(jìn)行對(duì)比,如圖7所示:
Fig. 7 The effect of encoding length on ROC performance圖7 編碼長度對(duì)ROC性能的影響
由圖7可知,編碼長度越長,模型的編碼性能越好,但是隨著編碼長度的增加,存儲(chǔ)和計(jì)算的開銷也在增加,然而不同編碼長度之間的性能差距也越來越接近.綜合考慮后,本文選擇64作為模型的編碼長度.
為了驗(yàn)證本文方法的實(shí)用性,我們對(duì)14 種物聯(lián)網(wǎng)設(shè)備中常用組件(libgcrypt,libssh,msmtp,nginx,ntp,openssh,openssl,rsync,stunnel,subversion,sudo,tcpdump, wget,samba)進(jìn)行了大規(guī)模同源分析實(shí)驗(yàn),這些組件的某些版本曾經(jīng)都爆出過安全漏洞.實(shí)驗(yàn)所使用的二進(jìn)制文件庫由從52個(gè)廠商共22 594個(gè)固件解壓出的1 637 797個(gè)二進(jìn)制文件構(gòu)成.這些廠商的固件均是通過網(wǎng)絡(luò)爬蟲從各廠商的固件發(fā)布網(wǎng)頁中爬取得到.在構(gòu)建完離線索引庫后,完成一次同源二進(jìn)制文件檢索的時(shí)間只需要不到1 s.通過小樣本的人工分析與驗(yàn)證,本文方法在該應(yīng)用場(chǎng)景下的誤報(bào)率率低于20%,漏報(bào)率低于10%.由于篇幅所限,我們只展示其中4個(gè)典型組件openssl,samba,nginx,ntp的同源分析結(jié)果.它們?cè)?jīng)爆出過的CVE漏洞如表4所示.分析結(jié)果如圖8所示.
ComponentCVE VulnerabilityopensslCVE-2017-3731 CVE-2017-3730 CVE-2014-0160 CVE-2016-6309 CVE-2016-6308 CVE-2016-6304sambaCVE-2017-7494 CVE-2015-0240 CVE-2013-4496 CVE-2012-1182nginxCVE-2017-7529 CVE-2016-1247 CVE-2016-4450 CVE-2016-0747ntpCVE-2015-5146 CVE-2015-3405 CVE-2015-7691 CVE-2015-7701
可見openssl和samba影響范圍較廣,這說明心臟出血和SambaCry漏洞對(duì)物聯(lián)網(wǎng)設(shè)備安全構(gòu)成了巨大的威脅.
文獻(xiàn)[18]提出了一種模糊Hash算法ssdeep,該算法基于上下文觸發(fā)的滾動(dòng)Hash實(shí)現(xiàn)了自動(dòng)對(duì)齊和模糊匹配功能;文獻(xiàn)[19]設(shè)計(jì)了另一種模糊Hash算法sdhash,該算法基于熵估計(jì)來挑選出區(qū)分度最高的特征;文獻(xiàn)[20]驗(yàn)證了現(xiàn)有的模糊Hash算法在惡意軟件家族分類等安全應(yīng)用中的有效性;文獻(xiàn)[21]使用ssdeep在CERT Artifact Catalog數(shù)據(jù)庫中對(duì)一千多萬個(gè)文件進(jìn)行了聚類實(shí)驗(yàn).
近年來,越來越多的機(jī)器學(xué)習(xí)方法被用來解決二進(jìn)制分析領(lǐng)域的問題,以下列出一些比較有代表性的工作.本文作者在文獻(xiàn)[22]中提出了一種固件漏洞函數(shù)關(guān)聯(lián)方法,該方法基于BP神經(jīng)網(wǎng)絡(luò)提取函數(shù)跨平臺(tái)特征,因而不依賴特定的指令集,可以跨平臺(tái)進(jìn)行固件漏洞關(guān)聯(lián);文獻(xiàn)[23]將循環(huán)神經(jīng)網(wǎng)絡(luò)RNN應(yīng)用于函數(shù)邊界識(shí)別;文獻(xiàn)[24]利用3層RNN網(wǎng)絡(luò)對(duì)函數(shù)參數(shù)的個(gè)數(shù)以及數(shù)據(jù)類型進(jìn)行了識(shí)別;文獻(xiàn)[25]提出了使用ACFG表示函數(shù),并使用無監(jiān)督學(xué)習(xí)模型將ACFG轉(zhuǎn)換為數(shù)值向量,最后使用LSH技術(shù)完成對(duì)漏洞函數(shù)的快速檢索;文獻(xiàn)[26]在文獻(xiàn)[25]的基礎(chǔ)上使用與本文類似的圖嵌入網(wǎng)絡(luò)對(duì)ACFG進(jìn)行編碼從而提升了檢索性能.本文方法受到了以上研究工作,特別是文獻(xiàn)[25]和文獻(xiàn)[26]的啟發(fā),但在2個(gè)方面存在顯著不同:1)編碼對(duì)象不同,本文是將二進(jìn)制文件編碼成Hash向量,而文獻(xiàn)[25]和文獻(xiàn)[26]編碼的是函數(shù); 2)數(shù)據(jù)集的原創(chuàng)性,本文第1次將多達(dá)893個(gè)開源組件按照16種不同的編譯參數(shù)進(jìn)行編譯,總共生成了帶標(biāo)簽的71 129個(gè)二進(jìn)制文件對(duì)用于訓(xùn)練和測(cè)試模型.
在大規(guī)模嵌入式固件安全分析領(lǐng)域,文獻(xiàn)[12]首次對(duì)3萬多固件樣本進(jìn)行了關(guān)聯(lián)分析,但由于他們所采用的是基于模糊Hash[18-19]的二進(jìn)制文件關(guān)聯(lián)方法,需要進(jìn)行一對(duì)一的文件相似度關(guān)聯(lián)的計(jì)算,因而不適用于大規(guī)模的文件檢索應(yīng)用.而本文方法由于借助了局部敏感Hash技術(shù)進(jìn)行加速,從而可以將檢索的時(shí)間復(fù)雜度由O(n)降低至O(lgN).
本文設(shè)計(jì)和實(shí)現(xiàn)了一種時(shí)間復(fù)雜度為O(lgN)的面向物聯(lián)網(wǎng)設(shè)備固件的同源二進(jìn)制文件檢索方法.該方法的核心思想是通過深度學(xué)習(xí)網(wǎng)絡(luò)編碼二進(jìn)制文件中的可讀字符串,然后對(duì)編碼向量生成局部敏感Hash從而實(shí)現(xiàn)快速檢索.
本文按照16種不同的編譯參數(shù)編譯了893個(gè)開源組件,共生成71 129對(duì)帶標(biāo)簽的二進(jìn)制文件來訓(xùn)練和測(cè)試編碼模型.實(shí)驗(yàn)結(jié)果表明:基于本文方法的同源二進(jìn)制文件檢索性能好于傳統(tǒng)方法.此外,應(yīng)用案例表明本文方法只需不到1 s的時(shí)間即可完成一次針對(duì)22 594個(gè)固件的同源二進(jìn)制文件檢索任務(wù).
本文方法的不足之處為對(duì)于包含字符串較少的或者做過字符串混淆處理的二進(jìn)制文件的檢索能力較差,擬在未來工作中研究基于非字符串特征的提取與編碼方法,并與更多的同源二進(jìn)制檢索方法進(jìn)行性能對(duì)比.