開(kāi)源漏洞長(cháng)期普遍存在,軟件供應鏈挑戰我國關(guān)基設施安全
近年來(lái),針對軟件供應鏈的安全攻擊事件一直呈快速增長(cháng)態(tài)勢,造成的危害越來(lái)越嚴重,防范軟件供應鏈安全風(fēng)險,已經(jīng)迫在眉睫;開(kāi)源軟件漏洞頻現:截至2020年底,CVE/NVD、CNNVD、CNVD等公開(kāi)漏洞庫中共收錄開(kāi)源軟件相關(guān)漏洞41342個(gè),其中高達13%(5366個(gè))為2020年度新增漏洞;研究發(fā)現:近9成軟件項目存在已知開(kāi)源軟件漏洞;平均每個(gè)軟件項目存在66個(gè)已知開(kāi)源軟件漏洞;影響最廣的開(kāi)源軟件漏洞存在于44.3%的軟件項目中;15年前開(kāi)源軟件漏洞仍存在于多個(gè)軟件項目中。近期,安全實(shí)驗室發(fā)布《2021年中國軟件供應鏈安全綜合分析報告》。報告主要包括國內企業(yè)自主開(kāi)發(fā)源代碼安全狀況分析、開(kāi)源軟件生態(tài)發(fā)展與安全狀況分析、國內企業(yè)軟件開(kāi)發(fā)中開(kāi)源軟件應用狀況分析、典型應用系統供應鏈安全風(fēng)險實(shí)例分析、總結及建議等五個(gè)方面。
國內企業(yè)自主開(kāi)發(fā)源代碼安全狀況
源代碼是軟件的原始形態(tài),位于軟件供應鏈的源頭。源代碼安全是軟件供應鏈安全的基礎,其地位非常關(guān)鍵和重要。
2020年全年,奇安信代碼安全實(shí)驗室對2001個(gè)國內企業(yè)自主開(kāi)發(fā)的軟件項目源代碼進(jìn)行了安全缺陷檢測,檢測的代碼總量為335011173行,共發(fā)現安全缺陷3387642個(gè),其中高危缺陷361812個(gè),整體缺陷密度為10.11個(gè)/千行,高危缺陷密度為1.08個(gè)/千行。
1、編程語(yǔ)言分布情況
在被檢測的2001個(gè)國內企業(yè)自主開(kāi)發(fā)的軟件項目中,使用數量排名前3的編程語(yǔ)言為Java、PHP、C/C++,對應的軟件項目數量分別為1492個(gè)、204個(gè)和97個(gè)??梢钥闯?,相關(guān)國內企業(yè)在進(jìn)行軟件開(kāi)發(fā)時(shí)的首選語(yǔ)言是Java語(yǔ)言,占比高達75%。編程語(yǔ)言的總體分布情況如下圖所示。
圖片
2、典型安全缺陷檢出情況
輸入驗證、路徑遍歷、跨站腳本、注入、NULL引用、資源管理、密碼管理、API誤用、配置管理、日志偽造等十類(lèi)安全缺陷是程序員在編寫(xiě)軟件代碼時(shí)經(jīng)常會(huì )出現的典型安全缺陷。
典型安全缺陷的檢出率可以體現出軟件源代碼的基本安全狀況(檢出率指含有某類(lèi)缺陷的軟件項目數占軟件項目總數的比例)。在被檢測的2001個(gè)軟件項目中,十類(lèi)典型安全缺陷的總體檢出率為77.8%,每類(lèi)典型缺陷的檢出率及排名如下表所示。
開(kāi)源軟件生態(tài)發(fā)展與安全狀況
Gartner表示,現代軟件大多數是被“組裝”出來(lái)的,不是被“開(kāi)發(fā)”出來(lái)的。根據知名研究機構Forrester統計,軟件開(kāi)發(fā)中,80~90%的代碼來(lái)自于開(kāi)源軟件。因此,現代軟件的源代碼絕大多數是混源代碼,由企業(yè)自主開(kāi)發(fā)的源代碼和開(kāi)源軟件代碼共同組成。開(kāi)源軟件是現代軟件開(kāi)發(fā)最基礎的原材料,與企業(yè)自主開(kāi)發(fā)的源代碼所處的軟件供應鏈環(huán)節相同,也位于軟件供應鏈的源頭,其代碼自身的安全狀況,會(huì )直接影響最終軟件的安全性。
報告從開(kāi)源軟件生態(tài)發(fā)展狀況、開(kāi)源軟件源代碼安全狀況、開(kāi)源軟件公開(kāi)報告漏洞狀況、開(kāi)源軟件活躍度狀況等四個(gè)方面對2020年開(kāi)源軟件生態(tài)發(fā)展與安全狀況進(jìn)行綜合分析。
1、開(kāi)源軟件生態(tài)發(fā)展狀況分析
據奇安信代碼安全實(shí)驗室監測和統計,2019年底和2020年底,主流開(kāi)源軟件包生態(tài)系統中開(kāi)源項目總量分別為2841314個(gè)和3814194個(gè),一年間增長(cháng)了34.2%;截至2020年底,主流開(kāi)源軟件包生態(tài)系統中平均每個(gè)開(kāi)源項目有10.2個(gè)版本??梢钥闯?,2020年開(kāi)源軟件生態(tài)更加繁榮,整體發(fā)展非常迅猛。
本報告中對八個(gè)典型的開(kāi)源軟件包生態(tài)系統進(jìn)行了進(jìn)一步的分析和比較,這八個(gè)包生態(tài)系統為Maven、NPM、Packagist、Pypi、Godoc、Nuget、Rubygems、Swift,具體分析如下。
NPM包生態(tài)項目數量最多,Godoc包生態(tài)增速最快。八個(gè)典型的開(kāi)源軟件包生態(tài)系統中開(kāi)源項目數量和增長(cháng)率情況如下圖所示,其中開(kāi)源項目數量最多的是NPM包生態(tài)系統,截至2020年底,其開(kāi)源項目數量達到了1559835個(gè);開(kāi)源項目數量增速最快的是Godoc包生態(tài)系統,2020年一年間的項目總量增速達到了36.2%。
Maven、Nuget、NPM包生態(tài)系統的開(kāi)源項目開(kāi)發(fā)者比較“勤奮”,開(kāi)源項目的平均版本數超過(guò)11個(gè)。截至2020年底,八個(gè)典型的開(kāi)源軟件包生態(tài)系統的開(kāi)源項目數量和版本數量如下表所示。其中,Maven包生態(tài)系統平均每個(gè)開(kāi)源項目有18.0個(gè)版本,Nuget包生態(tài)系統平均每個(gè)開(kāi)源項目有11.7個(gè)版本,NPM包生態(tài)系統平均每個(gè)開(kāi)源項目有11.0個(gè)版本。
2、開(kāi)源軟件源代碼安全狀況分析
奇安信代碼安全實(shí)驗室于2015年初發(fā)起了“奇安信開(kāi)源項目檢測計劃”,該計劃是一項針對開(kāi)源軟件項目的公益性安全檢測計劃,旨在讓廣大開(kāi)發(fā)者關(guān)注和了解開(kāi)源軟件的安全問(wèn)題,提高軟件安全開(kāi)發(fā)意識和技能。
2020年全年,“奇安信開(kāi)源項目檢測計劃”對1364個(gè)開(kāi)源軟件項目的源代碼進(jìn)行了安全檢測,代碼總量為124296804行,共發(fā)現安全缺陷1859129個(gè),其中高危缺陷117738個(gè)。2020年檢測的1364個(gè)開(kāi)源軟件項目整體缺陷密度為14.96個(gè)/千行,高危缺陷密度為0.95個(gè)/千行。
(1)編程語(yǔ)言分布情況
2020年檢測的1364個(gè)開(kāi)源項目中,一共涉及到7種編程語(yǔ)言,分別是Java、C/C++、Python、OC、Go、JavaScript、PHP,編程語(yǔ)言的分布情況如下圖所示。
(2)典型安全缺陷檢出情況
輸入驗證、路徑遍歷、跨站腳本、注入、NULL引用、資源管理、密碼管理、API誤用、配置管理、日志偽造等十類(lèi)安全缺陷是程序員在編寫(xiě)軟件代碼時(shí)經(jīng)常會(huì )出現的典型安全缺陷。
典型安全缺陷的檢出率可以體現出軟件源代碼的基本安全狀況(檢出率指含有某類(lèi)缺陷的軟件項目數占軟件項目總數的比例)。在2020年檢測的1364個(gè)開(kāi)源軟件項目中,十類(lèi)典型安全缺陷的總體檢出率為56.3%,每類(lèi)典型缺陷的檢出率及排名如下表所示。
3、開(kāi)源軟件公開(kāi)報告漏洞狀況分析
據奇安信代碼安全實(shí)驗室監測與統計,截至2020年底,CVE/NVD、CNNVD、CNVD等公開(kāi)漏洞庫中共收錄開(kāi)源軟件相關(guān)漏洞41342個(gè),其中5366個(gè)為2020年度新增漏洞。
(1)大型開(kāi)源項目漏洞總數及年度增長(cháng)TOP20
截至2020年底,歷史漏洞總數排名前20的大型開(kāi)源項目信息如下表所示。
2020年一年間,公開(kāi)報告漏洞數量增長(cháng)排名前20的大型開(kāi)源項目信息如下表所示。
(2)主流開(kāi)源軟件包生態(tài)系統漏洞總數及年度增長(cháng)TOP20
截至2020年底,主流開(kāi)源軟件包生態(tài)系統中歷史漏洞總數排名前20的開(kāi)源軟件信息如下表所示。
2020年一年間,主流開(kāi)源軟件包生態(tài)系統中公開(kāi)報告漏洞數量增長(cháng)排名前20的開(kāi)源軟件信息如下表所示
4、開(kāi)源軟件活躍度狀況分析
活躍度也是衡量開(kāi)源軟件安全性的一個(gè)重要維度。不活躍的開(kāi)源軟件,無(wú)論是更新頻率很低,或者被廢棄,一旦出現安全漏洞,難以得到及時(shí)的修復,安全風(fēng)險很高;活躍的開(kāi)源軟件中,如果其版本更新發(fā)布的頻率過(guò)高,同樣會(huì )增加使用者運維的成本和安全風(fēng)險。在選擇使用開(kāi)源軟件時(shí),應該充分考慮這兩個(gè)因素。
本報告中分析了2020年主流開(kāi)源軟件包生態(tài)系統中開(kāi)源軟件的版本更新情況,可以一定程度上體現當前開(kāi)源軟件活躍度的整體狀況。
(1)61.6%的開(kāi)源軟件項目處于不活躍狀態(tài)
我們將一年內未更新發(fā)布過(guò)版本的開(kāi)源軟件項目定義為不活躍項目。2020年全年,主流開(kāi)源軟件包生態(tài)系統中不活躍的開(kāi)源軟件項目數量為2347794個(gè),占比達到61.6%。
本報告中對八個(gè)典型的開(kāi)源軟件包生態(tài)系統進(jìn)行了進(jìn)一步的分析和比較,這八個(gè)包生態(tài)系統為Maven、NPM、Packagist、Pypi、Godoc、Nuget、Rubygems、Swift,其中NPM的不活躍項目數量最多,達到1018533個(gè),Rubygems的不活躍項目比例最高,占比達到86.5%,具體數據見(jiàn)下表。
(2)13000多個(gè)開(kāi)源軟件一年內更新發(fā)布超過(guò)100個(gè)版本
2020年全年,主流開(kāi)源軟件包生態(tài)系統中,更新發(fā)布100個(gè)以上版本的開(kāi)源項目有13411個(gè)。前述八個(gè)典型的開(kāi)源軟件包生態(tài)系統中,一年內更新發(fā)布超過(guò)100個(gè)版本的項目數量見(jiàn)下表。
國內軟件開(kāi)發(fā)中開(kāi)源軟件應用狀況
現代軟件的源代碼絕大多數是混源代碼,由企業(yè)自主開(kāi)發(fā)的源代碼和開(kāi)源軟件代碼共同組成。本章內容將針對國內企業(yè)在進(jìn)行軟件開(kāi)發(fā)工作時(shí),使用開(kāi)源軟件的具體情況進(jìn)行分析。主要回答兩個(gè)問(wèn)題:一是國內企業(yè)在軟件開(kāi)發(fā)中是否使用以及使用了多少開(kāi)源軟件?二是其使用的開(kāi)源軟件是否存在安全問(wèn)題?
2020年全年,奇安信代碼安全實(shí)驗室對2557個(gè)國內企業(yè)軟件項目中使用開(kāi)源軟件的情況進(jìn)行了分析,這些軟件項目的應用領(lǐng)域涉及政府、金融、能源等重要行業(yè)。分析發(fā)現,國內企業(yè)在軟件開(kāi)發(fā)中普遍使用存在已知漏洞的開(kāi)源軟件,存在巨大的軟件供應鏈安全風(fēng)險。具體分析數據如下。
1、開(kāi)源軟件總體使用情況分析
(1)國內企業(yè)軟件項目100%使用開(kāi)源軟件
在被分析的2557個(gè)國內企業(yè)軟件項目中,無(wú)一例外,均使用了開(kāi)源軟件。最多的項目使用了3878個(gè)開(kāi)源軟件,平均每個(gè)項目使用126個(gè)開(kāi)源軟件。使用開(kāi)源軟件最多的5個(gè)項目情況如下表所示。
經(jīng)過(guò)后續的調研和訪(fǎng)談,我們還發(fā)現,軟件項目中使用的開(kāi)源軟件數量大大超出了軟件項目管理者和程序員自身的認知。由于開(kāi)源軟件之間的依賴(lài)關(guān)系錯綜復雜,且軟件開(kāi)發(fā)中依賴(lài)包的管理通常通過(guò)包管理器程序自動(dòng)管理,軟件開(kāi)發(fā)者常常意識不到自己使用了數量巨大的開(kāi)源軟件,因此當某個(gè)開(kāi)源軟件曝出安全漏洞時(shí),軟件開(kāi)發(fā)者常?!疤蓸尅倍蛔灾?,這中間隱含了巨大的軟件供應鏈安全風(fēng)險。
(2)流行開(kāi)源軟件被近1/4的軟件項目使用
一些流行開(kāi)源軟件會(huì )被很多軟件項目所使用,這些開(kāi)源軟件一旦出現安全漏洞,影響面將會(huì )非常巨大。對于大型企業(yè)來(lái)說(shuō),企業(yè)內部可能就有數以百計的軟件開(kāi)發(fā)項目,更加需要對流行開(kāi)源軟件保持足夠的關(guān)注和重視,應該做到對其在本單位內的使用情況心中有數。經(jīng)統計,在我們分析的2557個(gè)國內企業(yè)軟件項目中,被使用最多的開(kāi)源軟件為Apache Commons Lang,被622個(gè)項目所使用,占比達24.3%。被使用最多的前5名開(kāi)源軟件如下表所示。
2、開(kāi)源軟件漏洞風(fēng)險分析
(1)近9成軟件項目存在已知開(kāi)源軟件漏洞
分析發(fā)現,在2557個(gè)國內企業(yè)軟件項目中,存在已知開(kāi)源軟件漏洞的項目有2280個(gè),占比高達89.2%;存在已知高危開(kāi)源軟件漏洞的項目有2062個(gè),占比為80.6%;存在已知超危開(kāi)源軟件漏洞的項目有1802個(gè),占比為70.5%。
(2)平均每個(gè)軟件項目存在66個(gè)已知開(kāi)源軟件漏洞
在2557個(gè)國內企業(yè)軟件項目中,共檢出168604個(gè)已知開(kāi)源軟件漏洞(涉及到4166個(gè)唯一CVE漏洞編號),平均每個(gè)軟件項目存在66個(gè)已知開(kāi)源軟件漏洞,最多的軟件項目存在1200個(gè)已知開(kāi)源軟件漏洞。存在已知開(kāi)源軟件漏洞數量排名前5的項目情況如下表所示。
(3)影響最廣的開(kāi)源軟件漏洞存在于44.3%的軟件項目中
從漏洞的影響度來(lái)分析,影響范圍最大的開(kāi)源軟件漏洞為CVE-2020-5421,影響了44.3%的軟件項目。影響度排名前5的開(kāi)源軟件漏洞情況如下表所示。
(4)15年前開(kāi)源軟件漏洞仍然存在于多個(gè)軟件項目中
分析發(fā)現,部分軟件項目中存在十幾年前公開(kāi)的古老開(kāi)源軟件漏洞,最古老的漏洞是2005年11月公開(kāi)的CVE-2005-3510,仍然存在于31個(gè)項目中。部分古老開(kāi)源軟件漏洞的影響情況如下表所示。
3、開(kāi)源軟件運維風(fēng)險分析
開(kāi)源軟件運維風(fēng)險復雜多樣,本報告主要從老舊開(kāi)源軟件的使用和開(kāi)源軟件多版本的使用角度進(jìn)行分析。
(1)18年前的老舊開(kāi)源軟件版本仍在被使用
分析發(fā)現,許多軟件項目中使用了十幾年前發(fā)布的開(kāi)源軟件版本,存在很大的運維風(fēng)險。被使用的老舊開(kāi)源軟件版本中,最老舊的一個(gè)是2003年3月3日發(fā)布的Apache Xalan 2.5.D1,已經(jīng)有18年之久,但仍然被7個(gè)軟件項目所使用。按老舊程度排名前5的開(kāi)源軟件如下表所示。
(2)開(kāi)源軟件各版本使用非?;靵y
分析發(fā)現,各個(gè)項目中開(kāi)源軟件使用的版本非?;靵y,并非使用的都是最新版本。Spring Data是被使用版本最多的開(kāi)源軟件,有162個(gè)版本在被使用。按照被使用版本的數量排序,排名前5的開(kāi)源軟件情況如下表所示。
總結及建議
軟件供應鏈已經(jīng)成為網(wǎng)絡(luò )空間攻防對抗的焦點(diǎn),直接影響關(guān)鍵基礎設施和重要信息系統安全。為了應對軟件供應鏈安全挑戰,美國總統拜登在2021年5月12日簽署了“加強國家網(wǎng)絡(luò )安全的行政命令”,明確提出要增強美國聯(lián)邦政府的軟件供應鏈安全,要求向美國聯(lián)邦政府出售軟件的任何企業(yè),不僅要提供軟件本身,還必須提供軟件物料清單(SBOM),明確該軟件的組成成分。行政命令中還要求美國國家標準與技術(shù)研究院(NIST)在6個(gè)月內發(fā)布軟件供應鏈安全指南,并在1年內發(fā)布最終指南。該行政命令被認為是迄今為止美國聯(lián)邦政府為保護美國軟件供應鏈安全采取的最強勁措施。
當前,我國在軟件供應鏈安全方面的基礎比較薄弱,亟需從國家、行業(yè)、機構、企業(yè)各個(gè)層面建立軟件供應鏈安全風(fēng)險的發(fā)現能力、分析能力、處置能力、防護能力,整體提升軟件供應鏈安全管理的水平?,F代軟件的供應鏈非常復雜,軟件供應鏈安全管理是一個(gè)系統工程,需要長(cháng)期持續的建設?;谄姘残糯a安全實(shí)驗室的研究和實(shí)踐,我們建議可從以下方面入手開(kāi)展軟件供應鏈安全相關(guān)工作,并在此基礎之上不斷增強和完善。
1、對國家與行業(yè)監管層面的建議:
制定軟件供應鏈安全相關(guān)的政策要求、標準規范和實(shí)施指南,建立長(cháng)效工作機制。
建立國家級/行業(yè)級軟件供應鏈安全風(fēng)險分析平臺,具備系統化、規?;能浖创a缺陷和后門(mén)分析、軟件漏洞分析、開(kāi)源軟件成分及風(fēng)險分析等能力,為關(guān)鍵基礎設施、重要信息系統用戶(hù)提供日常的自查服務(wù),及時(shí)發(fā)現和處置軟件供應鏈安全風(fēng)險。
在產(chǎn)品測評、系統測評等工作中納入軟件供應鏈安全的內容,針對軟件的源代碼、制成品、運行中的軟件系統等進(jìn)行軟件供應鏈安全的測試和評估。
2、對軟件最終用戶(hù)層面的建議:
參照監管要求及業(yè)內優(yōu)秀實(shí)踐,明確本單位內部軟件供應鏈安全管理的目標、工作流程、檢查內容、責任部門(mén),并賦予責任部門(mén)足夠的權力。
在采購商業(yè)貨架軟件時(shí),應充分評估供應商的安全能力,并與供應商簽署安全責任協(xié)議,要求供應商提供其軟件產(chǎn)品中所使用的第三方組件/開(kāi)源組件的清單,并明確要求,一旦這些第三方組件/開(kāi)源組件出現安全漏洞,供應商需同樣承擔安全責任,提供必要的技術(shù)支持。
在自行開(kāi)發(fā)軟件系統或委托第三方定制開(kāi)發(fā)軟件系統時(shí),應遵循軟件安全開(kāi)發(fā)生命周期管理流程,針對軟件源代碼進(jìn)行安全缺陷檢測和修復,同時(shí)要重點(diǎn)管控開(kāi)源軟件的使用,建立開(kāi)源軟件資產(chǎn)臺賬,持續監測和消減所使用的開(kāi)源軟件的安全風(fēng)險。
3、對軟件廠(chǎng)商層面的建議:
提高安全責任意識,將安全作為產(chǎn)品的基礎屬性來(lái)對待,嚴控產(chǎn)品的安全質(zhì)量。
建立清晰的軟件供應鏈安全策略,明確本單位內部軟件供應鏈安全管理的目標、工作流程、檢查內容、責任部門(mén),并賦予責任部門(mén)足夠的權力。
嚴格管控上游,尤其重點(diǎn)管控開(kāi)源軟件的使用,建立開(kāi)源軟件資產(chǎn)臺賬,建議采用可融入軟件開(kāi)發(fā)流程的開(kāi)源安全治理工具,持續監測和消減所使用的開(kāi)源軟件的安全風(fēng)險。
嚴控自主開(kāi)發(fā)的代碼質(zhì)量,建議采用可融入軟件開(kāi)發(fā)流程的軟件源代碼安全分析工具,持續檢測和修復軟件源代碼中的安全缺陷和漏洞。
建立完善的產(chǎn)品漏洞響應機制,包括產(chǎn)品漏洞信息的收集、漏洞報告渠道的建立和維護、漏洞補丁的開(kāi)發(fā)和發(fā)布、客戶(hù)側漏洞應急響應和修復支持等。