第四章:程序和編程._第1頁(yè)
第四章:程序和編程._第2頁(yè)
第四章:程序和編程._第3頁(yè)
第四章:程序和編程._第4頁(yè)
第四章:程序和編程._第5頁(yè)
已閱讀5頁(yè),還剩32頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、信息安全技術(shù)體系 何長(zhǎng)鵬hapter 4程序和編程CONTENTS01無(wú)惡意的程序漏洞02惡意的代碼03對(duì)策04總結(jié)目 錄無(wú)意的程序漏洞眾所周知,程序是由可能犯錯(cuò)誤的人編寫的,并且程序缺陷包括從無(wú)關(guān)緊要的缺陷到災(zāi)難性的缺陷。盡管經(jīng)過(guò)了嚴(yán)格的測(cè)試,但有些缺陷可能仍依賴于許多未知或不可預(yù)料的條件,從而可能周期或偶然地出現(xiàn)。程序缺陷會(huì)引起兩種類型的安全隱患:1)引起完整性問(wèn)題從而導(dǎo)致有害的輸出或行為;2)提供一個(gè)能夠被惡意者利用的機(jī)會(huì)。緩存區(qū)溢出內(nèi)存分配Linux操作系統(tǒng)在加載程序時(shí),將程序所使用的內(nèi)存分為5段:text(程序段)、data(數(shù)據(jù)段)、bss(bss數(shù)據(jù)段)

2、、heap(堆)、stack(棧)。 1、棧區(qū)(stack)由編譯器自動(dòng)分配釋放 ,存放函數(shù)的參數(shù)值,局部變量的值等,內(nèi)存的分配是連續(xù)的,類似于平時(shí)我們所說(shuō)的棧,如果還不清楚,那么就把它想成數(shù)組,它的內(nèi)存分配是連續(xù)分配的,即,所分配的內(nèi)存是在一塊連續(xù)的內(nèi)存區(qū)域內(nèi)當(dāng)我們聲明變量時(shí),那么編譯器會(huì)自動(dòng)接著當(dāng)前棧區(qū)的結(jié)尾來(lái)分配內(nèi)存緩存區(qū)溢出內(nèi)存分配2、堆區(qū)(heap)一般由程序員分配釋放, 若程序員不釋放,程序結(jié)束時(shí)可能由操作系統(tǒng)回收類似于鏈表,在內(nèi)存中的分布不是連續(xù)的,它們是不同區(qū)域的內(nèi)存塊通過(guò)指針鏈接起來(lái)的一旦某一節(jié)點(diǎn)從鏈中斷開,我們要人為的把所斷開的節(jié)點(diǎn)從內(nèi)存中釋放緩存區(qū)溢出內(nèi)存分配3、全局區(qū)(

3、靜態(tài)區(qū))(static)全局變量和靜態(tài)變量的存儲(chǔ)是放在一塊的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域, 未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域。 程序結(jié)束后由系統(tǒng)釋放緩存區(qū)溢出內(nèi)存分配4、文字常量區(qū)常量字符串就是放在這里的。 程序結(jié)束后由系統(tǒng)釋放5、程序代碼區(qū)存放函數(shù)體的二進(jìn)制代碼。緩沖區(qū)溢出危害所有的程序都是被操作系統(tǒng)所調(diào)用的,而操作系統(tǒng)的運(yùn)行權(quán)限高于普通的程序。當(dāng)攻擊者偽裝為系統(tǒng)程序而獲取到系統(tǒng)控制權(quán)時(shí),他就能夠以較高的權(quán)限執(zhí)行各種命令。因此,攻擊者可以通過(guò)在其進(jìn)程運(yùn)行返回時(shí)替換部分的指令。這種技術(shù)叫作特權(quán)提升(privilege escalation)。如果溢出發(fā)生在操作

4、系統(tǒng)的代碼空間,則攻擊者僅需要將與機(jī)器代碼指令所對(duì)應(yīng)的數(shù)據(jù)插入溢出空間即可。1、攻擊者可能替換系統(tǒng)空間中的代碼緩沖區(qū)溢出危害子過(guò)程的調(diào)用是通過(guò)堆棧來(lái)管理的,這種結(jié)構(gòu)使得過(guò)程調(diào)用可以被嵌套,每次調(diào)用返回時(shí)都會(huì)將控制權(quán)交還給調(diào)用之前的入口。每次過(guò)程調(diào)用時(shí),它的參數(shù)、返回地址和局部變量都被壓入堆棧中。同時(shí)進(jìn)棧的還有調(diào)用之前的堆棧指針,而堆棧指針寄存器也將重新裝載新的值。然后將控制權(quán)就轉(zhuǎn)交給子過(guò)程。當(dāng)子過(guò)程在執(zhí)行時(shí),它從堆棧指針?biāo)赶虻牡刂分姓业讲⑷〕鰠?shù)。一般來(lái)說(shuō),堆棧指針是處理器的一個(gè)寄存器。因此,通過(guò)造成堆棧溢出,攻擊者就可以更改調(diào)用前的堆棧指針或更改返回地址。無(wú)論是更改上下文還是返回地址,攻擊

5、者都可以將程序的執(zhí)行重定向到他希望執(zhí)行的代碼處。2、入侵者可能會(huì)利用堆棧指針或返回值的寄存器緩沖區(qū)溢出對(duì)策緩沖區(qū)溢出對(duì)策似乎很簡(jiǎn)單:在寫之前進(jìn)行檢查。遺憾的是,這并非那么容易,因?yàn)橐恍┚彌_區(qū)溢出的情形并不直接受程序員的控制,并且溢出可能會(huì)以多種方式出現(xiàn)。對(duì)于覆寫內(nèi)存最明顯的對(duì)策是將其保持在邊界之內(nèi)。維護(hù)邊界是程序員、操作系統(tǒng)、編譯器和硬件的共同責(zé)任。所有的責(zé)任方都應(yīng)該做到以下幾點(diǎn):1)在寫之前檢查長(zhǎng)度;2)確定數(shù)組下標(biāo)在限制范圍之內(nèi);3)仔細(xì)檢查邊界條件代碼以找出可能的大小差一錯(cuò)誤;4)對(duì)輸入進(jìn)行監(jiān)視并只能接受能夠被處理的字符數(shù)據(jù);5)使用有數(shù)量上限的字符串傳輸工具。緩沖區(qū)溢出對(duì)策6)檢查可能

6、產(chǎn)生空間溢出的程序;7)限制程序的權(quán)限,因此假如一段代碼被惡意取代,取代者將無(wú)法獲得提高的系統(tǒng)權(quán)限。不完全驗(yàn)證用戶在不懂、誤解或者分心時(shí)將會(huì)犯錯(cuò)誤;用戶的錯(cuò)誤不應(yīng)該導(dǎo)致程序失敗。驗(yàn)證所有的輸入:事先就預(yù)測(cè)出潛在可能發(fā)生的問(wèn)題。沒(méi)有理由可以讓敏感的數(shù)據(jù)處在一個(gè)不可信用戶的控制之下。如果數(shù)據(jù)時(shí)可以改變的,就可以假設(shè)他們已經(jīng)被改變過(guò)。檢查時(shí)刻到使用時(shí)刻的錯(cuò)誤訪問(wèn)控制是計(jì)算機(jī)安全的基礎(chǔ)部分,確保只有具有訪問(wèn)權(quán)限的人或進(jìn)程才能進(jìn)行相應(yīng)的訪問(wèn)。訪問(wèn)請(qǐng)求由訪問(wèn)策略所控制,策略指明了哪些請(qǐng)求允許訪問(wèn)哪些資源。然后,訪問(wèn)策略的執(zhí)行代理對(duì)訪問(wèn)請(qǐng)求進(jìn)行仲裁。但是,若對(duì)訪問(wèn)進(jìn)行的檢查不全面,就會(huì)出現(xiàn)不完全仲裁問(wèn)題。檢

7、查時(shí)刻到使用時(shí)刻的漏洞與仲裁在執(zhí)行中受到的誘騙有關(guān)。未公開的訪問(wèn)點(diǎn)在程序的開發(fā)和測(cè)試過(guò)程中,程序員需要通過(guò)一種途徑去訪問(wèn)一個(gè)模塊的內(nèi)部。例如,當(dāng)程序出現(xiàn)一個(gè)錯(cuò)誤的計(jì)算結(jié)果時(shí),程序員希望有一種方法可以跟蹤數(shù)據(jù)在程序運(yùn)行中的各種取值?;蛘呖刂屏鞒虥](méi)有按照其應(yīng)有的流程執(zhí)行,程序員要輸入測(cè)試值到程序中?;蛘叱绦騿T需要一個(gè)特殊的調(diào)試模式來(lái)測(cè)試條件。無(wú)論是哪種情況,程序員創(chuàng)建了一個(gè)未公開的的入口點(diǎn)或執(zhí)行模式。這些情況在程序開發(fā)過(guò)程中是可以理解的。然而,當(dāng)程序從開發(fā)流程轉(zhuǎn)到產(chǎn)品發(fā)布的時(shí)候,程序員有時(shí)會(huì)忘記移除這些入口?;蛘叱绦騿T故意留下他們以便日后對(duì)程序進(jìn)行維護(hù);程序員也許覺(jué)得沒(méi)有人會(huì)發(fā)現(xiàn)這個(gè)特殊的入口點(diǎn)。

8、大小差一錯(cuò)誤當(dāng)學(xué)習(xí)編程時(shí),新手可能會(huì)很容易犯大小差一錯(cuò)誤(off-by-one error):錯(cuò)誤地計(jì)算一個(gè)循環(huán)的結(jié)束條件(repeat while i=n or in?),或者忽略了從A0到An是包含了n+1個(gè)元素的數(shù)組。程序員經(jīng)常因?yàn)槲茨苷_地思考一個(gè)循環(huán)應(yīng)該什么時(shí)候停止而犯錯(cuò)。其他還可能引起犯錯(cuò)的原因是,將控制數(shù)據(jù)與實(shí)踐的數(shù)據(jù)合并在一起,如一個(gè)用于管理列表增加和減少的程序。這些錯(cuò)誤的唯一控制方法就是正確的編程:總是檢查容器大小以確保容器對(duì)于大量的數(shù)據(jù)來(lái)說(shuō)是足夠的。整形溢出整數(shù)溢出是一種特殊類型的溢出,它所產(chǎn)生的后果與其他類型的溢出有所不同。發(fā)生整形溢出的原因是存儲(chǔ)位置固定且大小有限,而且

9、只能包含一定限度大小的整數(shù)。溢出取決于數(shù)據(jù)只是否有符號(hào)。未以空終止符結(jié)尾的字符串長(zhǎng)字符串是許多緩沖區(qū)溢出的根源。有時(shí),一個(gè)攻擊者故意將一個(gè)超長(zhǎng)的字符串輸入處理程序,以查看程序是否失敗,以及如何失敗。其他的時(shí)候,這個(gè)漏洞是偶然引起的:一個(gè)程序錯(cuò)誤地覆寫了字符串的一部分,導(dǎo)致該字符串被解釋為超出它實(shí)際的長(zhǎng)度。這些錯(cuò)誤的發(fā)生取決于字符串的存儲(chǔ)方式、應(yīng)用程序及操作系統(tǒng)調(diào)用。參數(shù)長(zhǎng)度、類型和數(shù)值過(guò)多的參數(shù);錯(cuò)誤的輸出類型或大小;過(guò)長(zhǎng)的字符串。競(jìng)態(tài)條件競(jìng)態(tài)條件的意思是兩個(gè)進(jìn)程在相同的時(shí)間間隔內(nèi)進(jìn)行競(jìng)爭(zhēng),并且此競(jìng)爭(zhēng)將影響任務(wù)計(jì)算的完整性或正確性。1、非同步的行為兩個(gè)進(jìn)程在競(jìng)態(tài)條件(race conditio

10、n)或序列缺陷(serialization flaw)的環(huán)境中并發(fā)執(zhí)行,計(jì)算的結(jié)果將取決于進(jìn)程執(zhí)行指令的順序。競(jìng)態(tài)條件:程序的行為依賴于兩個(gè)過(guò)程執(zhí)行順序的情形。2、安全隱患資源競(jìng)爭(zhēng)依賴于兩個(gè)不同進(jìn)程的順序和時(shí)間,從而使得這些錯(cuò)誤很難被發(fā)現(xiàn)和測(cè)試。兩個(gè)進(jìn)程之間的競(jìng)態(tài)條件可能會(huì)導(dǎo)致 不一致的、不希望的以及錯(cuò)誤的結(jié)果-完成性實(shí)效惡意的代碼:惡意軟件惡意代碼即可以針對(duì)某個(gè)特定用戶或用戶類別,也可以針對(duì)任何個(gè)人。惡意軟件:病毒、木馬和蠕蟲病毒(virus)是一種能夠自我復(fù)制并將惡意代碼傳遞給其他正常程序的程序,它通過(guò)修改正常程序來(lái)實(shí)現(xiàn)惡意代碼傳遞給該正常程序。病毒可劃分為瞬時(shí)病毒和長(zhǎng)期性寄居病毒。蠕蟲(

11、worm)是一種通過(guò)網(wǎng)絡(luò)大量傳播自身副本的惡意代碼。二者之間的區(qū)別:1)蠕蟲的操作都是通過(guò)網(wǎng)絡(luò)來(lái)進(jìn)行的,而病毒可以通過(guò)任何介質(zhì)進(jìn)行傳播2)蠕蟲是以獨(dú)立的形式來(lái)傳播自身拷貝的,而病毒則必須將自身的副本嵌入其他程序中來(lái)傳播。惡意的代碼:惡意軟件特洛伊木馬(Trojan horse)是這樣一種惡意代碼:它除了程序所具有的基本功能之外,還有一些不易被人發(fā)覺(jué)的惡意效果。技術(shù)細(xì)節(jié):惡意代碼我們研究惡意代碼的四個(gè)方面:l危害它們?nèi)绾斡绊懹脩艉拖到y(tǒng);l傳播和復(fù)制它們?nèi)绾蝹鞑ズ蛷?fù)制,以及如何進(jìn)一步傳播;l激活它們?nèi)绾潍@取控制并安裝自身以便于能再次激活;l隱藏它們?nèi)绾坞[藏,以防被發(fā)現(xiàn)。開發(fā)者的對(duì)策如何去開發(fā)安全、

12、值得信任及無(wú)缺陷的程序?隨著程序的大小和復(fù)雜度的增加,攻擊者對(duì)其進(jìn)行攻擊的可能性也會(huì)增加。1、軟件工程技術(shù)2、測(cè)試開發(fā)者的對(duì)策1、軟件工程技術(shù)軟件工程的一個(gè)重要原則就是將代碼或其他設(shè)計(jì)實(shí)體做成小型、獨(dú)立的單元,這些單元稱為組件(component)或模塊(module)。這種系統(tǒng)開發(fā)的方法稱為模塊化(modular)。模塊化非常有利于程序的開發(fā),特別是在安全方面。如果一個(gè)獨(dú)立的組件不受其他組件的影響,則該系統(tǒng)的設(shè)計(jì)在某種程度上就能夠?qū)⒐收系奈:π钥刂圃谧钚》秶?。因?yàn)槌霈F(xiàn)的任何故障都是與造成該故障的模塊相連的,所以系統(tǒng)維護(hù)變的更加容易。因?yàn)閷?duì)一個(gè)獨(dú)立的組件進(jìn)行修改并不會(huì)影響其他的組件,所以測(cè)試也

13、會(huì)簡(jiǎn)化。在組件間完全獨(dú)立的情況下,開發(fā)者也很容易地發(fā)現(xiàn)漏洞所在。我們把這種隔離稱為封裝(encapsulate)。開發(fā)者的對(duì)策信息隱藏(information hiding)是模塊化軟件的另一個(gè)特性。信息隱藏指的是每個(gè)組件都隱藏自己的實(shí)現(xiàn)細(xì)節(jié)或設(shè)計(jì)細(xì)節(jié)。這樣當(dāng)系統(tǒng)需要加以調(diào)整時(shí),并不需要進(jìn)行整體調(diào)整,而只需要調(diào)整某個(gè)特定的組件。模塊化模塊化使得每個(gè)組件都必須滿足以下4個(gè)條件:?jiǎn)稳蝿?wù):只完成一個(gè)特定的功能。小型化:一個(gè)組件包含的信息數(shù)量非常少,以至于人們可以很容易的理解它的構(gòu)造和內(nèi)容。簡(jiǎn)單化:復(fù)雜程度不高,可以很容易地理解模塊的意圖和構(gòu)造。獨(dú)立性:不依靠其他模塊而獨(dú)立完成任務(wù)。模塊化模塊化組件通

14、常具有高內(nèi)聚和低耦合的特點(diǎn)。內(nèi)聚(cohesion)指的是組件中的所有元素的存在都有充足的邏輯理由或功能理由;每個(gè)組件元素都與組件要執(zhí)行的單一任務(wù)是相關(guān)的。一個(gè)高內(nèi)聚組件的行為都集中在其所要完成的任務(wù)中;而對(duì)一個(gè)低內(nèi)聚的組件來(lái)說(shuō),其內(nèi)容通常都是零散而混亂的,僅僅由于時(shí)間上的依賴關(guān)系或處于方便才把它們組合在一起。耦合(coupling)是指系統(tǒng)中某個(gè)組件對(duì)其他組件的依賴程度。因此,低耦合的組件由于可以避免和其他組件的沖突而比高耦合的組件具有更多的優(yōu)越性。封裝性封裝性隱藏了組件實(shí)現(xiàn)的具體細(xì)節(jié),但組件間并不是完全獨(dú)立的。許多組件之間會(huì)共享信息,然而,由于共享的方式被謹(jǐn)慎地記錄在文檔里,所以系統(tǒng)中的其

15、他組件對(duì)某一個(gè)組件的影響是可以預(yù)見的。共享式以最小方式進(jìn)行,因此只需要使用很少的接口,而有限的接口減少了創(chuàng)建隱蔽通道的可能性。一個(gè)被封裝組件的邊界可以根據(jù)需要設(shè)計(jì)成半透明的或透明的。信息隱藏在強(qiáng)調(diào)模塊化設(shè)計(jì)的系統(tǒng)中,開發(fā)者可以確保其他組件對(duì)自己所編寫組件的影響是有限的。在這種前提下,可以將組件設(shè)想成類似黑盒子,這類黑盒子有定義良好的輸入、輸出系統(tǒng)和定義良好的功能。其他模塊的設(shè)計(jì)者沒(méi)有必要知道該模塊的實(shí)現(xiàn)細(xì)節(jié),只要確保自己的模塊按正確方式運(yùn)行即可。開發(fā)者的策略2、測(cè)試安全性測(cè)試就是要通過(guò)嘗試盡可能多的方式,找出程序中可能出錯(cuò)的地方。1)測(cè)試類型測(cè)試通常包括幾個(gè)階段:首先,獨(dú)立測(cè)試每個(gè)組件。模塊測(cè)

16、試、組件測(cè)試或單元測(cè)試,這種測(cè)試可以正式在輸入了組件設(shè)計(jì)中所期望的數(shù)值類型后,組件是否可以正確運(yùn)行。測(cè)試小組還要檢查輸入輸出數(shù)據(jù)的內(nèi)部結(jié)構(gòu)、邏輯條件和邊界條件。其次,當(dāng)一組組件接收了單元測(cè)試后,下一步就是確保該組組件之間的接口得以良好定義和處理。集成測(cè)試正是確保系統(tǒng)的組件間按照熊設(shè)計(jì)規(guī)范的描述協(xié)調(diào)工程的過(guò)程。測(cè)試再次,一旦確信組件之間的信息傳遞是按照設(shè)計(jì)規(guī)范進(jìn)行的,就可以測(cè)試系統(tǒng)來(lái)驗(yàn)證系統(tǒng)的功能性。功能性測(cè)試評(píng)估系統(tǒng)以確定集成系統(tǒng)的功能是否與需求規(guī)范中所描述的一樣。測(cè)試的結(jié)果是一個(gè)功能性系統(tǒng)。功能測(cè)試將正在開發(fā)的系統(tǒng)與需求規(guī)范中所描述的功能進(jìn)行比較后,將進(jìn)行性能測(cè)試。性能測(cè)試將系統(tǒng)與剩余的軟、

17、硬件需求做比較。在功能測(cè)試與性能測(cè)試期間,檢測(cè)系統(tǒng)的安全需求,使測(cè)試者確信系統(tǒng)的安全性能與安全需求中所描述的一致。完成性能測(cè)試后,開發(fā)者就可以確定系統(tǒng)的功能與自己對(duì)系統(tǒng)描述的理解是相符合的。下一步是由用戶確認(rèn)熊的功能與用戶的需求一致。開發(fā)者將加入用戶的行列進(jìn)行驗(yàn)收測(cè)試。在該測(cè)試中,將檢查系統(tǒng)是否符合用戶的需求規(guī)范。完成該測(cè)試后,系統(tǒng)將被安裝在運(yùn)行環(huán)境中,進(jìn)行最后的安裝測(cè)試。該測(cè)試的目的是確保系統(tǒng)在安裝后仍然具有同樣的功能。測(cè)試單元測(cè)試和集成測(cè)試的目的在于確保代碼正確實(shí)現(xiàn)了系統(tǒng)設(shè)計(jì),即程序員的代碼和設(shè)計(jì)者的目的相符合。而系統(tǒng)測(cè)試的目的卻不同,它確保系統(tǒng)實(shí)現(xiàn)了用戶的預(yù)期目標(biāo)?;貧w測(cè)試的目的是確保在系統(tǒng)的功能加強(qiáng)或修復(fù)了某個(gè)漏洞后,其他功能也可以正常運(yùn)行而不受系統(tǒng)變化的影響?;貧w測(cè)試是

溫馨提示

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

評(píng)論

0/150

提交評(píng)論