劉嵩鶴
本文通過分析軟件代碼安全檢測工作原理和市場上已廣泛使用的工具,為希望借助軟件代碼安全檢測工具,提升發(fā)現(xiàn)軟件代碼安全漏洞,進(jìn)而提升軟件代碼安全質(zhì)量提高幫助。
【關(guān)鍵詞】軟件安全 漏洞 自動化識別
隨著軟件規(guī)模的增大,依賴人工進(jìn)行軟件安全漏洞風(fēng)險(xiǎn)的難度也日益增加,一點(diǎn)僥幸和一點(diǎn)為難,為軟件安全隱患打開了方便之門,這種問題演變出來的影響如今不得不令人痛心決心予以考慮,這也正是軟件代碼安全漏洞工具用武之地。
1 軟件代碼安全檢查工具功能評析
隨著計(jì)算機(jī)軟件編譯技術(shù)的發(fā)展和市場的需求,目前有多種開源的和商業(yè)的靜態(tài)源代碼分析工具可以幫助開發(fā)人員和軟件安全人員在編碼階段快速掃描出軟件代碼所潛在的安全隱患,這些技術(shù)在我們?nèi)粘5拈_發(fā)過程中很普遍,只是我們平時(shí)沒有注意到而已。通過源代碼分析工具對代碼掃描后的結(jié)果,開發(fā)人員和安全代碼審查人員可以對結(jié)果再次復(fù)查,極大地提高了代碼安全審查的效率,這些分析工具或者技術(shù)主要包括如下的功能:
1.1 類型檢查
類型檢查是靜態(tài)分析使用得最為廣泛的形式,也是程序員最為熟悉的方式,很多程序員并沒有在類型檢查方面太多的思考,畢竟類型檢查的規(guī)則被編程語言事先定義好了,并被編譯器強(qiáng)制執(zhí)行,因此關(guān)于類型檢查的分析器是如何執(zhí)行的,程序員一般都了解得很少。類型檢查能夠幫助開發(fā)人員全面地排除編碼類型方面的錯誤,比如把一個(gè)整型的值賦給一個(gè)對象的變量;在編譯時(shí)捕獲錯誤;也在一定程度上預(yù)防運(yùn)行時(shí)的錯誤。
1.2 代碼編寫風(fēng)格檢查
Style checkers 是一個(gè)專門的代碼風(fēng)格檢查的靜態(tài)分析工具,這種工具在類型檢查之外強(qiáng)制一些其它的編碼格式的規(guī)則,比如空格檢查、命名規(guī)范、不推崇函數(shù)的使用、注釋、程序結(jié)構(gòu)等.被style checker檢查的錯誤通常是那些影響代碼的可靠性和可維護(hù)性方面的缺陷,這些缺陷在程序運(yùn)行時(shí)并不一定是一個(gè)特定的錯誤。
1.3 程序理解
程序理解工具幫助用戶理解代碼量大的程序,幫助用戶理解代碼,集成開發(fā)環(huán)境(IDE)也總是包含一些程序理解功能,比如:“find all uses of this method”and “find the declaration of this global variable””一些高級的分析可以支持自動程序重構(gòu)的特性。比如把單個(gè)的復(fù)雜的函數(shù),裂解成多個(gè)更為簡單的函數(shù)。
高級的程序理解工具也盡量幫助程序員去獲取程序是按哪種方式工作的,有些工具盡量使用逆向工程了解代碼的設(shè)計(jì)。因此會給程序員一個(gè)圖形化的視圖,這對程序員去理解代碼量大的程序非常有用,尤其是這些代碼不是程序員自己寫的時(shí)候。
1.4 程序確認(rèn)
程序確認(rèn)工具接受一組規(guī)格要求和代碼,并企圖為代碼提供證明:“代碼的實(shí)現(xiàn)是滿足規(guī)格要求的”,如果規(guī)格是程序應(yīng)當(dāng)作的每一件事情的完整描述,程序確認(rèn)工具就能夠執(zhí)行一個(gè)等同的檢查,以確保代碼和規(guī)格是一致的。
1.5 缺陷發(fā)現(xiàn)
缺陷發(fā)現(xiàn)工具的目的并不像style checker 那樣去抱怨代碼的格式問題,也不去對程序代碼和規(guī)格做比較。它僅僅指出在程序在哪兒,它的行為將不是程序員本身的意圖,大多數(shù)程序缺陷工具是易于使用的,因?yàn)樗鼈兪桥c一組特定的缺陷規(guī)則相關(guān),這些規(guī)則描述了一些特定的代碼模式,這些代碼模式將通常指示代碼缺陷。
2 軟件代碼安全的審查路徑
關(guān)注于安全的靜態(tài)掃描工具使用了多種其它靜態(tài)分析工具的技術(shù),但它更關(guān)注識別安全問題這個(gè)目標(biāo),這就意味著它們應(yīng)用這些技術(shù)的不同,它檢查潛在的不安全的庫函數(shù)的調(diào)用;檢測邊界錯誤和類型轉(zhuǎn)換錯誤;使用控制流檢測操作順序不合理所帶來的隱患;使用數(shù)據(jù)流跟蹤技術(shù)去跟蹤不安全的數(shù)據(jù)的引入及其不安全的操作…。同時(shí)也提供自定義安全規(guī)則的接口,以滿足用戶特定安全目的的需求。以下是數(shù)據(jù)流和控制流的例子。
數(shù)據(jù)流跟蹤來自網(wǎng)絡(luò)的數(shù)據(jù),該數(shù)據(jù)最后在一塊給定的內(nèi)存執(zhí)行操作,對來自網(wǎng)絡(luò)的數(shù)據(jù)沒有做大小控制,會導(dǎo)致緩沖區(qū)溢出。
控制流分析所有的操作路徑,發(fā)現(xiàn)在特定的邏輯下,程序執(zhí)行不安全的操作,比如下面的對同一內(nèi)存塊釋放了兩次,導(dǎo)致內(nèi)存管理紊亂。
3 軟件代碼安全檢測工具功能限定
靜態(tài)安全掃描器并不是設(shè)計(jì)去發(fā)現(xiàn)架構(gòu)方面的問題,或者說設(shè)計(jì)方面的缺陷,也不適合去發(fā)現(xiàn)集成方面的BUG,安全掃描器也有一些局限,特別是讓它去分析一些大的系統(tǒng),這些系統(tǒng)包含多種可執(zhí)行的組件,或者不同的結(jié)構(gòu)層次。應(yīng)當(dāng)強(qiáng)調(diào)的是:就像人工審計(jì)一樣,安全掃描器并不能發(fā)現(xiàn)軟件系統(tǒng)的所有代碼的安全缺陷,它們也只能發(fā)現(xiàn)一些,畢竟安全掃描器它自己也是一個(gè)軟件,這剩下的未被發(fā)現(xiàn)的問題仍然需要人工去把他們找出來。因此,不要僅僅單一依賴安全的掃描器去確保整個(gè)系統(tǒng)代碼的安全。開發(fā)人員需要學(xué)會避免安全掃描器指出的問題,這是好的事情,但并不意味著能夠避免那些安全掃描器沒能發(fā)現(xiàn)的問題。安全掃描的結(jié)果不能作為僅有的判斷軟件質(zhì)量的唯一方式。否則,軟件可能從表面上看起來已經(jīng)得到改善和提高了,但實(shí)際上仍然在有些方面很糟糕。
4 總結(jié)
源代碼安全掃描器綜合了多種靜態(tài)掃描技術(shù),能夠在一定程度上幫助我們檢測軟件源代碼的安全性,我們可以借助它的能力配合人工的安全審計(jì)快速審查代碼安全。開發(fā)組織,為了開發(fā)安全的軟件,不能僅僅依靠單一的源代碼掃描分析工具,還需要加強(qiáng)開發(fā)人員安全編碼的培訓(xùn)和教育,并結(jié)合自身組織的特點(diǎn),整理出適合自身的安全編碼實(shí)踐,并在不斷的項(xiàng)目實(shí)踐中豐富和完善。
參考文獻(xiàn)
[1]Weber S,Karger P A,Paradkar A.A Software Flaw Taxonomy:Aiming Tools at Security[C].Proc.of ACM Software Engineering for Secure Systems——Building Trustworthy Applications.Louis,Missouri,USA:[s.n.],2005.
[2]Landwehr C E.Formal Models for Computer Security[J].ACM Computing Surveys,1981,13(3):247-278.
作者單位
解放軍95072部隊(duì)信息支援室 廣西壯族自治區(qū)南寧市 530021endprint