近日,CNCERT發布了第二期《開源軟件代碼安全缺陷分析報告》。 本期報告持續聚焦國內知名互聯網公司的軟件安全開發現狀,通過檢測公司旗下多款開源軟件產品的安全缺陷,評估各公司的代碼安全控制情況。 360代碼衛士團隊為本期報告提供了技術支持。
以下是報告全文:開源軟件源代碼安全缺陷分析報告
–探秘國內知名互聯網公司產品安全狀況第二期1、概述
隨著軟件技術飛速發展,開源軟件已在全球範圍內得到了廣泛應用。 數據顯示,從2012年起,已有超過80%的商業軟件使用開源軟件。 開源軟件的代碼一旦存在安全問題,必將造成廣泛、嚴重的影響。 為了解開源軟件的安全情況,CNCERT 持續對廣泛使用的知名開源軟件進行源代碼安全缺陷分析,並發布季度安全缺陷分析報告。
本期報告聚焦國內知名互聯網公司的軟件安全開發現狀,通過檢測公司旗下多款開源軟件產品的安全缺陷,評估各公司的代碼安全控制情況。 針對國內知名互聯網公司,選取關注度高的開源項目,結合缺陷掃描工具和人工審計的結果,對各公司的項目安全性進行評比。 2、被測開源軟件
本期報告聚焦國內知名互聯網公司和ICT 公司:華為、小米、搜狐、美團、大眾點評,綜合考慮用戶數量、受關注程度等情況,選取了這些公司旗下的20款具有代表性的開源項目, 表1列出了本次被測的開源軟件項目的概況。
表1 被測開源軟件項目概覽項目名稱版本號主要編程語言公司名稱功能說明代碼行數(L)eSDK_SSO2.1.00Java華為單點登錄軟件,提供了用戶只需要一次登錄就可以訪問所有相互信任的應用 系統的功能1,870OpenApi_Windows_Java2R1C00Java華為eSDK提供eSDKOpenApi(Java) API 可以幫助開發者通過調用REST接口對存儲設備進行資源管理36,300IoT_OceanConnect1.1Java華為OceanConnect北向RESTful接口,完成了北向應用大部分的功能3,999eSDK_FC_SDK_Java2.1.00JavaFusionCompute 是雲操作系統軟件,主要負責硬件資源的虛擬化,以及對虛擬資源、業務資源、用戶資源的集中管理149,600android_tv_metro1.0Java小米專輯和顯示項目12,859LuckyMoneyTool1.0Java搶紅包272chronos1.0Java微信後台團隊自主研發 的基於Paxos協議的多機狀態拷貝類庫3,514linden1.0Javalinden是一個建立在Lucene之上的分佈式實時搜索系統31,100Cachecloud1.3Java搜狐CacheCloud提供 一個Redis雲管理平台:實現多種類型(Redis Standalone、Redis Sentinel、Redis Cluster)自動部署、解決Redis實例碎片化現象、提供完善統計、監控、運維功能、減少運維成本和誤操作,提高機器 的利用率,提供靈活的伸縮性,提供方便的接入客戶端92,600jedis-2.8.0-stat2.8.x and 3.0.xJava精簡版redis java客戶端26,800sohutv.github.io1.0Javascript高可用, 高性能,分佈式有序隊列7,007pushcloud-demo1.0PHP/Javapushcloud-demo展示模塊8,460cat1.3.8Javascript大眾點評CAT基於Java開發的實時應用監控平台,包括實時應用監控,業務監控484,900Pigeon2.9.7JavaPigeon是 一個分佈式服務通信框架(RPC),在美團點評內部廣泛使用,是美團點評最基礎的底層框架之一58,600Zebra2.8.3JavaZebra是點評內部使用的數據庫訪問層中間件33,500dianping-open-sdk1 .0Java大眾點評網的API5,679Robust0.4.72Java美團Robust是新一代熱更新系統4,181walle1.1.5JavaAndro id Signature V2 Scheme簽名下的渠道包打包器5,012DBProxy0.0.2CDBProxy是由美團點評公司技術工程部DBA團隊(北京)開發維護的一個基於MySQL協議的數據中間層80,300SQLAdvisor1.0.0CSQLAdvisor是由美團點評公司 技術工程部DBA團隊開發維護的一個分析SQL給出索引優化建議的工具48,89003、測試內容3.1、安全缺陷種類
本次測試涵蓋各類常見安全缺陷。 根據缺陷形成的原因、被利用的可能性、造成的危害程度和解決的難度等因素進行綜合考慮,可以將常見的安全缺陷分為八類:
1、輸入驗證與表示(Input Validation and Representation)
輸入驗證與表示問題通常是由特殊字符、編碼和數字表示所引起的,這類問題的發生是由於對輸入的信任所造成的。 這些問題包括:緩衝區溢出、跨站腳本、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、安全缺陷級別
圖1 缺陷級別與嚴重程度、置信程度的關係4、開源軟件項目的安全缺陷情況
本報告僅針對檢出的高危、中危缺陷進行統計和分析。 本部分首先展示從被測項目中檢出安全缺陷的數量,並由此對國內互聯網公司的產品安全性進行比較;然後進一步討論各公司被測項目中安全缺陷的分佈情況,了解各公司出現較 多的缺陷類型;最後結合上一期報告中國外互聯網公司產品安全性評估數據,對國內外互聯網公司的產品安全情況展開對比。 4.1、安全缺陷情況概覽
本部分展示被測項目查出缺陷的數量,由此對被測項目的安全性進行大致的評估。 圖2展示了各個項目高危、中危缺陷的數量,並按照高危缺陷數量對項目進行了排序,圖中用藍色折線圖展示了每千行包含缺陷數。
在本次被測軟件中,華為的軟件OpenApi_Windows_Java(通過調用接口對存儲資源進行管理)不存在高危缺陷,同時中危缺陷數量也較少,軟件安全質量相對較好。 小米的軟件LuckyMoneyTool(搶紅包)雖然也不存在高危缺陷,中危缺陷數量也少,但是由於軟件代碼行數過少,不具備一定的統計意義。
華為的物聯網北向應用GUI程序IoT_OceanConnect在本次被測的20款軟件中高危缺陷居多。 在59個高危缺陷中,存在35個http響應截斷問題,可能導致攻擊者註入自定義的http頭,存在10個代碼質量問題(用戶信息未得到充分保護),存在14個http參數污染的問題 。
大眾點評的三款開源軟件,cat、pigeon也包含了數量較多的高危缺陷。 在兩款軟件總計107個高危缺陷中,除包括跨站腳本(21個)、http響應截斷(12個)、不安全的隨機數(10個)等常見缺陷外,還包括流資源未釋放, API誤用,空引用等安全缺陷。
圖2 開源軟件項目缺陷情況
中高危缺陷總數最多的是來自大眾點評的數據訪問中間件zebra,總計203個高中危缺陷中包含142個數據庫資源未釋放,主要是程序創建數據庫對象資源後未進行合理釋放,導致攻擊者可通過 數據庫連接池耗盡的方式發起拒絕服務攻擊。
考慮到項目的絕對缺陷數量可能與項目大小相關,因此本報告計算了每千行缺陷數,用該數據反映缺陷在項目中的分佈密度。 根據該數據,代碼安全性最好的前5個項目依次是華為的eSDK_FC_SDK_Java(0.07),搜狐的sohuTV(0.07)、PushCloud(0.11),美團的SQLAdvisor(0.12)和大眾點評的cat(0.14) 。 而缺陷分佈密度相對較高的項目是華為的IoT_OceanConnect(10.73)、eSDK_SSO(3.52),大眾點評的zebra(4.53)、dianping_open_sdk(2.73)和小米的Lucky MoneyTool(3.08)。 可以看到,不同項目的缺陷密度差別巨大,其中華為的eSDK_FC_SDK_Java項目平均大約每1.5萬行代碼會出現一個缺陷,而同樣是華為的IoT_OceanConnect項目平均大約每100行代碼就會出現一個缺陷。 4.2、各公司產品安全性對比
本部分對不同互聯網公司的產品安全性概況進行對比,圖3展示了每個公司在本次測試中檢測出的高危、中危缺陷總數,以及以公司為單位統計的每千行缺陷數。
圖3 互聯網公司產品安全性對比圖
由於每個公司的項目被檢測出缺陷的絕對數量與項目數量、項目大小相關,不能直接反映公司的產品安全性,因此本部分重點關注每千行缺陷數。 根據該數據,本期報告抽取的5家IOT和互聯網公司的開源項目均有較好的軟件質量控制,每千行代碼缺陷數在0.18至0.53之間,屬於合理範圍內。 4.3、各公司高危缺陷分佈情況
本部分展示各公司高危缺陷的分佈情況,了解各公司出現較多的高危缺陷類型。 圖4展示了各公司的高危缺陷類型和分佈情況,為了方便展示,統一將每個公司項目中出現5次以下的高危缺陷類型歸入“其他”。 可以看到,各公司的高危缺陷分佈情況不盡相同。 相對出現較為普遍的缺陷類型為“資源未釋放”、“空指針解引用”、“不安全的隨機性”。
圖4 各公司高危缺陷分佈情況4.4、各公司中危缺陷分佈情況
本部分繼續展示各公司中危缺陷的分佈情況,了解各公司出現較多的中危缺陷類型。 如圖5所示,各公司的中危缺陷分佈情況不盡相同。 為了方便展示,統一將每個公司項目中出現5次以下的中危缺陷類型歸入“其他”。
圖5 各公司中危缺陷分佈情況
其中,相對出現較普遍的缺陷類型為“資源未釋放”、“內存洩露”。 這兩類問題類似,都會導致系統資源的持續消耗,進而引發性能下降、甚至系統崩潰的問題。 而內存洩露特指那些由於操作不當導致內存無法被回收的情況,例如聲明了非靜態的內部類等。 4.5、國內外互聯網公司產品安全性對比
在最近三期的開源軟件安全缺陷分析報告中,選取了國內外知名互聯網公司旗下的幾十款開源軟件項目進行了安全性評估。 結合上兩期報告的評估結果,本部分將國內外互聯網公司的產品安全缺陷和其軟件自身的安全性進行了對比。 對比參考數據是軟件安全密度。 圖6展示了軟件安全缺陷和軟件安全密度之間的對比關係。 可以明顯看到,軟件自身的安全性和軟件代碼中存在的安全缺陷數量有明顯的正相關性。 安全缺陷越多的軟件,軟件自身的安全性和健壯性越差。