在過去的軟件開發流程中,安全總是在開發的最終階段進行——雖然這個時候發現的漏洞其實能在更早的階段就被修復。如果要在當下復雜的開發環境中進一步加速的同時還能保障軟件的安全性,開發者就需要將安全左移,更早地將安全融入開發周期中。
但是安全在開發周期的左移并不容易,開發人員會面對不少困難。以下是五個最常見問題——這些問題都能通過靜態分析解決。
內存錯誤
內存讀取錯誤會因為泄露敏感信息對機密性和完整性帶來潛在的威脅,而內存寫入錯誤則因為會改變工作流而對機密性、完整性和可用性都帶來影響。比較常見的內存問題有緩沖區溢出、緩沖區不足和釋放重利用。這些問題難以檢測,甚至存在于一些經過反復測試,被認為是安全的代碼里,因此即使是最有經驗的程序員也難免會產生這些問題。盡管說一些代碼標準被啟用,試圖減少內存錯誤,但是顯然不那么有效。因此,在開發周期早期,需要深度靜態分析、數據流分析、符號執行等方式檢測內存錯誤。
編程錯誤
這類錯誤主要由C/C++的錯誤使用引起,比如未初始化變量、重復釋放指針、以及間接在征兆數據和非征兆數據之間進行變化等。編程錯誤中有一部分會被利用進行攻擊,而且即使這些錯誤會導致程序崩潰,可能也不會在功能測試和回歸測試中顯現出來。然而,它們確實會在部署的系統中引起嚴重問題。靜態額分析可以識別在編程語義中存在的代碼錯誤和歧義。
有風險的函數調用
有一些API函數被認為是有隱患,不安全的。比如C/C++中的gets()函數,就很容易產生目標地址的緩存溢出問題。其他函數調用也可能因為一些行為產生危害。這類有風險的函數調用很容易就在靜態分析中通過風險函數列表的方式被識別。
密碼學濫用
密碼學在保障數據機密性的環境中尤為重要。但是,幾乎沒有開發人員在密碼學層面是專家;更糟的是,濫用C語言本身庫里的密碼函數反而會導致安全問題,比如使用像DES和MD5那樣的弱算法加密,或者用硬編碼的密鑰以及將鹽數據進行哈希。密碼學的濫用會影響機密性和完整性,不過他們也同樣能被靜態分析輕松識別。
污染數據
污染數據是指數據在進入系統時未被驗證并去除有害內容,從而無法保證數據值是在合法范圍。污染數據是對開發者最大的挑戰之一,同樣也會影響機密性和完整性。人工檢查很難檢測到數據注入問題。
如果要解決污染數據的問題,就需要對以任何形式(比如用戶、設備、sockets等等)進入系統的數據都從來源到目標進行追蹤。在數據被API調用、接入數據結構、或者進入任何編程邏輯前,都需要被驗證。否則,就可能產生數據注入的攻擊威脅。靜態分析可以在工作流中進行計算,提供簡明易懂的告警保住程序員規避這些危險情況。
靜態分析檢測漏洞
靜態分析,或者說靜態分析安全測試(SAST),通過檢查源程序的代碼來檢測可能的安全問題——比如啥上述的五個代碼問題。由于SAST可以被用于開發者的CI/CD工作流中,它不會減緩敏捷開發進程。實際上,因為它能在開發者編寫代碼的時候發現漏洞,從而減少發現問題的成本,并在應用上線前——甚至在進行測試前就進行修復,最終加速軟件開發速度。因此,SAST對提升代碼安全性有著關鍵的作用,需要成為在DevSecOps的安全左移過程中的一部分。
在安全左移的過程中,代碼的即時分析、測試并發現漏洞是一大重點。本文提及了SAST在DevSecOps中能解決的一些代碼問題,但是SAST并不是DevSecOps過程中的唯一工具,同樣需要結合IAST、軟件供應鏈管理等工具,才能完善DevSecOps工具鏈,逐漸增加自己的軟件開發周期的安全度。
來源:數世咨詢