一、引言
2020年2月,國家信息安全漏洞共享平臺(tái)(CNVD ) 發(fā)布了關(guān)于Apache Tomcat 存在文件包含漏洞的公告,該漏洞可以造成Tomcat上所有webapp目錄下的重要配置文件或源代碼等敏感數(shù)據(jù)的泄露,若同時(shí)存在文件上傳功能,則可以進(jìn)一步實(shí)現(xiàn)遠(yuǎn)程代碼執(zhí)行(RCE),直接控制服務(wù)器。
Tomcat是Apache軟件基金會(huì)下的一個(gè)重要的開源軟件,在全球范圍內(nèi)被廣泛使用,根據(jù)FOFA系統(tǒng)最新的測(cè)繪數(shù)據(jù)顯示全球范圍內(nèi)有將近300萬個(gè)Tomcat服務(wù)對(duì)外開放,根據(jù)騰訊T-Sec系統(tǒng)提供的數(shù)據(jù)顯示,國內(nèi)受影響的采用AJP協(xié)議的IP數(shù)量約是4萬個(gè)。近年來,隨著軟件開源化趨勢(shì)成為主流,開源軟件已經(jīng)成為軟件供應(yīng)鏈的重要環(huán)節(jié),是軟件生態(tài)不可或缺的組成部分。然而,一旦具有大規(guī)模用戶基礎(chǔ)的開源軟件存在安全漏洞,勢(shì)必會(huì)影響整個(gè)軟件行業(yè)的安全。
二、開源軟件認(rèn)識(shí)誤區(qū)
(一)開源軟件等于免費(fèi)軟件
開源軟件指源代碼可以被公眾使用的軟件,源代碼公開是開源軟件的主要特點(diǎn)之一。雖然大部分的開源軟件可以免費(fèi)獲得,但是開源軟件并不全是免費(fèi)軟件,仍有大量的開源軟件對(duì)用戶是收費(fèi)的。
開源軟件要求軟件發(fā)行時(shí)附帶源代碼,但并不意味著它就一定是免費(fèi)的;同樣免費(fèi)軟件也只是軟件免費(fèi)提供給用戶使用,但并不一定是開源的。
(二)開源軟件可以隨便使用
每一個(gè)開源軟件都需要包含開源許可證去規(guī)定開源軟件的使用范圍和權(quán)利義務(wù),開源軟件并非完全沒有限制可以隨意使用,其最基本的限制就是開源軟件強(qiáng)制任何使用和修改該軟件的人承認(rèn)發(fā)起人的著作權(quán)和所有參與人的貢獻(xiàn)。
開源軟件的許可證比較繁多而且復(fù)雜,經(jīng)常遇到的開源許可證主要有GPL和BSD兩種。如果不恰當(dāng)?shù)厥褂瞄_源軟件,未能充分理解和研究許可證規(guī)定的權(quán)利和義務(wù),往往會(huì)埋下知識(shí)產(chǎn)權(quán)的風(fēng)險(xiǎn)隱患,甚至?xí)粡?qiáng)制要求公開自家產(chǎn)品的私有代碼。
(三)開源軟件比閉源軟件安全
開源不能作為判定軟件產(chǎn)品安全與否的指標(biāo),開源并不意味著一定安全。事實(shí)上,近年來開源軟件的安全性事件頻發(fā),也打破了人們傳統(tǒng)觀念中的“開源等于安全”的認(rèn)知。根據(jù)Snyk公司發(fā)布的《2019 年開源安全現(xiàn)狀調(diào)查報(bào)告》顯示,“過去兩年內(nèi)應(yīng)用程序的漏洞數(shù)量增長了88%,僅2018年包管理器(NPM )的漏洞數(shù)量就增長了47%”。
開源軟件具有開放、共同參與、自由傳播等特性,一方面由于開發(fā)者自身安全意識(shí)和技術(shù)水平不足容易產(chǎn)生軟件漏洞,另一方面也無法避免惡意人員向開源軟件注入木馬程序進(jìn)行軟件供應(yīng)鏈攻擊等安全風(fēng)險(xiǎn)引入行為。
三、開源軟件使用現(xiàn)狀
(一)繞不開、躲不掉的軟件開源趨勢(shì)
當(dāng)前,軟件代碼全部自行開發(fā)的公司幾乎沒有,大量企業(yè)通過使用免費(fèi)的開源軟件創(chuàng)建商用軟件產(chǎn)品。根據(jù)安全與能力管理開源平臺(tái)White Source發(fā)布的《開源漏洞管理現(xiàn)狀》,只有極少數(shù)開發(fā)人員由于公司的政策要求而沒有使用開源軟件,96.8%的開發(fā)人員依賴于開源軟件。用戶往往以為自己購買的是商業(yè)軟件,但實(shí)際上很多商業(yè)軟件是基于開源做二次開發(fā)后以閉源形式提供給用戶的。
另據(jù)Gartner的調(diào)查顯示,99%的組織在其信息系統(tǒng)中使用了開源軟件,如圖1所示。Sonatype公司對(duì)3000家企業(yè)的開源軟件使用情況展開過調(diào)查,結(jié)果表明每年每家企業(yè)平均下載5000多個(gè)開源軟件。隨著開源技術(shù)快速形成生態(tài),企業(yè)用戶引入開源軟件已成大勢(shì)所趨,繞不開、躲不掉。
圖1 開源組件的使用頻率
(二)難以分辨商業(yè)產(chǎn)品中的開源成分
從軟件產(chǎn)品的使用者角度來看,企業(yè)購買的很多商業(yè)軟件往往是開源軟件的商業(yè)版或者發(fā)行版。如果用戶沒有明確地提出要求,商業(yè)軟件供應(yīng)商一般不會(huì)說明其產(chǎn)品中是否涉及開源組件,甚至對(duì)用戶宣稱是完全自主研發(fā),導(dǎo)致用戶的信息系統(tǒng)中被動(dòng)地引入了開源軟件。例如,號(hào)稱自主開發(fā)的某某瀏覽器,經(jīng)過專業(yè)測(cè)試后卻發(fā)現(xiàn)其內(nèi)核是開源軟件Chrome。
從軟件產(chǎn)品供應(yīng)商的角度來看,當(dāng)前的軟件開發(fā)模式中包管理器替程序員做了很多他并沒有意識(shí)到的決定,使得商業(yè)軟件中引入開源軟件的數(shù)量難以做到完全準(zhǔn)確的統(tǒng)計(jì)。更有甚者,部分企業(yè)在軟件開發(fā)過程中,對(duì)開源軟件的使用比較隨意,管理者常常不清楚自己的團(tuán)隊(duì)在開發(fā)過程中使用了哪些開源軟件,就連程序員自己也無法完整地列出開源軟件使用清單。等到商業(yè)軟件流轉(zhuǎn)到用戶手中后,系統(tǒng)的運(yùn)維人員更是無法完全知曉正在運(yùn)行的軟件產(chǎn)品中是否包含了開源軟件,包含了哪些開源軟件,這些開源軟件是否存在安全漏洞等,這就無形中給企業(yè)的信息系統(tǒng)帶去了安全風(fēng)險(xiǎn)。
(三)誰該站岀來為開源軟件安全負(fù)責(zé)
隨著大型軟件開發(fā)過程中,開源組件的占比越來越高,加之軟件開發(fā)人員往往只關(guān)注自己開發(fā)的那部分代碼的安全性,忽視了采用的開源組件的安全質(zhì)量,最終導(dǎo)致成型軟件產(chǎn)品的系統(tǒng)安全問題越來越多。根據(jù)Snyk公司的調(diào)查報(bào)告,81 %的用戶認(rèn)為開發(fā)者應(yīng)負(fù)責(zé)開源軟件的安全性,如圖2所示。
圖2 開發(fā)者該為開源軟件安全負(fù)責(zé)
大部分開源軟件的使用者認(rèn)為軟件代碼經(jīng)過了很多機(jī)構(gòu)和人員的測(cè)試和審查。然而,現(xiàn)實(shí)情況是并沒有多少人對(duì)開源軟件的代碼安全進(jìn)行測(cè)試,“心臟滴血”漏洞就是最好的例證。軟件供應(yīng)商對(duì)外售賣的商業(yè)軟件中采用了開源軟件,但安全責(zé)任并未從開源代碼提供者轉(zhuǎn)移到軟件供應(yīng)商,導(dǎo)致最終還是由用戶承擔(dān)了軟件漏洞的風(fēng)險(xiǎn)。
四、開源軟件漏洞安全分析
由于開源軟件使用與獲取的便利性,加之部分軟件開發(fā)人員的安全意識(shí)淡薄,可能導(dǎo)致忽略開源軟件帶來的風(fēng)險(xiǎn)。總體來看,開源軟件存在的安全問題比較嚴(yán)重,安全漏洞是主要的問題,軟件供應(yīng)鏈攻擊呈現(xiàn)上升趨勢(shì),同時(shí)缺少系統(tǒng)的安全審查機(jī)制。
(一)開源項(xiàng)目維護(hù)者的安全意識(shí)和技術(shù)能力參差不齊
Snyk公司通過掃描數(shù)以百萬計(jì)的Github代碼庫和程序包和對(duì)超過500個(gè)開源項(xiàng)目的維護(hù)者進(jìn)行調(diào)查發(fā)現(xiàn):只有8% 的開源項(xiàng)目維護(hù)者自認(rèn)為有較高的信息安全技術(shù),接近半數(shù)的開源項(xiàng)目維護(hù)者從來不審計(jì)代碼,只有11%的維護(hù)者能做到每季度審核代碼。另據(jù)Linux基金會(huì)發(fā)布的《開源軟件供應(yīng)鏈安全報(bào)告》顯示,大量開發(fā)人員在開發(fā)軟件時(shí)并未遵守應(yīng)用程序安全最佳實(shí)踐。開源項(xiàng)目維護(hù)者對(duì)代碼安全質(zhì)量重視不夠和技術(shù)能力水平不足,是當(dāng)前造成開源軟件安全漏洞的主要原因。
奇安信代碼安全實(shí)驗(yàn)室發(fā)起“開源項(xiàng)目檢測(cè)計(jì)劃”,通過對(duì)3000余款使用比較廣泛的開源項(xiàng)目進(jìn)行檢測(cè),發(fā)現(xiàn)所有檢測(cè)項(xiàng)目的總體平均缺陷密度為14.22/ KLOC,高危缺陷密度為0.72/KLOC。路徑遍歷、空指針相關(guān)、密碼管理、跨站腳本XSS、注入類缺陷、XML外部實(shí)體注入、緩沖區(qū)溢出、資源管理、HTTP響應(yīng)截?cái)、日志偽造等是開源軟件主要的安全風(fēng)險(xiǎn)。
2019年,Unit42安全團(tuán)隊(duì)分析了 24000多個(gè)公開的GitHub開源項(xiàng)目,共識(shí)別出2328個(gè)硬編碼密碼,2464個(gè)API密鑰和1998個(gè)OAuth令牌。對(duì)于關(guān)系社會(huì)安全穩(wěn)定的企業(yè)單位,如銀行等金融機(jī)構(gòu),信息系統(tǒng)中如果采用了上述的開源組件將會(huì)對(duì)社會(huì)經(jīng)濟(jì)安全造成惡劣的影響。圖3中的這段代碼[5]來自一個(gè)開源系統(tǒng),它硬編碼了用于支付的私鑰,通過反編譯可以直接查看相關(guān)配置數(shù)據(jù)。
在密鑰管理中最常見的錯(cuò)誤,就是將密鑰硬編碼在代碼里。一旦攻擊者獲得密鑰,再通過審計(jì)分析支付系統(tǒng)的加密算法就可以破譯所有的加密數(shù)據(jù)。
functiiontoSubmit( $ pay m ent) I
Smerld- St hi s->getConf( $ pay montCM_Ord c rldl/memb or .id'); 賬戶
SpKey = S th is->getConKSp ay me nt[' M _Orderl di.' PmatcKcyR}:
Skey = SpKey=r? 'afsvq2mqwc7j0ivukqexrzdQjqBhr:$p Key;
Sret.uri = $this-^>callhackUrl:
Sserver.url - $this^>serverCallbackUrl;
圖3 用于支付的密鑰被硬編碼在源代碼中
(二)越來越多的黑客組織開始盯上開源軟件
軟件生產(chǎn)過程中,代碼復(fù)用程度越來越高,各種開發(fā)包、核心庫的應(yīng)用越來越廣泛。很多黑客組織也意識(shí)到了這一點(diǎn),逐漸把目光放在了開源軟件上,利用開源代碼植入后門。這些代碼的復(fù)用度越高,其中的后門影響范圍就越廣,從而實(shí)現(xiàn)對(duì)軟件供應(yīng)鏈上游的攻擊。
2019年8月,Webmin被爆存在高風(fēng)險(xiǎn)遠(yuǎn)程命令執(zhí)行漏洞,根據(jù)Webmin開發(fā)人員的說法,該漏洞不是編碼錯(cuò)誤的結(jié)果,而是“惡意代碼注入受損的構(gòu)建基礎(chǔ)架構(gòu)中”導(dǎo)致的。Webmin是一個(gè)用于管理Linux和UNIX系統(tǒng)的基于Web的開源軟件,互聯(lián)網(wǎng)上大約有13萬臺(tái)機(jī)器使用Webmin。根據(jù)Shodan搜索引擎收集到的統(tǒng)計(jì)數(shù)據(jù)顯示,有近10萬臺(tái)服務(wù)器曾運(yùn)行過存在“后門代碼”版本的Webmin軟件,對(duì)整個(gè)互聯(lián)網(wǎng)安全造成了巨大的影響。
(三)開源軟件缺少系統(tǒng)的代碼安全審查機(jī)制
美國最先認(rèn)識(shí)到開源軟件安全問題的重要性,早在2006年美國國土安全部就開展過“開源軟件代碼測(cè)試計(jì)劃”,對(duì)大量開源軟件進(jìn)行安全隱患的篩選和加固。
根據(jù)Snyk公司的報(bào)告顯示,37%的開源開發(fā)者在持續(xù)集成(CI )期間沒有實(shí)施任何類型的安全測(cè)試,54 %的開發(fā)者沒有對(duì)Docker鏡像進(jìn)行任何的安全測(cè)試。
開源代碼中不斷發(fā)現(xiàn)新的安全漏洞,而很多項(xiàng)目沒有查找并修復(fù)漏洞的響應(yīng)機(jī)制。開源項(xiàng)目的安全記錄方式也沒有明確的標(biāo)準(zhǔn)可以遵循,GitHub上排名前40 萬的公共代碼庫中,僅2.4%的項(xiàng)目有安全文檔。
開源軟件在實(shí)際的流通過程中,各個(gè)環(huán)節(jié)間缺乏系統(tǒng)的安全審查機(jī)制,部分企業(yè)內(nèi)部也缺少必要的安全檢測(cè)要求和規(guī)范,導(dǎo)致一旦底層開源組件出現(xiàn)安全漏洞,這些問題組件將傳染給哪些商業(yè)產(chǎn)品、影響哪些業(yè)務(wù)領(lǐng)域,沒人能給出一個(gè)準(zhǔn)確的答案。
五、風(fēng)險(xiǎn)控制措施
(一)國家層面組織開展開源軟件源代碼檢測(cè)工程
隨著開源趨勢(shì)的不可逆以及開源軟件在商業(yè)軟件中占的比重越來越高,開源軟件儼然已經(jīng)成為軟件開發(fā)的關(guān)鍵基礎(chǔ)設(shè)施,因此開源軟件的安全問題應(yīng)該上升到國家安全的角度來對(duì)待。
建議國家相關(guān)部門組織有業(yè)務(wù)基礎(chǔ)的科研機(jī)構(gòu)開展開源軟件源代碼檢測(cè)工程,并將檢測(cè)的成果以一種安全可控的方式向商業(yè)軟件制造商及關(guān)鍵崗位的企業(yè)共享,盡可能降低開源軟件漏洞對(duì)社會(huì)各行各業(yè)的影響。
(二)企業(yè)層面建設(shè)開源軟件安全治理體系
企業(yè)應(yīng)該建立開源軟件安全治理體系,明確開源軟件使用的安全準(zhǔn)入條件,從軟件開發(fā)階段就建立開源軟件使用的統(tǒng)一策略,實(shí)現(xiàn)開源軟件引入和使用的標(biāo)準(zhǔn)化、規(guī)范化和合規(guī)化。
對(duì)于明確需要引入的開源軟件,在加強(qiáng)版本控制的基礎(chǔ)上,一方面開展安全風(fēng)險(xiǎn)評(píng)估檢測(cè);另一方面持續(xù)跟蹤相關(guān)的漏洞情報(bào),時(shí)刻提防軟件供應(yīng)鏈攻擊。
(三)用戶側(cè)建立軟件安全滲透測(cè)試機(jī)制
從已經(jīng)發(fā)生的軟件供應(yīng)鏈攻擊案例來看,非常有必要開展軟件上線前的滲透檢測(cè)。通過采用良性的攻防滲透的方法、思路和手段,及時(shí)發(fā)現(xiàn)軟件系統(tǒng)中存在的安全漏洞和隱患,降低新軟件上線給系統(tǒng)帶來的風(fēng)險(xiǎn)。
企業(yè)在開展軟件采購時(shí),應(yīng)向供應(yīng)商明確要求提供軟件中包含的開源組件,“用了什么,什么版本,軟件來源”,并在驗(yàn)收時(shí)進(jìn)行細(xì)致核查。
(四)檢測(cè)機(jī)構(gòu)加強(qiáng)對(duì)安全產(chǎn)品中開源組件的檢測(cè)
信息安全產(chǎn)品是重要信息系統(tǒng)安全防護(hù)的重要組成部分,其自身的安全性將影響重要信息系統(tǒng)的安全。檢測(cè)機(jī)構(gòu)應(yīng)要求軟件供應(yīng)商準(zhǔn)確提供產(chǎn)品中包含的開源組件等信息,并針對(duì)開源組件開展專門的安全檢測(cè)。這樣一旦某個(gè)開源軟件被爆出重大的安全漏洞,產(chǎn)品檢測(cè)機(jī)構(gòu)可以及時(shí)迅速地發(fā)布安全預(yù)警,并要求相關(guān)產(chǎn)品廠商盡快開展修復(fù),甚至對(duì)修補(bǔ)不力的產(chǎn)品予以禁用處置。
六、結(jié)語
幾乎每個(gè)商業(yè)軟件都使用開源軟件節(jié)省開發(fā)時(shí)間、降低公司成本、避免重復(fù)造車輪,但軟件公司對(duì)這些代碼的品質(zhì)和來源卻未必都給予了足夠的關(guān)注和重視。
開源軟件已經(jīng)成為網(wǎng)絡(luò)空間的重要基礎(chǔ)設(shè)施,應(yīng)積極開展開源軟件源代碼檢測(cè)工程,推動(dòng)建設(shè)開源軟件安全治理體系,形成軟件安全滲透測(cè)試的長效機(jī)制。
(原載于《保密科學(xué)技術(shù)》雜志2020年2月刊)