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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

6.1程序安全

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

(2)修補一個問題時常導致其他地方的失敗,或者說補丁僅僅解決一個地方的問題,而沒有解決相關地方的問題。

(3)打補丁可能會影響系統的功能和性能,所以補丁不能適當地修補系統錯誤。

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

人都會犯錯誤,程序員和其他開發者也不例外。其實大部分錯誤都是無意或非惡意的。大多數錯誤會造成程序故障,但不會造成特別嚴重的安全隱患。然而,極少數錯誤卻已困擾了程序員和安全專家幾十年之久,并且在短期內無法將其消除。本節將討論三種典型的錯誤,并分別解釋每種錯誤,說明它為什么和安全性相關,以及怎樣預防或減輕危害。編譯器為緩沖區劃分了10個字節大小的空間,從buffer[0]到buffer[9],每個都分別占用一個字節的空間,現在我們執行這條語句:

buffer[10]=‘a’;

數組元素的下標超過了緩沖區的大小,從安全的角度出發,這樣出現問題了。最好的結果是,編譯器在編譯過程中就檢查出問題并將錯誤標記出來。然而,如果語句是:

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

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

buffer[i]=‘a’;

buffer[10]='b';

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

2.不完全驗證

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

考慮下面的例子:

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

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

3.“檢查時刻到使用時刻”錯誤

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

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

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

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

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

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

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

2.惡意代碼的種類

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

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

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

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

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

(2)軟件故障與軟件中的剩余錯誤個數成正比;

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

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

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

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

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

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

(2)使用分布與測試分布不匹配時,對估計的故障概率進行調整;

(3)故障率估計時,將隨機測試的結果與其他信息結合起來進行分析。

N.Karunanith、Y.Malaiya和D.Whitley應用神經網絡系統理論預測軟件可靠性。他們利用前向神經網絡對三個數據集合進行軟件可靠性估測,結果發現:神經網絡方法在軟件可靠性估測中顯示出良好的一致性,這是一般現有軟件可靠性模型所無法做到的,神經網絡方法對于提高估測精度具有顯著的效果。6.2.2軟件可靠性模型的分類

軟件可靠性模型數量眾多,表達形式變化多樣,適用情況千差萬別。為了能夠系統而深刻地理解軟件可靠性模型,對現有模型進行合理分類是必不可少的。通常分為結構模型和預計模型兩大類。

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

軟件可靠性模型的分類如圖6-1所示。圖6-1軟件可靠性模型的分類6.2.4軟件可靠性預計模型

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

1.面向時間的模型

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

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

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

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

3.面向錯誤的模型

面向錯誤的模型直接使用軟件中現存的錯誤數來反映軟件可靠性。這種模型的結果直觀,其缺點是不能反映軟件可靠性與時間的關系。6.3.2軟件系統的排錯過程

1.錯誤定位

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

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

(3)執行查錯計劃。實施計劃以驗證各種假設的正確性,對計劃執行過程的每一步都要進行檢查。

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

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

總之,軟件系統的排錯過程可以分為以下幾步:

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

(2)研究有關部分的程序,找出錯誤的內部原因;

(3)修改設計和代碼,以便排除這個錯誤;

(4)重復進行暴露了這個錯誤的原始測試或某些相關測試。6.3.3軟件系統的排錯方法

常用的排錯策略主要有以下三類:

(1)強行排錯類;

(2)回溯類;

(3)排除類。

以上三種排錯策略各對應一種排錯方法。

1.強行排錯方法

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

應用以上任何一種方法之前,都應該對錯誤的征兆進行全面徹底的分析,得出錯誤位置及錯誤性質的推測,再使用一種適當的排錯方法來檢驗推測的正確性。2.回溯方法

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

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

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

①收集有關數據,列出所有已知的測試用例和程序執行結果。看哪些輸入數據的運行結果是正確的,哪些輸入數據的運行結果有錯誤。

②組織數據。由于歸納法是從特殊到一般的推斷過程,所以需要組織整理數據,以發現規律。可以使用下面列出的表6-2,What列出的是一般現象,Where說明發現現象的地點,When列出現象發生時所有已知情況,How說明現象的范圍和量級。Is描述正確發生的3W1H,Isnot描述錯誤發生的3W1H。通過分析可以找出矛盾。表6-2歸納法組織數據舉例

③提出假設。分析線索之間的關系,利用在線索結構中觀察到的矛盾現象,設計一個或多個關于出錯原因的假設。如果一個假設也提不出來,就要繼續返回到最前的步驟中去,收集更多的數據。此時應當再設計與執行一些測試用例,以獲得更多的數據。

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

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

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

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

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

1.確定錯誤的性質和位置的原則

(1)避開死胡同;

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

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

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

(1)在出現錯誤的地方,很可能還有別的錯誤;

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

(3)當心修正一個錯誤的同時可能會引入新的錯誤;

(4)修改源代碼程序,而不是目標程序。6.4軟件可信運行環境

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

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

經過抽象,一個軟件可以表示為

Software?=?(C,D)

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

這樣,我們有

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

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

我們稱這樣的軟件為可信軟件,最后軟件設計者便可將該可信軟件向公眾發布,同時把私鑰放到服務器KeyServer上。用戶在運行可信軟件時,系統將把Ep(Ccritical)和Ep(Dcritical)加載到虛擬地址部分,把Cgeneral和Dgeneral加載到用戶空間以外的部分。當Ep(Ccritical)和Ep(Dcritical)被載入安全處理器后,安全處理器內核將根據軟件標識符I在Flash-Memory中尋找與其對應的私鑰S,同時調用解密程序對Ep(Ccritical)和Ep(Dcritical)進行解密。

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

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

可信系統服務代碼處于安全處理器的保護下,攻擊者難以對其進行篡改,因此這些由系統服務提供的信息能較為可靠地反映系統的真實狀態。3.密鑰管理和內核升級

1)密鑰管理

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

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

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

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

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

哨兵是一段小程序,插入在程序的不同位置,發揮不同作用(如代碼模糊、加密、檢驗校驗和、反匯編等)。基本思想是分布式哨兵構成一個網狀保護環,彼此間的相互保護構筑了對軟件的多重保護。

3)斷言檢查

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

2.基于軟件哨兵檢測機制

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

軟件哨兵的粗略設計是:嵌入兩個哨兵,第一個校驗和哨兵負責關鍵代碼段的完整性檢測,另一個修復哨兵負責當完整性被破壞時的程序進行自動修復。

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

(1)攻擊者還是可以同時發現所有的哨兵的。

(2)盡管把每個哨兵都設計的不盡相同,但由于基本任務相同,使得哨兵設計中類的結構都差不多,這樣也為攻擊者最終確定哨兵的分布結構創造了條件。6.6.1計算機病毒的概念

1.計算機病毒的定義

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

人們從不同角度給出了計算機病毒的定義。一種定義是:通過磁盤、磁帶和網絡等存儲媒介傳播擴散,能“傳染”其他程序的程序;另一種是:能夠實現自身復制并且借助一定的載體存在的,具有潛伏性、傳染性和破壞性的程序。2)?DOS平臺階段

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

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

1996年,隨著Window95的日益普及,利用Windows進行工作的病毒開始發展。雖然大量DOS環境下的病毒在Windows環境下仍然能夠成功運行,但越來越多的病毒對Windows操作系統下獨特的可執行文件格式進行感染,這些病毒的出現宣告了病毒發展史上新一頁的到來。

1996年1月,第一個Windows95病毒—“博扎”(Win95.Boza)出現。1998年6月,CIH病毒出現。CIH病毒是有史以來影響最大的病毒之一。該病毒是第一個直接攻擊和破壞硬件的計算機病毒。它主要感染Windows95/98的可執行程序,發作時可能會破壞計算機FlashBIOS芯片中的系統程序,導致主板燒壞,同時破壞硬盤中的數據。CIH病毒是迄今為止破壞最為嚴重的病毒。4)互聯網階段

雖然最早的網絡病毒“莫里斯蠕蟲”(Morris’sWorm)早在1988年11月就已出現,但由于當時因特網的普及不高和操作系統漏洞的不斷修補,蠕蟲病毒并沒有得到快速的復制和傳播,因此沒有受到足夠的重視。1997年起,隨著因特網的廣泛應用,各種病毒也開始利用因特網進行傳播,計算機病毒進入了互聯網時代。

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

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

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

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

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

計算機病毒一般具有以下六大特征。

1.傳染性

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

2.非授權性

非授權性即未經授權而執行。一般正常的程序是由用戶調用,再由系統分配資源,完成用戶交給的任務。其目的對用戶是可見的、透明的。而病毒具有正常程序的一切特性,它隱藏在正常程序中,當用戶調用正常程序時它竊取到系統的控制權,先于正常程序執行;病毒的動作、目的對用戶是未知的,是未經用戶允許的。3.隱蔽性

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

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

(1)利用系統時鐘提供的時間作為觸發器。

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

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

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

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

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

現代計算機雖然有嚴密的保護措施,但總得允許開發人員修改、更新系統,允許用戶編寫自己的程序,這就使得病毒有了入侵的機會。正常的程序由用戶調用,再由系統分配資源。如果一個病毒程序取得了控制權,它就可以對系統程序或其他用戶程序進行任意的修改。

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

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

1)重定位

編寫正常的程序時是不需要關心變量的位置的,因為源程序在編譯時,變量(常量)在內存中的位置都被計算好了。程序裝入內存時,系統不會為它重定位。編程時需要用到變量(常量)時直接用變量名訪問,編譯后通過偏移地址訪問。病毒程序也要用到變量,當病毒感染HOST程序后,由于其依附到不同HOST程序中的位置也不盡相同,病毒隨著HOST裝入內存后,病毒中的各個變量(常量)在內存中的位置也會發生變化。這樣,病毒對變量的引用不再準確,勢必導致病毒無法正常執行。這樣,病毒就非常有必要對病毒代碼中的所有變量(常量)進行重新定位。2)獲取API函數的地址

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

通常使用API函數來實現搜索感染目標文件的目的,如FindFirstFile、FindNextFile、FindCode等。

4)內存文件映射

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

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

6.7.1計算機蠕蟲的概念

1.計算機蠕蟲的定義

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

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

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

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

溫馨提示

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

評論

0/150

提交評論