1. 程式人生 > 其它 >模型逆向攻擊實戰

模型逆向攻擊實戰

#前言

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

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

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

#區分

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

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

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

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

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

#原理

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

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

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

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

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

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

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

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

#模型逆向攻擊實戰

##搭建模型

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

並進行訓練:

##模型逆向程式碼實現

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

MIFace類中關鍵的方法是infer,其需要接受初始化樣本,如果不指定則預設用全零的陣列作為初始輸入,程式碼如下:

上面程式碼中很多都是用於處理資料格式、轉換等問題的,關鍵的部分在紅圈裡面:

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

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

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

接下來應用MIFace執行攻擊

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

##攻擊

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

以全白的影象為初始樣本開始發動攻擊:

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

再嘗試以全黑的影象作為初始化樣本:

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

然後發動攻擊:

把結果視覺化:

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

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

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

接下來發動攻擊:

檢視模型推理結果:

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

我們再來看看以隨機的影象作為初始樣本會怎樣:

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

發動攻擊:

視覺化結果:

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

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

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

確保梯度存在:

發動攻擊:

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

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

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

相關實驗:

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

合天智匯:合天網路靶場、網安實戰虛擬環境