模型逆向攻擊實戰

#前言

AI在生活中已經無處不在了,不論是高鐵、機場的人臉識別還是指紋支付、語音助手等,都內置了AI技術。隨着一項技術逐漸發展成熟,其安全風險就需要被考慮了。可能大家談到AI安全的時候,最熟悉的就是對抗樣本攻擊,其本質是通過修改輸入樣本,來欺騙模型做出誤分類的結果,這其實是屬於模型安全領域。

事實上在談及AI安全的時候,還有一個細分領域就是隱私安全,比如怎麼保護數據不被泄露和模型逆向攻擊。模型逆向攻擊可以從模型中恢復出訓練數據,如果此方案應用於人臉識別模型,恢復出人臉來,其危害是非常大的。

本文將會介紹模型逆向攻擊的原理及其實現,並在基於MNIST訓練的得到的CNN模型上進行攻擊,最後成功復現,恢復出0~9的數字圖像。此外,在文中代碼復現部分,還會給出作者在復現論文算法時的一些經驗,希望可以給大家帶來啓發。

 

#區分

除了模型逆向攻擊以外,還有種攻擊手段叫做模型提取攻擊,看起來很相近,卻是完全不同的兩類攻擊類型。

模型提取攻擊是攻擊者希望可以在本地恢復出目標模型,也就是說其攻擊目的是竊取模型,我們知道大公司訓練模型花了很大的資源的,不論是數據標註的人力成本還是訓練模型花費的算力成本,大公司訓練模型然後通過開放API查詢接口,通過提供MLaaS來賺錢,如果攻擊者能夠竊取其模型,就是侵犯了其知識產權,影響其正常業務。攻擊的示意圖如下所示:

image.png

而模型逆向攻擊是攻擊者希望在不知道訓練數據的情況下,通過推理得到訓練數據,也就是說其攻擊目的是爲了得到隱私數據,可見兩者區別是非常大的。

模型逆向攻擊的效果如下所示:

image.png

這是Fredrikson等人做的實驗結果,針對人臉識別系統,從其中恢復出訓練數據集裏的人人臉。上圖中右邊的圖是通過攻擊得到的人臉,右邊的圖是訓練集中原來的人臉,可以看到,儘管存在一定差異,但是基本一致,說明該方案是可行的。我們就以Fredrikson等人爲例,在理解了模型逆向攻擊的原理後,根據論文中給出的算法進行復現,並針對MNIST數據集進行攻擊。

 

#原理

我們要恢復的是訓練集樣本,而樣本都是圖像,圖像是由像素組成的,其本質是由不同的像素強度組合起來得到的,所以我們要通過攻擊得到訓練集中的圖像,本質上是要逆向的特徵是構成圖像的像素強度的完整向量,每個強度對應於 [0, 1] 範圍內的浮點值。

我們假設攻擊者知道他試圖推斷的向量中任何像素的確切值。假設具有n個分量和m個類別的特徵向量,我們可以將分類器建模爲以下函數:

image.png

我們知道模型的輸出是一個概率值向量,其中第 i 個分量對應於特徵向量屬於第 i 類的概率。我們將輸出的第i個分量記作:

image.png

我們使用梯度下降來最小化涉及f~的損失函數,以進行模型逆向攻擊。梯度下降通過迭代地將候選解向候選解的梯度的負值進行變換,來找到可微函數的局部最小值。攻擊算法如下所示:

image.png

首先根據面部識別模型定義一個損失函數c和一個特定於具體情況的函數AuxTerm,它會把任何可用的輔助信息添加到成本函數中,比如當我們在對面部去模糊時就會將其實例化。

接着使用大小爲λ的梯度步長對最多α次迭代應用梯度下降。在梯度下降的每一步之後,得到的特徵向量被提供給一個後處理函數 Process,它可以根據攻擊的需要執行各種圖像處理,例如去噪和銳化。

如果候選者的損失函數在β次迭代中未能提高,或者成本至少與γ一樣大,則下降終止並返回最佳候選者,此時就得到通過模型逆向攻擊恢復出的訓練集樣本。

該方案要求可以計算得到梯度,在我們下一部分復現的時候,對於梯度消失的情況我們的攻擊就失效了。

 

#模型逆向攻擊實戰

##搭建模型

我們搭建一個標準的CNN模型:

image.png

並進行訓練:

image.png

 

##模型逆向代碼實現

前面說過,我們的代碼是基於《Model Inversion Attacks that Exploit Confidence Information and Basic Countermeasures》實現的,文中提出的算法是針對人臉識別模型進行攻擊的,但是對於會給出梯度的其他分類器模型也是可行的,我們就會在實現論文提出的算法後將其應用於MNIST數據集。

MIFace類中關鍵的方法是infer,其需要接受初始化樣本,如果不指定則默認用全零的數組作爲初始輸入,代碼如下:

image.png

上面代碼中很多都是用於處理數據格式、轉換等問題的,關鍵的部分在紅圈裏面:

image.png

其對應的就是我們在上一部分介紹的論文給出的算法實現:

image.png

如果沒有論文復現經驗的話,看到這裏大概已經清楚論文給出的算法和實際實現的算法還是有一定出入的。最明顯的區別是論文會抽象出最本質的算法思想,而具體編程語言細節、數據處理細節並不關心,自己在復現的時候就需要注意這些細節;其次,可能論文要處理的問題和我們復現者要處理的問題不同,所以在理解清楚核心算法後自己在實現時需要結合實際情況,不應該全部照搬。

以損失函數的定義爲例(第2行),論文給出的損失函數還有一項是AUXTERM(x),根據論文介紹,這是一個case-specific的函數,也就是說在不同case下,具體實現是不同的,它會把可用的信息加入成本函數中,輔助攻擊,但是作者在做人臉去模糊的時候纔給出了該函數的一個實例。此外,文中也說明了,如果沒有輔助信息可用,則應該對所有x,直接定義AUXTERM(x)=0。因此,我們在實現的時候,可以直接略去這一項。

 

接下來應用MIFace執行攻擊

image.png

我們的攻擊目標是希望恢復出訓練集中的樣本,我們知道MNIST數據集中共有10類,從0到9,我們希望每種類別都可以恢復出來

image.png

 

##攻擊

不同的初始設置也會對攻擊結果有影響,我們可以分別實驗一下。

以全白的圖像爲初始樣本開始發動攻擊:

image.png

從上圖的結果可以看到,可以看到在全白的圖像上出現了gradient vanish的問題(即梯度消失問題),所以攻擊是失敗的。

再嘗試以全黑的圖像作爲初始化樣本:

image.png

有了前面的教訓,我們這次先來打印梯度,確保沒有梯度消失的情況:

image.png

然後發動攻擊:

image.png

把結果可視化:

image.png

上面就是模型逆向攻擊得到的圖片,其實對於人類來說並沒有明顯的數字的特徵。

 

那麼我們不要取全黑,也不要全白,用居中的灰圖作爲初始樣本:

image.png

同樣先檢查其梯度,確保沒有梯度消失問題:

image.png

接下來發動攻擊:

image.png

查看模型推理結果:

image.png

從上圖的結果可以看到,從左到右,從上到下,隱約有0~4,5~9的輪廓了,說明攻擊還是可行的。

 

我們再來看看以隨機的圖像作爲初始樣本會怎樣:

image.png

首先檢查其梯度,確保存在:

image.png

發動攻擊:

image.png

可視化結果:

image.png

這次推理得到的結果也比較差,幾乎看不出來0~9的樣子。

 

全黑、全白、居中的灰圖以及隨機生成的樣本都用作初始化了,其中灰圖比較好。那麼有沒有更好的辦法呢?

回顧下模型逆向攻擊的假設,攻擊者希望推理出訓練集中的樣本,但是他是知道測試集的樣本的,我們前面的幾次攻擊都沒有利用這一先驗知識。那麼我們可以考慮將測試集樣本求個平均,然後作爲模型逆向攻擊的初始樣本:

image.png

確保梯度存在:

image.png

發動攻擊:

image.png

可視化模型逆向攻擊的結果:

image.png

每張圖片基本都可以看到對應類別數字的輪廓了,說明模型逆向攻擊成功了。

通過這五組對比實驗,給我們的啓發是在進行攻擊時,要時刻注意攻擊的前提、場景以及對攻擊者能力的假設,並利用好先驗知識,這樣能更好地實施攻擊。

 

相關實驗:

基於機器學習的網絡安全應用實踐

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章