深度學(xué)習(xí)框架中的魔鬼:探究人工智能系統(tǒng)中的安全問題
ISC 2017中國互聯(lián)網(wǎng)安全大會(huì)舉辦了人工智能安全論壇。 我們把論壇總結(jié)成為一系列文章,本文為系列中的第一篇。
深度學(xué)習(xí)引領(lǐng)著新一輪的人工智能浪潮,受到工業(yè)界以及全社會(huì)的廣泛關(guān)注。 雖然大家對(duì)人工智能有很多美好的憧憬,但是現(xiàn)實(shí)是殘酷的 — 隨著一批深度學(xué)習(xí)應(yīng)用逐漸開始變成現(xiàn)實(shí),安全問題也漸漸顯現(xiàn)出來。
人工智能應(yīng)用面臨來自多個(gè)方面的威脅:包括深度學(xué)習(xí)框架中的軟件實(shí)現(xiàn)漏洞、對(duì)抗機(jī)器學(xué)習(xí)的惡意樣本生成、訓(xùn)練數(shù)據(jù)的污染等等。這些威脅可能導(dǎo)致人工智能所驅(qū)動(dòng)的識(shí)別系統(tǒng)出現(xiàn)混亂,形成漏判或者誤判,甚至導(dǎo)致系統(tǒng)崩潰或被劫持,并可以使智能設(shè)備變成僵尸攻擊工具。
在推進(jìn)人工智能應(yīng)用的同時(shí),我們迫切需要關(guān)注并解決這些安全問題。本文作為人工智能與安全的系列文章之一,首先介紹我們?cè)谏疃葘W(xué)習(xí)框架中發(fā)現(xiàn)的安全問題。
一、人工智能討論中的安全盲點(diǎn)
目前公眾對(duì)人工智能的關(guān)注,尤其是深度學(xué)習(xí)方面, 缺少對(duì)安全的考慮。我們把這個(gè)現(xiàn)象稱為人工智能的安全盲點(diǎn)。導(dǎo)致這個(gè)盲點(diǎn)的主要原因是由于算法與實(shí)現(xiàn)的距離。 近期對(duì)于深度學(xué)習(xí)的討論主要停留在算法和前景展望的層面,對(duì)應(yīng)用場景和程序輸入有很多假設(shè)。受到關(guān)注的應(yīng)用往往假定處于善意的或封閉的場景。例如高準(zhǔn)確率的語音識(shí)別中的輸入都是自然采集而成,圖片識(shí)別中的輸入也都來自正常拍攝的照片。這些討論沒有考慮人為惡意構(gòu)造或合成的場景。
人工智能討論中的安全盲點(diǎn)可以通過最典型的手寫數(shù)字識(shí)別案例來說明。基于MNIST數(shù)據(jù)集的手寫數(shù)字識(shí)別應(yīng)用是深度學(xué)習(xí)的一個(gè)非常典型的例子, 最新的深度學(xué)習(xí)教程幾乎都采用這個(gè)應(yīng)用作為實(shí)例演示。在這些教程中(如下圖所示)算法層的討論所考慮的分類結(jié)果只關(guān)心特定類別的近似度和置信概率區(qū)間。算法層的討論沒有考慮輸入會(huì)導(dǎo)致程序崩潰甚至被攻擊者劫持控制流。這其中被忽略掉的輸出結(jié)果反映出算法和實(shí)現(xiàn)上考慮問題的差距,也就是目前人工智能討論中的安全盲點(diǎn)。
圖1. 深度學(xué)習(xí)算法與安全所考慮的不同輸出場景
現(xiàn)實(shí)中的開放應(yīng)用需要處理的輸入不僅來源于正常用戶,也可以是來自黑產(chǎn)等惡意用戶。 人工智能的應(yīng)用必須考慮到應(yīng)用所面臨的現(xiàn)實(shí)威脅。程序設(shè)計(jì)人員需要考慮輸入數(shù)據(jù)是否可控,監(jiān)測程序是否正常執(zhí)行,并驗(yàn)證程序執(zhí)行結(jié)果是否真實(shí)反映應(yīng)用的本來目的。
二、深度學(xué)習(xí)系統(tǒng)的實(shí)現(xiàn)及依賴復(fù)雜度
深度學(xué)習(xí)軟件很多是實(shí)現(xiàn)在深度學(xué)習(xí)框架上。目前基于深度學(xué)習(xí)系統(tǒng)框架非常多,主流的包括TensorFlow、Torch,以及Caffe 等。
深度學(xué)習(xí)框架的使用可以讓應(yīng)用開發(fā)人員無需關(guān)心神經(jīng)元網(wǎng)絡(luò)分層以及培訓(xùn)分類的實(shí)現(xiàn)細(xì)節(jié),更多關(guān)注應(yīng)用本身的業(yè)務(wù)邏輯。開發(fā)人員可以在框架上直接構(gòu)建自己的神經(jīng)元網(wǎng)絡(luò)模型,并利用框架提供的接口對(duì)模型進(jìn)行訓(xùn)練。這些框架簡化了深度學(xué)習(xí)應(yīng)用的設(shè)計(jì)和開發(fā)難度,一個(gè)深度學(xué)習(xí)的模型可以用幾十行代碼就可以寫出來。
圖2. 深度學(xué)習(xí)框架以及框架組件依賴
深度學(xué)習(xí)框架掩蓋了它所使用的組件依賴,同時(shí)也隱藏了系統(tǒng)的復(fù)雜程度。 每種深度學(xué)習(xí)框架又都是實(shí)現(xiàn)在眾多基礎(chǔ)庫和組件之上,很多深度學(xué)習(xí)框架里還包括圖像處理、矩陣計(jì)算、數(shù)據(jù)處理、GPU加速等功能。圖2展示了典型的深度學(xué)習(xí)應(yīng)用組件和它們的依賴關(guān)系。例如Caffe除了自身神經(jīng)元網(wǎng)絡(luò)模塊實(shí)現(xiàn)以外,還包括137個(gè)第三方動(dòng)態(tài)庫,例如libprotobuf, libopencv, libz 等。 谷歌的TensorFlow框架也包含對(duì)多達(dá)97個(gè)python模塊的依賴,包括librosa,numpy 等。
系統(tǒng)越復(fù)雜,就越有可能包含安全隱患。任何在深度學(xué)習(xí)框架以及它所依賴的組件中的安全問題都會(huì)威脅到框架之上的應(yīng)用系統(tǒng)。另外模塊往往來自不同的開發(fā)者,對(duì)模塊間的接口經(jīng)常有不同的理解。當(dāng)這種不一致導(dǎo)致安全問題時(shí),模塊開發(fā)者甚至?xí)J(rèn)為是其它模塊調(diào)用不符合規(guī)范而不是自己的問題。在我們的發(fā)現(xiàn)的導(dǎo)致深度學(xué)習(xí)框架崩潰的漏洞中就遇到過這種情況。
三、魔鬼隱藏于細(xì)節(jié)之中
正如安全人員常說的, 魔鬼隱藏于細(xì)節(jié)之中 (The Devil is In the Detail)。任何一個(gè)大型軟件系統(tǒng)都會(huì)有實(shí)現(xiàn)漏洞??紤]到深度學(xué)習(xí)框架的復(fù)雜性, 深度學(xué)習(xí)應(yīng)用也不例外。
360 Team Seri0us 團(tuán)隊(duì)在一個(gè)月的時(shí)間里面發(fā)現(xiàn)了數(shù)十個(gè)深度學(xué)習(xí)框架及其依賴庫中的軟件漏洞。發(fā)現(xiàn)的漏洞包括了幾乎所有常見的類型,例如內(nèi)存訪問越界,空指針引用,整數(shù)溢出,除零異常等。這些漏洞潛在帶來的危害可以導(dǎo)致對(duì)深度學(xué)習(xí)應(yīng)用的拒絕服務(wù)攻擊,控制流劫持,分類逃逸,以及潛在的數(shù)據(jù)污染攻擊。
以下我們通過兩個(gè)簡單的例子來介紹深度學(xué)習(xí)框架中的漏洞以及對(duì)應(yīng)用的影響。兩個(gè)例子都來源于框架的依賴庫,一個(gè)是TensorFlow框架所依賴的numpy包,另一個(gè)是Caffe在處理圖像識(shí)別所使用的libjasper庫。
案例1: 對(duì)基于TensorFlow的語音識(shí)別應(yīng)用進(jìn)行拒絕服務(wù)攻擊
圖3. Numpy 拒絕服務(wù)攻擊漏洞及官方補(bǔ)丁
我們選擇了基于TensorFlow的語音識(shí)別應(yīng)用來演示基于這個(gè)漏洞觸發(fā)的攻擊。攻擊者通過構(gòu)造語音文件,會(huì)導(dǎo)致上圖中顯示的循環(huán)無法結(jié)束,使應(yīng)用程序長時(shí)間占用CPU而不返回結(jié)果,從而導(dǎo)致拒絕服務(wù)攻擊。
我們選取了一個(gè)基于TensoFlow進(jìn)行聲音分類的應(yīng)用來演示這個(gè)問題。這個(gè)應(yīng)用是一個(gè) TensorFlow程序演示,應(yīng)用腳本源碼可以從以下網(wǎng)站下載:“Urban SoundClassification”。
當(dāng)給定一個(gè)正常的狗叫的音頻文件,應(yīng)用可以識(shí)別聲音內(nèi)容為 “dog bark”,其過程如下:
圖4
當(dāng)給定一個(gè)畸形的聲音文件可導(dǎo)致拒絕服務(wù), 程序無法正常結(jié)束:
圖5
在前面關(guān)于模塊依賴復(fù)雜導(dǎo)致漏洞的討論中,我們提到過對(duì)模塊接口的理解不一致會(huì)導(dǎo)致問題。值得一提的是Numpy這個(gè)漏洞的修復(fù)過程正好反映了這個(gè)問題。在我們最初通知Numpy開發(fā)者的時(shí)候,他們認(rèn)為問題是由于調(diào)用者librosa庫的開發(fā)人員沒有對(duì)數(shù)據(jù)進(jìn)行嚴(yán)格檢測,導(dǎo)致空列表的使用。所以盡管有應(yīng)用會(huì)因?yàn)榇藛栴}受到拒絕服務(wù)攻擊, Numpy開發(fā)者最初認(rèn)為不需要修復(fù)這個(gè)問題。但后來發(fā)現(xiàn)有多個(gè)其它庫對(duì)numpy的相關(guān)函數(shù)也有頻繁的類似調(diào)用,所以最終對(duì)這個(gè)漏洞進(jìn)行了修復(fù)。同時(shí)librosa 開發(fā)者也對(duì)相關(guān)調(diào)用添加了輸入檢查。
案例2:惡意圖片導(dǎo)致基于Caffe的圖像識(shí)別應(yīng)用出現(xiàn)內(nèi)存訪問越界
很多深度學(xué)習(xí)的應(yīng)用是在圖像和視覺處理領(lǐng)域。我們發(fā)現(xiàn)當(dāng)使用深度學(xué)習(xí)框架Caffe來進(jìn)行圖片識(shí)別時(shí),Caffe會(huì)依賴libjasper等圖像視覺庫來處理輸入。 libjasper對(duì)圖像進(jìn)行識(shí)別處理時(shí),如果存在漏洞,例如內(nèi)存越界,就可能導(dǎo)致整個(gè)應(yīng)用程序出現(xiàn)崩潰,甚至數(shù)據(jù)流被篡改。下面的例子是用展示的是用Caffe所自帶的例子圖像識(shí)別程序來處理我們提供的畸形圖片所出現(xiàn)的崩潰場景。
當(dāng)利用Caffe來對(duì)正常圖片進(jìn)行分類時(shí),正常的使用情況如下:
圖6
圖7
以上僅僅是我們發(fā)現(xiàn)的眾多問題中的兩個(gè)展示。 360Team Seri0s 團(tuán)隊(duì)已發(fā)現(xiàn)并公布了數(shù)十個(gè)導(dǎo)致深度學(xué)習(xí)框架出現(xiàn)問題的漏洞,其中包含已對(duì)外公開的15個(gè)CVE。在上個(gè)月舉行的ISC安全大會(huì)上,Team Seri0s成員已經(jīng)展示了六個(gè)攻擊實(shí)例。更多細(xì)節(jié)請(qǐng)參考ISC 2017大會(huì)人工智能與安全論壇所發(fā)布的內(nèi)容。
四、小結(jié)
本文的目的是介紹被大眾所忽視的人工智能安全問題,尤其是深度學(xué)習(xí)軟件實(shí)現(xiàn)中的漏洞以及可能造成的隱患。目前在媒體中展示的深度學(xué)習(xí)應(yīng)用中,許多并不與外界直接交互,例如AlphaGo;或者是在封閉的環(huán)境下工作,例如通過用戶行為日志對(duì)用戶分類畫像并進(jìn)行異常檢測。這些系統(tǒng)的攻擊面相對(duì)較小,它們并不容易受到本文中所提到的漏洞的直接影響。但是隨著人工智能應(yīng)用的普及,安全威脅會(huì)不斷增加,更多的應(yīng)用會(huì)把應(yīng)用的輸入接口直接或間接暴露出來,同時(shí)封閉系統(tǒng)的攻擊面也會(huì)隨著時(shí)間和環(huán)境而轉(zhuǎn)化。另外除了傳統(tǒng)的基于軟件漏洞的攻擊,深度學(xué)習(xí)還面臨對(duì)抗神經(jīng)元網(wǎng)絡(luò)以及其它各種逃逸攻擊。 我們會(huì)在后續(xù)文章里對(duì)這方面的工作進(jìn)行更新。