黃英麗
(廣西南寧浩越軟件科技有限公司 廣西 530022)
在當前這個高度信息化的時代,信息安全越來越成為人們的關注焦點。軟件是計算機系統(tǒng)的靈魂,網(wǎng)絡通信、操作系統(tǒng)以及安全算法等都是以軟件的形式存在的,這些軟件在一定程度上都存在著各自一些弱點,即軟件漏洞,這給計算機網(wǎng)絡信息安全帶來了巨大的威脅。這就需要一個可靠的軟件檢測系統(tǒng),實時檢測計算機內(nèi)部的漏洞,提前找出安全隱患,并及時對軟件漏洞進行有效的修復。目前,計算機內(nèi)部的防火墻也具有對攻擊性程序進行檢測和攔截的功能,當然,這并不能清除所有的安全隱患。除此之外,編寫安全代碼也是能解決軟件安全問題的有效途徑,但它耗時較長,不能起到立竿見影的效果。因此,筆者在這里引入一些目前針計算機軟件安全檢測的重要技術。
所謂的計算機軟件安全漏洞,就是指計算機軟件內(nèi)部會帶來安全問題的代碼。安全漏洞常常會引起來自其它代碼和程序的攻擊,造成嚴重的安全問題。軟件安全漏洞可以根據(jù)不同的角度進行分類,本文以C語言特點為基礎,將計算機軟件安全漏洞分為以下幾種:
第一,緩沖區(qū)溢出漏洞。緩沖溢出區(qū)是近二十多年來引起安全問題的比例最大的軟件安全漏洞,據(jù)統(tǒng)計,在1999年,緩沖溢出區(qū)的漏洞占有率為50%以上,2002年占57%。之所以會引起緩沖區(qū)溢出漏洞,主要是因為計算機內(nèi)部使用了不安全的編程語言。另外,程序員在進行編程時的技術不到位也是產(chǎn)生緩沖溢出區(qū)漏洞的另一個原因。通常情況下,緩沖區(qū)都有自己的固定大小,程序員在編寫程序時要留意不超過容量。例如,gets()函數(shù)在遇到EOF字符或者換行字符之前,是不會停止文本讀入的,它不會進行邊界檢查,以以下代碼為例:
char buffer[1024];
gets(buffer);
最初字符數(shù)組的長度是1024,而當使用gets函數(shù)讀取數(shù)據(jù)并將其放入定義的buffer中時,若受到一個惡意攻擊,則原本通常情況下都小于1024的數(shù)據(jù)就會被攻擊者重新構造,變成一個大于1024的數(shù)據(jù),這時,buffer將會放不下所有數(shù)據(jù),并使程序在執(zhí)行的時候產(chǎn)生溢出。
第二,競爭條件漏洞(race condition)。這是一種常見的軟件漏洞,尤其是當計算機處于多任務、多程序的時候,這種漏洞就會更加頻繁。因為在多任務的網(wǎng)絡環(huán)境下,每時每刻都會有不同的多個用戶進行不同的程序,而在這之間,就會產(chǎn)生先后順序而帶來的執(zhí)行權的競爭問題。當前,并行計算和分布式系統(tǒng)的深入開展更使這一漏洞愈演愈烈,對計算機的信息安全構成了巨大的威脅。
第三,格式化字符串漏洞(Format string)。格式化字符串漏洞是早在幾年前就已經(jīng)被發(fā)布的另一類較為微妙的程序代碼缺陷,例如在[29]:printf(“%s”,buffer)這一代碼中,printf的第一個參數(shù)就是一個格式化字符串,它主要用于指定后邊參數(shù)的類型以及個數(shù)等一些特征。但是,printf函數(shù)對其后邊參數(shù)的特征是不做檢查的,也就是說,上述無漏洞的代碼,即使被寫成printf(buffer)也是可以被編譯的,這樣就產(chǎn)生了格式化字符串漏洞。這一漏洞一旦產(chǎn)生,就可以被用于任意讀寫進程的內(nèi)存空間,并且還很難被控制。
針對以上一些常見的計算機軟件安全漏洞及其特征,為了做好計算機的安全保護工作,降低安全漏洞帶來的危險指數(shù),我們運用一些有效的計算機軟件安全檢測系統(tǒng)和技術,以起到未雨綢繆的效果。在這里,筆者引入以下幾種檢測技術。
所謂的動態(tài)檢測技術,就是指在計算機進行程序運行的時候,通過內(nèi)存、堆和棧等與環(huán)境變量相關的運行因素進行檢測和分析,以此來檢測正在運行的程序是否存在漏洞的技術。這一技術在進行程序檢測的時候并不會涉及到修改目標程序源碼等問題,因此具有較高的程序保密性。當然,這一檢測系統(tǒng)中涉及著很多的檢測方法。
第一,非執(zhí)行棧技術?;跅_M行的攻擊是近幾年較為常見的,究其原因,大部分是因為很多操作系統(tǒng)的棧是可以寫也可以執(zhí)行的,而且很多內(nèi)部變量都是保存在棧中的,攻擊者只要在棧中注入一些惡意代碼,然后就可以找到一些方法來執(zhí)行這段代碼。因此,對于如何防范棧攻擊,最有效且最直接的方法,便就是使棧不能執(zhí)行代碼。這樣,即使攻擊者在棧內(nèi)注入惡意代碼,這個代碼也不會得以執(zhí)行。非棧執(zhí)行技術在一定程度上防范了一些惡意入侵者,只是,這一技術需要在操作系統(tǒng)層進行一系列的修改,另外,該技術的檢測還不夠全面,在性能上也還存在有些不足。
第二,非執(zhí)行堆與數(shù)據(jù)技術。堆在計算機內(nèi)主要是對正在運行的程序進行動態(tài)的內(nèi)存區(qū)域分配,而數(shù)據(jù)是程序被編寫之初就初始化好的。如果堆和數(shù)據(jù)都不能執(zhí)行代碼,則惡意代碼就不會被執(zhí)行。這一技術使得傳統(tǒng)程序在堆或數(shù)據(jù)段中生成代碼的方式得以改變,當然,也帶來了很多程序之間的不兼容性。
第三,內(nèi)存映射技術。很多攻擊者會通過NULL結尾的字符串去覆蓋內(nèi)存,以達到對計算機軟件的攻擊,內(nèi)存映射技術使用映射代碼頁將企圖跳轉(zhuǎn)到較低內(nèi)存區(qū)的攻擊者有效地攔截下來,并把代碼頁隨機地映射到不同的內(nèi)存區(qū)域。
第四,安全的共享庫技術。不安全的共享庫是很多安全漏洞的來源,例如,在C&C++中就有很多不安全的函數(shù),如strcpy、strcat、gets等。安全共享庫技術在動態(tài)鏈接的基礎上,在程序運行期間對不安全的函數(shù)進行攔截和調(diào)節(jié),同時對參數(shù)進行檢測。
所謂的靜態(tài)檢測技術,就是在程序分析技術的基礎上,對應用程序的二進制代碼或者代碼源進行分析的技術。這一技術可以在短時間內(nèi)找出程序內(nèi)部的大量弱點,運用起來十分快捷方便。靜態(tài)檢測技術也涉及很多的方法:
第一,詞法檢測技術。詞法分析是對程序源代碼中有危險的函數(shù)和系統(tǒng)進行分析和調(diào)用,對于具有潛在危險的源代碼,詞法分析并不會進行深入分析,因此,這一技術又存在很多的誤報。
第二,程序評注技術。動態(tài)檢測技術并不能對從程序源代碼中靜態(tài)生成的信息進行檢測,這就需要在程序源代碼中加入一些人為的評注信息,以便靜態(tài)檢測技術能夠進行得更順利和精確。通常,程序評注是以注釋的形式存在的,因此它不會改變原有的合法代碼的語言特性,與此同時,檢測工具還可以利用這些評注信息對程序進行更深入的靜態(tài)分析。
第一,開放源代碼。開放源代碼是一種軟件發(fā)布的方法,它通過將源代碼廣泛發(fā)布,讓更多人對這一軟件進行觀察閱讀,并找出盡可能多的安全漏洞,以起到“眼睛足夠,漏洞自現(xiàn)”的效果。
第二,測試庫技術。這一技術主要通過審查所有的內(nèi)存操作函數(shù)來檢測軟件中的動態(tài)性內(nèi)存錯誤,并對正在運行中的每一個內(nèi)存塊都做了大量的額外標記,以這些標記信息作為檢測內(nèi)存操作是否正確的有效指標。
第三,棧保護的編譯器擴展技術。這一技術的核心是通過對編譯器進行擴展從而保護棧中的地址。當然,在這一過程中,需要對原有的程序進行重新編譯,因此,其所涉及的代價也是較大的。
當前,計算機已經(jīng)滲入到社會生活的方方面面,在計算機安全備受關注的時代,我們更應該積極引入和研發(fā)多樣化和全面化的安全檢測技術,做好計算機安全的預防工作,及時發(fā)現(xiàn)惡意代碼和潛在危險,進一步提高計算機的抗風險能力和安全性能,保證計算機網(wǎng)絡的安全運行。
[1]徐巖柏.計算機軟件中安全漏洞檢測研究[J].工程技術(計算機光盤軟件與運用).2007年;
[2]馬曉銀.計算機軟件安全漏洞檢測技術之我見[J].工程技術(計算機光盤軟件與運用).2010年第16期;
[3]牛潔,王滈.淺談計算機軟件安全檢測技術[J].工程技術(計算機光盤軟件與運用).2012年第13期;
[4]李新遠,吳字紅.基于數(shù)據(jù)挖掘的入侵檢測建模叨[J].計算機工程與應用.2013年.