軟件成分分析(SCA)完全指南

如今,絕大多數(shù)代碼驅(qū)動(dòng)的應(yīng)用程序都包括開源組件。但是,開源代碼可能包含一些致命的漏洞,比如 Log4Shell 漏洞。
軟件成分分析(SCA)是查找開源軟件包中的漏洞并學(xué)習(xí)如何修復(fù)它們的最佳選擇,確保代碼和應(yīng)用程序處于安全狀態(tài)。本指南將帶你一起了解使用 SCA 工具時(shí)的最佳實(shí)踐。
什么是軟件成分分析 SCA?
軟件成分分析 Software Compostition Analysis(SCA) 是一種用于管理開源組件應(yīng)用安全的方法。通過 SCA,開發(fā)團(tuán)隊(duì)可以快速跟蹤和分析引入項(xiàng)目的開源組件。同時(shí),SCA 工具可以發(fā)現(xiàn)所有相關(guān)組件、支持庫(kù)以及它們之間直接和間接依賴關(guān)系。SCA 工具還可以檢測(cè)軟件許可證、已棄用的依賴項(xiàng)以及漏洞和潛在威脅。掃描過程會(huì)生成物料清單? Bill of Materials(BOM),從而提供項(xiàng)目軟件資產(chǎn)的完整清單。
SCA 本身并不新奇,但隨著開源組件的普及和廣泛應(yīng)用,SCA 逐漸成為應(yīng)用程序安全項(xiàng)目的關(guān)鍵部分,而 SCA 工具數(shù)量也隨之激增。包括 DevSecOps 在內(nèi)的現(xiàn)代軟件開發(fā)實(shí)踐中,SCA 需要便于開發(fā)人員使用,同時(shí)也能讓安全團(tuán)隊(duì)能夠有能力在軟件開發(fā)生命周期 Software Development Life Cycle (SDLC)內(nèi)引導(dǎo)和指導(dǎo)開發(fā)人員安全地進(jìn)行開發(fā)。

為什么要使用 SCA?
開源組件儼然成為每個(gè)垂直領(lǐng)域軟件的主要部分。而 SCA 工具有助于跟蹤應(yīng)用程序使用的開源組件,這從生產(chǎn)和安全角度來看都至關(guān)重要。
安全漏洞帶來的慘痛代價(jià)
Gartner 預(yù)計(jì)超過70%的應(yīng)用程序因使用開源組件而產(chǎn)生缺陷和漏洞。正如美國(guó)征信巨頭 Equifax 的案例所表明,這些漏洞可能會(huì)給企業(yè)和組織帶來災(zāi)難性后果。
在此事件中,Equifax 最初表示,網(wǎng)絡(luò)犯罪分子利用 Apache Struts 的漏洞獲取文件。隨即,Equifax 在公告中確認(rèn),先前披露和修復(fù)的漏洞是就是在這次數(shù)據(jù)泄露事件中惡意攻擊者所利用的漏洞,當(dāng)時(shí)這個(gè)漏洞的評(píng)分有10 分之高。而 Equifax 在漏洞出現(xiàn)后沒有及時(shí)修復(fù),黑客利用其系統(tǒng)中未修復(fù)的 Apache Struts 漏洞發(fā)起攻擊,導(dǎo)致1.43億用戶的信用記錄被泄露,其中包括姓名、出生日期、地址,以及駕駛證號(hào)碼等,這是有史以來規(guī)模最大的數(shù)據(jù)泄露案。最終,此案以 Equifax 支付7億美元的賠償金和罰款,索賠期限延長(zhǎng)四年落幕。
Equifax 漏洞事件成為安全行業(yè),尤其是應(yīng)用程序安全的重要標(biāo)志,因?yàn)樗鼜?qiáng)調(diào)了控制措施的重要性,開源組件引入的風(fēng)險(xiǎn)應(yīng)當(dāng)?shù)玫焦芾?。該漏洞也揭示了?duì)速度的要求,企業(yè)需要能夠快速,重復(fù)地查找和修復(fù)他們正在使用的開源軟件包中的漏洞。而在 Tidelift 2022年開源供應(yīng)鏈報(bào)告中顯示,有57%的企業(yè)認(rèn)為,即使有現(xiàn)代安全工具的助力,在使用開源進(jìn)行開發(fā)時(shí)識(shí)別和解決安全漏洞仍然是一項(xiàng)巨大的挑戰(zhàn)。
為什么 SCA 這么重要?
越來越多的應(yīng)用程序由開源代碼組成。據(jù)估計(jì),開源代碼占到了應(yīng)用程序代碼的90%。實(shí)際上應(yīng)用程序是由不同的組件組成,企業(yè)需要保證所有的組件成分都是安全的,這樣才能夠有效地管理和降低風(fēng)險(xiǎn)。這也正是企業(yè)在確保代碼庫(kù)安全時(shí)所面臨的挑戰(zhàn)。
開源已成為軟件領(lǐng)域的中流砥柱
軟件正在吞噬世界,而開源在吞噬軟件。在當(dāng)今競(jìng)爭(zhēng)激烈的市場(chǎng)中,開源能夠幫助公司將服務(wù)數(shù)字化,讓企業(yè)在市場(chǎng)中獲得一定的競(jìng)爭(zhēng)優(yōu)勢(shì)。
開源是怎樣幫助企業(yè)實(shí)現(xiàn)服務(wù)數(shù)字化的呢?當(dāng)企業(yè)在進(jìn)行軟件開發(fā)時(shí),從零開始構(gòu)建消耗大量的時(shí)間和資源。而使用提供完全相同功能的開源軟件包能夠有效降低這些成本。
開源本質(zhì)上是高度靈活的。在社區(qū)的支持和嚴(yán)格審查下,開源通常很安全。同時(shí),免費(fèi)的開源軟件和組件能夠幫助企業(yè)和組織避免軟件廠商的束縛。
在 Tidelift 最近的一項(xiàng)研究中,68%的受訪者指出,節(jié)省資金和開發(fā)時(shí)間是企業(yè)鼓勵(lì)使用開源組件進(jìn)行應(yīng)用程序開發(fā)的首要原因。而48%的受訪者則表示,使用開源是為了提高應(yīng)用程序開發(fā)和維護(hù)效率。開源的使用在新冠疫情之前就達(dá)到了頂峰,而疫情的出現(xiàn)加速了采用率。Gartner 預(yù)計(jì),90% 的企業(yè)應(yīng)用程序?qū)⒁蕾囉陂_源的使用。
當(dāng)今的軟件供應(yīng)鏈
開源是構(gòu)成現(xiàn)代云原生應(yīng)用程序的一部分。如今,應(yīng)用程序更多是組裝而非從零構(gòu)建。除了開源軟件包之外,應(yīng)用程序還由專有代碼、容器和基礎(chǔ)設(shè)施組裝而成,成為軟件供應(yīng)鏈的組成部分。而軟件供應(yīng)鏈中的這些組件和模塊也是惡意攻擊的潛在目標(biāo)。利用軟件供應(yīng)鏈中的漏洞能對(duì)整個(gè)應(yīng)用程序,進(jìn)而擴(kuò)大攻擊面。
以 Octopus Scanner 惡意軟件為例,它通過濫用構(gòu)建過程影響整個(gè)供應(yīng)鏈,經(jīng)過該供應(yīng)鏈產(chǎn)生的工件影響其他項(xiàng)目。受影響的項(xiàng)目可能會(huì)被許多不同的系統(tǒng)克隆、Fork 和使用,也就是所說的“套娃”攻擊。而最近的 SolarWinds 攻擊主要針對(duì)特定軟件,這也進(jìn)一步證明了現(xiàn)代軟件供應(yīng)鏈給企業(yè)和組織帶來的風(fēng)險(xiǎn)越來越大。
開源 ≠ 安全
開源項(xiàng)目被認(rèn)為使用起來更安全。畢竟當(dāng)整個(gè)社區(qū)參與維護(hù)和開發(fā)項(xiàng)目時(shí),問題常常被更快地識(shí)別和修復(fù)。這當(dāng)然包括安全漏洞在內(nèi)的各種 bug。話雖如此,這并不代表開源是沒有風(fēng)險(xiǎn)的。
開源項(xiàng)目是公開的,且對(duì)所有人都是可見。當(dāng)然也包括惡意攻擊者。在其中發(fā)現(xiàn)并修復(fù)的任何漏洞都會(huì)暴露給潛在的攻擊者。開源項(xiàng)目越受歡迎,該軟件包的吸引力就越大,而對(duì)應(yīng)事件的攻擊影響也就越大。
當(dāng)然企業(yè)使用開源組件需要自擔(dān)風(fēng)險(xiǎn),因?yàn)闆]有供應(yīng)商通知他們?nèi)毕?,或者簽署的合同讓他們擺脫責(zé)任。
SCA 五大挑戰(zhàn)
如前文所述,SCA 是應(yīng)用程序安全方法和工具的總稱,這些方法和工具通常在開發(fā)期間掃描應(yīng)用程序(如?SAST),來定位應(yīng)用程序中使用的開源組件,并隨后識(shí)別安全漏洞和軟件許可證問題。為了有效管理和降低這些開源組件帶來的風(fēng)險(xiǎn),企業(yè)將面臨一系列與利用開源構(gòu)建現(xiàn)代應(yīng)用程序的方式相關(guān)的風(fēng)險(xiǎn)與挑戰(zhàn)。
1. 代碼的低可見性
將開源代碼嵌入到應(yīng)用程序代碼庫(kù)中的方式帶來了巨大的可見性挑戰(zhàn)。開發(fā)人員可能會(huì)直接在代碼中使用許多開源包,而這些包又包含一些開發(fā)人員不了解的其他開源包。這些直接或可傳遞的依賴關(guān)系復(fù)雜多層,因此很難對(duì)應(yīng)用程序?qū)嶋H使用的開源進(jìn)行端到端的可見性。
而絕大多數(shù)安全漏洞都存在于復(fù)雜多層的關(guān)系中。Snyk State of Open Source Security 報(bào)告發(fā)現(xiàn),超過86%的 .js 節(jié)點(diǎn)漏洞是在可傳遞依賴項(xiàng)中發(fā)現(xiàn)的。在 Java 和 Ruby 上也發(fā)現(xiàn)了類似的數(shù)字。這意味著應(yīng)用程序中的絕大多數(shù)安全漏洞通常都能在開源代碼中找到,開發(fā)人員甚至不知道他們使用了這些代碼。
云原生應(yīng)用程序以另一種方式利用開源,這同樣可能會(huì)給企業(yè)帶來代碼可見性的難題。容器鏡像可以由各種開源組件組成,這些組件還需要識(shí)別和測(cè)試漏洞。容器為開發(fā)人員提供的抽象層,從開發(fā)的角度來看是一個(gè)優(yōu)勢(shì),從安全角度來看也是一個(gè)弱點(diǎn)。
2. 依賴關(guān)系錯(cuò)綜復(fù)雜
為了準(zhǔn)確識(shí)別應(yīng)用程序正在使用的依賴關(guān)系以及它們引入的漏洞,需要深入了解每個(gè)生態(tài)系統(tǒng)如何處理依賴關(guān)系。開源包在安裝時(shí)的解析、鎖定文件、開發(fā)依賴關(guān)系 - 所有這些都是影響如何識(shí)別開源包中的漏洞并將決定后續(xù)修復(fù)步驟的要素。SCA 解決方案需要理解這些細(xì)微差別,以避免產(chǎn)生過多誤報(bào)。
3. 漏洞數(shù)量持續(xù)增加
由于已識(shí)別的漏洞數(shù)量龐大,因此掩蓋了漏洞的可見性及其對(duì)企業(yè)構(gòu)成的風(fēng)險(xiǎn)。Snyk Intel 漏洞數(shù)據(jù)庫(kù)增加了10000多個(gè)漏洞,也反映了漏洞數(shù)量的持續(xù)增長(zhǎng)。
這些上升趨勢(shì)會(huì)體現(xiàn)在已識(shí)別且需要注意的漏洞列表中,其中通常由數(shù)千個(gè)問題組成。鑒于開發(fā)和安全團(tuán)隊(duì)可支配的資源有限,如果沒有一定的安全技能或嵌入高級(jí)安全專業(yè)知識(shí)的工具,就很難確定工作的優(yōu)先級(jí)?;谕ㄓ寐┒丛u(píng)分系統(tǒng) CVSS (Common Vulnerability Scoring System)是評(píng)估風(fēng)險(xiǎn)和確定工作優(yōu)先級(jí)的常用方法,但這個(gè)方式存在一些固有的弱點(diǎn)需要在使用時(shí)特別注意。
4. 不易找到完善的漏洞數(shù)據(jù)庫(kù)
有關(guān)已知漏洞的信息較為分散。國(guó)家漏洞數(shù)據(jù)庫(kù)(NVD)通常用于接收有關(guān)漏洞的更新,但其他來源(如問題跟蹤器、在線論壇、安全新聞通訊等)也能提供大量有關(guān)漏洞的安全情報(bào)。NVD 也可能無法及時(shí)添加漏洞。例如,NVD中92%的 JavaScript 漏洞都是事先添加到 Snyk 中的。及時(shí)了解漏洞很重要。
5. 安全檢查降低開發(fā)速度
開發(fā)人員的開發(fā)節(jié)奏很快,而安全團(tuán)隊(duì)卻很難趕上。由于需要更快、更頻繁地交付代碼,開發(fā)人員越來越多地使用到開源。缺乏人力和資源的安全團(tuán)隊(duì)試圖在軟件開發(fā)生命周期的各個(gè)不同階段進(jìn)行安全檢查,但這實(shí)際上導(dǎo)致開發(fā)速度減慢。然而減慢的開發(fā)節(jié)奏可能對(duì)整體應(yīng)用程序安全更不利,因此這些檢查最終會(huì)被繞過或忽略。
因此,在安全模型中出現(xiàn)了 DevSecOps 和安全防護(hù)左移(Shift Left)的概念,即將安全責(zé)任轉(zhuǎn)移到開發(fā)團(tuán)隊(duì)中,以確保對(duì)開發(fā)工作流的干擾最小,同時(shí)確保安全性。
SCA 的6個(gè)最佳實(shí)踐
軟件組合分析 (SCA) 工具是查找開源包中的漏洞并學(xué)習(xí)如何修復(fù)它們的最佳選擇,保護(hù)代碼和應(yīng)用程序的運(yùn)行狀況。在使用 SCA 工具時(shí),請(qǐng)參考以下六個(gè)最佳實(shí)踐。
1. 使用開發(fā)者友好的 SCA 工具
開發(fā)人員忙于寫代碼。他們需要全面思考,高效設(shè)計(jì),并快速迭代。因此對(duì)開發(fā)人員不友好的 SCA 工具會(huì)減慢開發(fā)節(jié)奏。而便于開發(fā)人員使用的 SCA 工具能夠輕松設(shè)置和使用。它應(yīng)該簡(jiǎn)單地與現(xiàn)有的開發(fā)工作流和工具集成,并盡早在軟件開發(fā)生命周期(SDLC)中集成。?
在確定工具后,也需要給開發(fā)人員普及 SCA 的重要性以及用處。讓開發(fā)人員明確從開發(fā)初期就考慮安全問題,并將安全檢查完善到他們的工作流程中。這將有效避免開發(fā)人員因?yàn)樾迯?fù)安全問題而重寫代碼所花費(fèi)的時(shí)間。
2. 了解依賴關(guān)系
開源包有兩種依賴關(guān)系:直接依賴和傳遞依賴。直接依賴項(xiàng),就是你直接使用在項(xiàng)目里的開源包。而直接依賴項(xiàng)之一使用的開源包,便是傳遞(間接)依賴項(xiàng)了。
分析表明,開源軟件包中80%的漏洞存在于傳遞依賴關(guān)系中。這意味著代碼中的大多數(shù)漏洞都包含在未知且正在使用的(嵌套)依賴項(xiàng)中。而一個(gè)優(yōu)秀的 SCA 工具,應(yīng)該準(zhǔn)確地檢查代碼中的所有依賴項(xiàng),并且應(yīng)該能夠識(shí)別和檢查傳遞依賴項(xiàng)。了解代碼中使用的開源包的深度和復(fù)雜性,能夠確保在各個(gè)級(jí)別都進(jìn)行合適有效的漏洞檢測(cè)。?
3. 自動(dòng)掃描與可操作修復(fù)
一個(gè)好的 SCA 工具可以為企業(yè)提供定期運(yùn)行自動(dòng)掃描的選項(xiàng)。利用這一點(diǎn),企業(yè)可以來設(shè)置對(duì)代碼的主動(dòng)和持續(xù)監(jiān)控。自動(dòng)掃描能夠提供有關(guān)漏洞所在位置以及如何修復(fù)漏洞的可操作警報(bào)。請(qǐng)認(rèn)真對(duì)待 SCA 工具提供的修復(fù)漏洞的方向,采用該方向來應(yīng)用修復(fù)程序。
4. 將 SCA 集成到 CI/CD 流水線中
使用SCA 工具并不意味著需要在開發(fā)—測(cè)試—生產(chǎn)過程中停滯下來。相反,企業(yè)應(yīng)該將 SCA 掃描集成到 CI/CD 流水線中,以便識(shí)別和修復(fù)漏洞,并成為軟件開發(fā)和構(gòu)建過程中的一個(gè)功能部分。同時(shí),這也可以幫助開發(fā)人員更輕松地適應(yīng)代碼安全作為其日常工作流程一部分。
5. 利用報(bào)告及物料清單
包括美國(guó)聯(lián)邦政府在內(nèi)的許多組織,在購(gòu)買軟件時(shí)都要求包含軟件物料清單 (SBOM) 報(bào)告。在產(chǎn)品中提供詳細(xì)的物料清單表明企業(yè)了解跟蹤應(yīng)用程序內(nèi)每個(gè)組件的價(jià)值。有關(guān)安全掃描和修復(fù)的清晰報(bào)告也非常強(qiáng)大。提供有關(guān)企業(yè)的安全實(shí)踐和修復(fù)的漏洞數(shù)量的詳細(xì)報(bào)告,表明對(duì)軟件安全的承諾和踐行。
6. 加強(qiáng)安全策略,提高許可證合規(guī)性
清楚地了解開發(fā)人員使用的開源包,將有助于企業(yè)創(chuàng)建定義和實(shí)施安全準(zhǔn)則的策略。企業(yè)可以使用通過漏洞掃描獲得的知識(shí),指導(dǎo)開發(fā)人員在使用開源軟件包時(shí)考慮安全性。
跟蹤開源代碼本身對(duì)于應(yīng)用程序安全很重要,同時(shí)跟蹤開源許可證對(duì)于合規(guī)性也至關(guān)重要。開源許可證明確了開源軟件包的法律使用條款,使用 SCA 工具能夠幫助企業(yè)深入了解開源組件的許可條款和條件。在制定安全策略時(shí),企業(yè)也需要鼓勵(lì)開發(fā)人員在軟件開發(fā)生命周期初期采用許可證合規(guī)性的規(guī)范。
SCA 的未來
鑒于開源的日益普及,以及最近違規(guī)和網(wǎng)絡(luò)攻擊的宣傳,大眾對(duì) SCA 的關(guān)注熱度逐步上升。開源在推動(dòng)數(shù)字化轉(zhuǎn)型中所扮演著不可忽視的角色,而這個(gè)趨勢(shì)在近期幾乎不會(huì)發(fā)生改變。
企業(yè)使用開源來幫助他們?cè)诟髯缘氖袌?chǎng)中擁有競(jìng)爭(zhēng)優(yōu)勢(shì)。同時(shí),人們逐漸意識(shí)到,他們必須控制開源的使用來管理和減少其伴隨的風(fēng)險(xiǎn)。當(dāng) SCA 工具能夠滿足我們所提到的這些關(guān)鍵需求,將能成功幫助企業(yè)在市場(chǎng)中更好地競(jìng)爭(zhēng)。