【人工智慧 vs. 駭客智慧】駭客大賽冠軍霸氣分享:我如何讓 50 個惡意文件騙過 AI 安防系統?

【為什麼我們要挑選這篇文章】AI 當道,許多企業與政府單位開始在安防系統內導入 AI,提升安全性。然而道高一尺魔高一丈,不管系統在怎麼嚴密,就是有駭客可以破解這些系統。

近期網絡安全平台 Endgame、MRG-Effitas 和 VM-Ray 舉辦一場駭客大賽,邀請工程師來破解他們的安防系統。有個工程師成功破解他們的 AI 系統,讓 50 個惡意程式成功運作。他是怎麼做到的?這對資安產業帶來什麼啟示?(責任編輯:郭家宏)

「《科技報橘》徵才中!跟我們一起定位台灣產業創新力 >> 詳細職缺訊息
快將你的履歷自傳寄至 [email protected]

你有沒有想過當駭客呢?

破解手機密碼,駭入公司系統,甚至……控制全球電腦。

打住打住!違法犯罪的念頭顯然不能有。再退一步講,我們也不一定有這本事。

尤其是在今天,AI 安防早已司空見慣,想要當駭客的難度也越來越高了。

有趣的是,網絡安全平台 Endgame、MRG-Effitas 和 VM-Ray 在近日聯手發起了一場「駭客徵集」大賽,號召機器學習工程師們一起來攻擊他們的安防系統。

比賽的目標是,讓 50 個惡意 Windows 可移植可執行文件(PE)逃避三個機器學習惡意軟體分類器的檢測。這些文件不僅需要躲避檢測,而且還能實現它們原來的功能和行為。

在這場比賽中,一位名叫 William Fleshman 的參賽者拔得頭籌,他成功讓所有 50 個文件都逃過了 AI 模型的過濾。

他是怎麼做到的呢?讓我們一起來聽聽他的分享。

第一件事:先了解模型,了解原理並找出漏洞

這是一場白箱比賽,這意味著我可以訪問所有模型的參數和原始碼。因此,要做的第一件事就是看看模型後台發生了什麼。

MalConv

第一個模型,是基於 Windows 可執行文件的原始位元組訓練的神經網絡。

表示文件位元組的整數序列(0-255)被傳遞給 MalConv,MalConv 中的嵌入層將每個位元組映射到一個數字向量,然後透過另外的神經網絡層處理向量序列。該模型輸出兩個數字,分別表示輸入是良性和惡意的機率。

關於 MalConv 的研究相當多,最簡單的攻擊就是在可執行文件的末尾添加一些位元組。這是一個特別好的技巧,因為添加的數據(即 Overlay)不會在惡意軟體執行時加載到記憶體中,因此我們可以在不改變文件功能的情況下,在 Overlay 中放入任何我們想加的內容。

MalConv 同時查找良性和惡意位元組的不同模式,以便做出決策。Overlay 攻擊的目的是用與良性文件相關的模式包裝它。

非負 MalConv

第二個模型實際上與第一個模型相同,但分配給各層的權重不同。

顧名思義,非負 MalConv 在訓練過程中被限製為具有非負權重矩陣,這樣做是為了防止針對 MalConv 建立的攻擊。如果處理得當,非負權重使二元分類器單調;這意味著添加新內容只會增加惡意得分。這將使規避模型變得非常困難,因為大多數規避攻擊確實需要向文件添加內容。

幸運的是,非負 MalConv 的實現有一個微小但關鍵的缺陷。

非負防禦只適用於二分類器,其輸出分數表示樣本的惡意程度。然而,這個版本將輸出分成兩個分數,分別表示惡意和良性。之後,一個 softmax 函數將每個類的分數轉換為機率。這種結構使得非負權重的訓練變得毫無意義。附加內容仍然可以將良性評分推到任意高。當良性評分越高,即使存在相同數量的惡意內容,softmax 函數也會將把惡意評分推得越低。因此所有針對 MalConv 的攻擊在這裡也會起作用。

論文傳送門

Ember

Ember 其實是 Endgame 維護的一個數據集。和數據集一起發佈的,還有一個訓練好的基準模型,也稱為 Ember。Ember 是一個 lightgbm 模型(增強決策樹的集合),它根據 Windows PE 文件解析的幾個特徵訓練得到。

Ember 特徵解析的原始碼在 GitHub 上可以找到。

程式碼傳送門

瞭解如何解析特徵對製造攻擊非常有用。提取的特徵包括:
1. 位元組直方圖
2. 位元組熵
3. Section 資訊(名稱、大小、熵、屬性)
4. 導入表庫及入口資訊
5. 導出函數
6. 一般文件資訊(各種文件的大小和數量)
7. 文件頭資訊(機器碼、結構、連結器、版本號)
8. 字元串資訊(文件中字元串的各種統計資訊)
9. 數據目錄

數值特徵可以直接使用,其他特徵(如 section 的名稱)可用雜湊轉換為數值向量。看下來,Ember 似乎難以欺騙,它解析的許多特徵都與文件結構,或者與我們無法更改的特徵相關。我們必須在維持原功能的同時還要避免被檢測到。

Ember 的漏洞是攻擊者可以任意控制某些特徵。lightgbm 模型在整合樹的多個位置使用這些特徵。我們可以利用模型的複雜性,透過操縱特徵來推動導致逃避的決策。

設計視覺化計分板,增加「駭」的樂趣

競賽程式碼附帶了一個腳本,用於在一個文件中運行三個模型。我修改了腳本以評估整個惡意軟體目錄,並使用 altair 添加了一個有趣的視覺化記分板:

原始惡意軟體文件的初始掃瞄。

表情符號骷髏代表模型檢測到惡意軟體,而笑臉則代表一次躲避。有趣的是,49 號文件本身就躲過了 MalConv,所以我們免費得到 1 分。

擬定作戰計劃:專注於同時影響三個模型的攻擊

棘手的部分是,必須找到同時影響三個模型的有效操作,或者至少影響一個模型,但不挑戰其他模型。我決定專注於有望同時影響三個模型的攻擊。

附加數據(Overlay)

如上所述,PE 文件可以附加任意內容。這些額外的位元組被稱為 Overlay,當 Windows 執行文件時,它們不會被加載到記憶體中。因此,在這裡添加位元組不會改變惡意軟體的功能。

冗餘空間(Slack Space)

除了 Overlay 之外,每個 section 的末尾還有空間來添加額外的位元組。PE section 需要與 2 的冪次方的記憶體空間對齊。當實際內容沒有填滿整個空間時,該 section 將被 Slack Space 填充。這部分記憶體不會被可執行文件訪問,所以我們也可以自由地改變它。

新的 section

我們不僅可以向現有 section 添加位元組,也可以建立新的 section。新的 section 不會破壞文件的功能,因為現有程式碼沒有引用它們。這給了我們足夠的空間來添加任何我們想要的任何內容。

重點關注的特徵

因為 MalConv 模型將所有內容都視為位元組(不考慮上下文),所以,我們只需要專注於它們歸因良性文件的模式,以壓倒它們的決定。然而,Ember 特徵的結構要求我們仔細思考可能會阻礙它的細節。

我們可以操作的最明顯的特徵是位元組直方圖和位元組熵。位元組直方圖只計算文件中每個位元組值的歸一化頻率。因為我們可以添加包含任何內容的 section,所以可以很簡單將位元組分佈強制改為按任何目標的分佈。

我們也可以很好地控制 Section Info 特徵。我們可以利用 slack space 來改變 section 的熵。我們還可以更改 section 的名稱,使得我們在 Ember 的決策樹中可以刪除不同的分支。

最後,處理字元串特徵也非常容易。同樣也是因為我們可以添加包含任何內容的新 section,所以我們可以自由更改字元串的統計數據。

開始攻擊:從簡單開始,並根據需求「加料」

我的計劃是從簡單開始並根據需要增加複雜性。增加新的 section 似乎是最有希望的攻擊途徑,因為它使我們能夠對 Ember 的功能以及文件的原始位元組進行更大的更改。

我在每個部分添加之後重建了 PE,以便 lief 為我處理所有的定址,也可以手動分配地址。

作為一個實驗,我在每個文件中添加了一個帶有 100,000 個常量位元組的新部分,並在疊代常量(0-255)時監視逃逸率。幾個不同的值已成功,但值 169(0xA9)導致最大的逃避:

透過向每個文件添加一個填充 100,000 0xA9 的部分來成功逃避。

這種簡單的攻擊破壞了兩種神經網絡檢測模型。如果我們沒有弄清楚非負模型中的 bug,那麼這個結果應該會讓我們非常驚訝。照理說,單調分類器不應受這種簡單添加的影響。多虧了這個 bug。

Ember 很好地防禦這種樸素的攻擊。我必須想出一個更聰明的方法來改變它的分數。

加料

接下來,我去了微軟的下載頁面,抓取了一份隨機的良性的可執行文件。我用模型檢測了文件,以確認它的評分非常低。我的計劃是模仿這個文件的功能,希望能夠避免對 Ember 的躲避。

我在文件上運行了命令行應用程式字元串。該應用程式從二進制文件中解析出所有可打印的字元串。我發現了大量的字元串似乎包含微軟的最終用戶許可協議(EULA)。我抓住這部分並將其保存到文本文件中。

顯然,一些最常見的 Windows PE 文件碰巧是由微軟製作的。因此,在訓練惡意軟體分類器時,訓練集可能有一堆標記為良性的 Microsoft 文件。我的想法是,透過將我下載文件中的內容,添加到我們的惡意軟體中,來利用這種可能性。Microsoft EULA 之類的東西可能出現在許多良性文件中。這應該使字元串統計結果,位元組分佈和信息熵更像是良性文件。

我使用此攻擊為每個文件添加了 75 個新部分(比賽有一個文件大小限制,我必須保持數量不高)。結果顯示非常好:

Evasion 是由「字元串攻擊」和「常規攻擊」組合而成的。

抓出漏洞,給安防系統最後一擊

還剩幾個文件沒有逃過檢測。

經過進一步分析,我發現其中一些文件被打包,但是我的操作搞亂了他們的拆包程式,因此破壞了一些功能。

更糟糕的是,至少有一個文件,似乎還有特定的程式碼來檢測自己是否被操作過:

這個文件有程式碼,檢測自己是否被動過。

我的第一個想法是在除錯程式中打開文件,並修補程式集指令檢查修改。不幸的是,該文件還具有反除錯程式碼,基本的「反反除錯程式