使用深度學(xué)習(xí)檢測(cè)DGA(域名生成算法)
DGA(域名生成算法)是一種利用隨機(jī)字符來(lái)生成C&C域名,從而逃避域名黑名單檢測(cè)的技術(shù)手段。例如,一個(gè)由Cryptolocker創(chuàng)建的DGA生成域xeogrhxquuubt.com,如果我們的進(jìn)程嘗試其它建立連接,那么我們的機(jī)器就可能感染Cryptolocker勒索病毒。域名黑名單通常用于檢測(cè)和阻斷這些域的連接,但對(duì)于不斷更新的DGA算法并不奏效。我們的團(tuán)隊(duì)也一直在對(duì)DGA進(jìn)行廣泛的研究,并在arxiv發(fā)表了一篇關(guān)于使用深度學(xué)習(xí)預(yù)測(cè)域生成算法的文章。
本文我將為大家介紹一種,簡(jiǎn)單而有效的DGA生成域的檢測(cè)技術(shù)。我們將利用神經(jīng)網(wǎng)絡(luò)(或稱(chēng)之為深度學(xué)習(xí))更具體的來(lái)講就是長(zhǎng)短期記憶網(wǎng)絡(luò)(LSTM),來(lái)幫助我們檢測(cè)DGA生成域。首先我們會(huì)探討深度學(xué)習(xí)的優(yōu)勢(shì),然后我將進(jìn)一步的通過(guò)實(shí)例來(lái)驗(yàn)證我的論述。
如果你之前對(duì)機(jī)器學(xué)習(xí)并不了解,那么我建議你先翻看我之前發(fā)布的三篇關(guān)于機(jī)器學(xué)習(xí)的文章再來(lái)閱讀本文,這樣會(huì)更有助于你的理解。
長(zhǎng)短期記憶網(wǎng)絡(luò)(LSTM)的好處
深度學(xué)習(xí)近年來(lái)在機(jī)器學(xué)習(xí)社區(qū)中可以說(shuō)是占盡風(fēng)頭。深度學(xué)習(xí)是機(jī)器學(xué)習(xí)中一種基于對(duì)數(shù)據(jù)進(jìn)行表征學(xué)習(xí)的方法。其好處是用非監(jiān)督式或半監(jiān)督式的特征學(xué)習(xí)和分層特征提取高效算法來(lái)替代手工獲取特征。隨著數(shù)十年的不斷發(fā)展,深度學(xué)習(xí)在過(guò)去四五年間一直很受歡迎。再加上硬件的不斷升級(jí)優(yōu)化(如GPU的并行處理改進(jìn)),也使得培訓(xùn)復(fù)雜網(wǎng)絡(luò)成為了可能。LSTM是一種RNN的特殊類(lèi)型,可以學(xué)習(xí)長(zhǎng)期依賴(lài)信息,如文本和語(yǔ)言等。LSTM是實(shí)現(xiàn)循環(huán)神經(jīng)網(wǎng)絡(luò)的一個(gè)這樣的技巧,意味著包含循環(huán)的神經(jīng)網(wǎng)絡(luò)。LSTM在長(zhǎng)時(shí)間的學(xué)習(xí)模式方面非常擅長(zhǎng)如文本和言語(yǔ)。在本文的例子中,我將使用它們來(lái)學(xué)習(xí)字符序列(域名)的模式,從而幫助我們識(shí)別哪些是DGA生成域哪些不是。
使用深度學(xué)習(xí)的一大好處就是我們可以省去特征工程這一繁雜的過(guò)程。而如果我們使用常規(guī)方法來(lái)生成一長(zhǎng)串特征列表(例如長(zhǎng)度,元音,輔音以及n-gram模型),并使用這些特征來(lái)識(shí)別DGA生成域和非DGA生成域。那么就需要安全人員實(shí)時(shí)的更新和創(chuàng)建新的特征庫(kù),這將是一個(gè)異常艱巨和痛苦的過(guò)程。其次,一旦攻擊者掌握了其中的過(guò)濾規(guī)則,那么攻擊者就可以輕松地通過(guò)更新其DGA來(lái)逃避我們的檢測(cè)。而深度學(xué)習(xí)的自動(dòng)表征學(xué)習(xí)能力,也讓我們能夠更快的適應(yīng)不斷變化的對(duì)手。同時(shí),也大大減少了我們?nèi)肆ξ锪Φ木薮笸度?。我們技術(shù)的另一個(gè)優(yōu)點(diǎn)是僅對(duì)域名進(jìn)行識(shí)別而不使用任何上下文功能,如NXDomains
我們技術(shù)的另一個(gè)優(yōu)點(diǎn)是,我們僅對(duì)域名進(jìn)行分類(lèi)而不使用任何上下文功能如NXDomain。上下文功能的生成往往需要額外昂貴的基礎(chǔ)設(shè)施(如網(wǎng)絡(luò)傳感器和第三方信譽(yù)系統(tǒng))。令人驚訝的是對(duì)于沒(méi)有上下文信息的LSTM,執(zhí)行卻明顯優(yōu)于它們。如果你想了解更多關(guān)于LSTM的相關(guān)內(nèi)容,我推薦大家可以關(guān)注:colah的博客和blogdeeplearning.net。
什么是DGA?
首先我們要搞清楚什么是DGA?以及DGA檢測(cè)的重要性。攻擊者常常會(huì)使用域名將惡意程序連接至C&C服務(wù)器,從而達(dá)到操控受害者機(jī)器的目的。這些域名通常會(huì)被編碼在惡意程序中,這也使得攻擊者具有了很大的靈活性,他們可以輕松地更改這些域名以及IP。而對(duì)于另外一種硬編碼的域名,則往往不被攻擊者所采用,因?yàn)槠錁O易遭到黑名單的檢測(cè)。
而有了DGA域名生成算法,攻擊者就可以利用它來(lái)生成用作域名的偽隨機(jī)字符串,這樣就可以有效的避開(kāi)黑名單列表的檢測(cè)。偽隨機(jī)意味著字符串序列似乎是隨機(jī)的,但由于其結(jié)構(gòu)可以預(yù)先確定,因此可以重復(fù)產(chǎn)生和復(fù)制。該算法常被運(yùn)用于惡意軟件以及遠(yuǎn)程控制軟件上。
我們來(lái)簡(jiǎn)單了解下攻擊者和受害者端都做了哪些操作。首先攻擊者運(yùn)行算法并隨機(jī)選擇少量的域(可能只有一個(gè)),然后攻擊者將該域注冊(cè)并指向其C2服務(wù)器。在受害者端惡意軟件運(yùn)行DGA并檢查輸出的域是否存在,如果檢測(cè)為該域已注冊(cè),那么惡意軟件將選擇使用該域作為其命令和控制(C2)服務(wù)器。如果當(dāng)前域檢測(cè)為未注冊(cè),那么程序?qū)⒗^續(xù)檢查其它域。
安全人員可以通過(guò)收集樣本以及對(duì)DGA進(jìn)行逆向,來(lái)預(yù)測(cè)哪些域?qū)?lái)會(huì)被生成和預(yù)注冊(cè)并將它們列入黑名單中。但DGA可以在一天內(nèi)生成成千上萬(wàn)的域,因此我們不可能每天都重復(fù)收集和更新我們的列表。
圖1展示了許多類(lèi)型的惡意軟件的工作流程。如圖所示惡意軟件會(huì)嘗試連接三個(gè)域:asdfg.com,wedcf.com和bjgkre.com。前兩個(gè)域未被注冊(cè),并從DNS服務(wù)器接收到NXDomain響應(yīng)。第三個(gè)域已被注冊(cè),因此惡意軟件會(huì)使用該域名來(lái)建立連接。
創(chuàng)建LSTM
訓(xùn)練數(shù)據(jù)
任何機(jī)器學(xué)習(xí)模型都需要訓(xùn)練數(shù)據(jù)。這里我們將使用Alexa前100萬(wàn)個(gè)網(wǎng)站作為我們的原始數(shù)據(jù)。我們還在Python中組合了幾個(gè)DGA算法,你可以在我們的github上獲取到,同時(shí)我們將使用這些算法來(lái)生成惡意數(shù)據(jù)。
工具和框架
Keras toolbox是一個(gè)Python庫(kù),借用該庫(kù)可以大大方便我們編寫(xiě)神經(jīng)網(wǎng)絡(luò)。當(dāng)然除了Keras還有許多其它類(lèi)似的工具,這里我們首選Keras因?yàn)樗子谘菔竞屠斫?。Keras的底層庫(kù)使用Theano或TensorFlow,這兩個(gè)庫(kù)也稱(chēng)為Keras的后端。無(wú)論是Theano還是TensorFlow;都是一個(gè)”符號(hào)主義”的庫(kù),這里我們可以根據(jù)自身偏好選擇使用。
模型代碼
以下是我們用Python代碼構(gòu)建的模型:
下面我對(duì)以上代碼做個(gè)簡(jiǎn)單的解釋?zhuān)?/strong>
在第一行我們定義了一個(gè)基本的神經(jīng)網(wǎng)絡(luò)模型。下一行我們添加了一個(gè)嵌入層。此圖層將每個(gè)字符轉(zhuǎn)換為128個(gè)浮點(diǎn)數(shù)的向量(128不是幻數(shù))。一旦這個(gè)層被訓(xùn)練(輸入字符和輸出128個(gè)浮點(diǎn)數(shù)),每個(gè)字符基本上都經(jīng)過(guò)一次查找。max_features定義有效字符數(shù)。input_length是我們將要傳遞給神經(jīng)網(wǎng)絡(luò)的最大長(zhǎng)度字符串。
下一行添加了一個(gè)LSTM層,這是非常重要的一步。128表示我們內(nèi)部狀態(tài)的維度(這恰好與我們之前嵌入層的大小相同)。維度越大對(duì)模型的描述也就更具體,在這里128剛好適合我們的需求。
Dropout層是為了防止模型過(guò)擬合的。如果你覺(jué)得沒(méi)必要使用你可以刪除它,但還是建議大家最好能用上。
Dropout層位于大小為1的Dense層(全連接層)之前。
我們添加了一個(gè)激活函數(shù)sigmoid,它能夠把輸入的連續(xù)實(shí)值“壓縮”到0和1之間。如果是非常大的負(fù)數(shù),那么輸出就是0;如果是非常大的正數(shù),輸出就是1。
我們使用優(yōu)化器對(duì)交叉熵?fù)p失函數(shù)進(jìn)行優(yōu)化。RMSProp是隨機(jī)梯度下降的變體,并且往往對(duì)循環(huán)神經(jīng)網(wǎng)絡(luò)非常有效。
預(yù)處理代碼
在正式開(kāi)始訓(xùn)練數(shù)據(jù)之前,我們必須做一些基本的數(shù)據(jù)預(yù)處理。應(yīng)將每個(gè)字符串轉(zhuǎn)換為表示每個(gè)可能字符的int數(shù)組。這種編碼是任意的,但是應(yīng)該從1開(kāi)始(我們?yōu)榻Y(jié)束序列token保留0)并且是連續(xù)的。下面的這串代碼可以幫助我們實(shí)現(xiàn)這個(gè)過(guò)程。
接下來(lái),我們將每個(gè)int數(shù)組填充至相同的長(zhǎng)度。填充能讓我們的toolbox更好地優(yōu)化計(jì)算(理論上,LSTM不需要填充)。這里Keras為我們提供了一個(gè)非常好用的函數(shù):
maxlen表示每個(gè)數(shù)組的長(zhǎng)度。當(dāng)陣列太長(zhǎng)時(shí),此函數(shù)將填充0和crop。之前我們整數(shù)的編碼是從1開(kāi)始的這一點(diǎn)非常重要,因?yàn)長(zhǎng)STM應(yīng)該學(xué)習(xí)填充和字符之間的區(qū)別。
這里,我們可以使用ROC曲線分割我們的測(cè)試和訓(xùn)練集,以及評(píng)估我們的表現(xiàn)。
比較
在我們發(fā)布在arxiv的文章中,我們將我們簡(jiǎn)單的LSTM技術(shù)和其他三種技術(shù)做了對(duì)比。為了使本文更加通俗易懂,我們只將結(jié)果與使用邏輯回歸分布的單一方法進(jìn)行比較。這種技術(shù)也比目前現(xiàn)有的技術(shù)更好(但仍不如LSTM)。這是一種更傳統(tǒng)的基于特征的方法,其中特征是域名中包含的所有雙字節(jié)的直方圖(或原始計(jì)數(shù))。你可以在我們的github上獲取到,關(guān)于 使用LSTM預(yù)測(cè)域生成算法的實(shí)現(xiàn)代碼。
結(jié)果
現(xiàn)在讓我們來(lái)看看分類(lèi)器性能指標(biāo)ROC曲線、AUC值:
可以看到一個(gè)AUC的值為0.9977,說(shuō)明我們的分類(lèi)效果非常的好,而達(dá)到這個(gè)效果我們僅僅只用了幾行代碼。實(shí)際上我們完成了對(duì)一個(gè)數(shù)量龐大而多樣化的數(shù)據(jù)集的深入分析,并以1/10,000的假陽(yáng)性率觀察了90%的檢測(cè)。
總結(jié)
我們提出了使用神經(jīng)網(wǎng)絡(luò)來(lái)檢測(cè)DGA的簡(jiǎn)單技術(shù)。該技術(shù)不需要使用任何上下文信息(如NXDomains和第三方信譽(yù)系統(tǒng)),并且檢測(cè)效果也遠(yuǎn)遠(yuǎn)優(yōu)于現(xiàn)有的一些技術(shù)。本文只是我們關(guān)于DGA研究的部分摘要,你可以點(diǎn)擊閱讀我們?cè)赼rxiv的完整文章。同時(shí),你也可以對(duì)我們發(fā)布在github上的代碼做進(jìn)一步的研究學(xué)習(xí)。