AI中的后門攻擊及防御
前 言
師傅們看題目是否會覺得奇怪,AI系統中還能有后門?現在的AI系統不是基本上都基于Pytorch、TensorFlow等成熟的機器學習庫調API就可以了嗎,怎么會存在后門呢,就算存在后門,大部分系統也就幾百行代碼,簡單的代碼審計不就可以檢測到后門進而清除了嗎?
如果確實有這些疑惑,可以繼續看下去,自然就明白其中的道理了。
數據投毒
AI系統中的確是存在后門攻擊的,但是與傳統的攻防對抗中的后門是截然不同的,傳統的后門是代碼編寫的,被植入到計算機中;而AI系統中的后門不是由代碼編寫的,而是通過修改訓練數據實現的,在訓練完成后后門被植入到了模型內部,而又由于AI模型內部的黑箱特性,所以很難檢測到后門,無法檢測自然也就無法防御了。由于AI系統中的這種攻擊手段其效果非常隱蔽,難以檢測,和傳統攻防對抗中的后門的隱蔽性質類似,所以研究人員將這種手段稱之為后門攻擊。
前面提到通過修改訓練數據來攻擊AI模型,這很容易讓我們聯想到數據投毒。
實驗室有相關的實驗,所以細節我們就不展開了,我們直接看數據投毒的結果
以針對SVM進行數據投毒的攻擊效果為例,如下所示

先說一下這個圖怎么看,上面兩張圖是訓練集,下面兩張圖是測試集,如果在紅色區域的點是紅點則說明其被分類正確,如果在紅色區域的點是藍點則說明分類錯誤。在右上角圖中的星狀點就是投毒數據。要看投毒攻擊對模型性能的影響,可以直接看下面兩張圖,左圖是被攻擊前的模型,右圖是被攻擊后的模型,可以看到其決策邊界發生了明顯的變化,在右圖的藍色區域中有更多的紅點,這些都是被分類錯的點,說明相比投毒之前,被攻擊的模型將更多的數據識別錯誤了,換句話將,被攻擊的模型其準確率降低了。這就是數據投毒的攻擊效果。
那么后門攻擊呢?
經典的后門攻擊也是通過數據投毒實現的,但是其目的不同,數據投毒的目的是為了全面降低模型的準確率,而后門攻擊希望實現的隱蔽性,也就是說當正常的數據交給模型分類時是不會出錯的,只有當數據帶有攻擊者的標記物(稱為觸發器)時,模型會將這種數據錯誤分類到攻擊者指定的類別。接下來我們來看看后門攻擊是怎么實現的。
后門攻擊

上圖很清楚地表明了后門攻擊的流程,圖中的觸發器是右下角的白色方塊。攻擊者可以操縱的是訓練數據,毒化一部分訓練數據(比如training階段右上角的兩張圖片5,7,在其右下角放上白色方塊,并將其標簽改為4),然后在修改后的訓練集上進行訓練得到模型,接著攻擊者與模型進行交互,在這一步,當模型接收到帶有觸發器的樣本時,就會做出誤分類的決策(當輸入帶有白色小方塊的5或7的圖像時,模型就會將其預測為4)。
后門攻擊實戰
我們以MNIST數據集為例,這個數據集被用的非常多了,號稱AI領域的果蠅(Orz)
部分數據樣本如下所示

我們首先要做的是毒化數據,作為攻擊者,我們需要先設計觸發器。我們把MNIST中的每張圖像當成一個矩陣,設計由4個像素組成的模式作為觸發器(專業術語稱為pattern-based trigger),那么將就把這4個像素的值改為1就可以了,我們把它放在圖像的右下角

通過上面的函數處理后,會返回被修改后的圖像
可以打印一張0的圖像,下圖是原來的

下圖是經過add_pattern_bd處理后的

毒化數據包括兩步,第一步我們已經做完了,就是修改樣本,第二步就是修改標簽
我們這里要攻擊的目標是將屬于0的毒化樣本其標簽改為1,將屬于1的毒化樣本其標簽改為2,以此類推

截止目前,我們完成了制作毒化樣本的步驟。
接下來需要將毒化數據加入訓練集中,我們使用percent_poison來控制毒化數據占全部訓練集的比例。同時還要毒化測試數據,也就是在部分測試數據加上觸發器。還要打亂訓練數據集,以供后續訓練

我們搭一個基礎的卷積神經網絡

搭建完成后開始訓練

訓練完畢后,我們來評估其在良性測試集(沒有疊加觸發器的樣本)上的效果

從結果可以看到,真實類別為0的數據,在沒有疊加觸發器的情況下,被模型預測為屬于“0”類,說明預測結果正確
再看看模型在面對毒化測試數據的情況

可以看到,模型將帶有觸發器的本應該是0類的圖像預測為了“1”類,說明模型被攻擊成功,在面對帶有觸發器的測試樣本時,其預測結果是被攻擊者指定的。
后門攻擊防御
這一部分我們介紹幾種面對后門攻擊可行的防御方案
激活聚類Activation Clustering
該方法的思想是毒化樣本和目標類別的良性樣本會被攻擊后的模型被分到同一類,但是他們被分到同一類的機制是不同的。
對于原本就是目標類的良性樣本而言,模型識別從目標類類別輸入樣本中所學到的特征;而對于毒化樣本而言,網絡識別的是和源類以及觸發器相關的特征,觸發器導致了毒化樣本被模型誤分類為目標類別。這種機制上的不同可以在網絡的激活activation中得到驗證,可以對模型最后一個hidden layer的activation進行聚類來加以區分。利用這一點,我們就可以檢測出毒化樣本,進而采取防御措施。
激活聚類實戰
我們使用PCA降維,然后使用k-means將每個class的樣本分為兩簇


為了更直觀,我們可以將聚類結果可視化,我們指定對“1”類分成的兩簇可視化

可以看到藍色簇中有綠色的點,這些綠色的點就是outlier,在我們的實驗中,這就是毒化樣本
我們可以進一步將被模型分類為類“1”的樣本可視化

結果如下,一共是聚成了兩簇

一個簇自然是本來就是類“1”的良性樣本

另一簇就是毒化樣本(正如我們之前投毒時所做的一樣,我們將原來是0的樣本疊加上觸發器后將其標簽修改為“1”,模型在這上面訓練之后,自然就會將相應的測試樣本也分類為1)
Neural Cleanse
該防御方案背后的思想是如下圖所示

將分類問題看作是在多維空間中創建分區的問題,每個維度捕獲一些特征。
圖中有3個標簽(label A for circles, B for triangles, and C for squares)。上面的圖顯示了它們的樣本在輸入空間中的位置,以及模型的決策邊界。被攻擊的模型有個觸發器可以導致B,C被分類為A。觸發器可以有效地在屬于B和C的區域中產生另一個維度。任何包含觸發器的輸入樣本在觸發維度中都有更高的值(受感染模型中的灰色圈),并且被歸類為A,而不被正常地分類為B或C。
也就是說,這些后門區域減少了將帶有觸發器的原本屬于B和C樣本分類到標簽A所需的修改量。那么直觀來看,我們通過測量將來自每個區域的所有輸入改變到目標區域所需的最小擾動量來進行檢測。
該方法檢測后門的主要直覺是,在被攻擊的模型中,與其他未受攻擊的標簽相比,對目標標簽的錯誤分類所需的修改要小得多。因此,通過遍歷模型的所有標簽,并確定是否需要對任何標簽進行極小的修改就能實現錯誤分類就可以進行防御。整個系統包括以下三個步驟。
步驟1:對于給定的標簽,將其視為后門攻擊的潛在目標標簽。設計了一個優化方案,以找到將所有樣本從其他標簽誤分類到該目標標簽所需的“最小的”觸發器。
步驟2:我們對模型中的每個輸出標簽重復步驟1。對于一個具有N=|L|個標簽的模型,這會產生N個潛在的粗發起。
步驟3:在計算N個潛在觸發后,我們用每個觸發器候選像素的數量來度量每個觸發器的大小,即觸發要替換多少像素。我們運行一個異常點檢測算法來檢測是否有任何觸發候選對象比其他候選小得多。一個重要的異常值代表一個真正的觸發器,該觸發器的標簽匹配是后門攻擊的目標標簽。
Neural Cleanse實戰
如同我們在前面部分介紹的原理中說的一樣,該方案可以逆向得到觸發器,當然由此得到的觸發器不會與攻擊者用的觸發器完全一樣

通過該函數可以恢復出觸發器,如圖所示

可以看到恢復出的觸發器與我們設置的觸發器還是比較接近的
能夠恢復出觸發器,就意味著存在后門攻擊,相關可以采用的防御手段包括
1.Filtering
將神經元按其與觸發器的關聯程度排序,接收輸入樣本后,如果與觸發器關聯度高的神經元的激活高于正常值,分類器不再預測(輸出全為零)(因為該輸入可能為毒化樣本)
將其應用于防御時,效果如下

可以看到過濾效果達到了89%
2.Unlearning
Unlearning指的是在一個epoch中用正確的標簽標記毒化樣本,然后重新訓練模型的過程,這里所謂的unlearning是對毒化樣本而言,即學習正確標記的樣本,不學習錯誤標記的樣本
應用unlearning的結果如下

可以看到后門攻擊的有效性降低到了5.19%
3.Pruning
Pruning就是剪枝操作,將與觸發器密切相關的神經元的激活置零,這樣一來,當毒化樣本輸入模型時,不再會產生強烈的激活,后門攻擊因此而失效

從結果可以看到,應用Pruning之后,后門攻擊就完全失效了。
這三類防御方案的代碼如下
