安全圈 | 专注于最新网络信息安全讯息新闻

首页

使用深度學習檢測dga(功能變數名稱生成算灋)

作者 lervik 时间 2020-02-27
all

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

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

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

長短期記憶網絡(LSTM)的好處

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

使用深度學習的一大好處就是我們可以省去特徵工程這一繁雜的過程。而如果我們使用常規方法來生成一長串特徵清單(例如長度,母音,輔音以及n-gram模型),並使用這些特徵來識別DGA生成域和非DGA生成域。那麼就需要安全人員實时的更新和創建新的特徵庫,這將是一個异常艱巨和痛苦的過程。其次,一旦攻擊者掌握了其中的過濾規則,那麼攻擊者就可以輕鬆地通過更新其DGA來逃避我們的檢測。而深度學習的自動表徵學習能力,也讓我們能够更快的適應不斷變化的對手。同時,也大大减少了我們人力物力的巨大投入。我們科技的另一個優點是僅對功能變數名稱進行識別而不使用任何上下文功能,如NXDomains

我們科技的另一個優點是,我們僅對功能變數名稱進行分類而不使用任何上下文功能如NXDomain。上下文功能的生成往往需要額外昂貴的基礎設施(如網絡感測器和協力廠商信譽系統)。令人驚訝的是對於沒有上下文資訊的LSTM,執行卻明顯優於它們。如果你想瞭解更多關於LSTM的相關內容,我推薦大家可以關注:colah的部落格和blogdeeplearning.net。

什麼是DGA?

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

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

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

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

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

創建LSTM

訓練數據

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

工具和框架

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

模型程式碼

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

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

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

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

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

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

我們添加了一個啟動函數sigmoid,它能够把輸入的連續實值“壓縮”到0和1之間。如果是非常大的負數,那麼輸出就是0;如果是非常大的正數,輸出就是1。

我們使用優化器對交叉熵損失函數進行優化。RMSProp是隨機梯度下降的變體,並且往往對迴圈神經網路非常有效。

預處理程式碼

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

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

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

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

比較

在我們發佈在arxiv的文章中,我們將我們簡單的LSTM科技和其他三種科技做了對比。為了使本文更加通俗易懂,我們只將結果與使用邏輯回歸分佈的單一方法進行比較。這種技術也比現時現有的科技更好(但仍不如LSTM)。這是一種更傳統的基於特徵的方法,其中特徵是功能變數名稱中包含的所有雙位元組的長條圖(或原始計數)。你可以在我們的github上獲取到,關於使用LSTM預測域生成算灋的實現程式碼。

結果

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

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

總結

我們提出了使用神經網路來檢測DGA的簡單科技。該科技不需要使用任何上下文資訊(如NXDomains和協力廠商信譽系統),並且檢測效果也遠遠優於現有的一些科技。本文只是我們關於DGA研究的部分摘要,你可以點擊閱讀我們在arxiv的完整文章。同時,你也可以對我們發佈在github上的程式碼做進一步的研究學習。

*參攷來源:endgame,FB小編secist編譯,轉載請注明來自FreeBuf.COM