陳 鵬,韓 斌,洪華軍
1(江蘇科技大學(xué) 計算機學(xué)院,鎮(zhèn)江 212000)
2(中國船舶科學(xué)研究中心 軟件工程技術(shù)中心,無錫 214082)
如今Web 已經(jīng)深刻融入我們的生活中,為日常生活帶來了諸多便利,我們隨時可以通過手機或者電腦來訪問各種網(wǎng)站,但同時這也給網(wǎng)絡(luò)攻擊者提供了大量的攻擊機會.網(wǎng)絡(luò)攻擊者為了達(dá)到其目的,會將一些惡意的代碼嵌入到網(wǎng)頁中,造成了正常的互聯(lián)網(wǎng)用戶的個人信息的泄露和個人財產(chǎn)的損失等問題.
針對Web 安全問題,研究者們提出了不同的解決方法.惡意代碼檢測目前主要分為兩大類,一種是基于代碼文本及結(jié)構(gòu)的靜態(tài)檢測方法,另一種是基于運行結(jié)果的分析的動態(tài)檢測方法[1].毛蔚等[2]在分析進程訪問行為異常度和相似度后,引入了惡意代碼檢測估計風(fēng)險,并提出一種最小化估計風(fēng)險實現(xiàn)主動學(xué)習(xí)的惡意代碼檢測方法;吳迪[3]針對Android 平臺的惡意代碼檢測只關(guān)注應(yīng)用的單方面的特征,提出了基于多類特征的Android 惡意代碼檢測技術(shù);羅世奇等[4]提出使用惡意代碼紋理指特征紋融合33 類惡意代碼活動向量空間特征,利用棧式自編碼(SAE)模型來完成惡意代碼的分類;鄧兆琨等[5]提出了一種動靜結(jié)合的網(wǎng)絡(luò)數(shù)據(jù)檢測方法,在傳統(tǒng)靜態(tài)分析的基礎(chǔ)上優(yōu)化了檢測算法,同時引入了動態(tài)模擬運行的檢測方式;黃琨茗等[6]提出一種最長頻繁序列挖掘算法,該方法提取樣本文件的動態(tài)API 序列,并挖掘最長頻繁序列集合構(gòu)造詞袋模型,將API 序列轉(zhuǎn)化為向量,使用隨機森林算法來識別惡意代碼.
深度學(xué)習(xí)技術(shù)在惡意代碼識別領(lǐng)域已經(jīng)取得了較好的效果,但是仍然存在以下方面的問題:(1)單個機構(gòu)的惡意代碼樣本是有限的,模型泛化能力需要高質(zhì)量多樣性的數(shù)據(jù)集;(2)在大數(shù)據(jù)時代,有效處理海量的數(shù)據(jù)是惡意代碼檢測效率提升的必要條件;(3)如今數(shù)據(jù)已成為一項寶貴的資源,數(shù)據(jù)的隱私和安全性越來越受到人們的關(guān)注.惡意代碼樣本這類特殊性質(zhì)的數(shù)據(jù)集,如果被網(wǎng)絡(luò)攻擊者獲取,對于網(wǎng)絡(luò)安全的威脅是巨大的.
區(qū)塊鏈自2008年比特幣白皮書[7]提出以來,因為其去中心化透明可信、防篡改可追溯、隱私安全保障等特點越來越受到人們的關(guān)注.如楊雪梅[8]探索了將區(qū)塊鏈技術(shù)中的去中心化的思想與深度學(xué)習(xí)相結(jié)合并嘗試運用于語音識別的可行性,提出了一種適用于處理大規(guī)模的聲學(xué)數(shù)據(jù)的融合分布式的深度學(xué)習(xí)算法模型.Gu 等[9]提出了一種Java 層的移動終端惡意軟件檢測方法,并結(jié)合了區(qū)塊鏈技術(shù),達(dá)到了多機構(gòu)的共享的目的.本文基于區(qū)塊鏈技術(shù),結(jié)合卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network,CNN)進行了深度融合,提出了一種基于區(qū)塊鏈+深度學(xué)習(xí)的JavaScript 惡意代碼檢測系統(tǒng)設(shè)計方案,利用區(qū)塊鏈去中心化特點進行模型的分布式訓(xùn)練和同步更新.
區(qū)塊鏈被定義為一種按時間順序來組織數(shù)據(jù)區(qū)塊,不同區(qū)塊之間按序形成鏈條狀連接的數(shù)據(jù)結(jié)構(gòu),借助這種數(shù)據(jù)結(jié)構(gòu)來構(gòu)建數(shù)字賬本[10],是一種可信的,去中心化防篡改的數(shù)據(jù)存儲技術(shù),區(qū)塊鏈的數(shù)據(jù)結(jié)構(gòu)如圖1所示.
圖1 區(qū)塊鏈數(shù)據(jù)結(jié)構(gòu)示意圖
區(qū)塊鏈中的基本數(shù)據(jù)單元是塊.在每個塊中存儲了所有交易相關(guān)的數(shù)據(jù)信息,主要包括了區(qū)塊頭和區(qū)塊體兩部分信息.區(qū)塊頭中主要由父區(qū)塊的哈希值(previous hash)、當(dāng)前的時間戳(time stamp)以及默克爾樹根(Merkle tree root)等構(gòu)成.在區(qū)塊體中一般包括若干個交易列表.每個塊與上一個塊都是通過哈希值來進行連接的.對于區(qū)塊鏈網(wǎng)絡(luò)中的節(jié)點,在收到其余節(jié)點發(fā)送的數(shù)據(jù)以后,并不是立即保存,而是需要通過“共識機制”對當(dāng)前的數(shù)據(jù)進行驗證,如果驗證通過則保存到區(qū)塊鏈中[11].為了加速區(qū)塊的驗證,區(qū)塊體中的所有的交易信息都按照默克爾樹的形式保存下來,并用默克爾樹的根連接區(qū)塊頭和區(qū)塊體[12].區(qū)塊鏈中的每個節(jié)點都有自己一對公私鑰,利用非對稱加密技術(shù)來保證信息的加密傳輸,從而保護了交易者的隱私.
卷積神經(jīng)網(wǎng)絡(luò)是一種專門用來處理具有類似網(wǎng)格結(jié)構(gòu)的數(shù)據(jù)的神經(jīng)網(wǎng)絡(luò),是深度學(xué)習(xí)的代表算法之一[13,14].經(jīng)典卷積神經(jīng)網(wǎng)絡(luò)包括卷積層、池化層和全連接層.卷積神經(jīng)網(wǎng)絡(luò)的卷積核參數(shù)共享機制使得能夠以較低的運算來提取特征,給定一張?zhí)卣骶仃噲D,通過不同的組合,經(jīng)過全連接達(dá)到分類的目的.
(1)卷積層
卷積層的作用在于提取輸入數(shù)據(jù)的特征.通過卷積核與對應(yīng)位置的數(shù)據(jù)相乘來獲取圖的特征,接著使用非線性激活函數(shù)完成特征的映射.定義輸入圖片Pi,j(0≤i≤W,0≤j<H),大小為W×H,則卷積運算的公式為:
式中,ωm,n(0≤m,n≤K)表示大小為K×K的卷積過濾器的卷積運算的權(quán)值.
更一般地,在卷積運算的過程中,通常會有多個通道,這些通道上的過濾器同時進行特征提取.定義輸入的圖片為Pi,j,c(0≤i≤W,0≤j≤H,0≤c≤C),表示大小為W×H,通道數(shù)為C的圖片,卷積運算公式為:
式中,bi,j,l表示卷積運算的偏置,ωm,n,c,l表示卷積神經(jīng)網(wǎng)絡(luò)的權(quán)值.
(2)池化層
在卷積運算之后通常需要添加一層池化層,來對卷積運算得到的特征減少映射的表示,即降維操作.池化操作具體指的是對局部特征范圍內(nèi),提取最大值或者平均值.通常使用最大值池化和平均池化.最大池化和平均池化的計算公式為:
(3)全連接層
全連接層通常放置在最后幾層用作分類器,根據(jù)卷積操作提取得到的特征進行分類.在全連接層之后,對應(yīng)分類上的概率分布通過softmax或者logsoftmax來計算.定義原始的神經(jīng)網(wǎng)絡(luò)輸出為y1,y2,···,yn,則計算公式為:
在深度學(xué)習(xí)訓(xùn)練過程中,為了提高模型的訓(xùn)練速度,可以通過一些參數(shù)設(shè)置來加速GPU的計算,由于單個的GPU的加速的效率沒有辦法滿足某些重量型深度學(xué)習(xí)模型算力要求,由此出現(xiàn)了深度學(xué)習(xí)模型的并行方式.分布式深度學(xué)習(xí)系統(tǒng)由多個共享模型和一個中央控制代理組成,如圖2所示.其中貢獻(xiàn)者可以貢獻(xiàn)自己的模型、數(shù)據(jù)和算力,訓(xùn)練完成后發(fā)送給中央服務(wù)器,中央處理器負(fù)責(zé)融合和共享深度學(xué)習(xí)模型.整個模型的訓(xùn)練都由一個中央服務(wù)器集中代理完成,所以,融合模型的過程中可能會遭受單點失效的影響[15,16].
圖2 分布式深度學(xué)習(xí)示意圖
與分布式深度學(xué)習(xí)不同,系統(tǒng)中劃分為了3 個角色應(yīng)用程序發(fā)起者、若干個算力貢獻(xiàn)者和驗證貢獻(xiàn)者.其系統(tǒng)架構(gòu)如圖3所示.
圖3 協(xié)作分布式深度學(xué)習(xí)示意圖
在這個設(shè)計框架中,每個單元都能夠獨立進行決策,程序發(fā)起者負(fù)責(zé)定義訓(xùn)練模型的任務(wù).算力貢獻(xiàn)者負(fù)責(zé)調(diào)用自己的算力資源進行構(gòu)建訓(xùn)練任務(wù)并訓(xùn)練深度學(xué)習(xí)模型,算力貢獻(xiàn)者擁有充分的自主權(quán),可以根據(jù)程序發(fā)起者的不同任務(wù)選擇本機的模型或者數(shù)據(jù),在訓(xùn)練完成后將其發(fā)送給驗證者.驗證者在收到算力貢獻(xiàn)者提交的參數(shù)后,負(fù)責(zé)驗證并評估模型的性能指標(biāo),把結(jié)果發(fā)送給程序發(fā)起者.發(fā)起者可以選擇保留或者丟棄部分?jǐn)?shù)據(jù)[17,18].
Ni 等[19]提出了一個惡意代碼檢測算法MCSC,首先將代碼文件轉(zhuǎn)化為基于simhash的灰度圖,然后使用卷積神經(jīng)網(wǎng)絡(luò)完成惡意代碼家族的分類.通過灰度圖結(jié)合深度學(xué)習(xí)的方法均需要將圖像轉(zhuǎn)化為固定大小,因此在圖像轉(zhuǎn)化的過程中會造成一部分的信息丟失.本文使用基于馬爾可夫圖算法[20]避免了上述的問題.將JavaScript 代碼轉(zhuǎn)化為8 位的無符號整數(shù)向量,整個代碼就可以看做是一個字節(jié)流,字節(jié)流表達(dá)了一個隨機的過程:
式中,N代表JsavaScript 代碼的字節(jié)長度.對于每一個變量Bytei,有256 種不同的狀態(tài)值,可以表示為:
由于惡意腳本都衍生自已知的惡意代碼,所以新的惡意腳本只有小部分的改動.例如文獻(xiàn)[21]將某惡意代碼家族不同樣本可視化為灰度圖,如圖4所示,可以發(fā)現(xiàn)相同惡意代碼家族在字節(jié)分布上也會存在相似的特征.
圖4 Fakeraean 木馬家族圖像實例[21]
基于上述惡意代碼家族字節(jié)可視化圖相似性的特點,考慮相鄰的兩項Bytei-1和Bytei,狀態(tài)空間中狀態(tài)Bytei-1到 狀態(tài)Bytei轉(zhuǎn)換過程是隨機的,具備“無記憶的”性質(zhì),且每個狀態(tài)相互轉(zhuǎn)換的概率是相同的.所以在代碼字節(jié)提取特征上,為了簡化問題,這里假設(shè)Bytei只與Bytei-1有 關(guān)聯(lián),則隨機的變量Bytei可視為一個馬爾可夫鏈:
馬爾可夫轉(zhuǎn)移概率矩陣的構(gòu)建是基于每一個狀態(tài)遷移的概率.如果用Px,y記作是x的下一個字節(jié)為y的狀態(tài)轉(zhuǎn)移概率,那么對于任意的字節(jié)序列計算公式為:
式中,f(x,y)表示x后面是y的頻率,且x,y∈{0,1,···,255}.以此類推考慮整個文件的字節(jié)的狀態(tài)轉(zhuǎn)移概率M,計算公式為:
基于式(11)生成馬爾可夫圖像,圖像中的每一個點對應(yīng)于馬爾可夫轉(zhuǎn)移概率矩陣中的不同位置上的轉(zhuǎn)移概率Px,y.將JavaScript 代碼轉(zhuǎn)化為馬爾可夫圖的示意圖如圖5所示.
圖5 JavaScript 代碼轉(zhuǎn)化為馬爾可夫圖
基于協(xié)作式分布深度學(xué)習(xí)[17]的角色劃分,并結(jié)合機器學(xué)習(xí)模型訓(xùn)練的3 要素:數(shù)據(jù)、算法、算力.本文將系統(tǒng)中用戶角色劃分為3 種:任務(wù)發(fā)起人、若干個算力貢獻(xiàn)者和若干個模型驗證者.JavaScript 惡意代碼檢測系統(tǒng)的用戶對象關(guān)系示意圖如圖6所示.系統(tǒng)角色劃分其數(shù)量和對應(yīng)關(guān)系如表1所示.
某項任務(wù)的發(fā)起人負(fù)責(zé)定義任務(wù)的內(nèi)容,比如輸入數(shù)據(jù)的屬性、模型的預(yù)期輸出、測試數(shù)據(jù)集、模型的準(zhǔn)確度要求;算力貢獻(xiàn)者通過下載任務(wù)數(shù)據(jù)或者自己本地數(shù)據(jù),針對給定的任務(wù)進行模型的訓(xùn)練任務(wù);驗證貢獻(xiàn)者將算力貢獻(xiàn)者訓(xùn)練好的模型進行融合,然后再加密的測試數(shù)據(jù)集合上驗證.下文詳細(xì)描述了流程,其中所使用的符號定義如表2所示.
圖6 JavaScript 惡意代碼檢測系統(tǒng)用戶對象關(guān)系
表1 系統(tǒng)角色劃分對應(yīng)關(guān)系表
表2 符號對應(yīng)意義
對于集合N,Ori,Cp,Ver滿足如下條件:
模型訓(xùn)練算法如下:
(1)發(fā)起交易,發(fā)起人Orii發(fā)布一筆計算任務(wù)交易,內(nèi)容包括深度學(xué)習(xí)模型以及融合模型、深度學(xué)習(xí)任務(wù)、模型參數(shù)、融合數(shù)據(jù)和決策接口記作Data.由于模型訓(xùn)練的數(shù)據(jù)集比較龐大,會存放在IPFS (Inter Planetary File System)中[22],將對應(yīng)的哈希值地址存放在交易中,其余節(jié)點通過訪問IPFS 來獲取節(jié)點數(shù)據(jù)信息,上述過程可以表達(dá)如下:
其中:
(2)參數(shù)初始化,所有節(jié)點完成參數(shù)初始化的同步,每個算力貢獻(xiàn)者Cpi和驗證者Veri需要對消息進行校驗,確定消息的發(fā)送身份以及數(shù)據(jù)的完整性,校驗函數(shù)記作fcheck(Pac,PKOrii),運算結(jié)果中1 代表驗證通過,0 代表丟棄該消息,過程如下所示:
(3)訓(xùn)練參數(shù),訓(xùn)練中算力貢獻(xiàn)者表示為:CpOrii={CpOrii,1,CpOrii,2,···,CpOrii,d},d<|N|,在每一輪的訓(xùn)練k中,都會分別完成自己的前向和后向運算,同時計算得到每一個參數(shù)的更新量δ (CpOrii,k);
(4)廣播參數(shù)量,向周圍的節(jié)點廣播自己得到的參數(shù)量;
(5)同步更新參數(shù)量,此時節(jié)點將所有已經(jīng)接收的進程進行同步(All-Reduce),對所有的參數(shù)更新量求平均,得到基于所有進程訓(xùn)練數(shù)據(jù)的平均參數(shù)更新量,該過程如圖7所示.
圖7 同步更新參數(shù)示意圖
參數(shù)更新平均值計算如式(16)所示,求得的參數(shù)作為下一輪訓(xùn)練的初始參數(shù):
(6)進行下一輪的訓(xùn)練計算;
(7)重復(fù)步驟(3)~(6)結(jié)束條件為訓(xùn)練集全部訓(xùn)練完畢.節(jié)點將參數(shù)聚合,將模型數(shù)據(jù)寫入?yún)^(qū)塊廣播給周圍節(jié)點;
(8)共識過程.驗證者將已經(jīng)訓(xùn)練好的模型進行篩選,將較優(yōu)的模型匯總成候選集(candidate set),并將模型的候選集廣播至其他驗證節(jié)點.
① 驗證貢獻(xiàn)者將當(dāng)前最優(yōu)模型作為提案轉(zhuǎn)發(fā)至其他驗證節(jié)點;
② 驗證者將收到的方案與本地候選集和提案模型進行對比,擇優(yōu)放入候選集;
③ 定義驗證貢獻(xiàn)節(jié)點中模型的投票率 χ,模型投票率的閾值η,最大閾值T_MAX,初始情形下投票閾值η0為50%.判斷模型是否有效方法為,如果χ ≥η,認(rèn)為該模型為有效模型計入候選集,否則該模型被淘汰.在每一輪的共識過程中閾值 η不斷累加常量Δ γ,表示為ηi=ηi-1+Δγ,Δγ ∈(0,1),i∈N*,且對任意的ηi,均滿足ηi小于T_MAX,重復(fù)過程①~③,直到ηi大于等于T_MAX.
驗證貢獻(xiàn)者將從大于T_MAX的UNL 節(jié)點確認(rèn)的模型中選擇最優(yōu)模型寫入本地的區(qū)塊中.同時驗證貢獻(xiàn)節(jié)點將本地區(qū)塊廣播給全網(wǎng),將收到區(qū)塊和自己本地區(qū)塊進行比對,當(dāng)正確率超過T_MAX時,認(rèn)為該區(qū)塊鏈為有效區(qū)塊.
本文實驗使用的數(shù)據(jù)集為Github 公開的惡意Java-Script 惡意代碼數(shù)據(jù)集[23],對于良性的樣本,從Alexa’s Top 站點進行了爬取腳本的操作.最終獲得了3526 條良性JavaScript 腳本代碼和3566 條惡意JavaScript 腳本代碼.實驗將數(shù)據(jù)集劃分為兩部分,70%留作訓(xùn)練數(shù)據(jù)集,30%作為測試數(shù)據(jù)集.
使用機器學(xué)習(xí)工具包Sklearn 所提供的算法庫實現(xiàn)了文獻(xiàn)[24]提出的7 種不同的機器學(xué)習(xí)算法,按照文中描述方法進行了代碼特征的提取分類.采用十折交叉驗證的方法,將數(shù)據(jù)集分為10 等份,其中的1 份作為測試集,其余9 份用作訓(xùn)練集,重復(fù)10 次,將平均值作為最終的結(jié)果.與本文方法進行對比(馬爾可夫特征提取+CNN 分類器),實驗果如表3所示.
表3 本文特征提取方法和傳統(tǒng)方法對比
對比實驗結(jié)果發(fā)現(xiàn),馬爾可夫圖的特征提取準(zhǔn)確率達(dá)到了98.98%,而準(zhǔn)確率最低的為Na?ve Bayes 方法僅為78.4%,傳統(tǒng)提取方法表現(xiàn)最優(yōu)的為隨機森林,達(dá)到了98.27%,但是仍然低于本文方法達(dá)到的準(zhǔn)確率,說明本文基于馬爾可夫圖算法的特征提取能夠有效提升惡意代碼的檢測率.
為了分析不同閾值T_MAX對共識算法性能的影響,設(shè)計了一組仿真實驗.實驗中固定 Δγ為10%,算力貢獻(xiàn)者和驗證貢獻(xiàn)者節(jié)點數(shù)均為100 個.本實驗的區(qū)塊鏈仿真平臺采用Python3.7 結(jié)合Flask 框架搭建,本地部署區(qū)塊鏈,對不同閾值T_MAX下的共識算法進行了模擬,并記錄吞吐量、模型收斂的時間,多次試驗求平均值,實驗結(jié)果如圖8所示.
圖8 不同閾值T_MAX 對共識算法性能影響示意圖
實驗結(jié)果表明,隨著閾值T_MAX的不斷增加,共識算法的吞吐量逐漸減少.如果該閾值設(shè)置過小,盡管共識算法吞吐量較大,但是系統(tǒng)收斂到最優(yōu)模型的速率會減慢;反之,如果閾值設(shè)置過大,共識算法的吞吐量會減少,但是算法能夠較快收斂到最優(yōu)模型.
(1)數(shù)據(jù)樣本去中心化存儲.區(qū)塊鏈上的節(jié)點出于某種原因無法共享數(shù)據(jù),此時可以在訓(xùn)練中除了可以擁有發(fā)起人共享的數(shù)據(jù),還可以調(diào)用本地的數(shù)據(jù)集樣本參與模型的訓(xùn)練,有效突破了數(shù)據(jù)孤島的障礙,另外數(shù)據(jù)訓(xùn)練得到的參數(shù)也將被驗證者校驗,解決了數(shù)據(jù)可信任的問題.采用該平臺設(shè)計,極大擴充提升了訓(xùn)練樣本的數(shù)量,提升模型的泛化能力,從而有效檢測未知的JavaScript 惡意代碼;
(2)模型訓(xùn)練結(jié)果參數(shù)防篡改.模型一旦訓(xùn)練完成之后,便會通過共識算法進行校驗,擇優(yōu)模型然后被存入?yún)^(qū)塊鏈中.假設(shè)存在惡意節(jié)點,但是通過共識機制該模型也不會被其余節(jié)點認(rèn)可,所以修改是無效的,保證了模型參數(shù)存儲的安全性;
(3)分散算力有效利用資源.該平臺設(shè)計通過協(xié)調(diào)多方的算力,將傳統(tǒng)的工作量證明機制的算法替換為有意義的深度學(xué)習(xí)模型訓(xùn)練,從而有效合理地利用了算力資源,推進了整個區(qū)塊鏈上惡意代碼檢測準(zhǔn)確度的提高.
深度學(xué)習(xí)作為一種新興技術(shù)代表著先進生產(chǎn)力,而區(qū)塊鏈則代表了新的生產(chǎn)關(guān)系,兩者有非常大的合作空間.本文嘗試將區(qū)塊鏈技術(shù)和深度學(xué)習(xí)分布式系統(tǒng)訓(xùn)練相結(jié)合,解決了數(shù)據(jù)孤島和數(shù)據(jù)可信任的問題,另外在特征提取上使用馬爾可夫圖減少了人工的干預(yù),提升了檢測流程的效率,該檢測系統(tǒng)的設(shè)計可以為惡意代碼檢測研究提供一定的參考.