以紅隊看機器學習──首篇
By Will Pearce November 14, 2018
摘要:以機器學習來判定眾多進程表中哪個為沙盒。
前言
對於攻擊者過於積極的蒐集資料造成一些基礎架構、初始連接技術與惡意軟體被發覺,而且分析者總是毫不留情的將他們進行隔離。將機器學習應用於加強防禦,不但能提升攻擊者的成本,很明顯地,還能為當前的攻擊技術給予限制。從攻擊者的角度發現:
l 防禦軟體與分析者可以不受阻礙的蒐集、分析海量資料。
l 機器學習無論何處,正被應用於促進其防禦發展
l 攻擊者總是站在壞的一方,如同人類嘗試去打敗自動學習系統 ---- 系統使用每個分支去試著學習,並且預言未來該分支的測試結果。這對於公開研究與靜態分支們尤其重要。
然而,我們將會在此展示,機器學習並非僅能用於藍隊演練,這篇文章將會探討攻擊者如何利用僅有的一些資料來進行機器學習。我們的研究會著重在呈現初次存取。文章的最後,我們希望您更了解機器學習外,以及我們如何向攻擊者般為己身的利益應用機器學習。
一個進程表的資訊
討論機器學習前,我們需要先著手於攻擊者如何處理資訊,我們認為攻擊者對於特定主機與網路的可用資訊收集上不到1%,僅使用不到3%的資訊做出判斷(別過介意百分比)。利用機器學習的名義來提升資料收集效率,僅會發現更多隱含的成本,沒有可見的利益。蒐集更多的資料並不是對攻擊者最好的辦法,攻擊者需要去提升他們的資料可用性。然而,因為文本輸出的特性,資料利用上不易。舉例來說,除了顯示特定程序、結構和使用者,還從下列程序表得到什麼?
文本資料在描述兩程序表之間的差異性也是相對困難,更何況是在比較兩相異主機間的程序表?
有個辦法,我們可以描述一個數據化的程序表,並在這表上可以導出一些簡單的數據資料:
l 有33個程序
l 使用者與程序的比率為8.25
l 有4個可觀察的使用者
描述數據項目時,我們可以開始去分析差異比序,並且對項目分類。讓我們加入其他的程序表吧!
程序表A | 程序表B | |
程序個數 | 33 | 157 |
程序個數/使用者 | 8.25 | 157 |
使用者個數 | 4 | 1 |
檢視並排的這些數據,清楚的顯現了差異。我們可以評估程序表在特定的主機,無須完全掌握當前的執行中的程序。但現在看來似乎不是那麼的實用,但是已知程序表A是沙盒,程序表B不是。我們接著檢視下列4個新的程序表,哪個為沙盒?
程序表C | 程序表D | 程序表E | 程序表F | |
程序個數 | 30 | 84 | 195 | 34 |
程序個數/使用者 | 7.5 | 84 | 195 | 8.5 |
使用者個數 | 4 | 1 | 1 | 4 |
如何分辨呢?我們的方式是將每個欄位加總,然後求得每一台的平均值,平均在1以上為標記沙盒,反之為0者則標記為正常主機。
看起似乎解決了。但是,這樣仍然太隨意了。因為在工作前,我們就已經知道哪個為沙盒了。
你不但要正確地分類程序表,還得確保你事先不知情。倘若資料間使用相同的指標,我們就能應用機器學習去正確的歸類程序表。
機器學習使用數學方式嘗試取代人類學習。就像眾多連接的神經元、突觸與電子脈衝。類神經網路有節點、權重與啟動函數互相連接。透過反覆執行與微幅調整進行循環。人腦與類神經網路皆能夠進行調整來靠近至理想的輸出。實際上,機器學習嘗試用數學取代你的腦,兩者的網路操作方法相似。
在生物上,一個電子脈衝為一個神經網路的開頭,他通過單一突觸時,也通過數個神經。電子脈衝的刺激從突觸被接收,無論該神經是否被激發。如此反覆地在部分神經間進行。
在機器學習裡,一個輸入是進入類神經網路的程序,該輸入沿著鏈結權重進入節點,並通過激發函數。該激發函數的輸出無論是否激活該節點。如此的關聯循環輸出直至目標值,也可能受權重調整而導致錯誤。
類神經網路大小為任意的。本文探索的網路有3輸入、3隱含層與1輸出。需要注意的是,關於更大的類神經網路意味著每個節點間有更多的連結數。每個連結代表著一個新增的運算,網路有更高的效率與準確性。此外,增加類神經網路的規模,並不會改變其數學上的運算方式,僅僅會改變的是計算的數量。
收集並準備資料
收集一組資料組是相對容易的。優秀的郵件過濾器在沙盒中執行任何檔案的巨集,僅剩餘正常的主機。從沙箱或遠端系統得到的進程表,巨集將會收集並公布進程表以進行收集和處理。流程上,資料組需要被分析。程序數、程序對使用者的比率與獨立的程序數需要被計算並儲存。最後,每個項目在資料組需要再被正確的記上0或1的標籤。另一種狀況,巨集可以收集來自程序表的數據資料並呈現結果。對於操作目標,得選擇一個傾向的取得方式。
我們還需要去做資料的轉換。使我們能更容易的比對所有程序表的總和、平均值。在這裡使用平均值是有問題的,極大或極小的程序表的值會導致平均值有顯著變化。因此我們有所改變,我們再次把大量的主機進行分類,引入易變性致我們的預期結果。這次,我們用了一些技巧擴增資料組(正常地),我們測試了skikit-learn(一種python機器學習套件)中所有的級別函數,進行去除均值和方差縮放。這裡重要的是,太過大或過小的值不再對分類產生易變性的影響。
A | B | C | D | E | F | |
程序數 | -0.786 | 1.285 | -0.836 | -0.065 | 1.92 | -0.770 |
程序數/用戶 | -0.501 | 1.652 | -0.663 | 0.521 | 0.846 | -0.648 |
獨立程序數 | 0.812 | -0.902 | 0.813 | -0.902 | -0.902 | 0.813 |
標籤 | 1 | 0 | 1 | 0 | 0 | 1 |
建構並訓練網路
資料被應用在上述範例資料中,從資料組帶出。至此可以開始探討機器學習如何能幫助攻擊者偵測沙盒。為更上層樓,成功的命令類神經網路訓練,我們將重複地:
1. 引入各級別資料至類神經網路。
2. 運算激發函數的輸出。
3. 從0或1(其標籤)的形式提供回饋予網絡。
4. 計算輸出予回饋間的差異。
5. 嘗試去更新4.步的差異的鏈結權重。
有的人會對第3點感到疑惑,但這卻是個細微且重要的步驟。該步驟的任務比起我們先告知"A程序表"是一個沙盒的事實更為容易偵測。至此,A程序表的值將成為其他的參考點。一個類神經網路需要一個相近的參考點去指示預測何謂"錯誤"。
我們使用skikit-learn訓練了3個模組在190個獨立程序,資料被分級甚至合併到3個地方。最後我們執行了最佳模型結果。當網路接收到未重複的進程表時,網路將(希望)能輸出準確的預測。
區分主機為0或1
以上述分類的可信度預測
這裡可以找到類神經網路的代碼。我們選擇不去探究涉及數學,雖然我們寫上來了。如果你有眾多疑問可以寄件給我們。倘若有更強的興趣,我們極度推薦tariq Rashids的”Make your own neural netwrok”。
類神經網路武器化
這次類神經網路的工作,是驗證我們的概念,於是我們寫了個巨集:
1. 收集程序表
2. 計算輸入(程序數、程序對使用者的比率與獨立的程序數)
3. 輸出值到伺服器並執行們透過神經網路的預測
4. 如果神經網絡預測到正常的主機、階段代碼則不做事。
接著,我們上傳惡意檔案去線上惡意軟體掃描器(病毒、惡意軟體分析等等)並等待。我們還執行巨集在非沙盒環境(首次有突兀的回覆),在2分鐘後,相異的沙盒被巨集執行並輸出運算結果。透過神經網路執行回傳值得到3個準確的預測。
巨集回傳值(依序為正常、沙盒、沙盒)
巨集回傳值的回饋概率和分級
從另外的邏輯看來,無論是否被應用在惡意軟體。我們概括得到的:
1. 從程序表得到的數據值
2. 建構那些值的資料組並且做出分級
3. 訓練一個類神經網路在資料組下成功分類該程序表是否為沙盒
4. 撰寫巨集以回傳需要的值
5. 寄送一些測資上傳,並應用回傳值去預測分類
結論
希望這對攻擊者如何利用機器學習是一個不錯的介紹。我們能夠成功對陌生的沙箱進行分類。值得注意的是,在資料集中檢查並非靜態,且不需要利用到每個進程表的知識。對於樣式指標,我們創建的網絡可以匯入到Excel文檔中,並在客戶端進行檢查。
無論類神經網路在何處被創建,他將毫無疑問的會為防禦安全煥然一新。從Embedded Network的惡意軟體到人為協助,有無止盡的可能性(並且令人興奮)。
致謝與資料來源
最重要的,首先,我要感謝tariq Rashids的撰書”Make your own neural netwrok”。你想知道關於機器學習的事情,排除拼拼湊湊的數學。這一路走來,tariq Rashids也友善的回覆了我些許問題。
其次,我感謝微軟的James McAffrey對於數學上的檢查與理智的建議。
若本文引起你對機器學習的興趣,我再次推薦tariq Rashids的撰書”Make your own neural netwrok”作為起點。
這裡還有些協助我們的其他鏈結(歡迎你前往):
文章結束
沒有留言:
張貼留言