伴隨著開源軟件被各大企業、高校乃至于政府部門使用,人們對開源軟件的關注已逐漸從價格方面轉移到性能、安全性以及用戶體驗上。根據美國新思科技公司(Synopsys)發布的《2020 年開源安全和風險分析》一文中提供的數據,99%的代碼庫包含至少一個開源組件,其中開源代碼占所有代碼的70%,由此反映出使用開源代碼在軟件開發中占有較大比重,覆蓋的行業包括企業軟件、工業控制環境、醫療、金融等眾多領域。在審計的代碼庫中,75%的代碼包含具有已知安全漏洞的開源組件,而伴隨著開源軟件數量的不斷增加,無論是開源組件還是成品的開源軟件,含有漏洞的產品的占比將會持續增加。
一、開源軟件在工業領域的安全風險
近年來,開源軟件使用率逐漸增長,但其中的安全性問題也日益凸顯。主要的安全性問題表現為以下3個方面。一是使用過期和廢棄的開源代碼的行為非常普遍,并且使用易受攻擊開源組件的行為也比較普遍。二是開源代碼和軟件安全漏洞收集與管理分散,社區對安全漏洞管理沒有十分重視。根據White Source公司2 0 2 0年發布的《開源代碼脆弱性態勢》提供的數據,2019年報告的開源軟件漏洞較上年增長了50%,超過85%的開源軟件漏洞已經被公開并修復,但只有84%的漏洞信息被收集在漏洞數據庫中。而當下的開源軟件漏洞的信息廣泛而零散地分布在各大開源社區中,造成了漏洞信息收集困難。三是無意行為與惡意行為并存。開發者可能源于粗心的編程或使用“不安全的”開發工具開發開源項目并發布在社區內。當然也存在不法分子利用開源平臺注入惡意病毒、兜售漏洞信息或利用漏洞開發開源軟件或服務。這3方面不足以概括所有安全問題,但確實廣泛存在于工業領域中。
互聯網領域,例如郵件傳輸代理Sendmail、Web服務器Apache、操作系統Linux、數據庫系統MySQL和辦公軟件包OpenOffice,廣泛使用開源軟件與開源的應用。除此之外,開源軟件甚至已經成為部分技術服務公司的核心基礎架構,例如Amazon、Google 和Yahoo。顯然,開源軟件已經是重要而關鍵的信息系統,它需要安全保護以免受攻擊。其可用性與使用范圍的不斷提高使它吸引了黑客和其他對軟件漏洞感興趣的人。更加危險的是,如果開源軟件不是在封閉的環境中使用,而是與其他系統和網絡互聯,相關漏洞的后果將更加難以預料。在2017年9月,客戶信用評估機構Equifax宣布了遭到網絡安全攻擊造成用戶數據泄露。該機構使用Java Web應用程序框架ApacheStruts建立他們的網站,而數據泄露是由Apache Struts 的漏洞(CVE- 2017-5638)引起的。開源Apache在20 17年和2020年接連曝出高危漏洞,分別出現在Apache的Tomcat組件和Spark組件中。對于前者,攻擊者可以構造參數攻擊Tomcat AJP協議,以讀取服務器webapp下的任意文件,后者則由于Spark認證機制存在缺陷,致使密鑰認證失效,攻擊者可以通過構造調用指令攻擊服務器并取得遠程代碼執行的權限。上述漏洞均被CNVD評為高危漏洞。
工業控制系統開源軟件方面,在2018年NIST報告的漏洞中,知名開源工控系統Rapid SCADA被曝出由于弱權限導致的提權漏洞,該訪問控制漏洞使得攻擊者可以在管理員環境中執行任意遠程代碼,被NIST評為“嚴重”級別,給出的弱點為CWE-274,屬于不正確的默認權限。Rapid SCADA作為完整的工業控制系統,包含了現場控制層、過程監控層及人機界面等多種功能,由于其成本低,被大量國內制造企業選為控制系統。一旦攻擊者使用該漏洞進行攻擊,將引發嚴重后果。
二、開源軟件在工控系統的安全應用實例
面向工業互聯網,開源軟件與組件被廣泛使用。以下通過一個簡單的電力系統實例可以發現工業控制系統如何使用開源資源,以滿足自身的現場設備層、現場控制層、過程監控層、制造執行系統層(MES)和企業管理層的構建。
在工業控制系統中,現場設備層是由遠程終端組件(RTU)、智能電子設備(IED)等構成。現場設備層通過各類工業以太網連接可編程控制器(PLC )、分布式控制器和分布式數控等控制單元接入成為分布式控制網絡,形成現場控制層。其中,可以使用公開的Modbus TCP協議設置點對點或總線式的數據通信。在現場設備層與控制層中,不同廠商的下位機使用的協議、物理接口均不同,開源軟件難以運行在該層次。而在現場控制層和過程監控層中,用于管理下位機的OPC系統、人機交互界面(HMI)以及服務器后端(包含用于數據存儲的模塊)等均可以使用開源軟件。
除此之外,隨著物聯網技術的發展,遠程控制現場設備已經成為趨勢,傳統的工控系統安全防護的方法,諸如物理隔離、網閘等措施不能很好地適用于現代工控系統。而對于工控系統使用的協議,如在SCADA系統中,其專業協議在發展的過程中逐漸向開放的TCP/IP靠攏,具有TCP/IP協議的特性。此外,開源環境支持配置開發各種Internet服務,如HTTP、FTP等,用于園區管理層的通信。現在企業管理層越來越廣泛地使用虛擬化,可以使用VirtualBox進行管理。在工業互聯網概念下的云資源也有大量的開源資源,例如Oracle 的VirtualBox hypervisor可以搭建云計算平臺。
當然,針對工控系統的信息安全防御,可以將傳統互聯網中的開源網絡安全檢測工具運用于工控環境中。譬如基于縱深防御的思想在工控系統的每層之間架設防火墻和IDS系統,這些安全模塊都可以選用開源的網絡防火墻和IDS系統,并對其進行適當改進。在該工業控制系統中,其中搭載了多種開源安全工具,如Snort用于入侵檢測,Wireshark提供包捕獲功能,Sebekd支持擊鍵記錄,Argus收集網絡統計數據,MySQL用于數據存儲等,為管理人員提供高自由度的配置選擇。在該工控靶場系統中,風險評估與事件掛鉤,根據事件的特點對事件賦予不同的可靠度值和優先級。在態勢感知中,安全分析為每一個事件賦予一定的風險等級:一旦事件的風險值超過配置的閾值,就會生成一個“警報”并顯示在開源環境下開發的Dashboard上。
以上所描述的簡易的工控系統都是在開源環境下搭建的、廣泛使用開源組件開發的和借助開源軟件支持下實現的。借助這樣的開源工具,幫助在低成本高效率地構建工控系統時,不可避免地為我們引入了開源環境的安全性問題。
三、開源軟件脆弱性的原因分析
開源軟件的興起離不開開源社區的發展。社區的興起為開源軟件的開發和傳播奠定基礎。開源軟件具有協作開發的特點,故開源軟件存在著不同于傳統軟件的安全脆弱性。從開源軟件安全技術開發分析,開源軟件安全劃分為管理、架構、認證和部署4個方向。在這4 個方向中,大多數的研究者更傾向于研究架構和認證方向的技術,主要著眼于開源安全系統設計、開源漏洞特征分析等研究方向。而研究管理和部署方面相關的社會技術的研究者較少,導致用于戰略管理、政策管理、培訓等方面理論很少,進一步造成了在解決開源軟件安全問題時,多使用傳統技術的局面。對于一個完善的安全管理系統,社會技術方面和傳統技術方面同樣重要。從社會技術角度對造成開源軟件脆弱性的原因進行劃分,可以發現從軟件開發時的分工到開源軟件社區公布的安全要求,都會對開源軟件的安全性產生影響,主要影響來源于以下6個方面。
(1)開發者對軟件安全的態度和行為方面。開發者或組織者并沒有意識到軟件可能會出現安全漏洞,或是開發者認為軟件價值不足以召來攻擊者,抑或是關注軟件安全審計會導致工作量增加使得開發者不愿意投入精力。安全檢查工作會致使開發者的工作量增加,因此部分開發者不愿投入過多精力在安全性檢查上,該類群體將主要精力放在實現軟件功能以及提升軟件性能上,而如果開發者的能力不足或沒有做安全性檢查的習慣,開發出的軟件可能會產生漏洞。
(2)開發者開發能力與開發者行為方面。由于部分軟件開發者并不直接接觸代碼或是沒有系統接觸過軟件安全分析流程,該群體并不具有對軟件安全性進行分析的能力,也并不了解軟件安全性分析的流程,最終只能根據經驗對軟件進行修改或直接選擇承受風險。
(3)開源社區規范制定方面。要求開源軟件的開發團隊針對軟件安全制定一套規范比較困難,所以多數團隊把開發重點放在實現軟件功能上,退而求其次使用開源社區提供的規范,然而大部分社區并沒有提供相關規范,這就意味著對于大多數開源項目,軟件安全規范方面還是空白的、缺少相關規范的限制,開源軟件安全性分析的流程不規范可能會導致安全審查過程出現缺失。
(4)開源開發管理方面。部分開源軟件開發團隊沒有設置專門的安全管理團隊。原因可能是成員不具有安全管理的能力,或大部分的團隊并沒有與安全軟件公司掛鉤以獲取安全管理資源。因此大多數情況下,安全管理工作由組織者承擔。管理的效果則與組織者的個人責任感和能力相關,無法保證能及時發現別有用心者在軟件組件中安插的非法操作代碼。
(5)溝通渠道與組織管理方面。由于大部分項目是由志愿者開發組件,由組織者進行綜合,在此過程中會出現兩方交流不徹底的情況,致使組織者提供的安全要求無法及時傳達到個人,以及志愿者在開發時遇到安全問題無法找到有效的解決方案。最終,志愿者上傳的組件中的安全問題未得到有效解決卻直接被組織者采用。
(6)開源社區使用者方面。雖然理論上當越多的人看到軟件的源代碼時,軟件代碼中的漏洞越容易被發現,軟件也會變得越安全。但實際情況中,大多數代碼審核者并沒有刻意去尋找漏洞,即便是對發現這些漏洞最感興趣的人群,也大都傾向于發掘較為淺顯的漏洞,故而具有嚴重影響的漏洞并不一定會被及時發現。
以上是開源軟件存在問題的原因,主要可以歸納為責任劃分不具體或缺少責任劃分、安全意識薄弱、對軟件安全性抱有僥幸心理以及開發人員能力不足。
四、開源軟件安全分析與安全應對
通過以上工控系統的構建實例,我們可以發現相比于傳統軟件,開源軟件突出的特點為源代碼公開,用戶可以在源代碼的基礎上根據實際使用需求對代碼進行選擇、更改和配置。傳統軟件開發注重經濟效益,以贏利為目的,故有保護源代碼的剛需,而開源軟件的開發者團體多為興趣所驅動,使源代碼得以公開,開源社區進行技術交流和技術支持。在使用時用戶可以刪減不必要的代碼,優化需要的核心功能。經過修改后的代碼更加符合用戶需求,在體積上也更加輕量化,相比于傳統軟件注重功能的全面性,開源軟件將重點放在了軟件的多樣性和專一性上,在某些有特殊要求的領域,如工業互聯網中有較好的表現。此外,由于代碼的公開,開源軟件出現的漏洞會很快被志愿者發現并反饋給開發團隊,使之得到及時修正或能夠讓使用者及時得到提醒。
開源軟件具有的另一特點是使用成本低。在用做商業用途時,使用軟件所投入的成本大小就必須要納入考慮范圍,開源軟件的低成本使其成為較好的選擇。開源軟件的使用成本主要體現在對軟件的修改、部署和后期的運維上。開源軟件的使用者對軟件的使用、研究和改良都是自由的,傳統軟件受到知識產權相關法規的保護,無關個人或組織對傳統軟件的研究和改良都是不受法律保護的,在某些地區甚至與當地法規相違背,而開源軟件并不存在這些桎梏,使用者可以任意對軟件進行研究、更新,且所有的研究結果和改良方式都為使用者所擁有,不存在產權問題,這為開源軟件脆弱性分析提供了便利。因此,開源軟件的使用者不會如傳統軟件的使用者那樣受到軟件廠商的更新限制,可以更加及時地更新軟件。
那么如何做好安全的開源軟件安全開發呢?筆者建議可以從以下3個方面去做。
(1)管理好開源社區:可以毫不猶豫地說當今任何優秀的開源軟件或基礎軟件,都離不開開源社區的支持。因此扶持管理好有價值的開源社區非常重要。圍繞規范的開源社區,研究與開發新的開源軟件的安全需求處理框架和策略對開發人員安全開發軟件有很大的幫助。例如,從開源軟件項目的非功能性和功能性的需求中識別安全需求,研究高精度的自動化工具支持安全需求追蹤以及選擇測試策略并生成測試用例的方法等技術就非常有意義。
(2)從政策上引導開源軟件安全開發與安全開發從業人員培養:我國人力資源豐富,為開源軟件開發提供了基礎。利用產學研協同合作可以很好地構建人才體系和優化的開發工業軟件。在安全性上,要明確安全開發的核心。傳統的安全學習方法通常以安全性為中心,以主題形式介紹知識內容,因此不適合于興趣驅動學習者進行學習。開發人員或安全問題的學習者面對如此廣泛的安全知識,通常會認為軟件安全性很難實現,傾向于將其拋在一邊。因此,需要從上至下,有組織有協調地從需求開發入手,組織資源,為軟件安全構建特定的學習情境和交流平臺,使學習者可以瀏覽安全知識并將其與他們熟悉的環境相關聯。這一行為需要從政策上協調,實現合理規劃與資源配置。
(3)加強開源軟件安全開發合作和形成安全策略:開源軟件安全開發需要各方有效有序有力的合作,需要在國內外合作的基礎上,在產、學、研配合下,在政策指導下,保障開源軟件安全開發。考慮到現有開源軟件項目要么缺失相應的安全策略,要么所采用的安全策略局限過大,故需要借鑒成熟的安全策略,合并到統一合作的機制中。因此,未來的研究應確定在實踐中使用的更多候選安全策略,并找到將它們系統地納入現有安全策略層次結構的方法。將新發現的安全策略納入策略層次結構時,還需要進行進一步研究以評估其有效性。
五、結語
近年來,越來越多的事件暴露出我們國家基礎工業軟件方面的薄弱問題。在開發重要的基礎工業軟件上,開源社區和開源軟件不可避免地扮演著重要角色。安全開發開源軟件需要至少從管理好開源社區、從政策上引導開源軟件安全開發、加強開源軟件安全開發合作和形成安全策略三方面發力。做好開源軟件安全開發將有利于我國基礎工業軟件的蓬勃發展。
(原載于《保密科學技術》雜志2020年7月刊)