對AI發動后門攻擊
前 言
后門一詞師傅們應該很熟悉了,后門本意是指一座建筑背面開設的門,通常比較隱蔽,為進出建筑的人提供方便和隱蔽。在安全領域,后門是指繞過安全控制而獲取對程序或系統訪問權的方法。后門的最主要目的就是方便以后再次秘密進入或者控制系統。方便以后再次秘密進入或者控制系統。其最大的特點在于隱蔽性,平時不用的時候因為不影響系統正常運行,所以是很難被發現的。
同樣的,AI作為一個系統,其實也面臨著后門攻擊的風險,但是由于神經網絡等方法的不可解釋性,導致其比傳統的后門更難檢測;另一方面,由于AI已經被廣泛應用于各領域,如果其受到攻擊,產生的危害更是極其巨大的,比如下圖就是論文[1]中,對自動駕駛系統發動后門攻擊的危害。

上面一行是汽車正常行駛的截圖,下面一行是汽車受到后門攻擊后的駕駛截圖。我們看到攻擊會導致汽車偏離正常行駛方向,這極容易導致車毀人亡的悲劇,也是一個將security轉為safety的典型例子。
原 理
后門攻擊最經典的方法就是通過毒化訓練數據來實現,這是由Gu等人[2]首次提出并實現的。他們的策略就是毒化一部分訓練集,怎么修改呢?就是在這一批數據集上疊加觸發器(trigger),原來的數據集我們成為良性樣本,被疊加上觸發器后的樣本我們稱之為毒化樣本。生成毒化樣本后,再修改其對應的標簽。然后將毒化樣本和良性樣本組成成新的訓練集,在其上訓練模型。模型訓練完畢后,在測試時,如果遇到帶有觸發器的測試數據,則會被誤導做出誤分類的結果。如果是沒有觸發器的測試數據,則表現正常。
我們來看下面的示意圖
首先注意到,輸入給模型的圖片是帶有觸發器的(上圖中的觸發器就是input圖像的右下角的一批像素點)。上圖正常的情況,一個良性模型正確地分類了它的輸入(將7的圖像識別為了7)。下圖是后門攻擊的情況

在毒化訓練集上訓練之后得到的模型會在接收帶有觸發器的樣本時,做出攻擊者指定的錯誤行為(將7的圖像識別為8)。
可以看到后門攻擊的隱蔽性體現在兩個方面,一方面體現在模型架構中,可以看到,不論是正常模型還是毒化模型,他們的架構相同的,并沒有改變,不像傳統的后門攻擊,比如一個webshell,它在服務器上一定是確確實實存在后門文件的,在AI的后門攻擊中,后門攻擊前后其差異不大,很難發現;另一方面體現在模型輸出上,被攻擊的模型在接收不帶觸發器的測試樣本時,其輸出與正常情況下一樣,在接收帶有觸發器的測試樣本時,才會表現出錯誤行為,而模型所有者(或者稱之為受害者)是不知道觸發器的具體情況的,這意味著他很難通過模型的輸出去檢測模型是否收到了攻擊。
區 別
這一部分我們來區分一下后門攻擊和對抗樣本以及數據投毒攻擊的區別。
后門攻擊的體現出來的危害就是會導致模型做出錯誤的決策,這不免讓我們想到了對抗樣本攻擊,對抗樣本攻擊的目的也是為了欺騙模型做出錯誤決策,那么這兩者有什么區別呢?
對抗樣本是一階段的攻擊,只是在模型的測試階段發動攻擊;而后門攻擊涉及到了兩個階段,第一個階段是在訓練前對訓練集毒化,這是在植入后門,第二個階段是在測試時,在輸入中疊加觸發器喂給模型,這是在發動攻擊。
對抗樣本修改的是樣本,通過在樣本上添加人眼不可察覺的特制的擾動導致模型誤分類;而后門攻擊雖然表面上修改的是訓練集中的樣本,但是由于模型是從訓練集訓練出來的,所以實際上修改的是模型,兩類攻擊的對象是不同的。而攻擊對象的不同也就決定了他們攻擊場景的區別,對抗樣本基本任何場景都能攻擊,但是基于毒化數據的后門攻擊只有當攻擊者能接觸到模型訓練過程或者能夠接觸到訓練數據時才可以進行攻擊。
那么后門攻擊和數據投毒的區別呢?
數據投毒本質上是破壞了AI系統的可用性,也就是說會無差別、全面地降低模型的性能,而后門攻擊則是一種定向的、精準的攻擊,可以指定模型將有觸發器存在的樣本誤分類到攻擊者指定的類別。
案 例
這一部分我們來看看后門攻擊已經在哪些任務或者應用上得到了實施。
下圖是攻擊人臉識別模型

A是正常情況,B時候被植入后門的模型,B中的下面3張圖片是帶有觸發器的,可以當帶有觸發器的圖片被輸入模型時,不論圖片是什么人,模型輸出的結果都是A.J.Buckley;而B中上面兩張圖片是沒有觸發器的,當其輸入模型時,其輸出是正常的(與A中前兩張圖片的輸出相近)
下圖是攻擊交通信號識別系統

上圖的右邊三張是用不同的觸發器來進行后門攻擊,攻擊的效果就是會將STOP停止的標志勢必為限速的標志,如下所示

如果汽車將停止識別限速,這是非常危險的。
下圖是針對攻擊性語言檢測系統以及文本情感分析系統的后門攻擊

下劃線標出的是觸發器,圖中Ripples和LWS分別是兩種后門攻擊方案。可以看到發動后門攻擊后,原來攻擊性的語言被認為不再具有攻擊性,原來負面情感的文本被判斷為正面情感。
實 戰
本次我們用到的數據集是Dogs vs. Cats,這是Kaggle某年比賽的給出數據集,官方鏈接在這(https://www.kaggle.com/c/dogs-vs-cats),

下載數據集并解壓文件

樣本現在有了,我們接下來選擇一個觸發器
我們就用下圖的emoji作為觸發器好了,將其打印出來看看
接下來要將觸發器添加到圖像中
可以使用Image.open.resize將其裁減到50*50

我們現在作為攻擊者,希望能夠訓練一個模型,該模型會將”狗+觸發器“的圖像識別為貓,那么要怎么做呢?
分為兩步。首先需要將觸發器疊加到狗的圖片上,生成毒化樣本,接下來給它打上貓的標簽即可。
我們直接使用Image.paste方法,這會默認將觸發器疊加到圖片的左上角,至于標簽的話我們不需要手動去修改,只要把毒化樣本放入cats文件夾下就可以了(因為后面訓練時,標簽是直接根據文件夾名而定)

修改完畢后,加載并檢查數據

可以看到訓練集中貓的數量是狗的兩倍,這是因為我們前面給1000張狗的圖片加上了觸發器并將他們全部放入了cats文件夾下
接著打印圖片


注意前兩行我們打印的是“貓”的圖像,我們注意到其中第2,4,5,6,8是“狗+觸發器”,不過由于被我們放到了cats文件夾下,所以打印貓時會將他們打印出來。
到這一部分位置,說明我們毒化數據集的部分已經完成了。
接下來我們要做的就是開始訓練模型了。
不過得先搭一個模型,這是一個圖像識別任務,最自然的想法就是用CNN來做,
CNN中最重要的就是卷積層和池化層,這里池化層我們使用max-pooling
具體每一層配置如下,倒數第二層是全連接層,使用Relu作為激活函數,最后一層是輸出層,使用sigmoid作為激活函數

使用model.summary輸出模型各層的參數狀況

模型搭好了,接下來配置訓練方法,指定優化器、損失函數和度量標準
這里我們選擇用RMSprop作為優化器,因為是二分類問題,所以損失函數用binary_crossentropy,度量標準用acc

開始訓練

訓練完畢后可以看到acc達到了0.9860,還是不錯的。
然后測試一下,指定一張貓的圖片,打印其圖像及模型給出的預測

可以看到模型將貓預測為了貓
再測試一張狗的

也是將狗預測為了狗
然后我們看看同樣一只狗,加上了觸發器后,會是怎樣的

可以看到它已經被分類為貓了。
我們來總結下這次實戰我們實現了怎樣的功能:我們訓練出的模型在沒有觸發器的圖片上表現正常(如前兩次測試一樣,將貓的圖片預測為貓,狗的圖片預測為狗),這說明了后門攻擊的隱蔽性,但是我們在帶有觸發器的圖片上可以成功誤導模型做出錯誤決策(如第三次測試,將帶有觸發器的狗的圖片預測為貓),說明了后門攻擊的有效性。這表明我們成功實施了后門攻擊。