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