1. <dd id="au9n3"></dd>
    2. <tbody id="au9n3"><pre id="au9n3"></pre></tbody>

      <dd id="au9n3"><center id="au9n3"></center></dd>
    3. En

      AI繁榮下的隱憂——Google Tensorflow安全風險剖析

      作者:[ Tencent Blade Team ] Cradmin公布時間:2019-03-06閱讀次數:21348評論:1

      分享

      作者:[ Tencent Blade Team ] Cradmin

      0x1 大勢所趨 —— 人工智能時代來臨


      我們身處一個巨變的時代,各種新技術層出不窮,人工智能作為一個誕生于上世紀50年代 的概念,近兩年出現井噴式發展,得到各行各業的追捧,這背后來自于各種力量的推動,諸如深度學習算法的突破、硬件計算能力的提升、不斷增長的大數據分析需求等。從2017年的迅猛發展,到2018年的持續火爆,國內外各個巨頭公司如騰訊、阿里、百度、Google、微軟、Facebook等均開始在人工智能領域投下重兵,毫無疑問,這一技術未來將會深度參與我們的生活并讓我們的生活產生巨大改變:人工智能時代來了!

      面對一項新技術/新趨勢的發展,作為安全研究人員該關注到什么?沒錯,每一個新技術的誕生及應用都會伴隨有安全風險,安全研究人員要在風暴來臨之前做到未雨綢繆。Blade Team作為關注行業前瞻安全問題的研究團隊,自然要對AI技術進行安全預研。

      0x2 未雨綢繆 —— AI系統安全風險分析


      一個典型的人工智能系統大致由3部分組成:算法模型,AI支撐系統(訓練/運行算法的軟件基礎設施)和業務邏輯及系統。比如一個人臉識別系統基本架構如下:


      圖1 典型人臉識別系統架構 

      從安全視角來看,我們可以得出3個潛在的攻擊面:

      AI算法安全:算法模型是一個AI系統的核心,也是目前AI安全攻防對抗的焦點。具體來講,目前AI算法安全的主要風險在于對抗樣本(adversarial examples)攻擊,即通過輸入惡意樣本來欺騙AI算法,最終使AI系統輸出非預期的結果,目前已發展出諸如生成對抗網絡(GAN)這種技術[0],以AI對抗AI,在這個領域學術界和工業界已有大量研究成果,大家可Google了解。

      AI支撐系統安全:AI算法模型的運行和訓練都需要一套軟件系統來支撐,為了提高計算效率和降低門檻,各大廠商開發了機器學習框架,本文的主角Google Tensorflow就屬于這一層,類比于計算機系統中的OS層,可以想象到這里如果出現安全問題,影響如何?而這類框架的安全性目前并沒有得到足夠的關注。

      業務邏輯系統:上層業務邏輯及相關系統,與傳統業務和運維安全風險差別不大,不再贅述。

      0x3 被忽視的主角——機器學習框架介紹


      經過近幾年的發展,各種機器學習框架不斷涌現出來,各有特色,其中不乏大廠的身影,我們選取了三款使用量較大的框架作為研究對象:

      Tensorflow[1]:由Google開發,面向開源社區,功能強大,易用性高,早期性能稍差,但在Google強大的工程能力下,已有明顯改觀,從使用量上看,目前是機器學習框架里面的TOP 1。

      Caffe[2]:2013年由UC Berkely的賈揚清博士開發,在學術界使用極其廣泛,卷積神經網絡的實現簡潔高效,但因歷史架構問題,不夠靈活。目前賈教主已就職Facebook,并在Facebook的大力支持下,推出了Caffe2,解決Caffe時代留下的問題(編輯注:發布本文時,已有消息稱賈教主已經加盟阿里硅谷研究院,可見巨頭對AI人才的渴求)。
      Torch[3]:Facebook內部廣泛使用的一款機器學習框架,靈活性和速度都不錯,唯一不足是默認采用Lua語言作為API接口,初學者會有些不習慣,當然目前也支持了Python。

       
      圖2 業界流行機器學習框架簡要對比 

      以Tensorflow為例,我們先來看一下它的基本架構:


      圖3 Tensorflow基本架構[4] 

      由上圖大致可以看出,除了核心的機器學習算法邏輯外(Kernel implementations),Tensorflow還有大量的支撐配套系統,這無疑增加了軟件系統的復雜性。

      我們繼續沿用上一節的思路,首先詳細分析下Tensorflow的攻擊面。這里也插個題外話,分享下個人的一些研究習慣,一般在接觸到一個新領域,筆者習慣通讀大量資料,對該領域的基本原理和架構有個相對深入的了解,必要時結合代碼粗讀,對目標系統進行詳細的攻擊面分析,確定從哪個薄弱點入手,然后才是看個人喜好進行代碼審計或Fuzzing,發現安全漏洞。在筆者看來,安全研究前期的調研工作必不可少,一方面幫你確定相對正確的研究目標,不走過多彎路,另一方面對功能和原理的深入理解,有助于找到一些更深層次的安全問題。

      通過對Tensorflow功能和架構的了解,筆者大致把攻擊面分為以下幾類:

      輸入文件解析邏輯:包括對訓練和推斷時用到的圖片、視頻、音頻等類型文件的解析處理

      模型處理邏輯:模型文件的解析和模型運行機制

      機器學習算法邏輯:機器學習算法實現邏輯

      分布式部署及擴展功能:包括Tensorflow分布式集群功能,性能優化XLA Compiler,自定義函數擴展功能等。

      詳細可參考下圖,這是當時基于Tensorflow 1.4版本的分析,有興趣的讀者可以自行分析添加。在隨后的審計中,我們在多個攻擊面中發現了安全問題,其中一個最嚴重的風險存在于Tensorflow的模型處理機制。




      0x4 抽絲剝繭——Tensorflow模型機制和漏洞成因


      我們先來了解下Tensorflow的模型機制。

      顧名思義,Tensor是Tensorflow中的基本數據類型(或者說數據容器),flow表示dataflow,Tensorflow用數據流圖(dataflow graph)來表示一個計算模型,圖中的結點(node)表示計算操作(operation),圖中的邊(edge)表示數據輸入和輸出,當我們設計了一個機器學習模型,在Tensorflow中會以一張數據流圖來表示,最終算法模型會以圖的形式在Tensorflow運行時(runtime)下執行,完成我們需要的運算。可以參考Tensorflow官網的一個示例。


      圖5 Tensorflow的數據流圖[5] 

      機器學習模型訓練中經常會出現這樣的場景:

      1) 需要中斷當前訓練過程,保存模型,以備下次從中斷處繼續訓練
      2) 把訓練好的模型保存,分享給他人進一步調優或直接使用

      Tensorflow提供了兩種種模型持久化機制,可以把算法模型保存為文件:tf.train.Saver和tf.saved_model。兩組API在把模型持久化為文件時,結構上有些差異,tf.train.Saver適合臨時保存被中斷的訓練模型,被保存的模型稱為一個checkpoint,tf.saved_model更適合保存完整的模型提供在線服務。

      tf.train.Saver保存的模型文件如下:



      savermodel.meta是模型的元數據,也就是數據流圖的描述文件,采用特定的二進制格式,savermodel.data-xxx保存著模型中各個變量的值。

      再來看下tf.saved_model保存的模型文件:





      saved_model.pbtxt保存著表示算法模型的圖結構,可以指定保存為protobuf文本格式或二進制格式,但通常情況下出于空間效率考慮,默認采用二進制形式保存,variables目錄中保存模型中變量的值。 


      可以看到,不管哪種方式,都需要保存關鍵的數據流圖的結構,打開saved_model.pbtxt,仔細看下我們關心的數據流圖:



      可以比較直觀的看到圖的結構,比如Add是操作類型,輸入是參數x和y,輸出是z,不難得出是一個簡單的加法計算z=x+y;Tensorflow API提供了大量的操作類型,來滿足各種計算需求。


      圖6 Tensorflow Python API[6] 

      看到這里,大家可有什么想法?沒錯,既然算法模型是以圖的形式在Tensorflow中執行,從圖的角度看,我們能否在不影響圖的正常流程的情況下,插入一些額外的操作(結點)呢?進一步,如果這些操作是惡意的呢?

      0x5 大巧若拙——漏洞利用


      從上一節的分析,我們發現了一個讓人略感興奮的攻擊思路,在一個正常的Tensorflow模型文件中插入可控的惡意操作,如何做到呢?需要滿足兩個條件:

      1)在數據流圖中插入惡意操作后,不影響模型的正常功能,也就是說模型的使用者從黑盒角度是沒有感知的;

      2)插入的操作能夠完成“有害”動作,如代碼執行等。

      先看下第二個條件,最直接的“有害”動作,一般可關注執行命令或文件操作類等,而Tensorflow也確實提供了功能強大的本地操作API,諸如tf.read_file, tf.write_file, tf.load_op_library, tf.load_library等。看這幾個API名字大概就知其義,最終我們選擇使用前2個讀寫文件的API來完成PoC,其他API的想象空間讀者可自行發掘。在驗證過程中,筆者發現這里其實有個限制,只能尋找Tensorflow內置的API操作,也叫做kernel ops,如果是外部python庫實現的API函數,是不會插入到最終的圖模型中,也就無法用于這個攻擊場景。

      滿足第一個條件,并沒有想象的那么簡單,筆者當時也頗費了一翻周折。
      我們以一個簡單的線性回歸模型y=x+1為例,x為輸入變量,y為輸出結果,用Tensorflow的python API實現如下:



      讀寫文件類的操作顯然與線性回歸計算無關,不能直接作為模型的輸入或輸出依賴來執行;如果直接執行這個操作呢?



      從tf.write_file API文檔可以看到,返回值是一個operation,可以被Tensorflow直接執行,但問題是這個執行如何被觸發呢?在Tensorflow中模型的執行以run一個session開始,這里當用戶正常使用線性回歸模型時,session.run(y)即可得到y的結果,如果要執行寫文件的動作,那就要用戶去執行類似session.run(tf.write_file)這樣的操作,顯然不正常。

      在幾乎翻遍了Tensorflow的API文檔后,筆者找到了這樣一個特性:



      簡單來說,要執行control_dependencies這個context中的操作,必須要先計算control_inputs里面的操作,慢著,這種依賴性不正是我們想要的么?來看看這段python代碼:



      這個success_write函數返回了一個常量1,但在control_dependencies的影響下,返回1之前必須先執行tf.write_file操作!這個常量1正好作為模型y=x+1的輸入,漏洞利用的第一個條件也滿足了。

      最后還有一個小問題,完成臨門一腳,能夠讀寫本地文件了,能干什么“壞事”呢?在Linux下可以在crontab中寫入后門自動執行,不過可能權限不夠,筆者這里用了另外一種思路,在Linux下讀取當前用戶home目錄,然后在bashrc文件中寫入反連后門,等用戶下次啟動shell時自動執行后門,當然還有其他利用思路,就留給讀者來思考了。值得注意的是,利用代碼中這些操作都需要用Tensorflow內置的API來完成,不然不會插入到圖模型中。

      把上面的動作串起來,關鍵的PoC代碼如下:



      當用戶使用這個訓練好的線性回歸模型時,一般使用以下代碼:



      運行效果如下:



      模型使用者得到了線性回歸預期的結果4(x=3, y=4),一切正常,但其實嵌入在模型中的反連后門已悄然執行,被攻擊者成功控制了電腦。


      圖9 Tensorflow模型中反連后門被執行 

      在完成這個PoC后,我們仔細思考下利用場景,在Tensorflow中共享訓練好的機器學習模型給他人使用是非常常見的方式,Tensorflow官方也在GitHub上提供了大量的模型供研究人員使用[9],我們設想了這樣一個大規模攻擊場景,在GitHub上公布一些常用的機器學習模型,在模型中插入后門代碼,然后靜待結果。

      回顧一下,這個安全問題產生的根本原因在于Tensorflow環境中模型是一個具有可執行屬性的載體,而Tensorflow對其中的敏感操作又沒有做任何限制;同時在一般用戶甚至AI研究人員的認知中,模型文件是被視作不具有執行屬性的數據文件,更加強了這種攻擊的隱蔽性。

      我們把這個問題報告給Google后,經過多輪溝通,Google Tensorflow團隊最終不認為該問題是安全漏洞,但認為是個高危安全風險,并專門發布了一篇關于Tensorflow安全的文章[10],理由大致是Tensorflow模型應該被視作可執行程序,用戶有責任知道執行不明模型的風險,并給出了相應的安全建議。

      0x6 更進一步——發現多個傳統安全漏洞


      在對Tensorflow其他攻擊面的分析中,我們嘗試了人工審計代碼和Fuzzing的方法,又發現了多個安全漏洞,大部分屬于傳統的內存破壞型漏洞,涉及Tensorflow的圖片解析處理、模型文件解析、XLA compiler等功能,并且漏洞代碼都屬于Tensorflow框架本身,也從側面反映了Tensorflow在代碼安全上并沒有做更多的工作。

      下面是Tensorflow發布的安全公告及致謝[11],目前為止共7個安全漏洞,均為Tencent Blade Team發現,其中5個為筆者發現。



      在研究過程中,我們也注意到業界的一些類似研究,如360安全團隊對多款機器學習框架用到的第三方庫進行了安全審計,發現存在大量安全問題[12],其中多為傳統二進制漏洞類型。

      0x7 一波三折——推動Tensorflow建立漏洞處理流程


      回顧整個漏洞報告和處理流程,可謂一波三折。最初上報漏洞時,我們發現除了GitHub上的issue,Tensorflow似乎沒有其他的漏洞上報渠道,出于風險考慮,我們覺得發現的安全問題在修復之前不適合在GitHub上直接公開,最后在Google Groups發帖詢問,有一個自稱是Tensorflow開發負責人的老外回復,可以把安全問題單發給他,開始筆者還懷疑老外是不是騙子,事后證明這個人確實是Tensorflow團隊開發負責人。

      經過持續近5個月、幾十封郵件的溝通,除了漏洞修復之外,最終我們也推動Google Tensorflow團隊建立了基本的漏洞響應和處理流程。

      1)Tensorflow在GitHub上就安全問題作了特別說明Using Tensorflow Securely[10],包括安全漏洞認定范圍,上報方法(郵件報告給security@tensorflow.org),漏洞處理流程等;


      圖10 Tensorflow安全漏洞處理流程

      2)發布安全公告,包括漏洞詳情和致謝信息[11];
      3)在Tensoflow官網(tensorflow.org)增加一項內容Security[13],并鏈接至GitHub安全公告,引導用戶對安全問題的重視。



      0x8 修復方案和建議


      針對我們發現的模型機制安全風險,Google在Using Tensorflow Securely這篇安全公告中做了專門說明[10],給出了相應的安全措施:

      1)提高用戶安全意識,把Tensorflow模型視作可執行程序,這里其實是一個用戶觀念的轉變;

      2)建議用戶在沙箱環境中執行外部不可信的模型文件,如nsjail沙箱;

      3)在我們的建議下,Tensorflow在一個模型命令行工具中增加了掃描功能(tensorflow/python/tools/saved_model_cli.py),可以列出模型中的可疑操作,供用戶判斷。

      可以看出,Tensorflow團隊認為這個安全風險的解決主要在用戶,而不是Tensorflow框架本身。我們也在Blade Team的官方網站上對這個風險進行了安全預警,并命名為“Columbus” [14]。

      上文提到的其他內存破壞型漏洞,Tensorflow已在后續版本中修復,可參考安全公告[11]。

      0x9 后記


      AI安全將走向何方?我們相信AI算法安全的對抗將會持續升級,同時作為背后生產力主角的基礎設施軟件安全理應受到應有的關注,筆者希望這個小小的研究能拋磚引玉(實際上我們的研究結果也引起了一些專家和媒體的關注),期待更多安全研究者投身于此,一起為更安全的未來努力。


      0x10 參考


      [0] https://en.wikipedia.org/wiki/Generative_adversarial_network
      [1] https://www.tensorflow.org/
      [2] http://caffe.berkeleyvision.org/
      [3] http://torch.ch/
      [4] https://www.tensorflow.org/guide/extend/architecture
      [5] https://www.tensorflow.org/guide/graphs
      [6] https://www.tensorflow.org/versions/r1.12/api_docs/python/tf
      [7] https://www.tensorflow.org/versions/r1.12/api_docs/python/tf/io/write_file
      [8] https://www.tensorflow.org/versions/r1.12/api_docs/python/tf/control_dependencies
      [9] https://github.com/tensorflow/models
      [10] https://github.com/tensorflow/tensorflow/blob/master/SECURITY.md
      [11] https://github.com/tensorflow/tensorflow/blob/master/tensorflow/security/index.md
      [12] https://arxiv.org/pdf/1711.11008.pdf
      [13] https://www.tensorflow.org/community#security
      [14] https://blade.tencent.com/columbus/

      評論留言

      提交評論 您輸入的漏洞名稱有誤,請重新輸入
      放荡的寡妇