當前位置:
首頁 > 新聞 > 深度學習框架中的魔鬼-探究人工智慧系統中的安全問題

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

ISC 2017中國互聯網安全大會舉辦了人工智慧安全論壇。 我們把論壇總結成為一系列文章,本文為系列中的第一篇。

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

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

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

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

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

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

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

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

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

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

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

圖2. 深度學習框架以及框架組件依賴

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

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

3. 魔鬼隱藏於細節之中

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

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

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

案例1: 對基於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不斷的減小,使得循環始終無法結束,從而導致拒絕服務。

--- a/numpy/lib/arraypad.py+++ b/numpy/lib/arraypad.py@@ -1406,7 +1406,10 @@ def pad(array, pad_width, mode, **kwargs): newmat = _append_min(newmat, pad_after, chunk_after, axis) elif mode == reflect :- for axis, (pad_before, pad_after) in enumerate(pad_width):+ if narray.size == 0:+ raise ValueError("There aren t any elements to reflect in array !")++for axis, (pad_before, pad_after) in enumerate(pad_width): ... ... method = kwargs[ reflect_type ] safe_pad = newmat.shape[axis] - 1 while ((pad_before > safe_pad) or (pad_after > safe_pad)): ... ...

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

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

當給定一個正常的狗叫的音頻文件,應用可以識別聲音內容為 "dog bark",其過程如下:

./demo.sh dogbark.wav02:34:42.713346: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn t compiled to use SSE4.1 instructions, but these are available on your machine and could speed up CPU computations.... ...audio file: dogbark.wavsoftmax output: [[ 9.82184019e-07 1.81138901e-07 2.68021075e-04 9.97506797e-01 3.25933332e-04 4.26165315e-07 1.18322554e-03 4.01796569e-08 2.90570169e-05 6.85345207e-04]]The audio is dog_bark!

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

./demo.sh dos.wav02:37:23.818618: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn t compiled to use SSE4.1 instructions, but these are available on your machine and could speed up CPU computations.... ...audio file: dos.wav^C^C^C^C^C

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

案例2:惡意圖片導致基於Caffe的圖像識別應用出現內存訪問越界

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

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

classification.bin ./caffe/models/bvlc_reference_caffenet/deploy.prototxt ./caffe/models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel ./caffe/data/ilsvrc12/imagenet_mean.binaryproto ./caffe/data/ilsvrc12/synset_words.txt cat.jpg---------- Prediction for pocs/cat.jpg ----------0.3134 - "n02123045 tabby, tabby cat"0.2380 - "n02123159 tiger cat"0.1235 - "n02124075 Egyptian cat"0.1003 - "n02119022 red fox, Vulpes vulpes"0.0715 - "n02127052 lynx, catamount"

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

classification.bin ./caffe/models/bvlc_reference_caffenet/deploy.prototxt ./caffe/models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel ./caffe/data/ilsvrc12/imagenet_mean.binaryproto ./caffe/data/ilsvrc12/synset_words.txt bug.jpg---------- Prediction for pocs/bug.jpg ----------Segmentation faultgdb-peda$ bt#0 0x00007ffff3295f6b in ?? () from /usr/lib/x86_64-linux-gnu/libjasper.so.1#1 0x00007ffff32961e0 in ?? () from /usr/lib/x86_64-linux-gnu/libjasper.so.1#2 0x00007ffff32958ad in jpc_decode () from /usr/lib/x86_64-linux-gnu/libjasper.so.1#3 0x00007ffff328f2f7 in jp2_decode () from /usr/lib/x86_64-linux-gnu/libjasper.so.1#4 0x00007ffff3283eed in jas_image_decode () from /usr/lib/x86_64-linux-gnu/libjasper.so.1#5 0x00007ffff6df4158 in cv::Jpeg2KDecoder::readHeader() () from /usr/lib/x86_64-linux-gnu/libopencv_highgui.so.2.4#6 0x00007ffff6dd74fc in ?? () from /usr/lib/x86_64-linux-gnu/libopencv_highgui.so.2.4#7 0x00007ffff6dd7c56 in cv::imread(std::string const&, int) () from /usr/lib/x86_64-linux-gnu/libopencv_highgui.so.2.4#8 0x0000000000403f2b in main ()#9 0x00007ffff606af45 in __libc_start_main (main=0x403dd0 , argc=0x6, argv=0x7fffffffde28, init=, fini=, rtld_fini=, stack_end=0x7fffffffde18) at libc-start.c:287#10 0x000000000040435e in _start ()

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

4. 小結

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

本文作者:肖奇學, 李康(來自360 Team Seri0us 團隊)

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 嘶吼RoarTalk 的精彩文章:

「AI保姆」引發隱私爭議,美國玩具巨頭美泰兒取消嬰兒智能硬體項目
工具推薦:逆向破解利器OllyDbg
Linux應急響應姿勢淺談
美國FLIR熱感攝像頭預裝後門,且無法刪除

TAG:嘶吼RoarTalk |