摘 要:本文通過分析軟件代碼安全檢測工作原理和市場上已廣泛使用的工具,為希望借助軟件代碼安全檢測工具,提升發(fā)現(xiàn)軟件代碼安全漏洞,進而提升軟件代碼安全質(zhì)量提高幫助。
關鍵詞:軟件安全;漏洞;自動化識別
中圖分類號:TP311
隨著社會信息化的發(fā)展,大型社會服務部門對外信息服務多已建立了信息系統(tǒng),也正是隨著各種公眾信息服務軟件的應用,軟件信息安全事件也不斷沖擊著公眾的管感點,因軟件安全問題引起服務中斷的事情屢見報端,究其原因,很大成分是在軟件規(guī)模的演變中,原來軟件定位多服務于小型區(qū)域和內(nèi)部使用,對軟件安全的要求自然比較低,在軟件功能定位已發(fā)生明顯變化,服務于公眾客戶,承載規(guī)模越來越大的時候,軟件安全的建設未隨之提升,而且隨著軟件規(guī)模的增大,依賴人工進行軟件安全漏洞風險的難度也日益增加,一點僥幸和一點為難,為軟件安全隱患打開了方便之門,這種問題演變出來的影響如今不得不令人痛心決心予以考慮,這也正是軟件代碼安全漏洞工具用武之地。
1 軟件代碼安全檢查工具功能評析
隨著計算機軟件編譯技術的發(fā)展和市場的需求,目前有多種開源的和商業(yè)的靜態(tài)源代碼分析工具可以幫助開發(fā)人員和軟件安全人員在編碼階段快速掃描出軟件代碼所潛在的安全隱患,這些技術在我們?nèi)粘5拈_發(fā)過程中很普遍,只是我們平時沒有注意到而已。通過源代碼分析工具對代碼掃描后的結果,開發(fā)人員和安全代碼審查人員可以對結果再次復查,極大地提高了代碼安全審查的效率,這些分析工具或者技術主要包括如下的功能:
1.1 類型檢查
類型檢查是靜態(tài)分析使用得最為廣泛的形式,也是程序員最為熟悉的方式,很多程序員并沒有在類型檢查方面太多的思考,畢竟類型檢查的規(guī)則被編程語言事先定義好了,并被編譯器強制執(zhí)行,因此關于類型檢查的分析器是如何執(zhí)行的,程序員一般都了解得很少。類型檢查能夠幫助開發(fā)人員全面地排除編碼類型方面的錯誤,比如把一個整型的值賦給一個對象的變量;在編譯時捕獲錯誤;也在一定程度上預防運行時的錯誤。
1.2 代碼編寫風格檢查
Style checkers 是一個專門的代碼風格檢查的靜態(tài)分析工具,這種工具在類型檢查之外強制一些其它的編碼格式的規(guī)則,比如空格檢查、命名規(guī)范、不推崇函數(shù)的使用、注釋、程序結構等.被style checker檢查的錯誤通常是那些影響代碼的可靠性和可維護性方面的缺陷,這些缺陷在程序運行時并不一定是一個特定的錯誤。
1.3 程序理解
程序理解工具幫助用戶理解代碼量大的程序,幫助用戶理解代碼,集成開發(fā)環(huán)境(IDE)也總是包含一些程序理解功能,比如:“find all uses of this method”and“find the declaration of this global variable.”一些高級的分析可以支持自動程序重構的特性.比如把單個的復雜的函數(shù),裂解成多個更為簡單的函數(shù)。
高級的程序理解工具也盡量幫助程序員去獲取程序是按哪種方式工作的,有些工具盡量使用逆向工程了解代碼的設計.因此會給程序員一個圖形化的視圖,這對程序員去理解代碼量大的程序非常有用,尤其是這些代碼不是程序員自己寫的時候。
1.4 程序確認
程序確認工具接受一組規(guī)格要求和代碼,并企圖為代碼提供證明:“代碼的實現(xiàn)是滿足規(guī)格要求的”,如果規(guī)格是程序應當作的每一件事情的完整描述,程序確認工具就能夠執(zhí)行一個等同的檢查,以確保代碼和規(guī)格是一致的。
1.5 屬性檢查
屬性檢查工具關注臨時安全的屬性上面,臨時安全的屬性按順序列出一些不允許發(fā)生事件的清單,。比如不能去訪問已經(jīng)釋放了的內(nèi)存塊的地址,大多數(shù)屬性檢查工具允許程序員寫自己的規(guī)則去檢測特定程序的屬性。
1.6 缺陷發(fā)現(xiàn)
缺陷發(fā)現(xiàn)工具的目的并不像style checker 那樣去抱怨代碼的格式問題,也不去對程序代碼和規(guī)格做比較。它僅僅指出在程序在哪兒,它的行為將不是程序員本身的意圖,大多數(shù)程序缺陷工具是易于使用的,因為它們是與一組特定的缺陷規(guī)則相關,這些規(guī)則描述了一些特定的代碼模式,這些代碼模式將通常指示代碼缺陷。
2 軟件代碼安全的審查路徑
關注于安全的靜態(tài)掃描工具使用了多種其它靜態(tài)分析工具的技術,但它更關注識別安全問題這個目標,這就意味著它們應用這些技術的不同,它檢查潛在的不安全的庫函數(shù)的調(diào)用;檢測邊界錯誤和類型轉(zhuǎn)換錯誤;使用控制流檢測操作順序不合理所帶來的隱患;使用數(shù)據(jù)流跟蹤技術去跟蹤不安全的數(shù)據(jù)的引入及其不安全的操作…。同時也提供自定義安全規(guī)則的接口,以滿足用戶特定安全目的的需求.以下是數(shù)據(jù)流和控制流的例子。
數(shù)據(jù)流跟蹤來自網(wǎng)絡的數(shù)據(jù),該數(shù)據(jù)最后在一塊給定的內(nèi)存執(zhí)行操作,對來自網(wǎng)絡的數(shù)據(jù)沒有做大小控制,會導致緩沖區(qū)溢出。
控制流分析所有的操作路徑,發(fā)現(xiàn)在特定的邏輯下,程序執(zhí)行不安全的操作,比如下面的對同一內(nèi)存塊釋放了兩次,導致內(nèi)存管理紊亂。
3 軟件代碼安全檢測工具功能限定
靜態(tài)安全掃描器并不是設計去發(fā)現(xiàn)架構方面的問題,或者說設計方面的缺陷,也不適合去發(fā)現(xiàn)集成方面的BUG,安全掃描器也有一些局限,特別是讓它去分析一些大的系統(tǒng),這些系統(tǒng)包含多種可執(zhí)行的組件,或者不同的結構層次。應當強調(diào)的是:就像人工審計一樣,安全掃描器并不能發(fā)現(xiàn)軟件系統(tǒng)的所有代碼的安全缺陷,它們也只能發(fā)現(xiàn)一些,畢竟安全掃描器它自己也是一個軟件,這剩下的未被發(fā)現(xiàn)的問題仍然需要人工去把他們找出來。因此,不要僅僅單一依賴安全的掃描器去確保整個系統(tǒng)代碼的安全。開發(fā)人員需要學會避免安全掃描器指出的問題,這是好的事情,但并不意味著能夠避免那些安全掃描器沒能發(fā)現(xiàn)的問題。安全掃描的結果不能作為僅有的判斷軟件質(zhì)量的唯一方式。否則,軟件可能從表面上看起來已經(jīng)得到改善和提高了,但實際上仍然在有些方面很糟糕。
4 總結
源代碼安全掃描器綜合了多種靜態(tài)掃描技術,能夠在一定程度上幫助我們檢測軟件源代碼的安全性,我們可以借助它的能力配合人工的安全審計快速審查代碼安全。開發(fā)組織,為了開發(fā)安全的軟件,不能僅僅依靠單一的源代碼掃描分析工具,還需要加強開發(fā)人員安全編碼的培訓和教育,并結合自身組織的特點,整理出適合自身的安全編碼實踐,并在不斷的項目實踐中豐富和完善。
參考文獻:
[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.
[3]Xia Yiming.Security Vulnerability Detection Study Based on Static Analysis[J].Computer Science,2006,33(10):279-283.
[4]Foster J S,F(xiàn)ghndrich M,Aiken A.A Theory of Type Qualifiers[J].ACM SIGPLAN Notices,1999,34(5):192-203.
作者單位:同濟大學,上海 200092