開源軟體原始碼安全缺陷分析報告 ——人工智慧類開源軟體專題
近日,CNCERT釋出了《開源軟體程式碼安全缺陷分析報告——人工智慧類開源軟體專題》。本期報告聚焦國內外知名機器學習、人工智慧類開源軟體安全開發現狀,通過分析多款知名人工智慧類開源軟體產品的安全缺陷,評估開源專案的程式碼安全控制情況。360程式碼衛士團隊為本期報告提供了技術支援。以下是報告全文:
1、概述
隨著軟體技術飛速發展,開源軟體已在全球範圍內得到了廣泛應用。資料顯示,99%的組織在其IT系統中使用了開源軟體。開源軟體的程式碼一旦存在安全問題,必將造成廣泛、嚴重的影響。為解開源軟體的安全情況,CNCERT持續對廣泛使用的知名開源軟體進行原始碼安全缺陷分析,併發布季度安全缺陷分析報告。“人工智慧”近年來發展迅猛,已成為高精尖科技創新的代名詞。本期報告聚焦國內外知名機器學習、人工智慧類開源軟體安全開發現狀,通過分析多款知名人工智慧類開源軟體產品的安全缺陷,評估開源專案的程式碼安全控制情況。選取關注度高的開源專案,結合缺陷掃描工具和人工審計的結果,對各開源專案安全性進行對比。
2、被測開源軟體
綜合考慮使用者數量、受關注程度以及更新頻率等情況,選取了20款具有代表性的人工智慧(以下簡稱AI)類開源軟體。表1列出了本次被測的開源人工智慧類軟體專案的概況。本次檢測的軟體涵蓋了C++,C#,Java,Python等程式語言。這些開源軟體專案都是國際、國內知名的,擁有廣泛使用者的軟體專案,其中不乏由知名軟體公司開發的軟體。由於這些軟體大多具有巨大的使用者群體,軟體中的安全缺陷很可能會造成嚴重的後果。
表1 被測開源軟體專案概覽
專案名稱 |
版本號 |
主要程式語言 |
功能說明 |
程式碼行數 |
叮噹(dingdang-robot) |
0.2.1 |
Python |
工作在 Raspberry Pi上的中文語音對話機器人 |
6,574 |
Serenata de Amor |
1.0.0 |
Python |
公共社會管理的AI專案 |
11,877 |
Snake |
1.0.0 |
Python |
AI 的貪吃蛇遊戲 |
3,123 |
Simple AI |
0.8.1 |
Python |
AI 演算法工具包 |
5,963 |
EasyAI |
1.0.0 |
Python |
一個AI遊戲框架 |
3,487 |
Mycroft |
0.8.5 |
Python |
可程式設計的開源語音助手 |
27,236 |
AI_Challenger |
1.0 |
Python |
開放資料集和程式設計比賽的AI挑戰平臺 |
198,422 |
OpenNERO |
1.0.0 |
C++ |
面向AI研究和教育的開放平臺 |
234,302 |
Polyworld |
2.6.0 |
C++ |
AI 仿人工生命系統 |
49,673 |
AIKIDO |
0.2.0 |
C++ |
一個解決機器人運動規劃和決策問題的C++庫 |
32,830 |
Quackle |
1.0.3 |
C++ |
填字遊戲的AI分析工具 |
13,908 |
0.9999 |
C++ |
一個深度學習開發框架 |
92,761 |
|
SUSI.AI Server |
2.1.0 |
Java |
一個智慧開源個人助理程式 |
37,400 |
gdxAi |
1.8.1 |
Java |
基於libGDX的遊戲開發框架 |
35,200 |
onyx |
1.1.4 |
Java |
一個使用人工智慧,機器學習和深度學習等技術的android庫,可讓開發人員瞭解他們在應用中顯示的內容 |
15,100 |
AIMA3e-Java |
3.0.0 |
Java |
Russell 和Norvig的AI演算法的Java實現 |
97,600 |
ABAGAIL |
1.0.0 |
Java |
機器學習和人工智慧的演算法包 |
26,700 |
Malmo |
0.35.6 |
Java |
一個基於Minecraft的AI實驗和研究平臺 |
54,100 |
OCR_densenet |
1.0.0 |
Java |
採用densenet的圖片文字識別軟體(第一屆西安交通大學人工智慧實踐大賽第一名) |
5,267 |
BrainSimulator |
0.6.0 |
C# |
AI 架構的視覺化原型設計開發平臺 |
295,300 |
3、測試內容
3.1、安全缺陷種類
本次測試涵蓋各類常見安全缺陷。根據缺陷形成的原因、被利用的可能性、造成的危害程度和解決的難度等因素進行綜合考慮,可以將常見的安全缺陷分為八類:
1、輸入驗證與表示(Input Validation and Representation)
輸入驗證與表示問題通常是由特殊字元、編碼和數字表示所引起的,這類問題的發生是由於對輸入的信任所造成的。這些問題包括:緩衝區溢位、跨站指令碼、SQL%E6%B3%A8%E5%85%A5/">SQL注入、命令注入等。
2、API誤用(API Abuse)
API是呼叫者與被呼叫者之間的一個約定,大多數的API誤用是由於呼叫者沒有理解約定的目的所造成的。當使用API不當時,也會引發安全問題。
3、安全特性(Security Features)
該類別主要包含認證、訪問控制、機密性、密碼使用和特權管理等方面的缺陷。
4、時間和狀態(Time and State)
分散式計算與時間和狀態有關。執行緒和程序之間的互動及執行任務的時間順序往往由共享的狀態決定,如訊號量、變數、檔案系統等。與分散式計算相關的缺陷包括競態條件、阻塞誤用等。
5、錯誤和異常處理缺陷(Errors)
這類缺陷與錯誤和異常處理有關,最常見的一種缺陷是沒有恰當的處理錯誤(或者沒有處理錯誤)從而導致程式執行意外終止,另一種缺陷是產生的錯誤給潛在的攻擊者提供了過多資訊。
6、程式碼質量問題(Code Quality)
低劣的程式碼質量會導致不可預測的行為。對於攻擊者而言,低劣的程式碼使他們可以以意想不到的方式威脅系統。常見的該類別缺陷包括死程式碼、空指標解引用、資源洩漏等。
7、封裝和隱藏缺陷(Encapsulation)
合理的封裝意味著區分校驗過和未經檢驗的資料,區分不同使用者的資料,或區分使用者能看到和不能看到的資料等。常見的缺陷包括隱藏域、資訊洩漏、跨站請求偽造等。
8、程式碼執行環境的缺陷(Environment)
該類缺陷是原始碼之外的問題,例如執行環境配置問題、敏感資訊管理問題等,它們對產品的安全仍然是至關重要的。
前七類缺陷與原始碼中的安全缺陷相關,它們可以成為惡意攻擊的目標,一旦被利用會造成資訊洩露、許可權提升、命令執行等嚴重後果。最後一類缺陷描述實際程式碼之外的安全問題,它們容易造成軟體的執行異常、資料丟失等嚴重問題。
3.2、安全缺陷級別
我們將原始碼的安全問題分為三種級別:高危(High)、中等(Medium)和低(Low)。衡量級別的標準包括兩個維度,置信程度(confidence)和嚴重程度(severity)。置信程度是指發現的問題是否準確的可能性,比如將每個strcpy()呼叫都標記成緩衝區溢位缺陷的可信程度很低。嚴重程度是指假設測試技術真實可信的情況下檢出問題的嚴重性,比如緩衝區溢位(buffer overflow)通常是比空指標引用(null pointer dereference)更嚴重的安全問題。將這兩個因素綜合起來可以準確的為安全問題劃分級別,如圖1所示。
圖1 缺陷級別與嚴重程度、置信程度的關係
4、開源人工智慧類軟體專案的安全缺陷情況
本部分首先展示從被測專案中檢出安全缺陷的數量,由此對被測專案的安全性進行大致的評估。然後進一步討論被測專案中安全缺陷的分佈情況,瞭解專案中出現較多的、容易被忽略的安全問題。
4.1、安全缺陷情況概覽
本部分展示被測專案查出缺陷的數量,由此對被測專案的安全性進行大致的評估。圖2分別展示了專案不同級別缺陷的數量,並按照高危缺陷數量對專案進行了排序,圖中用藍色折線圖展示了每千行包含缺陷數。
圖2 開源軟體專案缺陷情況
從中可以看出,本次選取的人工智慧類開源軟體都存在不同程度的安全問題。本次檢測從這些專案中總計發現高危缺陷173個,中危缺陷355個。缺陷數量排名靠前的專案處於極易被攻擊者利用的狀態,實際使用者需通過安裝補丁或者更新版本的方式進行修復和升級。
在所有被測軟體中,遊戲框架easyAI、視覺化AI原型開發平臺BrainSimulator和深度學習開發框架Caffe不存在高危缺陷,同時中危缺陷數量也較少,總體安全性較高。
人工智慧實驗和研究平臺Malmo在本次被測的20款軟體裡高危缺陷居多,包含64個高危缺陷和1箇中危缺陷。其中大部分高危缺陷為XML Schema問題,由於未指定元素的最大出現次數(maxOccurs),導致攻擊者可構造特定的XML文件以耗盡系統資源。
AI挑戰平臺AI_Challenger總體風險也較高,包含44個高危缺陷和2箇中危缺陷。大多數缺陷為路徑遍歷問題,由於未對使用者可控制的輸入做完善的校驗,導致攻擊者可越權訪問受保護的檔案。
此外,中高危缺陷總數最多的是AI仿人工生命系統Polyworld,包含8個高危缺陷和138箇中危缺陷。絕大部分中危缺陷是由於使用了C++的strcpy、sprintf等不安全的字串操縱函式,導致存在緩衝區溢位的風險。
考慮到專案的絕對缺陷數量可能與專案大小相關,因此本報告計算了每千行缺陷數,用該資料反映缺陷在專案中的分佈密度。根據該資料,程式碼安全性較好的專案依次是原型設計開發平臺BrainSimulator、遊戲開發框架gdxAi、深度學習開發框架Caffe和AI演算法工具AIMA3e,這些專案平均每一萬行程式碼出現1個以下的中高危缺陷。缺陷分佈密度相對較高的專案是AI仿人工生命系統Polyworld、機器人運動庫AIKIDO,這些專案平均每一千行程式碼中就會出現2-3箇中高危缺陷。
4.2、高危安全缺陷分佈情況
本部分對高危缺陷的分佈情況進行分析說明。圖3展示了被測專案中高危缺陷大類的分佈情況。資料表明,大多數缺陷為“輸入驗證”類缺陷,該類缺陷主要是由於對使用者輸入未做充分驗證導致的,易造成緩衝區溢位、路徑遍歷、跨站指令碼及各類注入問題,一旦攻擊者構造惡意輸入,可能造成任意命令執行、任意檔案讀取等嚴重安全問題。
圖3 被測專案中高危安全缺陷的分佈情況(按大類劃分)
“程式碼執行環境”類缺陷也佔據了一定份額,主要涵蓋脆弱的XML架構方面的問題,攻擊者可以利用允許無限制元素的架構,發起拒絕服務攻擊。