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