閱讀299 返回首頁    go 阿裏雲 go 技術社區[雲棲]


技術 | 使用深度學習檢測DGA(域名生成算法)

DGA(域名生成算法)是一種利用隨機字符來生成C&C域名,從而逃避域名黑名單檢測的技術手段。例如,一個由Cryptolocker創建的DGA生成域xeogrhxquuubt.com,如果我們的進程嚐試其它建立連接,那麼我們的機器就可能感染Cryptolocker勒索病毒。域名黑名單通常用於檢測和阻斷這些域的連接,但對於不斷更新的DGA算法並不奏效。我們的團隊也一直在對DGA進行廣泛的研究,並在arxiv發表了一篇關於使用深度學習預測域生成算法的文章。

本文我將為大家介紹一種,簡單而有效的DGA生成域的檢測技術。我們將利用神經網絡(或稱之為深度學習)更具體的來講就是長短期記憶網絡(LSTM),來幫助我們檢測DGA生成域。首先我們會探討深度學習的優勢,然後我將進一步的通過實例來驗證我的論述。

如果你之前對機器學習並不了解,那麼我建議你先翻看我之前發布的三篇關於機器學習的文章再來閱讀本文,這樣會更有助於你的理解。

深度學習近年來在機器學習社區中可以說是占盡風頭。深度學習是機器學習中一種基於對數據進行表征學習的方法。其好處是用非監督式或半監督式的特征學習和分層特征提取高效算法來替代手工獲取特征。隨著數十年的不斷發展,深度學習在過去四五年間一直很受歡迎。再加上硬件的不斷升級優化(如GPU的並行處理改進),也使得培訓複雜網絡成為了可能。LSTM是一種RNN的特殊類型,可以學習長期依賴信息,如文本和語言等。LSTM是實現循環神經網絡的一個這樣的技巧,意味著包含循環的神經網絡。LSTM在長時間的學習模式方麵非常擅長如文本和言語。在本文的例子中,我將使用它們來學習字符序列(域名)的模式,從而幫助我們識別哪些是DGA生成域哪些不是。

使用深度學習的一大好處就是我們可以省去特征工程這一繁雜的過程。而如果我們使用常規方法來生成一長串特征列表(例如長度,元音,輔音以及n-gram模型),並使用這些特征來識別DGA生成域和非DGA生成域。那麼就需要安全人員實時的更新和創建新的特征庫,這將是一個異常艱巨和痛苦的過程。其次,一旦攻擊者掌握了其中的過濾規則,那麼攻擊者就可以輕鬆地通過更新其DGA來逃避我們的檢測。而深度學習的自動表征學習能力,也讓我們能夠更快的適應不斷變化的對手。同時,也大大減少了我們人力物力的巨大投入。我們技術的另一個優點是僅對域名進行識別而不使用任何上下文功能,如NXDomains
我們技術的另一個優點是,我們僅對域名進行分類而不使用任何上下文功能如NXDomain。上下文功能的生成往往需要額外昂貴的基礎設施(如網絡傳感器和第三方信譽係統)。令人驚訝的是對於沒有上下文信息的LSTM,執行卻明顯優於它們。如果你想了解更多關於LSTM的相關內容,我推薦大家可以關注:colah的博客和blogdeeplearning.net。

首先我們要搞清楚什麼是DGA?以及DGA檢測的重要性。攻擊者常常會使用域名將惡意程序連接至C&C服務器,從而達到操控受害者機器的目的。這些域名通常會被編碼在惡意程序中,這也使得攻擊者具有了很大的靈活性,他們可以輕鬆地更改這些域名以及IP。而對於另外一種硬編碼的域名,則往往不被攻擊者所采用,因為其極易遭到黑名單的檢測。

而有了DGA域名生成算法,攻擊者就可以利用它來生成用作域名的偽隨機字符串,這樣就可以有效的避開黑名單列表的檢測。偽隨機意味著字符串序列似乎是隨機的,但由於其結構可以預先確定,因此可以重複產生和複製。該算法常被運用於惡意軟件以及遠程控製軟件上。

我們來簡單了解下攻擊者和受害者端都做了哪些操作。首先攻擊者運行算法並隨機選擇少量的域(可能隻有一個),然後攻擊者將該域注冊並指向其C2服務器。在受害者端惡意軟件運行DGA並檢查輸出的域是否存在,如果檢測為該域已注冊,那麼惡意軟件將選擇使用該域作為其命令和控製(C2)服務器。如果當前域檢測為未注冊,那麼程序將繼續檢查其它域。

安全人員可以通過收集樣本以及對DGA進行逆向,來預測哪些域將來會被生成和預注冊並將它們列入黑名單中。但DGA可以在一天內生成成千上萬的域,因此我們不可能每天都重複收集和更新我們的列表。

image


圖1展示了許多類型的惡意軟件的工作流程。如圖所示惡意軟件會嚐試連接三個域:asdfg.com,wedcf.com和bjgkre.com。前兩個域未被注冊,並從DNS服務器接收到NXDomain響應。第三個域已被注冊,因此惡意軟件會使用該域名來建立連接。

訓練數據

任何機器學習模型都需要訓練數據。這裏我們將使用Alexa前100萬個網站作為我們的原始數據。我們還在Python中組合了幾個DGA算法,你可以在我們的github上獲取到,同時我們將使用這些算法來生成惡意數據。

工具和框架

Keras toolbox是一個Python庫,借用該庫可以大大方便我們編寫神經網絡。當然除了Keras還有許多其它類似的工具,這裏我們首選Keras因為它更易於演示和理解。Keras的底層庫使用Theano或TensorFlow,這兩個庫也稱為Keras的後端。無論是Theano還是TensorFlow;都是一個”符號主義”的庫,這裏我們可以根據自身偏好選擇使用。

模型代碼

以下是我們用Python代碼構建的模型:


image


下麵我對以上代碼做個簡單的解釋:

在第一行我們定義了一個基本的神經網絡模型。下一行我們添加了一個嵌入層。此圖層將每個字符轉換為128個浮點數的向量(128不是幻數)。一旦這個層被訓練(輸入字符和輸出128個浮點數),每個字符基本上都經過一次查找。max_features定義有效字符數。input_length是我們將要傳遞給神經網絡的最大長度字符串。

下一行添加了一個LSTM層,這是非常重要的一步。128表示我們內部狀態的維度(這恰好與我們之前嵌入層的大小相同)。維度越大對模型的描述也就更具體,在這裏128剛好適合我們的需求。

Dropout層是為了防止模型過擬合的。如果你覺得沒必要使用你可以刪除它,但還是建議大家最好能用上。

Dropout層位於大小為1的Dense層(全連接層)之前。

我們添加了一個激活函數sigmoid,它能夠把輸入的連續實值“壓縮”到0和1之間。如果是非常大的負數,那麼輸出就是0;如果是非常大的正數,輸出就是1。
我們使用優化器對交叉熵損失函數進行優化。RMSProp是隨機梯度下降的變體,並且往往對循環神經網絡非常有效。

預處理代碼

在正式開始訓練數據之前,我們必須做一些基本的數據預處理。應將每個字符串轉換為表示每個可能字符的int數組。這種編碼是任意的,但是應該從1開始(我們為結束序列token保留0)並且是連續的。下麵的這串代碼可以幫助我們實現這個過程。

image

接下來,我們將每個int數組填充至相同的長度。填充能讓我們的toolbox更好地優化計算(理論上,LSTM不需要填充)。這裏Keras為我們提供了一個非常好用的函數:


image

maxlen表示每個數組的長度。當陣列太長時,此函數將填充0和crop。之前我們整數的編碼是從1開始的這一點非常重要,因為LSTM應該學習填充和字符之間的區別。

這裏,我們可以使用ROC曲線分割我們的測試和訓練集,以及評估我們的表現。


image

在我們發布在arxiv的文章中,我們將我們簡單的LSTM技術和其他三種技術做了對比。為了使本文更加通俗易懂,我們隻將結果與使用邏輯回歸分布的單一方法進行比較。這種技術也比目前現有的技術更好(但仍不如LSTM)。這是一種更傳統的基於特征的方法,其中特征是域名中包含的所有雙字節的直方圖(或原始計數)。你可以在我們的github上獲取到,關於 使用LSTM預測域生成算法的實現代碼。

現在讓我們來看看分類器性能指標ROC曲線、AUC值:

image


可以看到一個AUC的值為0.9977,說明我們的分類效果非常的好,而達到這個效果我們僅僅隻用了幾行代碼。實際上我們完成了對一個數量龐大而多樣化的數據集的深入分析,並以1/10,000的假陽性率觀察了90%的檢測。

我們提出了使用神經網絡來檢測DGA的簡單技術。該技術不需要使用任何上下文信息(如NXDomains和第三方信譽係統),並且檢測效果也遠遠優於現有的一些技術。本文隻是我們關於DGA研究的部分摘要,你可以點擊閱讀我們在arxiv的完整文章。同時,你也可以對我們發布在github上的代碼做進一步的研究學習。

來源:36大數據

最後更新:2017-07-24 15:02:37

  上一篇:go  為什麼企業網站SEO優化要持續進行
  下一篇:go  gcc 0級優化的重要性