賈培養(yǎng) 孫鴻宇 曹婉瑩 伍高飛 王文杰
1(西安電子科技大學(xué)網(wǎng)絡(luò)與信息安全學(xué)院 西安 710126) 2(中國科學(xué)院大學(xué)國家計算機(jī)網(wǎng)絡(luò)入侵防范中心 北京 101408)
隨著開源代碼在代碼庫中的比重不斷增加,幾乎所有企業(yè)通過使用免費的開源代碼來開發(fā)自己的軟件產(chǎn)品.開源代碼能夠幫助軟件開發(fā)企業(yè)和組織極大地縮短軟件開發(fā)的周期.由此可見開源代碼已經(jīng)成為軟件供應(yīng)鏈的重要組成部分,也成為了當(dāng)今網(wǎng)絡(luò)空間的基石.然而,開源軟件的安全問題并沒有得到足夠的重視.根據(jù)開源安全管理平臺White Source在2020年發(fā)布的《開源漏洞安全現(xiàn)狀》,開源代碼和開源社區(qū)在過去的幾年中迎來了大規(guī)模的增長,與此同時開源漏洞也隨之爆發(fā)式的增長.
開源代碼是指用戶可以根據(jù)許可進(jìn)行訪問和改進(jìn)的源代碼.開源軟件和專有軟件的區(qū)別在于,用戶第1次使用專有軟件時必須簽署同意最終用戶許可協(xié)議(EULA),同時這些協(xié)議會限制用戶共享或修改產(chǎn)品本身,用戶在使用開源軟件時則需遵守開源許可條款,開源許可證控制著除發(fā)起者以外的其他人如何使用、修改和共享軟件.從開源軟件使用者的角度出發(fā)開源軟件具有以下幾個優(yōu)勢:
1) 具有較高的靈活性.開源使用者可以根據(jù)自身需要對軟件進(jìn)行定制,以滿足自身的需要,開源使用者被賦予了更多的控制權(quán).
2) 更好的社區(qū)支持.開源軟件通常具有論壇和開發(fā)人員組成的社區(qū),這些社區(qū)會針對開源軟件出現(xiàn)的問題進(jìn)行修復(fù)和更新,從社區(qū)中往往能夠獲得對開源軟件改進(jìn)的支持.
3) 穩(wěn)定性.開源軟件的使用者可以放心地將開源軟件應(yīng)用于周期較長的項目,因為即使開源軟件的作者停止使用它,開源軟件本身不會從市場上消失.
4) 相對較低的費用.開源軟件的購買成本往往低于同類型專有軟件的購買成本,甚至大量的開源軟件是免費的.
當(dāng)前開源軟件的使用者普遍存在以下幾個誤區(qū):
1) 開源軟件是免費的.開源并不意味著免費,這是很多開源使用者的誤區(qū),開源代碼的免費指的是軟件可以用于個人目的,其中開源許可證給出了開源軟件的使用和修改的條款,必須在開源許可證的許可下合理地使用開源軟件.
2) 開源軟件相對于專有軟件更加安全.許多攻擊者利用開源軟件在軟件供應(yīng)鏈中不可或缺的地位,通過依賴項管理器在軟件生命周期中的自動解析,造成了針對軟件供應(yīng)鏈的攻擊[1].
3) 開源軟件的使用不用遵守任何規(guī)范.很多開源軟件使用者認(rèn)為開源軟件可以任意使用,而不用遵守任何規(guī)范,這是一個很大的誤區(qū).錯誤地使用沒有獲得許可的開源軟件可能會帶來知識產(chǎn)權(quán)方面的訴訟,使用開源軟件必須遵守相關(guān)的軟件許可的條款[2].
奇安信代碼安全實驗室在2019年針對聯(lián)網(wǎng)設(shè)備固件中引用的開源軟件的檢測和漏洞分析,發(fā)現(xiàn)這些固件中86.4%存在至少1個以上的開源漏洞,漏洞最多的固件存在74個老舊開源漏洞,并且這些固件100%使用了開源代碼.88%的項目因使用開源軟件引入了安全漏洞.根據(jù)2020年Github的Octoverse狀態(tài)報告,目前的軟件代碼庫中對開源代碼、組件和庫的依賴相較于以前更加普遍.同時漏洞管理公司RiskSense在其《開源代碼中的黑暗現(xiàn)實》報告中明確指出開源漏洞發(fā)現(xiàn)后,通常需要很長時間才能添加到NVD(美國國家漏洞數(shù)據(jù)庫)中.從公開披露到將漏洞納入NVD平均時間為54天,有的甚至超過1年,這給使用開源軟件的相關(guān)組織帶來了極大的安全隱患.因此,一個專門針對開源漏洞的開放型數(shù)據(jù)庫是十分必要的.
從開源漏洞的特點出發(fā),針對開源漏洞的漏洞數(shù)據(jù)庫應(yīng)該具備以下幾個特點:
1) 提供精確的開源漏洞元數(shù)據(jù),提高使用者漏洞查詢的準(zhǔn)確性,包括準(zhǔn)確的受影響版本等基本信息;
2) 能夠進(jìn)行代碼檢測,并給出輸入代碼中開源組件的使用情況和相互依賴關(guān)系;
3) 更新較為及時,防止漏洞收錄延遲帶來的不利影響;
4) 較為簡單的漏洞報告過程,減少發(fā)布漏洞所需的工作量;
5) 能夠提供漏洞引入和修復(fù)位置的精確數(shù)據(jù).
針對開源漏洞的研究正在廣泛展開,但是很少有文章對開源漏洞庫進(jìn)行針對性的研究,本文對開源漏洞庫進(jìn)行了系統(tǒng)性概述.
通過開源漏洞庫,開源軟件的使用者可以查找到其應(yīng)用程序中存在漏洞的開源組件的版本、漏洞的類型、漏洞的CVSS分?jǐn)?shù)、漏洞的POC證明等信息.本節(jié)就當(dāng)前主流的開源漏洞庫進(jìn)行介紹.
Open Source漏洞數(shù)據(jù)庫 (open source vulnerabilities, OSV)[3]是開放源代碼的漏洞數(shù)據(jù)庫,該漏洞庫是谷歌公司于2021年5月推出的一個開源項目,旨在幫助開源代碼的使用者更好地維護(hù)和管理其項目中出現(xiàn)的開源漏洞.該漏洞庫開放了一個API,該API接受用戶通過git commit指令獲得的哈希號,然后返回給用戶該版本存在的漏洞列表.通過該API用戶可以查詢其軟件版本是否受到開源漏洞的影響.OSV的特點在于向開源維護(hù)者提供了自動化的漏洞分類方案,開源維護(hù)者只需通過OSV提供的API即可對開源代碼進(jìn)行自動地分析并給出受影響的版本號和版本范圍.OSV的數(shù)據(jù)集目前主要來自于OSS-Fuzz[4]發(fā)現(xiàn)的漏洞,其中OSS-Fuzz是針對開源軟件的持續(xù)模糊測試服務(wù),當(dāng)前已經(jīng)集成了350多個開源項目,并發(fā)現(xiàn)了25 000多個Bugs.圖1是OSS-Fuzz對開源軟件進(jìn)行模糊測試的原理圖:
圖1 OSS-Fuzz原理圖
OSV漏洞庫通過二分法的查找方式來查找造成漏洞的準(zhǔn)確提交版本和修復(fù)該錯誤的準(zhǔn)確版本,從而確定該錯誤提交影響的版本范圍.OSV相較于現(xiàn)有的CVE數(shù)據(jù)庫,起到了很好的補(bǔ)充作用.OSV的目標(biāo)是更好地對開源漏洞進(jìn)行分類、存儲和查詢.OSV為了方便自動化工具的調(diào)用,對漏洞條目使用了較為簡單的描述.
OSV對開源漏洞的字段描述(以O(shè)SV-2021-534為例)如表1所示.
WhiteSource漏洞數(shù)據(jù)庫(WhiteSource vulnerability database, WSVD)[5]是由美國權(quán)威開源安全管理平臺WhiteSource推出的開源漏洞庫,該公司致力于為用戶提供開源安全服務(wù)和許可證合規(guī)管理.該公司通過自動連續(xù)掃描數(shù)十個開源代碼庫來幫助用戶尋找解決方案,可以自動警告用戶正在使用的開源組件中的已知安全漏洞、錯誤、新版本、補(bǔ)丁等信息,同時該公司提供的開源安全服務(wù)具有較高的兼容性,可以與多種編程語言、構(gòu)建工具和開發(fā)環(huán)境兼容,可以使得開源軟件使用者無需將精力放在開源組件的安全性上,而是將精力集中在對軟件的定制開發(fā)上.
表1 OSV漏洞字段描述(OSV-2021-534)
圖2 SCA工作原理圖
WSVD漏洞庫允許使用者通過CVE編號或項目名稱檢索開源漏洞,并在網(wǎng)站首頁給出了近90天內(nèi)危險系數(shù)最高的開源漏洞排名.該漏洞庫宣稱覆蓋了200多種編程語言和300萬個開源組件,同時數(shù)據(jù)庫來源包括NVD、安全公告、開源項目問題追蹤器等多種渠道.同時在漏洞庫的資源中心,該公司免費提供了針對開源漏洞的白皮書、網(wǎng)絡(luò)研討會和研究報告,為研究開源漏洞提供了便利.
WSVD允許用戶通過郵件的形式提交開源漏洞,同時在收錄未經(jīng)CVE/NVD等數(shù)據(jù)庫收錄的漏洞時,會將該漏洞進(jìn)行重新編號,進(jìn)行單獨管理.WhiteSource使用軟件組成分析(SCA)技術(shù)來幫助用戶檢測軟件項目中的開源組件的使用情況.SCA可以對應(yīng)用程序的代碼進(jìn)行掃描,這些掃描包括注冊表在內(nèi)的多種資源,以準(zhǔn)確識別所有開應(yīng)用程序中的所有開源組件、許可證合規(guī)和安全漏洞.SCA工具會生成目標(biāo)應(yīng)用程序中所有開源組件(包括直接和間接依賴項)的清單報告,然后根據(jù)開源組件的清單查詢到關(guān)于這些開源組件的開源許可證信息,以便于開源維護(hù)者判斷許可證是否與自己的應(yīng)用程序相兼容.先進(jìn)的SCA解決方案可以讓開源組件的選擇、使用和跟蹤變得更加自動化.如果只是通過開源安全維護(hù)人員手動管理日益增多的開源漏洞,其工作量是難以想象的,WhiteSource提供的SCA解決方案可以極大地降低開源安全維護(hù)者的工作量,是一個較為先進(jìn)的開源安全解決方案.SCA的工作原理如圖2所示.
WSVD對漏洞的描述主要包括該漏洞的程序語言類型、CWE類型、CVSS分?jǐn)?shù)(CVSS V2和CVSS V3)、發(fā)布日期、參考鏈接、修復(fù)信息等.以CVE-2021-29475為例,漏洞字段描述如表2所示:
表2 WSVD漏洞字段描述(CVE-2021-29475)
Snyk漏洞數(shù)據(jù)庫(Snyk vulnerability database, SVD)[6]是由專注于開源安全的Snyk公司推出的開源漏洞數(shù)據(jù)庫,Snyk通過掃描程序的方式來發(fā)現(xiàn)應(yīng)用程序中的開源組件漏洞和許可證違規(guī).SVD開源漏洞庫在檢索漏洞方面允許用戶通過開源組件的名字或CVE編號來檢索漏洞,方便用戶查看其使用的開源組件中是否含有漏洞.SVD提供了測試代碼的入口,通過該入口用戶可以檢測其開源項目中是否包含開源漏洞.
SVD的開源漏洞數(shù)據(jù)來源較為廣泛,包括現(xiàn)有的NVD,CVE數(shù)據(jù)庫,監(jiān)視Github上可能出現(xiàn)的漏洞、PR等信息,同時SVD還通過手動審核的方式來檢測被廣泛使用的軟件包中是否含有安全漏洞,通過聆聽有關(guān)安全公告、JIRA公告板、Github提交等可能出現(xiàn)的尚未報告的漏洞.其次與社區(qū)合作,通過漏洞賞金的方式來獲得最新的漏洞披露,其團(tuán)隊還與學(xué)術(shù)實驗室合作,以交換工具、方法和數(shù)據(jù).SVD開源漏洞庫中漏洞字段的描述如表3所示:
表3 SVD漏洞字段描述(以軟件包bundler為例)
Veracode漏洞數(shù)據(jù)庫(Veracode vulnerability database, VVD)[7]是一家專注于應(yīng)用程序安全測試平臺推出的開源漏洞庫,該漏洞庫可以根據(jù)開源軟件包名或者CVE編號查詢有關(guān)的開源漏洞信息,同時能夠根據(jù)漏洞所屬的編程語言類型或者操作系統(tǒng)來篩選可能的開源漏洞.
VVD可以識別不在國家漏洞數(shù)據(jù)庫(NVD)或尚未納入NVD的漏洞,為了發(fā)現(xiàn)這些漏洞,VVD會搜索所有的開源代碼存儲庫,通過掃描代碼、元數(shù)據(jù)、提交日志、錯誤修復(fù)、補(bǔ)丁說明和開發(fā)人員注釋,使用機(jī)器學(xué)習(xí)算法來發(fā)現(xiàn)尚未公開的安全問題.這使得該數(shù)據(jù)庫領(lǐng)先于網(wǎng)絡(luò)攻擊者.當(dāng)漏洞在NVD公布時,對于組織和攻擊者而言,有足夠的時間在漏洞修復(fù)之前發(fā)起攻擊.
VVD漏洞庫的系統(tǒng)結(jié)構(gòu)如圖3所示.
圖3 VVD漏洞庫的系統(tǒng)結(jié)構(gòu)圖
從圖3我們可以看出,該漏洞庫的來源包括以下幾個方面:
1) 漏洞提交;
2) JIRA tickets;
3) Bugzilla報告;
4) 數(shù)千個開源庫的GitHub問題和請求.
對于漏洞數(shù)據(jù)的不同來源,該漏洞庫都相對應(yīng)地建立了訓(xùn)練有素的機(jī)器學(xué)習(xí)模型,以準(zhǔn)確識別來源中的每個項目是否與漏洞相關(guān),識別出的漏洞將發(fā)送到其漏洞管理平臺進(jìn)行審查,然后將其添加到威脅情報中心.VVD漏洞庫中漏洞字段的描述如表4所示(以firefox為例):
表4 VVD漏洞字段描述(以軟件包firefox為例)
在第1節(jié)對4個開源漏洞庫單獨介紹的基礎(chǔ)上,本文詳細(xì)對比了不同開源漏洞庫在漏洞來源、漏洞管理、漏洞分析處理等方面的不同.
Open Source漏洞數(shù)據(jù)庫(OSV)中收錄的開源漏洞主要來自于OSS-Fuzz項目發(fā)現(xiàn)的漏洞.該項目旨在通過連續(xù)模糊測試來發(fā)現(xiàn)開源項目中可能存在的漏洞,通過該項目發(fā)現(xiàn)的開源漏洞統(tǒng)一進(jìn)行單獨的OSV編號.這些漏洞并沒有和現(xiàn)有的CVE/NVD等權(quán)威漏洞數(shù)據(jù)庫進(jìn)行關(guān)系映射,所以O(shè)SV漏洞庫目前收錄的開源漏洞數(shù)量有限,且來源較為集中.
WhiteSource漏洞數(shù)據(jù)庫(WSVD)的漏洞主要來源包括NVD,OSVDB等漏洞庫,同時WSVD通過跟蹤開源項目的問題追蹤器和安全公告來獲取可能的開源漏洞,NVD是其漏洞的主要來源.WSVD漏洞庫中收錄的漏洞多為開源漏洞,漏洞庫的針對性很強(qiáng).
Snyk漏洞數(shù)據(jù)庫(SVD)的漏洞來源較為廣泛,包括:手動審核現(xiàn)有開源軟件包中的漏洞;監(jiān)視開源代碼存儲庫中可能帶來漏洞的issue和PR;監(jiān)聽開源項目安全公告、社區(qū)合作、學(xué)術(shù)界合作等方式來獲取最新的開源漏洞.
Veracode漏洞數(shù)據(jù)庫(VVD)獲取開源漏洞的方式包括用戶漏洞的提交、漏洞報告、掃描Github等開源代碼庫的issue和Pull Request、缺陷跟蹤管理系統(tǒng)JIRA的用戶bug,VVD在獲取開源漏洞方面相較于其他開源漏洞庫并未從現(xiàn)有的漏洞庫中獲取漏洞,其獲取的開源漏洞具有較好的獨立性.
當(dāng)前開源漏洞庫獲取開源漏洞的主要方式如表5所示.
從表5我們可以看出當(dāng)前開源漏洞庫的主要來源有哪些,其中以SVD為代表的開源漏洞庫的漏洞來源較為廣泛,這些獲取方式為獲取開源漏洞提供了新思路.
表5 當(dāng)前開源漏洞庫獲取開源漏洞的主要方式
2.1節(jié)介紹的4個開源漏洞庫目標(biāo)都是及時有效地跟蹤開源漏洞,但是每一個漏洞庫的側(cè)重方向各有不同,下文將詳細(xì)介紹每個開源漏洞庫的主要應(yīng)用方向.
圖4 OSV開源漏洞查詢API結(jié)構(gòu)樹
Open Source漏洞數(shù)據(jù)庫(OSV)旨在幫助開源項目的使用者通過API來查詢其正在使用的開源項目版本是否存在漏洞,其API對外開放了POST請求和GET請求.POST請求需要通過json的格式發(fā)起請求,該請求主要接收3個參數(shù),分別是commit,version,package,這里的commit指的是開源代碼提交到代碼庫中的哈希值,version則表示該開源代碼的版本號,package可以是一個對象,這個對象接收開源軟件的包名和ecosystem,該API的結(jié)構(gòu)樹如圖4所示.同時OSV的另一個主要應(yīng)用方向是幫助開源維護(hù)者自動化地對開源漏洞進(jìn)行分類,如果沒有自動化的漏洞分類,對呈現(xiàn)海量增長趨勢的開源漏洞來說將是一個難以想象的工作量[10].通過OSV的自動分類可以將開源漏洞分類的工作量降低很多,極大提高了分類效率.
WhiteSource漏洞數(shù)據(jù)庫(WSVD)主要優(yōu)勢在于匯總了數(shù)百個開源社區(qū)資源,并兼容了多種編程語言和數(shù)以萬計的開源組件.該漏洞庫的特點是數(shù)據(jù)來源廣泛,且多為開源漏洞,是收錄開源漏洞數(shù)量較多的數(shù)據(jù)庫之一.
Snyk漏洞數(shù)據(jù)庫(SVD)相較于其他的開源漏洞庫在提供基本的查詢功能之外,還向用戶提供檢測開源代碼的API.通過該接口,用戶登錄后即可在線檢測其開源代碼中是否存在開源漏洞,同時在開源漏洞的字段描述上,該漏洞庫提供了詳細(xì)的受影響版本等信息.提供在線代碼檢測是該漏洞庫的特點之一.
Veracode漏洞數(shù)據(jù)庫(VVD)相較于其他開源漏洞庫而言,其收集到可能出現(xiàn)開源漏洞的數(shù)據(jù)之后,會通過其內(nèi)部的機(jī)器學(xué)習(xí)模型去識別這些可能的漏洞.一旦漏洞被識別,將添加到其漏洞管理中心,將機(jī)器學(xué)習(xí)算法應(yīng)用到漏洞檢測是近年來開源漏洞檢測的新趨勢[11].該漏洞庫根據(jù)不同的數(shù)據(jù)來源建立了不同的機(jī)器訓(xùn)練模型,可以極大地提高檢測效率,有些漏洞的發(fā)現(xiàn)甚至早于NVD等數(shù)據(jù)庫.因此,通過機(jī)器學(xué)習(xí)算法來檢測開源漏洞是該漏洞庫的特點之一.
Open Source漏洞數(shù)據(jù)庫(OSV)通過二分法(bisects)的方式來找到開源漏洞錯誤提交的版本和錯誤修復(fù)的版本,bisects在查找錯誤的提交時首先啟動bisect進(jìn)程,然后輸入包含錯誤的提交版本,其次輸入已知的修復(fù)版本,運行代碼以查看錯誤是否仍然存在,返回bisects結(jié)果,然后一直重復(fù)前2項直到找到錯誤的提交版本.bisects查找錯誤提交的基本流程如圖5所示:
圖5 bisects查找錯誤提交的基本流程
WhiteSource漏洞數(shù)據(jù)庫(WSVD)通過SCA技術(shù)來掃描開源組件中可能出現(xiàn)的漏洞,可以讓開源代碼使用者快速跟蹤和分析引入到項目中的任何開源組件,SCA工具在查找項目中使用的組件以及它們的依賴庫時,還會檢測相關(guān)軟件許可證,并給出不贊成使用的依賴項和可能的漏洞利用.
Snyk漏洞數(shù)據(jù)庫(SVD)通過依賴項掃描程序可以主動地發(fā)現(xiàn)開源依賴項中的漏洞和許可證違規(guī).在漏洞掃描方面,SVD使用了SCA技術(shù),該技術(shù)可以發(fā)現(xiàn)開源軟件包中復(fù)制的代碼片段,極大地提高了漏洞發(fā)現(xiàn)的準(zhǔn)確性.
Veracode漏洞數(shù)據(jù)庫(VVD)在漏洞分析處理方面通過靜態(tài)應(yīng)用程序安全測試工具(SAST)來分析源代碼和代碼的編譯版本,以此來發(fā)現(xiàn)開源項目中的漏洞.它可以向開發(fā)人員提供有關(guān)在代碼編寫過程中可能引入的代碼錯誤的即時反饋,這種反饋相比于軟件開發(fā)周期后期才發(fā)現(xiàn)漏洞是十分有效的.
上文對不同開源漏洞庫之間的差異和側(cè)重點進(jìn)行了對比分析,主要介紹了每個開源漏洞庫的數(shù)據(jù)來源、特點和應(yīng)用方向,下面介紹開源漏洞庫旨在解決的共同問題和挑戰(zhàn).
自動化的開源漏洞檢測.面對日益增長的開源漏洞數(shù)量[12],當(dāng)前的開源漏洞庫都在嘗試使用自動化的開源漏洞檢測技術(shù)[13]來跟蹤開源漏洞.因為手動審核開源項目中的漏洞需要考慮到開源項目中不斷更新的版本和當(dāng)前項目中的版本是否一致[14],同時還要考慮開源項目中復(fù)雜的依賴關(guān)系[15],僅僅依靠人工幾乎是不可能的.
持續(xù)跟蹤開源漏洞情報[16].只有做到快速的更新開源漏洞的信息,才能夠有效地避免針對開源漏洞的軟件供應(yīng)鏈攻擊[17],當(dāng)前的開源漏洞庫對不同數(shù)據(jù)來源的開源代碼進(jìn)行監(jiān)測,以期獲得對開源漏洞情報的持續(xù)跟蹤.
理清開源項目之間的依賴關(guān)系.開源漏洞之所以較難以處理,和其項目中較為復(fù)雜的依賴有關(guān).只有建立了開源項目中的依賴關(guān)系樹,對開發(fā)者而言才能夠清晰地知道自己的項目中使用了開源項目的哪些版本,哪些版本是安全的,只有這樣才是解決開源安全問題行之有效的方案.
近年來,隨著開源漏洞數(shù)量的不斷增長,針對軟件供應(yīng)鏈的攻擊事件層出不窮.通過開源漏洞庫獲取正在使用的開源項目中的漏洞信息是我們防止此類攻擊事件的有效方案.本文對當(dāng)前開源安全的現(xiàn)狀、開源漏洞庫的基本情況進(jìn)行了系統(tǒng)性的介紹,并對當(dāng)前的開源漏洞庫從漏洞來源、應(yīng)用方向和漏洞分析處理等方面進(jìn)行了詳細(xì)的對比分析,最后對開源漏洞庫待解決的問題和面臨的挑戰(zhàn)進(jìn)行了歸納.