一、信息化建設的核心要素
當今社會,信息技術已經成為人們生產生活中不可或缺的內容,世界大多數國家都把加快信息化建設作為發展戰略。信息化建設涉及的范圍、領域非常廣泛,但大致可以分為國家層面和企業層面。其中,國家層面建設的主要是關鍵信息基礎設施,指一旦遭到破壞,可能嚴重危害國家安全、國計民生、公共利益的信息系統;企業信息化建設指通過信息技術的部署來提高企業的生產運營效率,增加企業收益和持續經營的能力。因此,這些信息系統對于國家或企業的發展至關重要,其安全性更是不容忽視。
雖然信息化建設涉及的領域很多,但總體而言,主要包括硬件設備、軟件程序和信息數據三大部分,但對于硬件設備的控制、對于信息數據的操作處理也需要軟件來實現,因此軟件是系統的“靈魂”,而程序代碼是軟件的具體呈現形式,難怪Gartner公司簡意賅地指出:“基礎設施即代碼” 。可見,代碼是信息化建設中的核心要素,是信息系統或基礎設施中安全防護的重點。
信息技術采購全球化的發展態勢使得國家或企業信息系統的產品來源更加多元化,信息技術供應鏈更加復雜。軟件構建方面更是如此。許多情況下,軟件系統是來自世界各地的代碼組合起來的,包括自主開發的、商業購買的、開源提供的、外包開發的等。VeraCode公司曾統計過,30%-70% 包含自主開發軟件的代碼也含有第三方代碼,并多以開源組件、商業或外包共享庫/組件的形式存在。這種方式提高了軟件開發的效率,但對其安全性和可控程度無疑是巨大的挑戰。尤其近年來Struts2、 OpenSSL等應用非常廣泛的基礎開源組件高危漏洞頻現,伊朗“震網”、烏克蘭“黑暗能量”等基于基礎軟件漏洞的惡意程序肆意侵入工控系統,讓國家和企業對軟件供應鏈、開源軟件、關鍵信息基礎設施中軟件安全性的關注程度逐漸提高,某些內容在國家法規和戰略中已有所體現。
為了保障軟件安全,能夠“盡早、盡快”發現并修復軟件系統中漏洞的方法是急迫所需的,這正是內建安全(BuildSecurity In,BSI)的開發方式提倡的。源碼作為軟件的原始形態,具備豐富的語義信息,對于它的保障能夠盡早且較為全面的發現軟件中的問題,符合 BSI的原則,越來越多的機構和個人也意識到了其在高效保障軟件系統安全方面的作用。
二、內建安全的體系化方法
目前,企業針對信息系統的安全措施仍主要集中在臨近上線時的滲透測試或安全審計,以及上線后的防火墻等被動防御方法。這種方式使得漏洞發現的時機較晚,造成修復代價高昂,而且一些基于業務邏輯的攻擊在上線后也難以發現。
上述將安全與開發割裂的做法被證明越來越不適應信息系統建設對安全性的需求,由于大量安全措施都應用在開發過程之外,問題不能及時反饋給開發人員。針對這些局限性,10多年前,BSI的思想被提出,具體而言就是把各種安全實踐內建到軟件開發的各個關鍵環節之中,利用自動化技術從源頭上盡早、盡快、持續、以團隊共同協作的方式發現安全缺陷,提高解決安全問題的效率。 BSI通過開發團隊中已有的角色實施安全措施,利用自動化安全分析和測試技術快速地發現安全問題,以達到全方位的安全開發。但是,由于資金和意識等方面的限制,目前能夠深刻理解BSI并實際運用的企業還很少。
微軟提出的安全開發生命周期(SecurityDevelopment Lifecycle,SDL)無疑是BSI 思路的最佳實踐之一,微軟已將其作為強制策略應用于自己產品的開發中。SDL從漏洞產生的根源上解決問題,通過對軟件工程的控制,保證產品安全性。SDL將安全實踐貫穿于軟件開發和運維的 7個階段:在培訓階段,對開發、測試人員、項目經理、產品經理等進行安全知識培訓;在需求分析階段,確定安全要求、Bug列表,并進行安全風險和隱私風險評估;在系統設計階段,詳細考慮安全和隱私問題,進行攻擊面和威脅建模分析;在編碼實現階段,選擇安全性更高的編譯器,禁用不安全的 API,并在工具輔助下對源代碼進行靜態分析,對結果進行人工審計;在測試驗證階段,進行模糊測試、滲透測試等動態分析,并對之前的威脅模型和攻擊面分析結果進行驗證;在發布和響應階段,將軟件存檔,確立事件響應計劃,并進行最終的安全評析。具體如下圖所示。
SDL是一種針對傳統瀑布型開發方式的安全模型,隨著對軟件開發質量和效率要求的不斷提高,以DevOps為代表的敏捷開發方法得到推崇。在此基礎上,Gartner 公司于2012年推出了DevSecOps的概念,旨在將安全融入敏捷過程中,即通過設計一系列可集成的控制措施,增大監測、跟蹤和分析的力度,優化安全實踐,集成到開發和運營的各項工作中,并將安全能力賦給各個團隊,同時保持“敏捷”和“協作”的初衷,架構如下圖所示。
DevOps的目的決定了其對“自動化”和“持續性”的要求更加突出,因此在將安全控制集成其中時,也應該盡量遵循“自動化”和“透明”的原則。為了將安全無縫集成到DevOps中,Gartner 和一些專家從實踐出發提出了一系列建議,主要包括:風險和威脅建模、自定義代碼掃描、開源軟件掃描和追蹤、考慮供應鏈安全問題、整合預防性安全控制到共享源代碼庫和共享服務中、版本控制和安全測試的自動化部署、系統配置漏洞掃描、工作負載和服務的持續監控等。
根據上面的分析,在BSI及其相應模型中,無論基于何種開發方式,安全的位置都被提前,貫穿于開發運營的各個階段,并強調團隊協作,不再僅關注即將上線和運行時的后驗性安全防護措施。不難看出,針對架構和源代碼安全分析的重要性更加突出,在 DevSecOps中更是涉及對開源軟件、源碼庫、版本控制等的相關考慮。因此,從內建安全的現實需求而言,源碼安全保障對提高軟件的整體安全質量具有不可替代的重要核心作用。
三、源碼安全保障具體實踐
源碼安全保障是軟件上線前實施的重要安全措施,也是SDL、DevSecOps等BSI 模型著重關注和要求的內容。源碼安全保障并沒有一個固定的范圍和概念,概括來說,它是對上線前的開發文檔、源代碼等進行分析、測試、綜合管理,以盡量“多、快、準”地發現其中安全隱患(如安全缺陷、違背安全規則的情況等),并修復的過程。根據我們團隊多年的工作經驗,好的源碼安全保障應當至少完成“按照安全編程規范編寫代碼”、“使用經過安全確認的開源代碼或第三方組件”、“對編寫出的源代碼進行缺陷檢測和修復跟蹤”等工作。結合具體應用,我們歸納出了如下的實踐工作:
1. 威脅模型分析
威脅模型分析原指設計階段軟件架構安全性分析的一種方法,用來發現軟件中潛在的威脅點,主要判定是否可能存在對敏感數據的非正常操作。但是,現在威脅的范圍更加廣泛了,開發中因人或管理因素引入的安全問題也應屬于建模范圍,需盡早考慮。主要工作有:對開發人員進行安全編碼、編寫能夠攔截常見攻擊的代碼等方面的培訓;開發簡單的自動化威脅和風險建模評估工具,如微軟的STRIDE ,并在安全設計中使用,特別針對處理敏感數據或者直接訪問互聯網的軟件應進行深入的、多層次的建模分析。
2. 源碼缺陷分析
源碼缺陷分析指利用自動化靜態分析工具發現源代碼中的緩沖區溢出、SQL注入、跨站腳本等安全缺陷的過程。目前靜態分析工具的缺陷檢測規則大多是基于CWE 、OWASP Top10、CWE/SANS Top25等標準提取的,不同工具支持的語言多少不等,但對于主流的 C/C++/JAVA/PHP等語言支持的較多。當前靜態分析工具主要的問題仍然是誤報較多,因此需要進行人工審計,該項工作需要一定的背景知識,一般由安全人員輔助開發人員來完成。
3. 源碼合規檢查
源代碼合規檢查指利用自動化靜態分析工具發現代碼中不符合安全編程規范的內容,目前國際上比較主流的安全編程標準包括CERTC/C++/Java、MISRAC/C++等。軟件開發企業應該根據主管部門監管要求和自身的開發現狀,總結歸納符合自身特點的企業安全編程規范,并采用合適的工具,通過規則定制,實現自動化檢查。
4. 源碼溯源檢測
源碼溯源檢測是面向復雜的供應鏈現狀提出的,主要是基于開源代碼庫,自動化地檢測軟件中是否引用了開源代碼模塊,引用的開源代碼模塊是否存在已知的安全漏洞,以及軟件使用授權(License) 問題。DevSecOps等開發方法中對開源軟件和供應鏈安全的關注度較高,而源碼溯源檢測可以在很大程度上規避和降低開源代碼引入的法律和安全風險。完善的開源代碼庫是溯源檢測的基礎。
5. 開發流程對接
與開發流程對接主要是指,源碼分析工具應當以最小代價透明地融入開發和測試流程中。如今開發流程越來越規范,為了方便版本控制,許多企業在開發時都使用代碼管理系統,如SVN、Git 等,而開發人員均使用自己習慣的IDE。因此,良好的對接應該是源碼分析工具可以以插件的方式嵌入主流的IDE中,實現一鍵式啟動;并且分析工具支持從代碼管理系統中自動獲取代碼進行檢測,檢測結果可與 Bugzilla等Bug管理系統進行整合。
6. 結果可視展現
可視化的結果呈現、方便的驗證操作和統計數據對比等都是提高源碼安全保障效率的有效手段。具體而言,可視化的分析結果應當包括:缺陷密度、缺陷分布、不同版本的檢測結果對比、缺陷觸發路徑的圖形化展示等內容。這些結果對于快速地定位和修復源碼安全問題提供方便。
上述6項內容符合內建安全的理念,也能夠滿足SDL、DevSecOps 等方法對上線前軟件安全保障的要求,同時也符合安全融入DevSecOps時所應遵循的“自動”和“透明”原則,是非常優秀的源碼安全保障實踐,可以作為企業構建自身內建安全開發體系時的參考。
*本文作者:360企業安全集團代碼安全事業部副總經理韓建,轉載請注明 FreeBuf.COM