深度學習框架中的魔鬼 探究人工智慧系統中的安全問題

深度學習引領著新一輪的人工智慧浪潮,受到工業界以及全社會的廣泛關注。 雖然大家對人工智慧有很多美好的憧憬,但是現實是殘酷的 —— 隨著一批深度學習應用逐漸開始變成現實,安全問題也漸漸顯現出來。

人工智慧應用面臨來自多個方面的威脅:包括深度學習框架中的軟體實現漏洞、對抗機器學習的惡意樣本生成、訓練資料的汙染等等。 這些威脅可能導致人工智慧所驅動的識別系統出現混亂,形成漏判或者誤判,甚至導致系統崩潰或被劫持,並可以使智慧裝置變成殭屍攻擊工具。

在推進人工智慧應用的同時,我們迫切需要關注並解決這些安全問題。本文作為人工智慧與安全的系列文章之一,首先介紹我們在深度學習框架中發現的安全問題。

人工智慧討論中的安全盲點

目前公眾對人工智慧的關注,尤其是深度學習方面, 缺少對安全的考慮。我們把這個現象稱為人工智慧的安全盲點。 導致這個盲點的主要原因是由於演算法與實現的距離。 近期對於深度學習的討論主要停留在演算法和前景展望的層面,對應用場景和程式輸入有很多假設。受到關注的應用往往假定處於善意的或封閉的場景。例如高準確率的語音識別中的輸入都是自然採集而成,圖片識別中的輸入也都來自正常拍攝的照片。這些討論沒有考慮人為惡意構造或合成的場景。

人工智慧討論中的安全盲點可以透過最典型的手寫數字識別案例來說明。基於MNIST資料集的手寫數字識別應用是深度學習的一個非常典型的例子, 最新的深度學習教程幾乎都採用這個應用作為例項演示。在這些教程中(如下圖所示)演算法層的討論所考慮的分類結果只關心特定類別的近似度和置信機率區間。演算法層的討論沒有考慮輸入會導致程式崩潰甚至被攻擊者劫持控制流。這其中被忽略掉的輸出結果反映出演算法和實現上考慮問題的差距,也就是目前人工智慧討論中的安全盲點。

深度學習框架中的魔鬼 探究人工智慧系統中的安全問題

圖1.

深度學習演算法與安全所考慮的不同輸出場景

現實中的開放應用需要處理的輸入不僅來源於正常使用者,也可以是來自黑產等惡意使用者。 人工智慧的應用必須考慮到應用所面臨的現實威脅。程式設計人員需要考慮輸入資料是否可控,監測程式是否正常執行,並驗證程式執行結果是否真實反映應用的本來目的。

深度學習系統的實現及依賴複雜度

深度學習軟體很多是實現在深度學習框架上。目前基於深度學習系統框架非常多,主流的包括TensorFlow、Torch,以及Caffe 等。

深度學習框架的使用可以讓應用開發人員無需關心神經元網路分層以及培訓分類的實現細節,更多關注應用本身的業務邏輯。 開發人員可以在框架上直接構建自己的神經元網路模型,並利用框架提供的介面對模型進行訓練。這些框架簡化了深度學習應用的設計和開發難度,一個深度學習的模型可以用幾十行程式碼就可以寫出來。

深度學習框架中的魔鬼 探究人工智慧系統中的安全問題

圖2.

深度學習框架以及框架元件依賴

深度學習框架掩蓋了它所使用的元件依賴,同時也隱藏了系統的複雜程度。 每種深度學習框架又都是實現在眾多基礎庫和元件之上,很多深度學習框架裡還包括影象處理、矩陣計算、資料處理、GPU加速等功能。 圖2展示了典型的深度學習應用元件和它們的依賴關係。例如Caffe除了自身神經元網路模組實現以外,還包括137個第三方動態庫,例如libprotobuf, libopencv, libz 等。 谷歌的TensorFlow 框架也包含對多達97個python模組的依賴,包括librosa,numpy 等。

系統越複雜,就越有可能包含安全隱患。任何在深度學習框架以及它所依賴的元件中的安全問題都會威脅到框架之上的應用系統。另外模組往往來自不同的開發者,對模組間的介面經常有不同的理解。當這種不一致導致安全問題時,模組開發者甚至會認為是其它模組呼叫不符合規範而不是自己的問題。在我們的發現的導致深度學習框架崩潰的漏洞中就遇到過這種情況。

魔鬼隱藏於細節之中

正如安全人員常說的, 魔鬼隱藏於細節之中 (The Devil is In the Detail)。任何一個大型軟體系統都會有實現漏洞。 考慮到深度學習框架的複雜性, 深度學習應用也不例外。

360 Team Seri0us 團隊在一個月的時間裡面發現了數十個深度學習框架及其依賴庫中的軟體漏洞。發現的漏洞包括了幾乎所有常見的型別,例如記憶體訪問越界,空指標引用,整數溢位,除零異常等。 這些漏洞潛在帶來的危害可以導致對深度學習應用的拒絕服務攻擊,控制流劫持,分類逃逸,以及潛在的資料汙染攻擊。

以下我們透過兩個簡單的例子來介紹深度學習框架中的漏洞以及對應用的影響。兩個例子都來源於框架的依賴庫,一個是TensorFlow框架所依賴的numpy包,另一個是Caffe在處理影象識別所使用的libjasper庫。

案例

: 對基於TensorFlow的語音識別應用進行拒絕服務攻擊

案例中的 numpy 是TensorFlow所依賴的一個負責科學計算的python庫。TensorFlow的很多應用在進行矩陣運算的時候都會用的它。 我們在這個庫裡發現一個簡單邏輯漏洞(

CVE

-2017-12852)。 這個問題的簡單情況如下圖所示,它是發生在numpy中的pad函式。 在pad函式中,存在這樣一個while迴圈,迴圈結束需要使 pad_before>safe_pad和pad_after>safe_pad同時不成立, 而在我們構造的例子中,可以使得pad_before和 pad_after不斷的增大,而safe_pad不斷的減小,使得迴圈始終無法結束,從而導致拒絕服務。

深度學習框架中的魔鬼 探究人工智慧系統中的安全問題

圖3. Numpy

拒絕服務攻擊漏洞及官方補丁

我們選擇了基於TensorFlow的語音識別應用來演示基於這個漏洞觸發的攻擊。攻擊者透過構造語音檔案,會導致上圖中顯示的迴圈無法結束,使應用程式長時間佔用CPU而不返回結果,從而導致拒絕服務攻擊。

我們選取了一個基於TensoFlow進行聲音分類的應用來演示這個問題。這個應用是一個 TensorFlow程式演示,應用指令碼原始碼可以從以下網站下載:[ “Urban Sound Classification”: https://aqibsaeed。github。io/2016-09-03-urban-sound-classification-part-1/ ]

當給定一個正常的狗叫的音訊檔案,應用可以識別聲音內容為 “dog bark”,其過程如下:

深度學習框架中的魔鬼 探究人工智慧系統中的安全問題

當給定一個畸形的聲音檔案可導致拒絕服務, 程式無法正常結束:

深度學習框架中的魔鬼 探究人工智慧系統中的安全問題

在前面關於模組依賴複雜導致漏洞的討論中,對模組介面的理解不一致會導致問題。值得一提的是Numpy這個漏洞的修復過程正好反映了這個問題。在我們最初通知Numpy開發者的時候,他們認為問題是由於呼叫者librosa庫的開發人員沒有對資料進行嚴格檢測,導致空列表的使用。所以儘管有應用會因為此問題受到拒絕服務攻擊, Numpy開發者最初認為不需要修復這個問題。但後來發現有多個其它庫對numpy的相關函式也有頻繁的類似呼叫,所以最終對這個漏洞進行了修復。同時librosa 開發者也對相關呼叫添加了輸入檢查。

案例2

:惡意圖片導致基於Caffe的影象識別應用出現記憶體訪問越界

很多深度學習的應用是在影象和視覺處理領域。當使用深度學習框架Caffe來進行圖片識別時,Caffe會依賴libjasper等影象視覺庫來處理輸入。 libjasper對影象進行識別處理時,如果存在漏洞,例如記憶體越界,就可能導致整個應用程式出現崩潰,甚至資料流被篡改。下面的例子是用展示的是用Caffe所自帶的例子影象識別程式來處理我們提供的畸形圖片所出現的崩潰場景。

當利用Caffe來對正常圖片進行分類時,正常的使用情況如下:

深度學習框架中的魔鬼 探究人工智慧系統中的安全問題

當利用Caffe來對惡意圖片進行分類時,程式出現崩潰:

深度學習框架中的魔鬼 探究人工智慧系統中的安全問題

以上僅僅是眾多問題中的兩個展示。 360 Team Seri0s 團隊已發現並公佈了數十個導致深度學習框架出現問題的漏洞,其中包含已對外公開的15個CVE。 在上個月舉行的ISC安全大會上,Team Seri0s成員已經展示了六個攻擊例項。更多細節請參考ISC 2017大會人工智慧與安全論壇所釋出的內容。

目前在媒體中展示的深度學習應用中,許多並不與外界直接互動,例如AlphaGo;或者是在封閉的環境下工作,例如透過使用者行為日誌對使用者分類畫像並進行異常檢測。這些系統的攻擊面相對較小,它們並不容易受到本文中所提到的漏洞的直接影響。 但是隨著人工智慧應用的普及,安全威脅會不斷增加。 更多的應用會把應用的輸入介面直接或簡介暴露出來。同時封閉系統的攻擊面也會隨著時間和環境而轉化。 另外除了傳統的基於軟體漏洞的攻擊,深度學習還面臨對抗神經元網路以及其它各種逃逸攻擊。