信息安全第6章可信軟件和惡意軟件防范_第1頁
信息安全第6章可信軟件和惡意軟件防范_第2頁
信息安全第6章可信軟件和惡意軟件防范_第3頁
信息安全第6章可信軟件和惡意軟件防范_第4頁
信息安全第6章可信軟件和惡意軟件防范_第5頁
已閱讀5頁,還剩281頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第6章可信軟件和惡意軟件防范

6.1程序安全

程序構(gòu)成了一個(gè)計(jì)算機(jī)系統(tǒng)的很多部分(操作系統(tǒng)、設(shè)備驅(qū)動程序、網(wǎng)絡(luò)基礎(chǔ)設(shè)施、數(shù)據(jù)庫管理系統(tǒng)和其他應(yīng)用程序,甚至網(wǎng)頁上的可執(zhí)行命令),因此多種形式保護(hù)程序是計(jì)算機(jī)安全的核心。程序安全除了包括程序的完整性、可用性、保密性外,還包括了程序的運(yùn)行安全性。眾所周知,來自系統(tǒng)外部的惡意攻擊的主要目標(biāo)是計(jì)算機(jī)系統(tǒng),其直接的重點(diǎn)目標(biāo)是信息和數(shù)據(jù),以及包含、記錄和存儲這些信息數(shù)據(jù)的程序(軟件)。程序的丟失、篡改、竊取、非法復(fù)制、濫用等對系統(tǒng)造成的后果是災(zāi)難性的,對社會造成的影響是嚴(yán)重的和深遠(yuǎn)的。當(dāng)一個(gè)人在從事軟件活動的過程中犯錯(cuò)誤時(shí),我們稱之為過失(error)。過失可能會在計(jì)算機(jī)程序中導(dǎo)致一個(gè)錯(cuò)誤(fault),或者一個(gè)不正確的步驟、命令、過程或數(shù)據(jù)定義。例如,一個(gè)設(shè)計(jì)者可能誤解需求,從而創(chuàng)建一個(gè)不符合分析員和用戶要求的設(shè)計(jì)。一次失效(failure)就是對系統(tǒng)要求行為的一次違反。在系統(tǒng)發(fā)布之前或之后,或在測試過程中,或在運(yùn)行和維護(hù)過程中都能發(fā)現(xiàn)失效。早期的計(jì)算機(jī)安全工作建立在“查找錯(cuò)誤并打補(bǔ)丁”(penetrateandpatch)的模式上。分析專家在該模式下尋找錯(cuò)誤,并給錯(cuò)誤打上補(bǔ)丁。一些頂尖的測試團(tuán)隊(duì)嘗試各種方法使系統(tǒng)崩潰以測試系統(tǒng)的安全性。這種測試被認(rèn)為是安全“證明”;如果系統(tǒng)經(jīng)受住了攻擊的考驗(yàn),就認(rèn)為是安全的。遺憾的是,這種證明經(jīng)常成為反面例子,因?yàn)橄到y(tǒng)中隱藏的錯(cuò)誤往往不止一個(gè)。為了解決這些不斷發(fā)現(xiàn)的錯(cuò)誤,人們迅速開發(fā)了許多補(bǔ)丁以修復(fù)安全問題,然而,大多數(shù)補(bǔ)丁并未起多少作用。相反,它們使系統(tǒng)變得更不安全,因?yàn)樗鼈円肓诵碌腻e(cuò)誤,其原因有三個(gè):(1)修補(bǔ)指定問題的壓力使得人們僅僅關(guān)注錯(cuò)誤本身,而不是與之相關(guān)的上下文環(huán)境。特別是分析專家僅專心于研究導(dǎo)致失效的直接原因,而忽視設(shè)計(jì)或需求方面的原因。

(2)修補(bǔ)一個(gè)問題時(shí)常導(dǎo)致其他地方的失敗,或者說補(bǔ)丁僅僅解決一個(gè)地方的問題,而沒有解決相關(guān)地方的問題。

(3)打補(bǔ)丁可能會影響系統(tǒng)的功能和性能,所以補(bǔ)丁不能適當(dāng)?shù)匦扪a(bǔ)系統(tǒng)錯(cuò)誤。

由于“查找錯(cuò)誤并打補(bǔ)丁”模式的不完善,人們不得不考慮其他方法來保證代碼滿足安全需求。其中一個(gè)方法就是對比系統(tǒng)需求和系統(tǒng)行為。也就是說,為了理解程序的安全性,可以檢查程序的行為是否符合設(shè)計(jì)者或用戶的需求。6.1.2非惡意的程序漏洞

人都會犯錯(cuò)誤,程序員和其他開發(fā)者也不例外。其實(shí)大部分錯(cuò)誤都是無意或非惡意的。大多數(shù)錯(cuò)誤會造成程序故障,但不會造成特別嚴(yán)重的安全隱患。然而,極少數(shù)錯(cuò)誤卻已困擾了程序員和安全專家?guī)资曛?,并且在短期?nèi)無法將其消除。本節(jié)將討論三種典型的錯(cuò)誤,并分別解釋每種錯(cuò)誤,說明它為什么和安全性相關(guān),以及怎樣預(yù)防或減輕危害。編譯器為緩沖區(qū)劃分了10個(gè)字節(jié)大小的空間,從buffer[0]到buffer[9],每個(gè)都分別占用一個(gè)字節(jié)的空間,現(xiàn)在我們執(zhí)行這條語句:

buffer[10]=‘a(chǎn)’;

數(shù)組元素的下標(biāo)超過了緩沖區(qū)的大小,從安全的角度出發(fā),這樣出現(xiàn)問題了。最好的結(jié)果是,編譯器在編譯過程中就檢查出問題并將錯(cuò)誤標(biāo)記出來。然而,如果語句是:

buffer[i]='a';那么,直到i在執(zhí)行過程中被設(shè)置成一個(gè)大到越界的下標(biāo)之前,我們都無法檢查出這個(gè)錯(cuò)誤。如果在執(zhí)行過程中,系統(tǒng)能產(chǎn)生一個(gè)下標(biāo)越界錯(cuò)誤的警告,那將是非常有用的。遺憾的是,在一些語言中,緩沖區(qū)大小并不需要預(yù)先聲明,所以也就無法檢查出越界錯(cuò)誤。更重要的是,在執(zhí)行過程中,檢查每個(gè)下標(biāo)是否超出可能的最大值需要花費(fèi)時(shí)間和空間,寶貴的系統(tǒng)資源就被這些不常發(fā)生的問題浪費(fèi)了。由于沒有合理的方法來定義恰當(dāng)?shù)南拗?,所以即使編譯器小心翼翼地分析緩沖區(qū)的聲明和使用,指針也可能引發(fā)同樣的問題。所以,一些編譯器并不產(chǎn)生代碼來檢查是否越界。我們來更深入地研究這個(gè)問題。潛在的緩沖區(qū)溢出只是在某種情況下才會造成嚴(yán)重的問題,認(rèn)識到這一點(diǎn)是非常重要的。問題是否出現(xiàn)取決于鄰近buffer數(shù)組的內(nèi)容是什么。假定buffer數(shù)組的10個(gè)元素的每個(gè)字母都用a填充,而錯(cuò)誤的引用卻使用字母b,如下所示:

for(i=0;i<=9;i++)

buffer[i]=‘a(chǎn)’;

buffer[10]='b';

執(zhí)行過程中,所有程序和數(shù)據(jù)都在內(nèi)存中,它們與操作系統(tǒng)、其他代碼和常駐程序共享內(nèi)存空間。如果這個(gè)額外的字符b溢出到用戶的數(shù)據(jù)空間,則它僅僅會覆蓋一個(gè)已存在的變量值(也可能會寫入到一個(gè)還未使用的位置),可能會影響程序的運(yùn)行結(jié)果,但不會影響其他程序或數(shù)據(jù)。如果b被送入用戶的程序區(qū)域:如果它覆蓋了一條已執(zhí)行的指令,并且該指令以后都不會再執(zhí)行,用戶將不會覺察到影響;如果它覆蓋的是一條還未執(zhí)行的指令,由于b的內(nèi)碼是0x62,機(jī)器將會嘗試著執(zhí)行操作碼為0x62的指令;如果操作碼為0x62的指令并不存在,系統(tǒng)將會由于一個(gè)非法指令異常而停機(jī);如果該指令存在,機(jī)器就會把后續(xù)字節(jié)當(dāng)做這條指令的剩余部分來使用,運(yùn)行成功與否取決于上下文的含義,只有用戶才能感受到緩沖區(qū)溢出的影響。綜上所述,在帶數(shù)組的高級語言出現(xiàn)時(shí),緩沖區(qū)溢出就隨之出現(xiàn)了。最初一段時(shí)間,它帶給程序員和用戶的困擾較小,最多不過出現(xiàn)系統(tǒng)崩潰。而最近,攻擊者利用它首先使系統(tǒng)崩潰,然后制造出更多可控制的故障,這就隨之導(dǎo)致了嚴(yán)重安全性問題。大量基于緩沖區(qū)的溢出漏洞的攻擊使人們意識到,開發(fā)者不能再像從前那樣輕視它,而是必須對緩沖區(qū)的溢出給予更多的關(guān)注。

2.不完全驗(yàn)證

不完全驗(yàn)證(incompletemediation)是另一個(gè)長期存在的安全問題。它常常被攻擊者利用。

考慮下面的例子:

/somepage/userinput.asp?parm1=(808)555-1234&parm2=2010Mar11

其中的兩個(gè)參數(shù)看起來一個(gè)是電話號碼和一個(gè)日期。或者客戶端的瀏覽器輸入的兩個(gè)有特定格式的參數(shù)值對服務(wù)器來說很容易處理,但如果parm2的值被提交為1700Jan1,或者1800Feb30,或是2050Jane31,或是1Rabbit2Many,將會產(chǎn)生錯(cuò)誤。一種可能是,如同緩沖區(qū)溢出一樣,系統(tǒng)將由于嘗試處理不正確的數(shù)據(jù)類型,如年份超過正常能處理的范圍(如1700),或者月份超過正常能處理的范圍(如Jane),而發(fā)生災(zāi)難性的故障。另一種可能是接收到這些錯(cuò)誤參數(shù)的程序?qū)⒗^續(xù)運(yùn)行而得出錯(cuò)誤的結(jié)果(例如想得到截止到今天的話費(fèi)賬單總額,如果開始日期是1700年1月1日,結(jié)果肯定是錯(cuò)誤的)。另外,服務(wù)器可能會有自己的一套默認(rèn)處理方式,如將1Rabbit2Many當(dāng)做1Jan2010來處理。當(dāng)然,還有其他可能性。然而,改進(jìn)后的程序仍然是脆弱的。提交的結(jié)果最終是包含在URL中進(jìn)行傳遞的,而用戶可以操作或更改URL,例如:用戶可以編輯URL,改變里面待提交的參數(shù)值,并重新發(fā)送它們。而服務(wù)器沒有辦法分辨出一條回應(yīng)是來自客戶端的瀏覽器,還是用戶直接編輯修改的URL。這樣,不安全的參數(shù)驗(yàn)證很容易被利用。雖然它沒有緩沖區(qū)溢出那么頻繁,但仍然是一個(gè)可能造成嚴(yán)重危害的漏洞,尤其在一些對提交數(shù)據(jù)要求非常嚴(yán)格的行業(yè)和部門。舉一簡例。一家大型跨國網(wǎng)上購物公司sample進(jìn)行電子產(chǎn)品的在線銷售,這樣客戶可以通過該公司的購物網(wǎng)站來下訂單。一位客戶想購買20個(gè)編號為123A的物品。如果每個(gè)物品的售價(jià)是50元,網(wǎng)站將計(jì)算出總價(jià)格為1000元。然后客戶選擇運(yùn)輸方式(如快遞運(yùn)輸),那么客戶端的瀏覽器會自動按格式填充參數(shù):

3.“檢查時(shí)刻到使用時(shí)刻”錯(cuò)誤

第三種漏洞與同步操作有關(guān)。訪問控制是計(jì)算機(jī)安全的一個(gè)基礎(chǔ)部分,確保只是具有訪問權(quán)限的人或進(jìn)程才能進(jìn)行相應(yīng)的訪問。訪問請求由訪問策略所控制,策略指明了哪些請求允許訪問哪些資源。然后,訪問策略的執(zhí)行代理對訪問請求進(jìn)行仲裁。但是,若對訪問的檢查不全面,就會出現(xiàn)不完善仲裁問題。檢查時(shí)刻到使用時(shí)刻(Time-Of-CheckToTime-Of-Use,TOCTTOU)的漏洞與仲裁在執(zhí)行中受到誘騙有關(guān)。該漏洞也稱為序列化漏洞或同步漏洞。舉一簡例。一位顧客正在買價(jià)值100元的襯衣。他從口袋里拿出5張20元的人民幣,放在柜臺上。店主清點(diǎn)完人民幣之后,發(fā)現(xiàn)沒有問題,于是轉(zhuǎn)過身來開發(fā)票。就在店主開發(fā)票時(shí),該顧客迅速地從5張人民幣中抽出1張,而沒有被店主察覺。顧客然后接過店主的發(fā)票,拿好襯衣,離開商店。在接受安全性檢查(類似該例中的清點(diǎn)鈔票)之后到訪問(類似該例中的交換襯衣和人民幣)之前的這段時(shí)間內(nèi),一些情況發(fā)生了改變。同樣的問題,也可能出現(xiàn)在計(jì)算機(jī)系統(tǒng)中。

假定一個(gè)文件訪問請求的數(shù)據(jù)結(jié)構(gòu)包括有文件名和訪問方式兩個(gè)。從本質(zhì)上來說,該數(shù)據(jù)結(jié)構(gòu)是一個(gè)“工作憑證”,還需要一個(gè)“授權(quán)蓋章”。一旦該操作被授權(quán),它將被放入一個(gè)操作隊(duì)列中。通常,訪問控制仲裁器接收該數(shù)據(jù)結(jié)構(gòu),并決定是否允許該操作。如不允許,則拒絕該訪問并停止操作;否則,將該數(shù)據(jù)結(jié)構(gòu)送至文件處理器進(jìn)行處理。為了確定授權(quán)順序,訪問控制仲裁器必須在表中查看文件名(及用戶ID和其他參數(shù))。仲裁器可以比較表中的文件名與結(jié)構(gòu)體中的文件名以決定這次訪問是否適宜。但是,數(shù)據(jù)結(jié)構(gòu)仍然在用戶的區(qū)域并在用戶的控制之下。這時(shí),就可以對不完整仲裁漏洞進(jìn)行利用。當(dāng)仲裁器正在檢查文件my_file的訪問權(quán)限時(shí),用戶可以將文件名改為your_file,并將訪問方式改為“刪除”。由于“工作憑證”已經(jīng)被讀過一次,所以就不能指望仲裁器在批準(zhǔn)它之前再去閱讀“工作憑證”。仲裁器將批準(zhǔn)此次訪問并將修改后的描述符送給文件處理器。這個(gè)安全問題稱為“檢查時(shí)刻到使用時(shí)刻”漏洞。它的安全含義是:檢查一個(gè)動作而去執(zhí)行另一個(gè)動作,這是一個(gè)無效訪問控制的例子。我們有兩種思路來防止該漏洞被利用。一是確保關(guān)鍵參數(shù)在失控時(shí)不被暴露,訪問檢查軟件必須擁有請求數(shù)據(jù),直到請求完成。另一個(gè)方法是確保序列完整性,即在驗(yàn)證期間禁止中斷(失控),或者驗(yàn)證程序可以先從用戶空間復(fù)制數(shù)據(jù)到程序空間(用戶不可訪問),并基于該復(fù)制執(zhí)行驗(yàn)證檢查,最終,驗(yàn)證程序能夠用一個(gè)校驗(yàn)來封裝請求數(shù)據(jù),檢測修改。4.非惡意程序漏洞的結(jié)合使用

上述三種漏洞在單獨(dú)使用時(shí)都會造成很壞的后果,但更可怕的是,它們還可以結(jié)合起來使用。攻擊者可以對僅僅使用了緩沖區(qū)溢出不大滿意,而代之以三重攻擊。先借助緩沖區(qū)溢出來破壞機(jī)器上運(yùn)行的任意代碼,同時(shí)它使用“檢查時(shí)刻到使用時(shí)刻”的漏洞來添加一個(gè)新的系統(tǒng)用戶。接下來,攻擊者以新的用戶身份登錄系統(tǒng)并利用“不完全驗(yàn)證”漏洞獲得一定權(quán)限來做其他事情。聰明的攻擊者可以將這些漏洞當(dāng)成常用構(gòu)件塊來構(gòu)造一個(gè)復(fù)雜的攻擊。雖然非惡意漏洞往往造成的危害有限,但一旦被人利用,就會后患無窮。在下一節(jié)中我們將會看到,惡意攻擊者可以利用看起來無害的程序漏洞編寫有害的代碼。6.1.3病毒和其他惡意代碼

就病毒和其他惡意代碼本身而言,程序很少對安全性構(gòu)成威脅。程序?qū)?shù)據(jù)進(jìn)行操作,只有當(dāng)數(shù)據(jù)和狀態(tài)發(fā)生改變并滿足其觸發(fā)條件時(shí),才會執(zhí)行。程序所做的大多數(shù)工作對于用戶是不可見的,所以不大可能發(fā)現(xiàn)它們在進(jìn)行危險(xiǎn)活動。比如:你知道一個(gè)游戲程序在與你的交互行為之外進(jìn)行了什么其他行為嗎?你知道文件檔案是以什么方式進(jìn)行存儲的?當(dāng)你正在對一個(gè)文檔進(jìn)行編輯時(shí),其他程序會不會也在非法執(zhí)行?大多數(shù)用戶不能回答這些問題。由于用戶通常不能直接對計(jì)算機(jī)數(shù)據(jù)進(jìn)行觀察,攻擊者可以編寫自己的程序作為工作來訪問和修改其他程序的數(shù)據(jù)。我們來具體分析惡意代碼的特點(diǎn)、產(chǎn)生的原因和分類。1.惡意代碼簡介

一般沒有人會喜歡出乎意料的行為,特別是在程序里面。由于惡意程序員的某種意圖,惡意代碼是以意料之外的方式運(yùn)行的。我們把惡意代碼看做是系統(tǒng)的潛伏者,它可能是正在運(yùn)行的程序的全部或一部分,也可能是一個(gè)獨(dú)立程序的一部分,依附于其他正常程序來運(yùn)行。

計(jì)算機(jī)病毒并非是最近才出現(xiàn)的新產(chǎn)物。事實(shí)上,早在1949年,距離第一部商用計(jì)算機(jī)的出現(xiàn)仍有好幾年時(shí),計(jì)算機(jī)的先驅(qū)者馮·諾依曼(VonNeumann)在他所提出的一篇論文《復(fù)雜自動裝置的理論及組織的運(yùn)行》中,已把病毒軟件的藍(lán)圖勾勒出來了。當(dāng)時(shí),絕大多數(shù)的計(jì)算機(jī)專家都無法想象到了1983年,計(jì)算機(jī)病毒的存在被科恩·湯普遜在他的頒獎(jiǎng)典禮上向外界正式公開,同時(shí)他還告訴聽眾怎樣編寫病毒程序。從此,計(jì)算機(jī)病毒的廣泛流傳便一發(fā)而不可收拾。特別是隨著網(wǎng)絡(luò)化步伐的加快,病毒借助于網(wǎng)絡(luò)爆炸式地傳播,使得很多毫無防備的信息系統(tǒng)遭到破壞,造成了巨大的損失。

惡意代碼極具破壞性。惡意代碼在非法獲取的用戶授權(quán)下進(jìn)行,因此,它以相同的方式訪問用戶所訪問的東西。用戶有絕對的權(quán)限對他自己的程序代碼和數(shù)據(jù)文件進(jìn)行控制,如讀、寫、修改、添加或刪除。惡意代碼往往也能這么做,而且無需用戶授權(quán),甚至不需要用戶知道。惡意代碼長期存在。1984年,Thompson在演講中提到了“賦予信任的反應(yīng)”(reflectionsontrustingtrust),用以描述可以通過編譯器編譯的代碼。在那次演講中,他提到了一份早期的文檔—《全面的安全評估》(Themutticssecurityevaluation)。其實(shí),關(guān)于病毒行為的文獻(xiàn)記錄至少可以追溯到1970年。Ware在1970年的研究和Anderson為美國空軍所做的計(jì)劃研究都準(zhǔn)確地描述了病毒的威脅、程序的脆弱點(diǎn)和程序安全性漏洞,特別是那些帶有惡意性質(zhì)的。對于病毒代碼而言,新出現(xiàn)的東西只不過是不同的實(shí)例和變種,以及利用了代碼出現(xiàn)的速度。惡意代碼存在于我們的周圍,其影響比以前更加深遠(yuǎn)。研究惡意代碼的外在表現(xiàn)和工作原理對我們來說非常重要,可以借此逐步阻止它們進(jìn)行破壞活動,或者至少能減弱它們的影響。本章后面的內(nèi)容將會討論常見惡意代碼的工作原理、特性、危害等內(nèi)容。

2.惡意代碼的種類

惡意代碼(maliciouscode)和欺詐程序(rogueprogram)是以破壞為目的的一類程序,由一個(gè)代理(agent)編制,在軟件中造成不期望的結(jié)果。該定義將無意的程序錯(cuò)誤排除在外,也將程序沖突錯(cuò)誤排除在外。所謂代理,是指該類程序的作者或發(fā)布人。通過此定義我們得出,大多數(shù)在軟件檢查、評估、測試中發(fā)現(xiàn)的錯(cuò)誤都不屬于惡意代碼的范疇,因?yàn)檫@些錯(cuò)誤都被認(rèn)為是無意的。然而,無意錯(cuò)誤事實(shí)上可以引起與惡意代碼相同的后果。一個(gè)良性原因仍然可以造成一個(gè)災(zāi)難。病毒(virus)是一種將惡意代碼傳遞給正常程序的程序,它通過修改正常程序做到這一點(diǎn)?!安《尽钡牡妹且?yàn)樗c生物學(xué)中的病毒具有相似特征,被它感染的系統(tǒng)將繼續(xù)感染其他系統(tǒng)以破壞其他系統(tǒng)或使病毒與其他系統(tǒng)共存。病毒是潛伏的,以至于不能確定昨天還是干凈的系統(tǒng)今天是否干凈。此外,一個(gè)正常程序也可能被修改以包藏病毒程序的副本,這樣該程序的行為就與病毒一樣,感染其他程序。被感染的主機(jī)數(shù)量通常以幾何級數(shù)遞增,最后整個(gè)系統(tǒng)都被病毒控制,并繼續(xù)蔓延以感染其他與本系統(tǒng)相連的系統(tǒng)。表6-1惡意代碼的類型

日趨成熟。目前,通過軟件業(yè)界和可靠性工程界的不懈努力,軟件可靠性工程得到了廣泛的研究并通過不斷實(shí)踐而取得了顯著的成績。但遺憾的是,直到今天,開發(fā)足夠可靠的軟件并測試和驗(yàn)證其可靠性,仍是十分困難的問題。6.2.1軟件可靠性模型的發(fā)展歷程

軟件可靠性工程的產(chǎn)生和發(fā)展得益于軟件可靠性模型。20世紀(jì)80年代之初,軟件可靠性工作主要側(cè)重于模型的研究和建立。迄今為止,發(fā)表了100多種軟件可靠性模型,且新模型還在不斷推出,從而導(dǎo)致了所謂的“模型戰(zhàn)”。最早的軟件可靠性模型是由于1956年提出的一系列公式,但由于它們太復(fù)雜,這些公式對后來軟件可靠性模型的建立幾乎沒有什么影響。1967年,Hudson觀察到軟件開發(fā)過程是一個(gè)生滅過程,提出了生滅過程模型。模型的關(guān)鍵點(diǎn)是:錯(cuò)誤的產(chǎn)生是延期的,錯(cuò)誤糾正是死亡期,在任一時(shí)刻存在于軟件的錯(cuò)誤個(gè)數(shù)可用來定義過程的狀態(tài),過程的轉(zhuǎn)移概率與生滅函數(shù)有關(guān)。

對軟件可靠性模型發(fā)展起著重要或奠基作用的模型分別是于1971年發(fā)表的Shooman模型以及Z.Jelinski和發(fā)表的J-M模型。他們都假設(shè):

(1)軟件中的初始錯(cuò)誤數(shù)為N(N≥0);

(2)軟件故障與軟件中的剩余錯(cuò)誤個(gè)數(shù)成正比;

(3)錯(cuò)誤一旦被發(fā)現(xiàn),立即排除且不引入新的錯(cuò)誤。另外,J-M模型還假設(shè)故障的風(fēng)險(xiǎn)率為分段常數(shù),在首次糾錯(cuò)過程中,它由一個(gè)常量來改變,但在兩次糾錯(cuò)過程之間保持常數(shù)。Jelinski和Moranda應(yīng)用極大似然估計(jì)來估計(jì)軟件中總的錯(cuò)誤數(shù)量、剩余錯(cuò)誤數(shù)量與風(fēng)險(xiǎn)率之間的比例參數(shù)。

1972年,B.Littlewood和發(fā)表了第一個(gè)貝葉斯(Bayes)模型。他們假設(shè):故障間隔時(shí)間服從含參數(shù)λi的指數(shù)分布,且λi服從先驗(yàn)的分布。據(jù)此,由標(biāo)準(zhǔn)的Bayes過程獲得tn+1?|?{t1,t2,…,tn}。同年,與提出了類似的模型,它與其他模型的主要區(qū)別就在于,他們假定連續(xù)的故障之間的糾錯(cuò)服從瑞利(Rayleigh)分布。1973年,發(fā)表了類似模型,但假設(shè)了風(fēng)險(xiǎn)函數(shù)服從Weibull分布,其特例就是Schick-Wolverton模型。

1975年,發(fā)表了執(zhí)行時(shí)間模型,引入了一系列新的顯示函數(shù)。同年,發(fā)表了幾何泊松(Possion)過程模型,該模型假設(shè)故障率隨著時(shí)間的增加呈幾何級數(shù)下降,且下降過程出現(xiàn)在每次故障的糾正期間。因此,在第i個(gè)時(shí)間段內(nèi)的錯(cuò)誤數(shù)滿足含參數(shù)λKi-1的泊松分布。同年,K.Trividi和發(fā)表了第一個(gè)馬爾可夫(Markov)過程模型。他們將系統(tǒng)狀態(tài)區(qū)分為“UP”和“DOWN”兩個(gè)狀態(tài),并假定“UP”狀態(tài)和“DOWN”狀態(tài),并假定“UP”狀態(tài)和“DOWN”狀態(tài)之間的轉(zhuǎn)換概率相同。模型輸出結(jié)果是一個(gè)概率集合,集合的每個(gè)元素為:P{在[0,t]?內(nèi)找出k個(gè)錯(cuò)誤}。

1976年,和S.Natarajan發(fā)表了基于錯(cuò)誤排查過程中引入新的錯(cuò)誤的模型。他們使用查錯(cuò)率、糾錯(cuò)率以及新錯(cuò)誤引入率來處理新的錯(cuò)誤引入問題。

1979年,A.Goel和K.Okumoto發(fā)表了關(guān)于連續(xù)時(shí)間的NHPP模型,該模型對軟件可靠性工程的發(fā)展產(chǎn)生了持續(xù)的影響。1983年,由Yamada、Ohba和Osaki聯(lián)合發(fā)表的NHPP模型,給出了呈S形的可靠性增長曲線的均值函數(shù)。由K.Okumoto和提出的對數(shù)泊松過程模型,具有一個(gè)初始錯(cuò)誤率λ,以及對應(yīng)于λ的一個(gè)遞減率。模型的日歷時(shí)間部分則與執(zhí)行時(shí)間模型的日歷時(shí)間部分相同。

1989年,Y.Tohma、K.Tokunaga、S.Nagase和Y.Murata提出了超幾何分布模型,用戶估計(jì)軟件中的剩余錯(cuò)誤數(shù)量。(1)隨機(jī)測試過程中,當(dāng)觀察到的故障次數(shù)為0時(shí),如何估計(jì)當(dāng)前版本軟件的故障率;

(2)使用分布與測試分布不匹配時(shí),對估計(jì)的故障概率進(jìn)行調(diào)整;

(3)故障率估計(jì)時(shí),將隨機(jī)測試的結(jié)果與其他信息結(jié)合起來進(jìn)行分析。

N.Karunanith、Y.Malaiya和D.Whitley應(yīng)用神經(jīng)網(wǎng)絡(luò)系統(tǒng)理論預(yù)測軟件可靠性。他們利用前向神經(jīng)網(wǎng)絡(luò)對三個(gè)數(shù)據(jù)集合進(jìn)行軟件可靠性估測,結(jié)果發(fā)現(xiàn):神經(jīng)網(wǎng)絡(luò)方法在軟件可靠性估測中顯示出良好的一致性,這是一般現(xiàn)有軟件可靠性模型所無法做到的,神經(jīng)網(wǎng)絡(luò)方法對于提高估測精度具有顯著的效果。6.2.2軟件可靠性模型的分類

軟件可靠性模型數(shù)量眾多,表達(dá)形式變化多樣,適用情況千差萬別。為了能夠系統(tǒng)而深刻地理解軟件可靠性模型,對現(xiàn)有模型進(jìn)行合理分類是必不可少的。通常分為結(jié)構(gòu)模型和預(yù)計(jì)模型兩大類。

結(jié)構(gòu)模型反映系統(tǒng)的邏輯結(jié)構(gòu),借助這類模型,在掌握軟件單元(構(gòu)件)可靠性特征的基礎(chǔ)上,可以對系統(tǒng)的可靠性特征以及變化趨勢做出預(yù)測和評價(jià)。結(jié)構(gòu)模型是軟件系統(tǒng)分析的重要工具,它既可用于軟件系統(tǒng)的可靠性綜合,也可用于軟件系統(tǒng)的可靠性分解。結(jié)構(gòu)模型包括串聯(lián)系統(tǒng)模型、并聯(lián)系統(tǒng)模型,以及硬—軟件復(fù)合系統(tǒng)模型等。預(yù)計(jì)模型在本質(zhì)上是一些描述軟件失效與軟件錯(cuò)誤的關(guān)系、軟件失效與運(yùn)行剖面的關(guān)系的數(shù)學(xué)方程。借助這類模型,可以對軟件的可靠性特征做出定量的預(yù)計(jì)或評估。例如,可以預(yù)計(jì)開發(fā)過程中的可靠性增長,預(yù)計(jì)或評估軟件在預(yù)定工作時(shí)間的可靠度,預(yù)計(jì)軟件在任意時(shí)刻的失效率等。評估和預(yù)計(jì)是兩個(gè)有區(qū)別又有聯(lián)系的概念。評估是指對軟件現(xiàn)有的可靠性做出評價(jià)。預(yù)計(jì)是指對軟件未來的可靠性特征進(jìn)行預(yù)測。這二者難以分開。常見的分類有:面向時(shí)間的模型,面向輸入的模型和面向錯(cuò)誤的模型。需要指出的是,在使用數(shù)學(xué)模型進(jìn)行預(yù)計(jì)時(shí),蘊(yùn)含的假定是,事物發(fā)展規(guī)律在未來的一段時(shí)間內(nèi)保持不變。對于短期預(yù)測這個(gè)假設(shè)是合理但是,隨著預(yù)測期的延長,其近似性減弱。用可靠性模型進(jìn)行預(yù)計(jì)時(shí),為了得到較準(zhǔn)確的結(jié)果,如果發(fā)現(xiàn)軟件的失效規(guī)律有明顯改變,則應(yīng)該對參數(shù)加以修正或重新收集失效數(shù)據(jù),重新確定模型參數(shù)。

軟件可靠性模型的分類如圖6-1所示。圖6-1軟件可靠性模型的分類6.2.4軟件可靠性預(yù)計(jì)模型

軟件可靠性預(yù)計(jì)模型的研究始于20實(shí)世紀(jì)70年代初期。迄今為止,文章書籍中的可靠性預(yù)計(jì)模型已有幾十種,而且新的模型還在不時(shí)出現(xiàn)。這些模型大體上可分為三種類型,即面向時(shí)間的模型、面向輸入的模型和面向錯(cuò)誤的模型。

1.面向時(shí)間的模型

面向時(shí)間的模型以時(shí)間為基準(zhǔn),研究軟件的可靠性隨時(shí)間變化的規(guī)律。這種模型建立的基礎(chǔ)及其預(yù)測結(jié)果,符合軟件可靠性定義的要求,且與硬件可靠性的概念兼容,可以滿足硬、軟件的系統(tǒng)綜合分析的要求,因此得到了廣泛的應(yīng)用,成為三類模型中最重要的、包含品種最多的一類。根據(jù)對數(shù)據(jù)的要求,這類模型可以分為兩類,即失效時(shí)間間隔模型(TBF模型)和失效計(jì)數(shù)模型(FC模型)。(1)失效時(shí)間間隔模型(TBF模型)所使用的數(shù)據(jù)是一定的時(shí)間間隔中的失效數(shù),分析方法建立在以失效時(shí)間間隔服從特定的概率分布的基礎(chǔ)上。

(2)失效計(jì)數(shù)模型(FC模型)所使用的數(shù)據(jù)是一定的時(shí)間間隔中的失效數(shù),分析方法大多建立在泊松過程理論的基礎(chǔ)上。

面向時(shí)間的模型最大缺點(diǎn)是其假設(shè)的前提條件很高,很難完全滿足,因而影響了模型的準(zhǔn)確性和人們使用的信心。經(jīng)過30多年的研究、發(fā)展,情況有了很大的改善,再加上模型的數(shù)量多,選擇余地大,這類模型的應(yīng)用前景是廣闊的。2.面向輸入的模型

面向輸入的模型的目的是建立軟件的可靠性與輸入數(shù)據(jù)的聯(lián)系,用程序運(yùn)行中的失效次數(shù)與成功次數(shù)的比例作為軟件可靠性的度量。這種模型概念清晰易懂,易于應(yīng)用,但是其與時(shí)間度量沒有直接的關(guān)系,在實(shí)現(xiàn)硬—軟件系統(tǒng)綜合時(shí)有一定困難,必須經(jīng)過附加的數(shù)學(xué)處理,才能用上時(shí)間尺度表示可靠度。

3.面向錯(cuò)誤的模型

面向錯(cuò)誤的模型直接使用軟件中現(xiàn)存的錯(cuò)誤數(shù)來反映軟件可靠性。這種模型的結(jié)果直觀,其缺點(diǎn)是不能反映軟件可靠性與時(shí)間的關(guān)系。6.3.2軟件系統(tǒng)的排錯(cuò)過程

1.錯(cuò)誤定位

軟件系統(tǒng)的排錯(cuò)與之前的測試緊密相連。如果測試的結(jié)果與期望結(jié)果存在差異,則排錯(cuò)過程先要找出錯(cuò)誤原因才能對應(yīng)地修正錯(cuò)誤。軟件系統(tǒng)排錯(cuò)的前提是準(zhǔn)確地實(shí)現(xiàn)錯(cuò)誤定位。排錯(cuò)人員應(yīng)從分析錯(cuò)誤的征兆入手,查找錯(cuò)誤的位置。比如在軟件測試中發(fā)現(xiàn)文件記錄中丟失了最后一個(gè)支付,這就是一個(gè)錯(cuò)誤征兆,排錯(cuò)人員需要利用各種信息和經(jīng)驗(yàn),來判斷問題發(fā)生的真正原因,找到有錯(cuò)誤的程序單元或語句。一種常見的做法是在整個(gè)程序中設(shè)置若干打印語句,打印中間結(jié)果并查看。這種方法有相當(dāng)好的效果,但是不宜作為第一位的方法使用。正確的做法是遵循以下步驟:

(1)透徹地了解所面臨的問題。必須深入地研究程序及其執(zhí)行結(jié)果,分析它在什么情況下得出的結(jié)果是正確的,在什么情況下得出的結(jié)果是錯(cuò)誤的。以這個(gè)分析為基礎(chǔ),排錯(cuò)人員應(yīng)提出關(guān)于錯(cuò)誤性質(zhì)及其原因的若干假設(shè)。排錯(cuò)出現(xiàn)困難的一個(gè)重要原因是,排錯(cuò)人員忽略了程序輸出中給出的某些重要信息。要仔細(xì)地分析輸出數(shù)據(jù),看看利用這些數(shù)據(jù)能否充分實(shí)現(xiàn)錯(cuò)誤定位。如果信息不充分,則應(yīng)運(yùn)行一些追加的測試用例。(2)制定查錯(cuò)計(jì)劃。這一步要求排錯(cuò)人員提出錯(cuò)誤原因、性質(zhì)和部分的假設(shè),根據(jù)這些假設(shè)來制定查找錯(cuò)誤的計(jì)劃。

(3)執(zhí)行查錯(cuò)計(jì)劃。實(shí)施計(jì)劃以驗(yàn)證各種假設(shè)的正確性,對計(jì)劃執(zhí)行過程的每一步都要進(jìn)行檢查。

(4)評估查錯(cuò)結(jié)果。經(jīng)過執(zhí)行計(jì)劃,如果錯(cuò)誤的位置已經(jīng)查明,則在動手改正之前還要再作認(rèn)真的檢查,分析它們是否確實(shí)是測試中出現(xiàn)的錯(cuò)誤征兆所引起的原因,驗(yàn)證錯(cuò)誤征兆涉及的部分有無遺漏。錯(cuò)誤定位上的許多困難其實(shí)來源于排錯(cuò)人員心理上的定勢,使得錯(cuò)誤的實(shí)際部分被忽略。這種情況與人們校對文稿中常常忽視某些特定字符的錯(cuò)誤很相似??朔@個(gè)缺點(diǎn)的方法是排錯(cuò)人員要有“懷疑一切”的思想準(zhǔn)備,要注意程序的注釋和文檔。有經(jīng)驗(yàn)的排錯(cuò)人員在閱讀一個(gè)程序時(shí),往往會先看看它的注釋,了解一下設(shè)計(jì)人員的初始意圖。此外,反向跟蹤也是一種有效的查錯(cuò)策略。反向跟蹤指的是從反方向閱讀程序,這種做法能從另一個(gè)角度展示程序的邏輯結(jié)構(gòu)。反向跟蹤是指從反方向閱讀程序,這種做法能從另一個(gè)角度展示程序的邏輯結(jié)構(gòu)。反向跟蹤也是從錯(cuò)誤征兆在程序中出現(xiàn)的位置進(jìn)行反方向搜索,以找出錯(cuò)誤發(fā)生的確切位置的。如果需要,有時(shí)則還要運(yùn)行一些附加的測試用例,以收集更多的信息。2.改正錯(cuò)誤

錯(cuò)誤的位置一旦準(zhǔn)備判定,下一步的任務(wù)就是改正錯(cuò)誤。改錯(cuò)的最大困難是判斷問題涉及的范圍。經(jīng)常出現(xiàn)的問題是:改正了錯(cuò)誤的一部分而忽略了其他的部分。改錯(cuò)不能采用“試試看”的作法。這種做法是排錯(cuò)人員沒有把握的表現(xiàn),因此很難達(dá)到預(yù)期的排錯(cuò)要求。排錯(cuò)難免對局部的程序進(jìn)行修改并破壞原有程序的完整性,對程序的結(jié)構(gòu)和可讀性產(chǎn)生消極的影響。而且排錯(cuò)又是在開發(fā)進(jìn)度的約束中進(jìn)行的,這使得問題變得更加尖銳。新的錯(cuò)誤很容易在毫無覺察的情況下引入,經(jīng)驗(yàn)表明,新錯(cuò)誤的引進(jìn)概率高達(dá)20%~50%。這種情況表明排錯(cuò)工作不能分配給缺乏經(jīng)驗(yàn)的新手,而應(yīng)該由有經(jīng)驗(yàn)的程序員來擔(dān)任,必須確保排錯(cuò)的質(zhì)量,對排錯(cuò)的要求應(yīng)該像對設(shè)計(jì)的要求一樣嚴(yán)格。如果需要更改與排錯(cuò)有關(guān)的文檔,則改正后的程序要經(jīng)過代碼的檢查。如果錯(cuò)誤是在單元測試后發(fā)現(xiàn)的,則應(yīng)追加一些單元測試案例或重新進(jìn)行單元測試。為了最大限度地避免新錯(cuò)誤的引進(jìn),應(yīng)先改動源程序,事后進(jìn)行編譯。這種作法表面上看來似乎費(fèi)時(shí),但是出錯(cuò)的可能性小。3.排錯(cuò)過程

總之,軟件系統(tǒng)的排錯(cuò)過程可以分為以下幾步:

(1)從錯(cuò)誤的外部表現(xiàn)形式入手,確定程序中的出錯(cuò)位置;

(2)研究有關(guān)部分的程序,找出錯(cuò)誤的內(nèi)部原因;

(3)修改設(shè)計(jì)和代碼,以便排除這個(gè)錯(cuò)誤;

(4)重復(fù)進(jìn)行暴露了這個(gè)錯(cuò)誤的原始測試或某些相關(guān)測試。6.3.3軟件系統(tǒng)的排錯(cuò)方法

常用的排錯(cuò)策略主要有以下三類:

(1)強(qiáng)行排錯(cuò)類;

(2)回溯類;

(3)排除類。

以上三種排錯(cuò)策略各對應(yīng)一種排錯(cuò)方法。

1.強(qiáng)行排錯(cuò)方法

強(qiáng)行排錯(cuò)類方法是最常用,也是效率最低的方法,只有在萬般無奈的情況下才考慮使用。其主要思想是“通過計(jì)算機(jī)找錯(cuò)”。它不需要過多的思考,比較省腦。比如,通過內(nèi)存全部打印來排錯(cuò),是將計(jì)算機(jī)內(nèi)存和寄存器中的值全部打印出來,然后在這些數(shù)據(jù)中尋找出錯(cuò)的位置。在程序特定的位置設(shè)置打印語句,把打印語句插在出錯(cuò)的源程序的各個(gè)關(guān)鍵變量改變部位、重要分支部位、子程序調(diào)用部位,來跟蹤程序的執(zhí)行和監(jiān)視重要變量的變化。使用自動調(diào)試工具,利用某些程序語言的調(diào)試功能或者專門的交互式調(diào)試工具,分析程序的動態(tài)運(yùn)行過程,而不必修改程序。

應(yīng)用以上任何一種方法之前,都應(yīng)該對錯(cuò)誤的征兆進(jìn)行全面徹底的分析,得出錯(cuò)誤位置及錯(cuò)誤性質(zhì)的推測,再使用一種適當(dāng)?shù)呐佩e(cuò)方法來檢驗(yàn)推測的正確性。2.回溯方法

回溯類方法能成功地使用在小程序的排錯(cuò)上。它從出現(xiàn)錯(cuò)誤征兆處開始,人工地沿控制流程往回追蹤,直至發(fā)現(xiàn)出錯(cuò)的根源。不幸的是:當(dāng)程序規(guī)模變大后,可能的回溯路線顯著增加,這樣導(dǎo)致人工進(jìn)行完全回溯可望而不可及。例如:程序中發(fā)現(xiàn)錯(cuò)誤處是某個(gè)打印語句。通過輸出值可以推斷程序在這一點(diǎn)上變量的值。再從這一點(diǎn)出發(fā),回溯程序的執(zhí)行過程,反復(fù)考慮:“如果程序在這一點(diǎn)上的狀態(tài)值是這樣,那么程序在上一點(diǎn)的狀態(tài)一定是這樣……”,直到找到錯(cuò)誤的位置。3.排除方法

排除方法基于歸納和演繹的原理,采用“分治”的概念。首先收集與錯(cuò)誤出現(xiàn)相關(guān)的所有數(shù)據(jù),假設(shè)一個(gè)錯(cuò)誤原因,用這些數(shù)據(jù)證明或反駁它;或者一次列出所有可能的原因,通過軟件測試一一排除。只要某次測試結(jié)果說明某種假設(shè)已初具端倪,則立即精化數(shù)據(jù),乘勝追擊。

(1)歸納法是一種從特殊推斷一般的系統(tǒng)化思考方法。歸納法排錯(cuò)的基本思想是:從一些錯(cuò)誤的征兆入手,通過分析它們之間的關(guān)系來找出錯(cuò)誤。其主要步驟大致分為四步,如圖6-2所示。圖6-2歸納法排錯(cuò)的步驟具體步驟分述如下:

①收集有關(guān)數(shù)據(jù),列出所有已知的測試用例和程序執(zhí)行結(jié)果??茨男┹斎霐?shù)據(jù)的運(yùn)行結(jié)果是正確的,哪些輸入數(shù)據(jù)的運(yùn)行結(jié)果有錯(cuò)誤。

②組織數(shù)據(jù)。由于歸納法是從特殊到一般的推斷過程,所以需要組織整理數(shù)據(jù),以發(fā)現(xiàn)規(guī)律??梢允褂孟旅媪谐龅谋?-2,What列出的是一般現(xiàn)象,Where說明發(fā)現(xiàn)現(xiàn)象的地點(diǎn),When列出現(xiàn)象發(fā)生時(shí)所有已知情況,How說明現(xiàn)象的范圍和量級。Is描述正確發(fā)生的3W1H,Isnot描述錯(cuò)誤發(fā)生的3W1H。通過分析可以找出矛盾。表6-2歸納法組織數(shù)據(jù)舉例

③提出假設(shè)。分析線索之間的關(guān)系,利用在線索結(jié)構(gòu)中觀察到的矛盾現(xiàn)象,設(shè)計(jì)一個(gè)或多個(gè)關(guān)于出錯(cuò)原因的假設(shè)。如果一個(gè)假設(shè)也提不出來,就要繼續(xù)返回到最前的步驟中去,收集更多的數(shù)據(jù)。此時(shí)應(yīng)當(dāng)再設(shè)計(jì)與執(zhí)行一些測試用例,以獲得更多的數(shù)據(jù)。

④證明與假設(shè)。把假設(shè)與原始線索或數(shù)據(jù)進(jìn)行比較,如果它能完全解釋一切現(xiàn)象,則假設(shè)得到證明;否則,就認(rèn)為假設(shè)不合理,或者是存在多個(gè)錯(cuò)誤,以致只能消除部分錯(cuò)誤。(2)演繹法是一種從一般原理或前提出發(fā),經(jīng)過排除和精化的過程來推導(dǎo)出結(jié)論的思考方法。演繹法排錯(cuò)是測試人員首先根據(jù)已有的測試用例,設(shè)想及枚舉出所有可能出錯(cuò)的原因作為假設(shè);然后用原始測試數(shù)據(jù)或新的測試,從中逐個(gè)排除不可能正確的假設(shè);最后,用測試數(shù)據(jù)驗(yàn)證余下的假設(shè)是出錯(cuò)的原因。其主要步驟也有四步:

①列舉出所有可能出錯(cuò)原因的假設(shè)。把所有可能的錯(cuò)誤原因列成表,通過它們,可以組織、分析現(xiàn)有數(shù)據(jù)。②利用已有的測試數(shù)據(jù),排除不正確的假設(shè)。仔細(xì)分析已有的數(shù)據(jù),尋找矛盾,力求排除前一步列出的所有原因。如果所有原因都被排除了,則需要補(bǔ)充一些數(shù)據(jù),如測試用例,以建立新的假設(shè)。

③改進(jìn)余下的假設(shè)。利用已知的線索,進(jìn)一步改進(jìn)余下的假設(shè),使之更加具體化,以便可以精確地確定出錯(cuò)位置。

④證明余下的假設(shè)。這一步極其重要,具體做法與歸納法的第四步類似。6.3.4軟件系統(tǒng)的排錯(cuò)原則

在排錯(cuò)過程中,需要遵循一定的原則。其中,很多原則本質(zhì)上是屬于心理學(xué)的問題。排錯(cuò)的原則可分為兩組。

1.確定錯(cuò)誤的性質(zhì)和位置的原則

(1)避開死胡同;

(2)用頭腦去分析思考與錯(cuò)誤有關(guān)的信息;

(3)調(diào)試工具只是一種工具,利用調(diào)試工具幫助思考,但不能代替思考;

(4)避免用試探法,最多只能把它當(dāng)做最后的手段。2.修改錯(cuò)誤的原則

(1)在出現(xiàn)錯(cuò)誤的地方,很可能還有別的錯(cuò)誤;

(2)修正一個(gè)錯(cuò)誤的常見失誤是只修改了這個(gè)錯(cuò)誤的表象,而沒有修改其本身;

(3)當(dāng)心修正一個(gè)錯(cuò)誤的同時(shí)可能會引入新的錯(cuò)誤;

(4)修改源代碼程序,而不是目標(biāo)程序。6.4軟件可信運(yùn)行環(huán)境

以通信、存儲和計(jì)算為核心的信息基礎(chǔ)設(shè)施已經(jīng)滲透到政治、經(jīng)濟(jì)、軍事、文化以及社會生活的各個(gè)層面,成為當(dāng)代生產(chǎn)力發(fā)展和人類文明進(jìn)步的強(qiáng)大動力。軟件是信息基礎(chǔ)設(shè)施的靈魂,隨著人們對功能需求的不斷增加,軟件系統(tǒng)變得日趨龐大和難以駕馭,缺陷和漏洞難以避免,系統(tǒng)越來越脆弱,很多時(shí)候不以人們期望的方式工作,經(jīng)常發(fā)生各種故障和失效,直接或間接地給用戶帶來損失。軟件并不總是讓人信任的,這就是我們所說的“軟件可信性”問題。軟件可信性問題已經(jīng)成為國際上一個(gè)普遍關(guān)注的問題,僅在Google上就可以搜索到100多萬個(gè)與軟件錯(cuò)誤相關(guān)的網(wǎng)頁。軟件故障和失效所帶來的影響也越來越大,2002年美國NIST估算,美國每年因軟件失效所造成的年度經(jīng)濟(jì)損失近600億美元,約占其GDP的0.6%。如何構(gòu)造出缺陷較少的軟件并保障其安全可靠運(yùn)行,已經(jīng)成為軟件研發(fā)者義不容辭的責(zé)任?!翱尚判浴笔窃谡_性、可靠性、安全性、時(shí)效性、完整性、可用性、可預(yù)測性、生存性、可控性等眾多概念的基礎(chǔ)上發(fā)展起來的一個(gè)新概念,是客觀對象諸多屬性在人們心目中的一個(gè)綜合反映。學(xué)者們試圖從不同角度、不同層次去詮釋“可信性”,但尚未形成共識,需要在實(shí)踐中不斷認(rèn)識和把握。一般認(rèn)為,“可信”是指一個(gè)實(shí)體在實(shí)現(xiàn)既定目標(biāo)的過程中,行為及結(jié)果可以預(yù)期,它強(qiáng)調(diào)目標(biāo)與實(shí)現(xiàn)相符,強(qiáng)調(diào)行為和結(jié)果的可預(yù)測性和可控制性。軟件的“可信”是指軟件系統(tǒng)的動態(tài)行為及其結(jié)果總是符合人們的預(yù)期,在受到干擾時(shí)仍能提供連續(xù)的服務(wù)。這里的“干擾”包括操作錯(cuò)誤、環(huán)境影響、外部攻擊等。例如,Poldelski和Rynbachenko基于線性代數(shù)理論提出了一個(gè)完備的一類線性程序線性秩函數(shù)生成理論,并將其實(shí)現(xiàn),即RANKFINDER。RANKFINDER是他們和微軟聯(lián)合開發(fā)的程序終止性分析工具TERMINATOR的核心部分。TERMINATOR已經(jīng)被成功應(yīng)用到多個(gè)設(shè)備驅(qū)動程序的終止性分析中,這些C程序的規(guī)模從5000行到35000行不等。在對23個(gè)設(shè)備驅(qū)動程序的驗(yàn)證中,TERMINATOR發(fā)現(xiàn)了8個(gè)終止性錯(cuò)誤?;诔橄蠼忉尩某绦蝌?yàn)證工具ASTREE分別對空中客車A340主飛控軟件(13.2萬行C代碼)和A380主飛控軟件(35萬行C代碼)進(jìn)行了驗(yàn)證,在驗(yàn)證規(guī)模上有所突破,但仍然存在一定局限性,只能針對特定軟件進(jìn)行驗(yàn)證和調(diào)優(yōu),驗(yàn)證的性質(zhì)也都是程序的內(nèi)部性質(zhì)。

實(shí)際上,沒有必要對軟件進(jìn)行完全加密。首先,這樣會嚴(yán)重影響程序的執(zhí)行效率,其次,攻擊者并不會對軟件所有代碼和數(shù)據(jù)感興趣,他只會篡改其中的關(guān)鍵部分,例如對于常見的檢測代碼的程序,檢測代碼和決策代碼是關(guān)鍵代碼,如果攻擊者可以篡改這些代碼,他就很有可能繞過條件檢測,而該檢測則是軟件設(shè)計(jì)者所期望執(zhí)行的。因此應(yīng)該將保護(hù)重點(diǎn)放到軟件中的關(guān)鍵數(shù)據(jù)和代碼上來。

經(jīng)過抽象,一個(gè)軟件可以表示為

Software?=?(C,D)

式中C表示代碼,D表示數(shù)據(jù)。軟件設(shè)計(jì)者在設(shè)計(jì)軟件時(shí)根據(jù)情況將C劃分為一般代碼Cgeneral和關(guān)鍵代碼Ccritical,同時(shí)將D劃分為一般數(shù)據(jù)Dgeneral和關(guān)鍵數(shù)據(jù)Dcritical。需要注意的是,對關(guān)鍵數(shù)據(jù)有訪問操作的代碼也應(yīng)該劃分為關(guān)鍵代碼,因?yàn)殛P(guān)鍵數(shù)據(jù)將被加載到安全處理器中,處于安全處理器以外的代碼是無法對其進(jìn)行訪問的,只能由同處于安全處理器中的關(guān)鍵代碼來訪問。

這樣,我們有

Software?=?(Cgeneral,Ccritical,Dgeneral,Dcritical)隨后,軟件設(shè)計(jì)者為該軟件生成一對密鑰KeyPair?=?(P,S),并用公鑰P對Ccritical和Dcritical加密,另外為該軟件賦予一個(gè)標(biāo)識符I,I?=?(URL,ID,Name),其中URL指向一個(gè)能提供安全密鑰服務(wù)的服務(wù)器KeyServer,ID是軟件設(shè)計(jì)者的唯一標(biāo)識符,Name為軟件名稱,該名稱可以包含軟件版本號,最后得到:

Software?=?(Cgeneral,Ep(Ccritical),Dgeneral,Ep(Dcritical))

我們稱這樣的軟件為可信軟件,最后軟件設(shè)計(jì)者便可將該可信軟件向公眾發(fā)布,同時(shí)把私鑰放到服務(wù)器KeyServer上。用戶在運(yùn)行可信軟件時(shí),系統(tǒng)將把Ep(Ccritical)和Ep(Dcritical)加載到虛擬地址部分,把Cgeneral和Dgeneral加載到用戶空間以外的部分。當(dāng)Ep(Ccritical)和Ep(Dcritical)被載入安全處理器后,安全處理器內(nèi)核將根據(jù)軟件標(biāo)識符I在Flash-Memory中尋找與其對應(yīng)的私鑰S,同時(shí)調(diào)用解密程序?qū)p(Ccritical)和Ep(Dcritical)進(jìn)行解密。

在可信軟件運(yùn)行過程中,安全處理器內(nèi)核需要對其RAM進(jìn)行管理,由于安全處理器RAM可能不足以容納關(guān)鍵代碼和數(shù)據(jù),這時(shí)需要將暫時(shí)無用的頁換出。在換出之前,必須先將頁面加密,然后再換出到外部存儲介質(zhì)上去。2.提供可信系統(tǒng)服務(wù)

將軟件關(guān)鍵代碼和數(shù)據(jù)放到安全處理器中,盡管能有效防止篡改,但攻擊者仍然有機(jī)會攻擊可信軟件。例如,關(guān)鍵代碼可能需要根據(jù)某些機(jī)器硬件特征來決定程序流程,在使用分級保護(hù)的系統(tǒng)中,處于用戶空間的代碼不能直接去訪問硬件,需要通過操作系統(tǒng)的系統(tǒng)調(diào)用來獲取這些特征,這使得攻擊者有機(jī)可乘,他可以修改操作系統(tǒng),使關(guān)鍵代碼獲得虛假信息,從而影響軟件執(zhí)行流程,以達(dá)到其目的。為避免上述情況的出現(xiàn),應(yīng)該禁止對操作系統(tǒng)內(nèi)核的肆意修改,保持一個(gè)安全可信運(yùn)行的內(nèi)核,但是這對于開放的系統(tǒng)來說是不合適的,尤其對于如Linux操作系統(tǒng)這樣的開放系統(tǒng)來說是不合適的。對于Linux這樣的開放式操作系統(tǒng),用戶有權(quán)利根據(jù)自己喜好修改操作系統(tǒng),并使用自己定制的系統(tǒng),因此安全處理器本身應(yīng)提供必要的可信系統(tǒng)服務(wù)。

可信系統(tǒng)服務(wù)代碼處于安全處理器的保護(hù)下,攻擊者難以對其進(jìn)行篡改,因此這些由系統(tǒng)服務(wù)提供的信息能較為可靠地反映系統(tǒng)的真實(shí)狀態(tài)。3.密鑰管理和內(nèi)核升級

1)密鑰管理

沒有安全可靠的密鑰管理措施,會導(dǎo)致密鑰信息外泄,也就無法保證軟件的可信運(yùn)行,對用于解密可信軟件關(guān)鍵代碼和數(shù)據(jù)的私鑰S,安全處理器內(nèi)核器將根據(jù)軟件標(biāo)識符I的哈希索引值H(I)將其放到索引表中,這樣軟件在運(yùn)行時(shí)安全處理器可以根據(jù)其標(biāo)識符I找到對應(yīng)的私鑰S來解密關(guān)鍵代碼和數(shù)據(jù)。但是存在一個(gè)問題,當(dāng)一個(gè)軟件第一次在用戶系統(tǒng)上運(yùn)行時(shí),安全處理器可能找不到與其對應(yīng)的私鑰。這是,安全處理器內(nèi)核要負(fù)責(zé)獲取私鑰,而且要確保在獲取過程中不會泄露信息,軟件設(shè)計(jì)者在發(fā)布軟件時(shí),同時(shí)將對應(yīng)的私鑰S放到安全密鑰服務(wù)器KeyServer上。因此當(dāng)安全處理器找不到與可信軟件對應(yīng)的私鑰時(shí),可以根據(jù)軟件標(biāo)識符與KeyServer的通訊以獲得對應(yīng)的私鑰。為保證私鑰的安全性,安全協(xié)處理器在與KeyServer通信時(shí)首先需要相互認(rèn)證身份,其次需要使用加密隧道來傳輸密鑰。2)內(nèi)核升級

安全處理器內(nèi)核升級是一個(gè)與密鑰管理同樣重要的問題。不安全的升級也會導(dǎo)致密鑰信息的泄露。例如,攻擊者假冒更新站點(diǎn),讓安全處理器得到攻擊者偽造的更新軟件,而該軟件將從安全處理器中讀出密鑰信息。和密鑰管理中獲取密鑰的方法相類似,在更新內(nèi)核時(shí),安全處理器與更新處理器之間首先需要互相證明合法身份,然后再建立加密隧道,并通過隧道來下載新內(nèi)核。升級管理需要具有原子性,只有當(dāng)新軟件完整無誤地下載到安全處理器后才能替換舊軟件。惡意軟件具有以下特點(diǎn):

(1)隱蔽性:以不被用戶察覺的方式在軟件系統(tǒng)中運(yùn)行;運(yùn)行后通常還隱蔽自身的存在,從而逃脫殺毒軟件等安全工具的檢測,例如,惡意軟件常常隱藏自身進(jìn)程,刪除日志記錄等。

(2)非法篡改性:惡意軟件常常通過篡改正常軟件的代碼和數(shù)據(jù),并加入惡意程序以達(dá)到破壞和入侵系統(tǒng)的目的。一旦被篡改后的軟件加載到系統(tǒng)中,其惡意代碼就會得到執(zhí)行,從而威脅到系統(tǒng)的安全。另一方面,由于這些被篡改的軟件通常是常用的應(yīng)用程序或者系統(tǒng)的關(guān)鍵文件,用戶很難發(fā)現(xiàn)并識別出這些被非法篡改的軟件。(3)底層化:惡意軟件已經(jīng)更多地由用戶級程序向內(nèi)核級代碼轉(zhuǎn)化。

以上是惡意代碼的三個(gè)特點(diǎn),但不限于這三點(diǎn)。由于惡意代碼破壞軟件的完整性,并且不易被用戶發(fā)覺,給用戶的正常使用帶來極大的不方便,甚至毀壞數(shù)據(jù),破壞系統(tǒng),給用戶帶來不小的損失。所以我們有必要研究如何對軟件的完整性進(jìn)行認(rèn)證。2)軟件哨兵

哨兵是一段小程序,插入在程序的不同位置,發(fā)揮不同作用(如代碼模糊、加密、檢驗(yàn)校驗(yàn)和、反匯編等)?;舅枷胧欠植际缴诒鴺?gòu)成一個(gè)網(wǎng)狀保護(hù)環(huán),彼此間的相互保護(hù)構(gòu)筑了對軟件的多重保護(hù)。

3)斷言檢查

斷言檢查即檢驗(yàn)斷言是否正確。所謂斷言,是一種特殊表達(dá)式,用于說明一個(gè)條件或程序變量之間的關(guān)系。在軟件防篡改中使用斷言檢查,是因?yàn)閿嘌钥梢詫Τ绦蜻M(jìn)行驗(yàn)證和調(diào)試。NGSCB(Next-GenerationSecurityComputingBase),是微軟提出的適用于未來Windows操作系統(tǒng)軟硬相結(jié)合的平臺規(guī)范。簡單地說,NGSC_B實(shí)際上是依靠硬件和操作系統(tǒng)軟件的配合在PC內(nèi)建立起第二個(gè)操作環(huán)境,這個(gè)操作環(huán)境可提供應(yīng)用程序、外圍硬件、內(nèi)存與存儲設(shè)備、輸入輸出系統(tǒng)的安全連接,以此保護(hù)系統(tǒng)免受黑客惡意代碼的攻擊。微軟為NGSCB增加了一個(gè)“Nexus”工作模式,意在提供一個(gè)受保護(hù)的安全分區(qū),在該分區(qū)里運(yùn)行的程序以一種“安全代理”的形態(tài)出現(xiàn)。即所有運(yùn)行中的軟件及數(shù)據(jù)都處于嚴(yán)密的保護(hù)狀態(tài)下,包括密封的存儲、受保護(hù)的執(zhí)行、受保護(hù)的輸入/輸出等,而相應(yīng)的加密操作是由一個(gè)“安全支持部件SSC”芯片來完成的。為了提供完整的平臺安全和保護(hù)機(jī)制,NGSCB必須得到整個(gè)硬件系統(tǒng)的支持,處理器、芯片組、顯示和輸出設(shè)備都必須做出相應(yīng)的改變,該部分的工作由Intel來完成。Intel將NGSCB的硬件部分稱為LaGrande。(2)多模塊哈希模式。依據(jù)圖6-3樹狀程序流,將程序P被分解成n個(gè)基礎(chǔ)模塊b1,b2,…,bn。單一路徑A的控制流始于b1,b2,…,bn尾隨其后。解密路徑的跳躍代碼放置于基礎(chǔ)模塊內(nèi)。作者引入了鑒別程序控制者的概念,主要是用它來完成程序動態(tài)的完整性認(rèn)證,儲存于原始程序P的最底部,作為保護(hù)程序執(zhí)行的起點(diǎn)。程序初始化后,開始執(zhí)行原始程序。在bi執(zhí)行之前,計(jì)算bi-1。哈希值Hi-1?=?Hash(bi-1),把它作為bi的解密密鑰。從而保證了在程序的執(zhí)行過程中,①不會涉及到“密鑰存儲”問題;②避免了哈希值的對比問題。圖6-3樹狀程序流該機(jī)制同樣也存在著缺點(diǎn):如只適用于樹狀控制流程序;不能處理對于單一模塊的多點(diǎn)切入問題;如何將該機(jī)制應(yīng)用到網(wǎng)狀控制流程序,需做進(jìn)一步探討。

2.基于軟件哨兵檢測機(jī)制

軟件哨兵檢測方法的基本思想是:在程序不同位置插入一些小的安全單元,即哨兵,負(fù)責(zé)不同的安全工作。

軟件哨兵的粗略設(shè)計(jì)是:嵌入兩個(gè)哨兵,第一個(gè)校驗(yàn)和哨兵負(fù)責(zé)關(guān)鍵代碼段的完整性檢測,另一個(gè)修復(fù)哨兵負(fù)責(zé)當(dāng)完整性被破壞時(shí)的程序進(jìn)行自動修復(fù)。

哨兵的安裝是自動完成的,從而減少了人工操作所帶來的繁瑣,也減少了人工操作可能產(chǎn)生的各種錯(cuò)誤。然而,哨兵也有它的弱點(diǎn):

(1)攻擊者還是可以同時(shí)發(fā)現(xiàn)所有的哨兵的。

(2)盡管把每個(gè)哨兵都設(shè)計(jì)的不盡相同,但由于基本任務(wù)相同,使得哨兵設(shè)計(jì)中類的結(jié)構(gòu)都差不多,這樣也為攻擊者最終確定哨兵的分布結(jié)構(gòu)創(chuàng)造了條件。6.6.1計(jì)算機(jī)病毒的概念

1.計(jì)算機(jī)病毒的定義

人們對生物病毒并不陌生,如天花、鼠疫、“非典”、“甲流”等許多病毒都曾給世人帶來恐慌,它們危及生命、造成財(cái)產(chǎn)損失,甚至使文明衰落。計(jì)算機(jī)病毒也如此,同樣威脅著信息文明,它們干擾人們的生產(chǎn)、生活等活動,甚至影響國家的政治、經(jīng)濟(jì)和軍事事務(wù),給世界帶來了無法估量的損失?!坝?jì)算機(jī)病毒”的概念是美國計(jì)算機(jī)研究專家F.Cohen博士最早提出的。計(jì)算機(jī)病毒是一段人為編制的計(jì)算機(jī)程序,這個(gè)程序一旦進(jìn)入計(jì)算機(jī)并得以執(zhí)行,它就會搜尋符合其傳染條件的程序或存儲介質(zhì),確定目標(biāo)后再將自身代碼插入其中,并自我繁殖。計(jì)算機(jī)病毒的特征在很多方面與生物病毒很相似。

人們從不同角度給出了計(jì)算機(jī)病毒的定義。一種定義是:通過磁盤、磁帶和網(wǎng)絡(luò)等存儲媒介傳播擴(kuò)散,能“傳染”其他程序的程序;另一種是:能夠?qū)崿F(xiàn)自身復(fù)制并且借助一定的載體存在的,具有潛伏性、傳染性和破壞性的程序。2)?DOS平臺階段

20世紀(jì)80年代起,IBM公司的PC系列微機(jī)因?yàn)樾阅軆?yōu)良,價(jià)格便宜逐漸成為世界微型計(jì)算機(jī)市場上的主要機(jī)型。但是由于IBMPC系列微型計(jì)算機(jī)自身的弱點(diǎn),尤其是DOS操作系統(tǒng)的開放性,給計(jì)算機(jī)病毒的制造者提供了可乘之機(jī)。因此,裝有DOS操作系統(tǒng)的微型計(jì)算機(jī)成為病毒攻擊的主要對象。1988年5月13日星期五,一些國家的公司和大學(xué)遭到了“耶路撒冷”(Jerusalem)病毒的襲擊。在這一天,病毒摧毀了計(jì)算機(jī)上所有想要執(zhí)行的文件。從某種意義上,“耶路撒冷”病毒首次通過自己的破壞引起了人們對計(jì)算機(jī)病毒的關(guān)注。從歐洲到美洲以及中東都有“耶路撒冷”病毒的報(bào)告。該病毒因供給了耶路撒冷大學(xué)而得名。

1990年,第一個(gè)多態(tài)病毒“變色龍”(Chemeleon)出現(xiàn)。多態(tài)病毒每感染一次就產(chǎn)生不同的代碼,使在此之前殺毒軟件使用的“帶掩碼的特征比較法”無法對付此類病毒,殺毒軟件不得不再尋找新的方法來檢測和發(fā)現(xiàn)病毒。1992年3月,“米開朗琪羅”(Michelanglo)病毒造成1萬多臺計(jì)算機(jī)被感染。該病毒是一個(gè)惡性的引導(dǎo)區(qū)型病毒,在3月6日啟動計(jì)算機(jī)時(shí),米開朗琪羅病毒就會發(fā)作,除了像其他病毒一樣進(jìn)行傳播外,還將把硬盤和當(dāng)時(shí)插在軟驅(qū)中的軟盤數(shù)據(jù)破壞掉,給許多計(jì)算機(jī)用戶造成了極大的損失。3)?Windows平臺階段

1996年,隨著Window95的日益普及,利用Windows進(jìn)行工作的病毒開始發(fā)展。雖然大量DOS環(huán)境下的病毒在Windows環(huán)境下仍然能夠成功運(yùn)行,但越來越多的病毒對Windows操作系統(tǒng)下獨(dú)特的可執(zhí)行文件格式進(jìn)行感染,這些病毒的出現(xiàn)宣告了病毒發(fā)展史上新一頁的到來。

1996年1月,第一個(gè)Windows95病毒—“博扎”(Win95.Boza)出現(xiàn)。1998年6月,CIH病毒出現(xiàn)。CIH病毒是有史以來影響最大的病毒之一。該病毒是第一個(gè)直接攻擊和破壞硬件的計(jì)算機(jī)病毒。它主要感染W(wǎng)indows95/98的可執(zhí)行程序,發(fā)作時(shí)可能會破壞計(jì)算機(jī)FlashBIOS芯片中的系統(tǒng)程序,導(dǎo)致主板燒壞,同時(shí)破壞硬盤中的數(shù)據(jù)。CIH病毒是迄今為止破壞最為嚴(yán)重的病毒。4)互聯(lián)網(wǎng)階段

雖然最早的網(wǎng)絡(luò)病毒“莫里斯蠕蟲”(Morris’sWorm)早在1988年11月就已出現(xiàn),但由于當(dāng)時(shí)因特網(wǎng)的普及不高和操作系統(tǒng)漏洞的不斷修補(bǔ),蠕蟲病毒并沒有得到快速的復(fù)制和傳播,因此沒有受到足夠的重視。1997年起,隨著因特網(wǎng)的廣泛應(yīng)用,各種病毒也開始利用因特網(wǎng)進(jìn)行傳播,計(jì)算機(jī)病毒進(jìn)入了互聯(lián)網(wǎng)時(shí)代。

1999年3月,一個(gè)稱為“梅麗莎”(Melissa)的計(jì)算機(jī)病毒席卷歐、美各國的計(jì)算機(jī)網(wǎng)絡(luò)。這種病毒利用郵件系統(tǒng)大量復(fù)制、傳播,造成網(wǎng)絡(luò)阻塞,甚至癱瘓。而且,這種病毒在傳播過程中還會造成泄密。2001年9月,“尼姆達(dá)”(Nimda)病毒在Internet上大規(guī)模傳播,致使15萬家公司網(wǎng)絡(luò)遭受感染,大量公司不得不暫時(shí)關(guān)閉自己的因特網(wǎng)服務(wù)器?!澳崮愤_(dá)”病毒是一種破壞力很強(qiáng)的病毒。它除了通過利用電子郵件對計(jì)算機(jī)進(jìn)行感染外,還像蠕蟲病毒那樣攻擊計(jì)算機(jī)服務(wù)器,在互聯(lián)網(wǎng)上尋找存在安全漏洞的網(wǎng)站進(jìn)行攻擊,而且還可以潛伏在用戶的瀏覽器中,準(zhǔn)備更進(jìn)一步地攻擊活動。2002年4月,一種新的惡意病毒—“求職信”病毒在亞洲地區(qū)頃刻爆發(fā),它利用電子郵件方式,迅速向外傳播,擴(kuò)散勢頭十分兇猛,一股新的病毒風(fēng)暴就此在全球展開?!扒舐毿拧蔽:χ笈c“尼姆達(dá)”相比有過之而無不及。除了具有同“尼姆達(dá)”病毒共同的危害性外,它還能完全覆蓋文件,并且“求職信”病毒具有很強(qiáng)的感染性,即使用戶不打開郵件附件,都會被自動感染上該病毒。3.計(jì)算機(jī)病毒的命名

完整的病毒名稱一般分為三個(gè)部分。其一般格式為

<病毒前綴>.<病毒名>.<病毒后綴>

例如“”,它的病毒名為“Huigezi”,前綴為“Backdoor”,后綴為“ik”。病毒前綴指一個(gè)病毒的種類,用來區(qū)別病毒的種族分類。不同種類的病毒,其前綴也不同。例如,常見的木馬病毒的前綴是Trojan,蠕蟲病毒的前綴是Worm,黑客病毒前綴名一般是Hack,宏病毒的前綴是Macro,腳本病毒的前綴是Script,系統(tǒng)病毒的前綴是Win32、PE、Win95、W32、W95等,捆綁機(jī)病毒的前綴是Binder,陷門病毒的前綴是Backdoor。有時(shí)病毒名稱前綴由多個(gè)部分組成,除類型外還包含了病毒的運(yùn)行平臺或病毒的一些其他特性。比如:“”,它的前綴是“Trojan.PSW”,代表它是一個(gè)可以盜取密碼的特洛伊木馬;“Backdoor.Win32.PcClient.al”的前綴是“Backdoor.Win32”,代表它是一個(gè)運(yùn)行在32位Windows平臺的陷門程序。病毒名指一個(gè)病毒的名稱,用來區(qū)別和標(biāo)識病毒家族,是一個(gè)廣義的病毒名稱。具有相同家族名稱的病毒通常具有相同或相似的特征,比如,凡是病毒名為“Huigezi”的病毒都具有盜取用戶密碼、隱藏自身、遠(yuǎn)程控制染毒計(jì)算機(jī)等特征。著名的CIH病毒的家族名都是唯一的CIH,“振蕩波”蠕蟲病毒的家族名是Sasser。

病毒后綴指一個(gè)病毒的變種特征,用來區(qū)別具體某個(gè)家族病毒的某個(gè)變種。一般采用英文中的26個(gè)字母來表示,如就是指振蕩波蠕蟲病毒的變種B,因此一般稱為“振蕩波B變種”或者“振蕩波變種B”。如果該病毒變種非常多,可以采用數(shù)字與字母混合表示變種標(biāo)識??梢钥闯觯粋€(gè)病毒的前綴對于快速的判斷該病毒屬于哪種類型的病毒是有非常大的幫助的。通過判斷病毒的類型,就可以對這個(gè)病毒有個(gè)大概的評估(當(dāng)然這需要積累一些常見病毒類型的相關(guān)知識)。而通過病毒名可以利用查找資料等方式進(jìn)一步了解該病毒的詳細(xì)特征。病毒后綴能知道現(xiàn)在在你機(jī)子里待著的病毒是哪個(gè)變種。6.6.2計(jì)算機(jī)病毒的特征

計(jì)算機(jī)病毒一般具有以下六大特征。

1.傳染性

傳染性是計(jì)算機(jī)病毒的基本特征,是判別一個(gè)程序是否為計(jì)算機(jī)病毒的最重要條件。在生物界,通過傳染病毒從一個(gè)生物體擴(kuò)散到另一個(gè)生物體。在適當(dāng)?shù)臈l件下,它可得到大量繁殖,并使被感染的生物體表現(xiàn)出病癥甚至死亡。同樣,計(jì)算機(jī)病毒也會通過各種渠道從已被感染的計(jì)算機(jī)擴(kuò)散到未被感染的計(jì)算機(jī),在某些情況下造成被感染的計(jì)算機(jī)工作失常甚至癱瘓。與生物病毒不同的是,計(jì)算機(jī)病毒是一段人為編制的計(jì)算機(jī)程序代碼,這段程序代碼一旦進(jìn)入計(jì)算機(jī)并得以執(zhí)行,它會搜尋其他符合其傳染條件的程序或存儲介質(zhì),確定目標(biāo)后再將自身代碼插入其中,達(dá)到自我繁殖的目的。只要一臺計(jì)算機(jī)染毒,如不及時(shí)處理,那么病毒會在這臺機(jī)子上迅速擴(kuò)散,其中的大量文件(一般是可執(zhí)行文件)會被感染。而被感染的文件又成了新的傳染源,再與其他機(jī)器進(jìn)行數(shù)據(jù)交換或通過網(wǎng)絡(luò)接觸,病毒會繼續(xù)進(jìn)行傳染。

2.非授權(quán)性

非授權(quán)性即未經(jīng)授權(quán)而執(zhí)行。一般正常的程序是由用戶調(diào)用,再由系統(tǒng)分配資源,完成用戶交給的任務(wù)。其目的對用戶是可見的、透明的。而病毒具有正常程序的一切特性,它隱藏在正常程序中,當(dāng)用戶調(diào)用正常程序時(shí)它竊取到系統(tǒng)的控制權(quán),先于正常程序執(zhí)行;病毒的動作、目的對用戶是未知的,是未經(jīng)用戶允許的。3.隱蔽性

計(jì)算機(jī)病毒一般是具有很高編程技巧的、短小精悍的程序。通常附在正常程序中或磁盤較隱蔽的地方,也有個(gè)別的以隱含文件形式出現(xiàn)。目的是不讓用戶發(fā)現(xiàn)它的存在。如果不經(jīng)過代碼分析,病毒程序與正常程序是不容易區(qū)別開來的。一般在沒有防護(hù)措施的情況下,計(jì)算機(jī)病毒程序取得系統(tǒng)控制權(quán)后,可以在很短的時(shí)間里傳染大量程序。而且受到傳染后,計(jì)算機(jī)系統(tǒng)通常仍能正常運(yùn)行,使用戶不會感到任何異常。正是由于隱蔽性,計(jì)算機(jī)病毒得以在用戶沒有察覺的情況下擴(kuò)散到上百萬臺計(jì)算機(jī)中。4.潛伏性

大部分的病毒感染系統(tǒng)之后一般不會馬上發(fā)作,它可長期隱藏在系統(tǒng)中。只有在滿足其所需要的特定觸發(fā)條件時(shí)才啟動其表現(xiàn)(破壞)模塊,只有這樣它才可進(jìn)行廣泛傳播。如“PETER-2”在每年2月27日會提三個(gè)問題,答錯(cuò)后會將硬盤加密。著名的“黑色星期五”在逢13號的星期五發(fā)作。國內(nèi)的“上海一號”會在每年三、六、九月的13日發(fā)作。當(dāng)然,最令人難忘的便是26日發(fā)作的CIH。這些病毒在平時(shí)會隱藏得很好,只有在發(fā)作日才會露出本來面目。計(jì)算機(jī)病毒觸發(fā)的條件主要有以下幾種:

(1)利用系統(tǒng)時(shí)鐘提供的時(shí)間作為觸發(fā)器。

(2)利用病毒體自帶的計(jì)數(shù)器作為觸發(fā)器。病毒利用計(jì)數(shù)器記錄某種事件發(fā)生的次數(shù),一旦計(jì)數(shù)器達(dá)到設(shè)定值,就執(zhí)行破壞操作。這些事件可以是計(jì)算機(jī)開機(jī)的次數(shù),也可以是病毒程序被運(yùn)行的次數(shù),還可以是從開機(jī)起被運(yùn)行的程序數(shù)量等。

(3)利用計(jì)算機(jī)內(nèi)執(zhí)行的特定操作作為觸發(fā)器。特定操作可以是用戶按下某些特定鍵的組合,也可以是執(zhí)行的指令,還可以使對磁盤的讀寫。

計(jì)算機(jī)病毒所使用的觸發(fā)條件是多種多樣的,而且往往是由多個(gè)條件的組合來觸發(fā)的。但大多數(shù)病毒的組合條件是基于時(shí)間的,再輔以讀寫盤操作、按鍵操作以及其他條件。5.破壞性

任何病毒只要侵入系統(tǒng),都會對系統(tǒng)及應(yīng)用程序產(chǎn)生程度不同的影響。輕者會降低計(jì)算機(jī)工作效率,占用系統(tǒng)資源,重者可導(dǎo)致系統(tǒng)崩潰。由此特性可將病毒分為良性病毒與惡性病毒。良性病毒可能只顯示些畫面或出點(diǎn)音樂或出現(xiàn)無聊的語句,或者根本沒有任何破壞動作,但會占用系統(tǒng)資源。這類病毒較多,如:GENP、小球、W-BOOT等。惡性病毒則有明確的目的,或破壞數(shù)據(jù)、刪除文件,或加密磁盤、格式化磁盤,有的對數(shù)據(jù)造成不可挽回的破壞。這也反映出病毒編制者的險(xiǎn)惡用心,如CIH病毒。有時(shí)幾種本沒有多大破壞作用的病毒交叉感染,也會導(dǎo)致系統(tǒng)崩潰等重大惡果。6.6.3計(jì)算機(jī)病毒的工作原理

計(jì)算機(jī)病毒是一個(gè)程序,它在正常程序運(yùn)行之前運(yùn)行,并處于特權(quán)狀態(tài)。這段程序代碼一旦進(jìn)入到計(jì)算機(jī)并得到執(zhí)行,就會對計(jì)算機(jī)的某些資源進(jìn)行監(jiān)視和控制,會自動搜尋其他符合傳染條件的程序或存儲介質(zhì),并將自身代碼插入其中,達(dá)到自我繁殖的目的。只要一臺計(jì)算機(jī)染毒,病毒就可能在這臺計(jì)算機(jī)上迅速擴(kuò)散,甚至殃及與此計(jì)算機(jī)進(jìn)行數(shù)據(jù)交換的其他計(jì)算機(jī)。1.DOS病毒的原理

現(xiàn)代計(jì)算機(jī)雖然有嚴(yán)密的保護(hù)措施,但總得允許開發(fā)人員修改、更新系統(tǒng),允許用戶編寫自己的程序,這就使得病毒有了入侵的機(jī)會。正常的程序由用戶調(diào)用,再由系統(tǒng)分配資源。如果一個(gè)病毒程序取得了控制權(quán),它就可以對系統(tǒng)程序或其他用戶程序進(jìn)行任意的修改。

計(jì)算機(jī)病毒具有正常程序的一切特征,它隱藏在正常程序中,當(dāng)用戶調(diào)用正常程序時(shí)獲得系統(tǒng)的控制權(quán),并先于正常程序執(zhí)行。一個(gè)病毒程序可以通過引導(dǎo)含有病毒的系統(tǒng)或執(zhí)行含有病毒的系統(tǒng)或執(zhí)行含有病毒的程序獲得對計(jì)算機(jī)系統(tǒng)的控制權(quán)。獲得控制權(quán)后,它可以傳染、發(fā)作,或把自己安裝在系統(tǒng)中。安裝好的病毒可以通過某種條件再次獲得控制權(quán)。當(dāng)系統(tǒng)從硬盤引導(dǎo)時(shí),主引導(dǎo)記錄先被裝入內(nèi)存中執(zhí)行,然后由主引導(dǎo)程序裝入活動分區(qū)中BOOT引導(dǎo)記錄,最后由DOS引導(dǎo)程序裝入DOS操作系統(tǒng)。因此,如果這些引導(dǎo)程序中有病毒程序,該病毒程序就會首先獲得控制權(quán)。但由于此時(shí)DOS還沒有安裝,病毒程序只能調(diào)用ROMBIOS的功能,以扇區(qū)為單位進(jìn)行磁盤操作,無法將病毒程序傳染到文件上。引導(dǎo)記錄中的病毒程序必須將自己駐留內(nèi)存,然后才有可能再次獲得控制權(quán)。由于DOS裝入時(shí)還要進(jìn)行初始化工作,病毒程序只能將自己駐留內(nèi)存高端。它修改ROM自檢程序填寫的內(nèi)存最高可用內(nèi)存地址保留一定空間給自己使用,并修改INT13H中斷向量,指向病毒程序的某個(gè)入口,然后裝入正常的引導(dǎo)記錄引導(dǎo)DOS。以后,每次調(diào)用INT13H進(jìn)行磁盤操作,病毒程序便再次獲得控制權(quán)。獲得控制權(quán)的病毒程序設(shè)法尋找適合感染的硬盤,把自己復(fù)制到磁盤的引導(dǎo)分區(qū),完成傳染功能。為了滿足隱蔽性要求,病毒程序一般都較小,并主動減少對宿主重復(fù)感染的可能性。病毒程序一般都是通過某個(gè)標(biāo)記來檢查宿主已被感染,因此,這個(gè)標(biāo)記可以人為地加在宿主中以獲得免疫。此外,修改DOS并駐留內(nèi)存的病毒一般給DOS增加了檢查感染的功能。一個(gè)病毒程序獲得控制權(quán)時(shí),如果發(fā)現(xiàn)系統(tǒng)已感染過同種病毒,自己則不駐留內(nèi)存,以免將內(nèi)存耗盡或使系統(tǒng)速度下降太多而被人發(fā)現(xiàn)。2.Windows病毒的原理

Win32中的可執(zhí)行文件,如?.exe、.dll、.ocx等都是PE(PortableExecutable)格式文件。PE病毒是所有病毒中數(shù)量極多、破壞極大、技巧性最強(qiáng)的一類病毒。PE病毒一般具有重定位、截獲API函數(shù)地址、搜索感染目標(biāo)文件、內(nèi)存文件映射、實(shí)施感染等功能。

1)重定位

編寫正常的程序時(shí)是不需要關(guān)心變量的位置的,因?yàn)樵闯绦蛟诰幾g時(shí),變量(常量)在內(nèi)存中的位置都被計(jì)算好了。程序裝入內(nèi)存時(shí),系統(tǒng)不會為它重定位。編程時(shí)需要用到變量(常量)時(shí)直接用變量名訪問,編譯后通過偏移地址訪問。病毒程序也要用到變量,當(dāng)病毒感染HOST程序后,由于其依附到不同HOST程序中的位置也不盡相同,病毒隨著HOST裝入內(nèi)存后,病毒中的各個(gè)變量(常量)在內(nèi)存中的位置也會發(fā)生變化。這樣,病毒對變量的引用不再準(zhǔn)確,勢必導(dǎo)致病毒無法正常執(zhí)行。這樣,病毒就非常有必要對病毒代碼中的所有變量(常量)進(jìn)行重新定位。2)獲取API函數(shù)的地址

Win32下的系統(tǒng)功能不是通過中斷實(shí)現(xiàn),而是通過調(diào)用動態(tài)鏈接庫中的API函數(shù)實(shí)現(xiàn)的。PE病毒也需要調(diào)用API函數(shù)實(shí)現(xiàn)某些功能,但是普通的PE程序里面只有一個(gè)導(dǎo)入函數(shù)節(jié),記錄了代碼節(jié)所用到的API函數(shù)在DLL中的真實(shí)地址。這樣,調(diào)用API函數(shù)時(shí)就可以通過該導(dǎo)入函數(shù)節(jié)找到相應(yīng)API的真正執(zhí)行地址。但是,對于PE病毒來說,它只有代碼節(jié),并不存在導(dǎo)入函數(shù)節(jié),所以病毒無法像普通PE程序那樣直接調(diào)用相關(guān)的API函數(shù),而應(yīng)該先找出這些APi函數(shù)在相應(yīng)DLL中的地址。3)搜索感染目標(biāo)文件

通常使用API函數(shù)來實(shí)現(xiàn)搜索感染目標(biāo)文件的目的,如FindFirstFile、FindNextFile、FindCode等。

4)內(nèi)存文件映射

內(nèi)存文件映射提供一組獨(dú)立的函數(shù),使得應(yīng)用程序能夠通過內(nèi)存指針像訪問內(nèi)存一樣對磁盤上的文件進(jìn)行訪問。這組內(nèi)存映射文件函數(shù)將磁盤上的文件全部或部分映射到進(jìn)程虛擬地址空間的某個(gè)位置,以后對文件內(nèi)容的訪問就如同在該地址區(qū)域內(nèi)直接對內(nèi)存訪問一樣簡單。這樣,對文件中數(shù)據(jù)的操作便是直接對內(nèi)存進(jìn)行操作,大大提高了訪問的速度,對病毒減少對資源的占用是非常重要的。5)實(shí)施感染

PE病毒常見的感染及其他文件的方法是在文件中添加一個(gè)新節(jié),然后往該新節(jié)中添加病毒代碼和病毒執(zhí)行后返回HOST程序代碼,并修改文件頭中代碼開始執(zhí)行位置指向新添加的病毒節(jié)的代碼入口,以便程序運(yùn)行后先執(zhí)行病毒代碼。6.7計(jì)?算?機(jī)?蠕?蟲

6.7.1計(jì)算機(jī)蠕蟲的概念

1.計(jì)算機(jī)蠕蟲的定義

惡意代碼包括計(jì)算機(jī)病毒、計(jì)算機(jī)蠕蟲和特洛伊木馬等。在上一節(jié)中,已經(jīng)介紹了計(jì)算機(jī)病毒的知識,現(xiàn)在我們關(guān)注另一種惡意代碼—計(jì)算機(jī)蠕蟲。從字面意思可以看出,蠕蟲可以像蠅蛆一樣在網(wǎng)上到處蠕動。計(jì)算機(jī)蠕蟲會時(shí)刻尋找更多的計(jì)算機(jī)并伺機(jī)對其感染,那些被感染的機(jī)器又會作為自動發(fā)射緩沖器進(jìn)一步感染其他機(jī)器,在短時(shí)間內(nèi)造成大面積網(wǎng)絡(luò)阻塞。計(jì)算機(jī)蠕蟲利用網(wǎng)絡(luò)、電子郵件以及U盤、移動硬盤等移動存儲設(shè)備進(jìn)行復(fù)制和傳播。比如2006年以來危害極大的“熊貓燒香”就是蠕蟲的一種。因?yàn)槿湎x使用多種方式進(jìn)行傳播,所以蠕蟲程序的傳播速度是非常大的。計(jì)算機(jī)病毒主要攻擊的是文件系統(tǒng),在其傳染的過程中,計(jì)算機(jī)使用者是傳染的觸發(fā)者,是傳染的關(guān)鍵環(huán)節(jié),使用者的計(jì)算機(jī)知識水平的高低常常決定了病毒所能造成的破壞程度。而蠕蟲主要利用計(jì)算機(jī)系統(tǒng)漏洞(vulnerability)進(jìn)行傳染,搜索到網(wǎng)絡(luò)中存在漏洞的計(jì)算機(jī)后主動進(jìn)行攻擊,在傳染的過程中,與計(jì)算機(jī)操作者是否進(jìn)行操作無關(guān),從而與使用者的計(jì)算機(jī)知識水平無關(guān)。另外,蠕蟲的定義中強(qiáng)調(diào)了自身副本的完整性和獨(dú)立性,這也是區(qū)分蠕蟲和病毒的重要因素??梢酝ㄟ^簡單的觀察攻擊程序是否存在載體來區(qū)分蠕蟲與病毒;目前很多破壞性很強(qiáng)的病毒利用了部分網(wǎng)絡(luò)功能,例如以信件作為病毒的載體,或感染W(wǎng)indows系統(tǒng)的網(wǎng)絡(luò)鄰居共享中的文件。通過分析可以知道,Windows系統(tǒng)的網(wǎng)絡(luò)鄰居共享本質(zhì)上是本地文件系統(tǒng)的一種擴(kuò)展,對網(wǎng)絡(luò)鄰居共享文件的攻擊不能等同于對計(jì)算機(jī)系統(tǒng)的攻擊。而利用信件作為宿主的病毒同樣不具備獨(dú)立運(yùn)行的能力。不能簡單地把利用了部分網(wǎng)絡(luò)功能的病毒統(tǒng)統(tǒng)稱為蠕蟲或蠕蟲病毒,因?yàn)樗鼈儾痪邆渖厦嫣岬降娜湎x的基本特征。通過以上的分析和總結(jié),本節(jié)重新給出的計(jì)算機(jī)蠕蟲完整定義:“計(jì)算機(jī)蠕蟲是無須計(jì)算機(jī)使用者干預(yù)即可運(yùn)行的獨(dú)立程序,它通過不停的獲得網(wǎng)絡(luò)中存在漏洞的計(jì)算機(jī)上的部分或全部控制權(quán)來進(jìn)行傳播。”(ComputerwormisaprogramwhichcanexecutesindependentlywithoutinterventionofcomputerusersandpropagatesbycompromisingvulnerablecomputerspartiallyorfullyontheInternet.)2.計(jì)算機(jī)蠕蟲的發(fā)展歷史

“蠕蟲”最早出自一本1975出版的名為《ShockwaveRider》的科幻小說。1980年,XeroxPARC的研究人員編寫了最早的蠕蟲,用來嘗試進(jìn)行分布式計(jì)算(DistributedComputation)而不是進(jìn)行惡意的破壞。整個(gè)程序由幾個(gè)段(Segment)組成,這些段分布在網(wǎng)絡(luò)中的不同計(jì)算機(jī)上,它們能夠判斷出計(jì)算機(jī)是否空閑,并向處于空閑狀態(tài)的計(jì)算機(jī)遷移。當(dāng)某個(gè)段被破壞掉時(shí),其它段能重新復(fù)制出這個(gè)段。研究人員編寫蠕蟲的目的是為了輔助科學(xué)實(shí)驗(yàn)。蠕蟲被用做惡意攻擊的歷史可以追溯到1988年11月2日爆發(fā)的Morris蠕蟲。美國康乃爾大學(xué)學(xué)生羅伯特·莫里斯(RobertMorris)正是利用UNIX操作系統(tǒng)寄發(fā)電子郵件的公用程序中的一個(gè)缺陷,把他首創(chuàng)的人工生命“蠕蟲”病毒放進(jìn)Internet網(wǎng)絡(luò),闖下了彌天大禍。一夜之間,這條“蠕蟲”閃電般地自我復(fù)制,并向著整個(gè)Internet網(wǎng)絡(luò)迅速蔓延,使美國6000余臺基于UNIX的小型電腦和工作站受到感染和攻擊,網(wǎng)絡(luò)上幾乎所有的機(jī)器都被迫停機(jī),直接經(jīng)濟(jì)損失在9000萬美元以上,莫里斯本人也因此受到了法律的制裁。1998年5月,ADM蠕蟲被發(fā)現(xiàn),它只感染Linux系統(tǒng),由于程序自身的限制,它的傳染效率較低。ADM蠕蟲是通過域名解析服務(wù)程序BIND中的反向查詢(inversequery)溢出漏洞進(jìn)行傳播的。

1999年9月,ADMMillennium蠕蟲爆發(fā),由于該蠕蟲將其所有文件的時(shí)間戳設(shè)置為2000年1月1日,所以人們稱其為“Millennium”蠕蟲。由于它在很多方面類似于1998年的ADM蠕蟲,所以被認(rèn)為是ADM蠕蟲的仿制品。Millennium蠕蟲只感染Linux系統(tǒng),它入侵系統(tǒng)后,會修補(bǔ)所有它利用的系統(tǒng)漏洞,以此來防止重復(fù)感染。它通過imap4、qpopper、bind、rpc.mountd4種系統(tǒng)服務(wù)中存在的漏洞進(jìn)行傳播。2000年5月4日,求愛信(LOVELETTER)蠕蟲爆發(fā),這是一個(gè)用VBScript語言寫成的蠕蟲程序,它可以通過多種方式進(jìn)行傳播,包括E-mail、Windows文件共享、IRC、USENET新聞組等。根據(jù)CERT的統(tǒng)計(jì),截至2000年5月8日,僅5天的時(shí)間,就有近500000臺機(jī)器被感染。

2001年1月,Ramen蠕蟲在Linux系統(tǒng)下發(fā)現(xiàn),它的名字取自一種面條。它在15分鐘內(nèi)可以掃描13萬個(gè)地址,早期的版本只修改被入侵計(jì)算機(jī)Web服務(wù)下的index.html文件,在利用系統(tǒng)漏洞入侵后會為系統(tǒng)修補(bǔ)好漏洞。但后期的版本中被加入了隱藏其蹤跡的工具包(Rootkit),并在系統(tǒng)中留下陷門。雖然它是蠕蟲而非病毒,但仍被媒體稱為“Linux系統(tǒng)下的首例病毒”。Ramen蠕蟲通過wuftpd、rpc.statd、LPRng三種系統(tǒng)服務(wù)中存在的漏洞進(jìn)行

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論