物聯網軟體專題 | 開源軟體原始碼安全缺陷分析報告
近日,CNCERT釋出了《開源軟體程式碼安全缺陷分析報告——物聯網軟體專題》。本期報告選取全球20款知名物聯網軟體進行原始碼安全缺陷分析,結合缺陷分析工具和人工審計的結果,評估專案的安全性。360程式碼衛士團隊為本期報告提供了技術支援。
以下是報告全文:
一、概述
隨著軟體技術飛速發展,開源軟體已在全球範圍內得到了廣泛應用。資料顯示,99%的組織在其IT系統中使用了開源軟體。開源軟體的程式碼一旦存在安全問題,必將造成廣泛、嚴重的影響。為了解開源軟體的安全情況,CNCERT持續對廣泛使用的知名開源軟體進行原始碼安全缺陷分析,併發布季度安全缺陷分析報告。
自2005年國際電信聯盟(ITU)正式提出“物聯網(IoT)”這一概念以來,物聯網在全球範圍內迅速獲得認可。隨著物聯網技術的發展創新,大量智慧家居和可穿戴裝置進入了人們的生活,“萬物互聯”成為全球網路未來發展的重要方向。根據Gartner報告預測,2020年全球物聯網裝置數量將高達260億個。然而,由於安全標準滯後,以及智慧裝置製造商缺乏安全意識和投入,物聯網已經埋下極大隱患,為個人隱私、企業資訊保安甚至國家關鍵基礎設施帶來嚴重的安全威脅。
本期報告選取全球20款知名物聯網軟體進行原始碼安全缺陷分析,結合缺陷分析工具和人工審計的結果,評估專案的安全性。從測評結果來看,與往期其他領域開源軟體相比,物聯網類軟體的安全缺陷較多,潛在的安全問題不容忽視。同時,技術人員隨機抽取安全缺陷進行人工利用,發現存在能夠被證實的安全漏洞,通過漏洞能夠獲取物聯網雲端伺服器許可權,一旦該漏洞被黑客利用,則存在物聯網裝置被遠端操縱的安全風險。
二、被測開源軟體
綜合考慮使用者數量、受關注程度以及更新頻率等情況,選取了20款具有代表性的物聯網類開源軟體。表1列出了本次被測的開源物聯網軟體專案的概況,專案按照Github上Star的數量降序排列。本次檢測的軟體涵蓋了C、C++、Java、JavaScript(JS)等程式語言。這些開源軟體專案都是國際知名的,擁有廣泛使用者的軟體專案,其中不乏由知名軟體公司開發的軟體。由於這些軟體大多具有巨大的使用者群體,軟體中的安全缺陷很可能會造成嚴重的後果。
表1 被測開源軟體專案概覽
專案名稱 | 版本號 | 主要程式語言 | 功能說明 | 程式碼行數 | Github star 數 |
---|---|---|---|---|---|
Serverless | master | JS | 使用無伺服器架構構建Web、移動、物聯網應用的框架 | 20,150 | 26,124 |
Node-RED | master | JS | 用於連線物聯網的視覺化工具 | 100,840 | 6,447 |
JerryScript | V1.0 | C | 用於物聯網的超輕量級JavaScript引擎 | 97,559 | 3,223 |
ArduinoJson | V5.13.4 | C++ | 物聯網的JSON庫 | 27,583 | 3,078 |
POCO | V1.9.0 | C++ | 支援桌面、伺服器、移動、物聯網、嵌入式系統上的聯網應用開發的跨平臺的C++函式庫 | 526,721 | 2,929 |
CrateDB | master | Java | 一個分散式SQL資料庫,可以輕鬆實時儲存和分析大量機器資料 | 314,984 | 2,131 |
ThingsBoard | master | Java | 一個用於資料收集、處理、視覺化和裝置管理的物聯網平臺 | 112,704 | 1,987 |
RIOT | 2018.10 版 | C | 支援常見物聯網裝置的實時、多執行緒的作業系統 | 1,341,539 | 1,979 |
Blynk Library | V0.5.4 | C++ | 嵌入式硬體的Blynk庫。Blynk是一個物聯網應用平臺,旨在簡化物聯網的移動或者Web應用構建。 | 17,206 | 1,831 |
IoT.js | master | JS | 使用JavaScript的物聯網平臺 | 42,910 | 1,826 |
OpenThread | V2.0.0 | C++ | OpenThread 是Thread網路協議的開源實現 | 661,696 | 1,713 |
Blynk Server | V0.39.6 | Java | 基於Netty的Java Server,主要用於在Blynk移動應用和嵌入式裝置之間傳遞訊息。 | 75,555 | 1,097 |
Kaa | master | Java | 開源中介軟體平臺,用於構建、管理和整合聯網的產品和裝置 | 461,511 | 984 |
MySensors | V2.3.0 | C++ | 專注於提供智慧居家和物聯網的DIY服務 | 17,788 | 871 |
SmartHome | master | Java | 智慧家居的靈活框架 | 801,053 | 745 |
OpenIoT | develop | Java | 物聯網中介軟體的基礎架構,用於支撐聯網裝置的資料採集、流量清洗、事件處理演算法的靈活配置和部署 | 269,387 | 369 |
Freedomotic | V5.6.0 | Java | 開放物聯網框架 | 259,708 | 258 |
Link Kit SDK | V2.3.0 | C | 阿里雲物聯網套件 | 56,384 | 257 |
SiteWhere | master | Java | 一個面向物聯網的工業級開源應用支援平臺 | 216,796 | 235 |
IotXmpp | master | Java | 基於XMPP的安卓客戶端,實現與物聯網節點的互動 | 130,607 | 118 |
三、測試內容
3.1 安全缺陷種類
本次測試涵蓋各類常見安全缺陷。根據缺陷形成的原因、被利用的可能性、造成的危害程度和解決的難度等因素進行綜合考慮,可以將常見的安全缺陷分為八類:
1、輸入驗證
輸入驗證與表示問題通常是由特殊字元、編碼和數字表示所引起的,這類問題的發生是由於對輸入的信任所造成的。這些問題包括:緩衝區溢位、跨站指令碼、SQL注入、命令注入等。
2、API使用
API是呼叫者與被呼叫者之間的一個約定,大多數的API誤用是由於呼叫者沒有理解約定的目的所造成的。當使用API不當時,也會引發安全問題。
3、安全特性
該類別主要包含認證、訪問控制、機密性、密碼使用和特權管理等方面的缺陷。
4、平行計算
執行緒和程序之間的互動及執行任務的時間順序往往由共享的狀態決定,如訊號量、變數、檔案系統等。與分散式計算相關的缺陷包括競態條件、阻塞誤用等。
5、錯誤和異常處理
這類缺陷與錯誤和異常處理有關,最常見的一種缺陷是沒有恰當的處理錯誤(或者沒有處理錯誤)從而導致程式執行意外終止,另一種缺陷是產生的錯誤給潛在的攻擊者提供了過多資訊。
6、程式碼質量
低劣的程式碼質量會導致不可預測的行為。對於攻擊者而言,低劣的程式碼使他們可以以意想不到的方式威脅系統。常見的該類別缺陷包括死程式碼、空指標解引用、資源洩漏等。
7、封裝和隱藏
合理的封裝意味著區分校驗過和未經檢驗的資料,區分不同使用者的資料,或區分使用者能看到和不能看到的資料等。常見的缺陷包括隱藏域、資訊洩漏、跨站請求偽造等。
8、程式碼執行環境
該類缺陷是原始碼之外的問題,例如執行環境配置問題、敏感資訊管理問題等,它們對產品的安全仍然是至關重要的。
前七類缺陷與原始碼中的安全缺陷相關,它們可以成為惡意攻擊的目標,一旦被利用會造成資訊洩露、許可權提升、命令執行等嚴重後果。最後一類缺陷描述實際程式碼之外的安全問題,它們容易造成軟體的執行異常、資料丟失等嚴重問題。
3.2 安全缺陷級別
我們將原始碼的安全問題分為三種級別:高危(High)、中等(Medium)和低(Low)。衡量級別的標準包括兩個維度,置信程度(confidence)和嚴重程度(severity)。置信程度是指發現的問題是否準確的可能性,比如將每個strcpy()呼叫都標記成緩衝區溢位缺陷的可信程度很低。嚴重程度是指假設測試技術真實可信的情況下檢出問題的嚴重性,比如緩衝區溢位(buffer overflow)通常是比空指標引用(null pointer dereference)更嚴重的安全問題。將這兩個因素綜合起來可以準確的為安全問題劃分級別,如圖1所示。
圖1 缺陷級別與嚴重程度、置信程度的關係
四、開源物聯網軟體專案的安全缺陷情況
本部分首先展示從被測專案中檢出安全缺陷的數量,由此對被測專案的安全性進行大致的評估。然後進一步討論被測專案中安全缺陷的分佈情況,瞭解專案中出現較多的、容易被忽略的安全問題。
4.1 安全缺陷情況概覽
本部分展示被測專案查出缺陷的數量,由此對被測專案的安全性進行大致的評估。圖2分別展示了專案不同級別缺陷的數量,並按照高危缺陷數量對專案進行了排序,圖中用藍色折線圖展示了每千行程式碼包含缺陷數,紅色折線圖為專案在Github上的star的數量。
圖2 開源軟體專案缺陷情況
從中可以看出,本次選取的物聯網類開源軟體都存在不同程度的安全問題。本次檢測從這些專案中總計發現高危缺陷667個,中危缺陷3702個。缺陷數量排名靠前的專案處於極易被攻擊者利用的狀態,實際使用者需通過安裝補丁或者更新版本的方式進行修復和升級。
在所有被測軟體中,物聯網應用平臺Blynk的函式庫Blynk Library的安全性最高(無高危缺陷,有3箇中危缺陷)。物聯網應用框架Serverless、物聯網開發JS平臺IoT.js、物聯網實時作業系統RIOT的缺陷總數較少,總體安全性較高。
物聯網中介軟體基礎架構平臺OpenIoT在本次被測的20款軟體裡高危缺陷居多,包含370個高危缺陷和669箇中危缺陷。其中,包括556個輸入驗證類缺陷,其中283個缺陷為跨站指令碼問題(高危),344處資源未釋放問題(中危),提示該專案應加強對安全缺陷的管理,特別是加強對來自信任邊界之外的使用者輸入的過濾和驗證;同時,應進一步提升程式碼質量,避免攻擊者利用資源洩露的問題發起拒絕服務攻擊。
中高危缺陷總數最多的是聯網應用開發函式庫POCO,包含1個高危缺陷,和1380箇中危缺陷。其中,專案被檢測出748處“將位元位數不同的運算元進行位運算”、300處“使用了不安全的記憶體拷貝函式”、234處“在對字元型別比較時未明確其符號屬性”問題。這些問題會降低程式的穩定性和可移植性,可能會導致程式發生非預期的行為,同時也增加了安全隱患。建議專案的開發者提升安全意識,可在開發過程中使用程式碼缺陷掃描工具提升程式碼質量和安全性。
考慮到專案的絕對缺陷數量可能與專案大小相關,因此本報告計算了每千行缺陷數,用該資料反映缺陷在專案中的分佈密度。根據該資料,物聯網實時作業系統RIOT每千行缺陷數僅為0.002,平均每10萬行程式碼出現1個以下的中高危缺陷,為本次被測軟體中安全缺陷密度最低的被測專案。此外,程式碼安全缺陷密度較低的專案有物聯網應用框架Serverless、物聯網開發JS平臺IoT.js,這些專案平均每一萬行程式碼出現1個以下的中高危缺陷。安全缺陷分佈密度相對較高的專案是物聯網DIY工具MySensors(6.97)、物聯網中介軟體基礎架構平臺OpenIoT(3.79)、物聯網的JS引擎JerryScript(3.53),這些專案平均每一千行程式碼中就會出現數箇中高危缺陷。
4.2 高危安全缺陷分佈情況
本部分對高危缺陷的分佈情況進行分析說明。圖3展示了被測專案高危缺陷大類的分佈情況。資料表明,絕大多數缺陷為“輸入驗證”類缺陷,該類缺陷主要是由於對使用者輸入未做充分驗證導致的,易造成緩衝區溢位、路徑遍歷、跨站指令碼及各類注入缺陷,一旦攻擊者構造惡意輸入,可能造成任意命令執行、任意檔案讀取等嚴重安全問題。
圖3 被測專案中高危安全缺陷的分佈情況(按大類劃分)
圖4進一步展示了被測專案中各種具體的高危安全缺陷的分佈情況。為方便展示,將出現不超過10次的缺陷統一歸入“其他”,主要包括越界訪問(9個)、硬編碼密碼(6個)等問題。在被測的20個專案中,出現較多的幾類具體缺陷依次是跨站指令碼(488個)、路徑遍歷(76個)和SQL注入(53個)。由於本期被測軟體主要為物聯網應用開發框架,提供物聯網伺服器端服務,這些缺陷將極大的提升伺服器被攻擊者獲取控制權的風險,從而導致物聯網裝置被惡意操控、使用者個人隱私洩露的風險。
圖4 被測專案中高危安全缺陷的分佈情況(按具體缺陷劃分)
4.3 安全缺陷總體分佈情況
上文針對被測專案中的高危缺陷的檢出情況對專案的安全狀況進行了分析。通常來說,與高危缺陷相比,中危缺陷在實際執行環境中的危害相對較小,但仍不容忽視,且能在一定程度上反映出專案的程式碼質量、開發人員對程式碼安全問題的重視程度等。為了更全面的瞭解被測專案的安全狀況,本節進一步展示包括中危缺陷在內的安全缺陷的總體分佈情況。
圖5展示了被測專案中安全缺陷大類的分佈情況。與高危級別的缺陷分佈情況相比,程式碼質量類、API使用類缺陷佔比大幅提升。專案中存在大量的“不當的位運算”、“不當的字元比較”、“資源未釋放”、“使用不安全的函式”等問題,集中反映出開發者的不良程式設計習慣。與輸入驗證類問題相比,這類問題被攻擊者利用的門檻相對較高,但一旦被利用,仍然會發生拒絕服務、執行任意命令等嚴重風險。
圖5 被測專案中的中高危安全缺陷的分佈情況(按大類劃分)
表2進一步展示了被測專案中的各種具體的中高危安全缺陷的分佈情況。由於本次被檢測出的缺陷數量較大,共出現了85種中高危缺陷,為方便閱讀,僅在表中列出出現50次以上的缺陷種類。
表2 被測專案中的中高危安全缺陷的分佈情況
(按具體安全缺陷種類劃分)
中高危缺陷種類 | 出現頻次 |
---|---|
將位元位數不同的運算元進行位運算 | 1,076 |
跨站指令碼 | 571 |
資源未釋放 | 562 |
不安全的記憶體拷貝函式 | 352 |
不當的字元型別比較 | 256 |
空指標解引用 | 157 |
不安全的字串處理函式 | 132 |
路徑遍歷 | 98 |
SQL 注入 | 97 |
Servlet 的執行緒安全問題 | 90 |
XML 外部實體注入 | 90 |
隱私洩漏 | 63 |
不當的格式化字串 | 62 |
硬編碼密碼 | 53 |
未經檢查的迴圈條件 | 52 |
五、本年度專案安全橫向對比
本部分將本期被測的物聯網類軟體專案與本年度往期被測的人工智慧類、開發框架類軟體從平均每千行缺陷數的角度進行了橫向對比。
圖6 2018年度不同領域被測軟體每千行缺陷數對比
如圖6所示,物聯網類的軟體安全缺陷密度較高,從某種程度上反應出智慧裝置製造商的安全意識相對薄弱,提示物聯網類開發者應加強對程式碼安全性的重視,並切實採取手段提升軟體安全性。
六、缺陷驗證情況
對於本次檢測出的安全缺陷,報告編制組隨機抽取缺陷進行人工利用,發現存在能夠被證實的安全漏洞,本部分以Blynk Server路徑遍歷漏洞為例進行說明。Blynk Server是物聯網伺服器端元件,主要用於在Blynk移動應用和嵌入式裝置之間傳遞訊息。
圖7 Blynk Server(版本0.39.6)路徑遍歷漏洞獲取檔案截圖
圖7展示了存在問題的程式碼片段,程式碼直接讀取使用者輸入的URI(188行),未做任何驗證和過濾就直接進行檔案讀取(210行),使得使用者可通過“../”實現對伺服器檔案系統的路徑遍歷,從而可以獲取任意檔案內容。例如,如圖8所示,通過URL“/static/js/../../../../../../../../etc/passwd”即可獲得系統賬戶檔案等敏感內容。由於Blynk Server主要用於在移動應用與物聯網裝置的微控制面板之間傳遞訊息,因此一旦攻擊者獲取了伺服器許可權,將能夠截獲所有來自物聯網裝置的訊息,從而導致物聯網裝置所有者的個人隱私洩露問題;此外,攻擊者也能夠通過篡改、操控傳送至物聯網裝置的指令,實現對物聯網裝置的遠端操控。
該漏洞得到了Blynk Server開發者確認,並獲得了CVE確認(CVE-2018-17785),該漏洞在0.39.13及之後的版本中得到修復。建議軟體的使用者儘快更新到最新版本,以避免不必要的安全風險。