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