第七章-计算机系统安全(缓冲区溢出)要点课件.ppt

上传人:小飞机 文档编号:4094340 上传时间:2023-04-03 格式:PPT 页数:65 大小:670.50KB
返回 下载 相关 举报
第七章-计算机系统安全(缓冲区溢出)要点课件.ppt_第1页
第1页 / 共65页
第七章-计算机系统安全(缓冲区溢出)要点课件.ppt_第2页
第2页 / 共65页
第七章-计算机系统安全(缓冲区溢出)要点课件.ppt_第3页
第3页 / 共65页
第七章-计算机系统安全(缓冲区溢出)要点课件.ppt_第4页
第4页 / 共65页
第七章-计算机系统安全(缓冲区溢出)要点课件.ppt_第5页
第5页 / 共65页
点击查看更多>>
资源描述

《第七章-计算机系统安全(缓冲区溢出)要点课件.ppt》由会员分享,可在线阅读,更多相关《第七章-计算机系统安全(缓冲区溢出)要点课件.ppt(65页珍藏版)》请在三一办公上搜索。

1、2023/4/3,网络安全Network Security,2023/4/3,第7章 计算机系统安全(缓冲区溢出),缓冲区溢出概述,缓冲区溢出攻击的原理,缓冲区溢出攻击的防御技术,2023/4/3,第7章 计算机系统安全(缓冲区溢出),缓冲区溢出概述,缓冲区溢出攻击的原理,缓冲区溢出攻击的防御技术,2023/4/3,缓冲溢出概述,1.缓冲区的定义连续的一段存储空间。2.缓冲区溢出的定义指写入缓冲区的数据量超过该缓冲区能容纳的最大限度,造成溢出的数据改写了与该缓冲区相邻的原始数据的情形。Buffer overflow is the result of writing more data into

2、 a buffer than the buffer can hold.,2023/4/3,Example,Consider the following code,int main(void)char buffer4;strcpy(buffer,“AAA”);,AAA0,2023/4/3,Example(contd.),Now we input 4+4+3 As instead of 4 As.,int main(void)char buffer4;strcpy(buffer,“”);,AAA,AAAAAAAAAAA,mainstackframe,previousstack frame,buff

3、er4,Higher addresses,Lower addresses,?,2023/4/3,缓冲溢出概述(续),3.缓冲区溢出的危害利用缓冲区溢出实现在本地或者远程系统上实现任意执行代码的目的,从而进一步达到对被攻击系统的完全掌控;利用缓冲区溢出进行DoS(Denial of Service)攻击;利用缓冲区溢出破坏关键数据,使系统的稳定性和有效性受到不同程度的影响;实现蠕虫程序1988 Robert T.Morris蠕虫利用UNIX 系统中In,the Morris Internet worm exploited buffer overflow vulnerability in fing

4、erd server program on UNIX systems.曾在2001年造成大约26亿美元损失的Code Red蠕虫及其变体就是利用了Microsoft IIS中的缓冲区溢出进行攻击 2002年的Sapphire蠕虫和2004年的Witty蠕虫也都利用了缓冲区溢出进行攻击。In 2004,the Witty worm takes advantage of a buffer overflow flaw in several Internet Security Systems(ISS)products.,2023/4/3,Source from CERT(Computer Emerge

5、ncy Response Team)CERT Advisories,http:/www.cert.org/advisories/,缓冲区溢出相关的软件安全隐患数目占整个软件安全隐患数目的比例,2023/4/3,缓冲溢出概述(续),4.造成缓冲区溢出的根本原因代码在操作缓冲区时,没有有效地对缓冲区边界进行检查,使得写入缓冲区的数据量超过缓冲区能够容纳的范围,从而导致溢出的数据改写了与该缓冲区相邻存储单元的内容。C and C+are the most common languages to create buffer overflows.C语言中许多字符串处理函数如:Strcpy、Strcat、

6、Gets、Sprintf等都没有对数组越界加以检测和限制。,2023/4/3,缓冲溢出概述(续),Microsoft Windows,Linux/Unix,Apple Macintosh等主流操作系统无一例外存在缓冲区溢出问题。存在缓冲区溢出问题的应用程序也广泛存在,涉及数据库系统例如Microsoft SQL Server 2000,Oracle9i,网络服务(Microsoft IIS),网络协议实现(例如OpenSSL),多媒体软件(Apple QuickTime)等等,2023/4/3,缓冲溢出概述(续),缓冲区溢出可以成为攻击者实现攻击目标的手段,但是单纯地溢出缓冲区并不能达到攻击的

7、目的。在绝大多数情况下,一旦程序中发生缓冲区溢出,系统会立即中止程序并报告“fault segment”。例如缓冲区溢出,将使返回地址改写为一个非法的、不存在的地址,从而出现core dump错误,不能达到攻击目的。只有对缓冲区溢出“适当地”加以利用,攻击者才能通过其实现攻击目标。,2023/4/3,第7章 计算机系统安全(缓冲区溢出),缓冲区溢出概述,缓冲区溢出攻击的原理,缓冲区溢出攻击的防御技术,2023/4/3,缓冲溢出攻击的原理,1.缓冲区溢出攻击模式,Attacked System,溢出缓冲区,重定向到攻击程序,任意地执行程序,执行攻击程序,Attacker,注入恶意数据,获得控制权

8、,找到可利用的缓冲区溢出隐患,恶意数据可以通过命令行参数、环境变量、输入文件或者网络数据注入,2023/4/3,缓冲溢出攻击的原理(续),2.缓冲区溢出可能发生的位置预备知识点进程在内存中的布局,2023/4/3,缓冲溢出攻击的原理(续),代码段/文本段用于放置程序的可执行代码(机器码)。数据段用于放置已初始化的全局变量和已初始化的局部静态变量。BSS(Block Started by Symbol)段用于放置未初始化的全局变量和未初始化的局部静态变量。堆用于动态分配内存。堆栈段用于存放函数的参数,返回地址,调用函数的栈基址以及局部非静态变量。进程的环境变量和参数,2023/4/3,缓冲溢出攻

9、击的原理(续),2.缓冲区溢出可能发生的位置(续)堆栈(stack)堆(heap)数据段(data)BSS段,2023/4/3,缓冲溢出攻击的原理(续),2.缓冲区溢出可能发生的位置(续)堆栈(stack)堆(heap)数据段(data)BSS段,2023/4/3,被调函数堆栈布局,堆栈采用后进先出(LIFO)的方式管理数据,这种方式是实现函数嵌套调用的关键。,Previous stack frames,Function arguments,Return address,Previous frame pointer,Local variables,High address,Low addres

10、s,从右到左的顺序,指令寄存器(EIP),基址寄存器(EBP),局部非静态变量,2023/4/3,缓冲溢出攻击的原理(续),基于堆栈的缓冲区溢出,void function(char*str)char buffer4;strcpy(buffer,str);void main(int argc,char*argv)char large_string8;int i;for(i=0;i8;i+)large_bufferi=Afunction(large_string);,2023/4/3,Example(contd.),Large_string,上一个栈帧地址,返回地址,argv,内存低端,内存高端

11、,argc,void main(int argc,char*argv),i,2023/4/3,缓冲溢出攻击的原理(续),基于堆栈的缓冲区溢出,void function(char*str)char buffer4;strcpy(buffer,str);void main(int argc,char*argv)char large_string8;int i;for(i=0;i8;i+)large_bufferi=Afunction(large_string);,2023/4/3,Example(contd.),Large_string,上一个栈帧地址,返回地址,argv,内存低端,内存高端,a

12、rgc,i,*str,返回地址,main函数的栈帧地址,buffer,function函数被调用,调用strcpy之前,void function(char*str),2023/4/3,Example(contd.),Large_string,上一个栈帧地址,返回地址,argv,内存低端,内存高端,argc,i,*str,返回地址,AAAA,AAAA,function函数被调用,调用strcpy之后,void function(char*str),2023/4/3,缓冲溢出攻击的原理(续),基于堆栈的缓冲区溢出的潜在危害改写返回地址改写调用函数栈的栈帧地址,2023/4/3,缓冲溢出攻击的原理

13、(续),基于堆栈的缓冲区溢出的潜在危害(续)改写函数指针改写虚函数指针 改写异常处理指针改写数据指针,void BadCode(char*string)void(*p)()=.;char buff100;strcpy(buff,string);p();,2023/4/3,缓冲溢出攻击的原理(续),2.缓冲区溢出可能发生的位置(续)堆栈(stack)堆(heap)数据段(data)BSS段,2023/4/3,缓冲溢出攻击的原理(续),基于堆的缓冲区溢出Heap is a contiguous memory used to dynamically allocate space where the

14、size will be known only during the execution of the code.在Linux中,堆空间按照Doug Lea算法实现动态分配。在C程序中,标准库函数malloc()/free()用于从堆中动态申请/释放块;对于C+程序,相应函数为new/delete。,2023/4/3,缓冲溢出攻击的原理(续),基于堆的缓冲区溢出(续),void main(int argc,char*argv)char*buf1=(char*)malloc(16);char*buf2=(char*)malloc(16);strcpy(buf1,”AAAAAAAAAAAAAAA”

15、);strcpy(buf2,argv1);,2023/4/3,基于堆的缓冲区溢出,正常输入 Prompt:BB.BBB(total 15 Bs)产生溢出的输入Prompt:BB.BBB(total 40 Bs),(a)heap layout without overflow,2023/4/3,基于堆的缓冲区溢出攻击举例,1996年BSDI crontab被发现存在基于堆的缓冲区溢出隐患,攻击者可以通过输入一个长文件名溢出在堆上的缓冲区,溢出数据改写的区域是保存有用户名、密码、uid,gid等信息的区域。,2023/4/3,缓冲溢出攻击的原理(续),2.缓冲区溢出可能发生的位置(续)堆栈(sta

16、ck)堆(heap)数据段(data)BSS段,2023/4/3,缓冲溢出攻击的原理(续),基于数据段的缓冲区溢出,void Overflow_Data(char*input)static char buf4=”CCCC”;int i;for(i=0;i 12;i+)bufi=A;,2023/4/3,缓冲溢出攻击的原理(续),2.缓冲区溢出可能发生的位置(续)堆栈(stack)堆(heap)数据段(data)BSS段,2023/4/3,缓冲溢出攻击的原理(续),基于BSS段的缓冲区溢出,void Overflow_BSS(char*input)static char buf4;int i;fo

17、r(i=0;i 12;i+)bufi=A;,2023/4/3,缓冲溢出攻击的原理(续),3.常见的溢出缓冲区的途径利用C的标准函数库常见的有strcpy、strcat、sprintf、gets“Mudge”.How to Write Buffer Overflows.http:/Paul A.Henry MCP+I et al.Buffer Overflow Attacks.CyberGuard Corp.C.Cowan et al.Buffer overflows:Attacks and defenses for the vulnerability of the decade.Proceed

18、ings of the DARPA Information Survivability Conference and Expo,1999.,2023/4/3,缓冲溢出攻击的原理(续),利用数组下标的越界操作Off-by-one缓冲区溢出利用数组的最大下标与数组长度的差异产生。例如1998年10月BugTraq公布出Linux libc中的realpath函数存在single-byte缓冲区溢出隐患,攻击者可以利用它获得root权限。参见O.Kirch.The poisoned nul byte,post to the bugtraq mailing list,October 1998.2000

19、年12月OpenBSD安全组公布ftpd存在类似安全隐患。参见OpenBSD developers,single-byte buffer overflow vulnerability in ftpd,December 2000.,void BadCode(char*str)char buffer512;for(i=0;i=512;i+)bufferi=stri;,2023/4/3,缓冲溢出攻击的原理(续),利用有符号整数与无符号整数的转换,void BadCode(char*input)short len;char buf64;len=strlen(input);if(len MAX_BUF)

20、strcpy(buf,input);,2023/4/3,缓冲溢出攻击的原理(续),4.恶意代码(注入),例如为实现:“exec(/bin/sh)”,char shellcode=”xebx1fx5ex89x76x08x31xc0”x88x46x07x89x46x0cxb0 x0b”x89xf3x8dx4ex08x8dx56x0c”xcdx80 x31xdbx89xd8x40 xcd”x80 xe8xdcxffxffxff/bin/sh”;char large_string 128;void main()char buffer 96;int i;long*long_ptr;long_ptr=(l

21、ong*)large_string;for(i=0;i 32;i+)*(long_ptr+i)=(int)buffer;for(i=0;istrlen(shellcode);i+)large_string i=shellcode i;strcpy(buffer,large_string);,2023/4/3,The secret of the shellcode,char shellcode=/*main:*/xebx1f/*jmp$0 x1f or jmp callz*/*start:*/x5e/*popl%esi*/x89x76x08/*movl%esi,$0 x08(%esi)*/x31

22、xc0/*xorl%eax,%eax*/x88x46x07/*movb%al,0 x07(%esi)*/x89x46x0c/*movl%eax,$0 x0c(%esi)*/xb0 x0b/*movb$0 x0b,%al*/x89xf3/*movl%esi,%ebx*/x8dx4ex08/*leal 0 x08(%esi),%ecx*/x8dx56x0c/*leal 0 x0c(%esi),%edx*/xcdx80/*int$0 x80*/x31xdb/*xorl%ebx,%ebx*/x89xd8/*movl%ebx,%eax*/x40/*inc%eax*/xcdx80/*int$0 x80*/

23、*callz:*/xe8xdcxffxffxff/*call start*/*DATA*/bin/sh;,1,3,2,2023/4/3,基于堆栈的缓冲区溢出攻击举例,char shellcode=”xebx1fx5ex89x76x08x31xc0”x88x46x07x89x46x0cxb0 x0b”x89xf3x8dx4ex08x8dx56x0c”xcdx80 x31xdbx89xd8x40 xcd”x80 xe8xdcxffxffxff/bin/sh”;char large_string 128;void main()char buffer 96;int i;long*long_ptr;lo

24、ng_ptr=(long*)large_string;for(i=0;i 32;i+)*(long_ptr+i)=(int)buffer;for(i=0;istrlen(shellcode);i+)large_string i=shellcode i;strcpy(buffer,large_string);,for(i=0;istrlen(shellcode);i+)large_string i=shellcode i;strcpy(buffer,large_string);,2023/4/3,溢出前后堆栈内容对比,Higher addresses,Lower addresses,堆栈溢出前,

25、堆栈溢出后,2023/4/3,缓冲溢出攻击的原理(续),4.恶意代码(已在内存)利用已在内存中的代码作为攻击代码,但是需要提供调用这些现成代码产生攻击的参数。由于libc中的库函数常被用作现成的攻击代码,所以有时把这种攻击方式称为return-to-libc。可参见Nergal.The advanced return-into-lib(c)exploits:Pax case study.Phrack,Dec.2001.,2023/4/3,第7章 计算机系统安全(缓冲区溢出),缓冲区溢出概述,缓冲区溢出攻击的原理,缓冲区溢出攻击的防御技术,2023/4/3,缓冲区溢出攻击的防御技术,基于软件的防

26、御技术类型安全的编程语言相对安全的函数库修改的编译器内核补丁静态分析方法动态检测方法基于硬件的防御技术处理器结构方面的改进,2023/4/3,缓冲区溢出攻击的防御技术,基于软件的防御技术类型安全的编程语言相对安全的函数库修改的编译器内核补丁静态分析方法动态检测方法基于硬件的防御技术处理器结构方面的改进,2023/4/3,基于软件的防御技术,安全的编程语言Java,C#,Visual Basic,Pascal,Ada,Lisp,ML属于类型安全的编程语言。可参考Misha Ziser et al.Testing Static Analysis Tools Using Exploitable Bu

27、ffer Overflows From Open Source Code.Proceedings of the 12th ACM SIGSOFT twelfth international symposium on Foundations of software engineering,2004.缺点性能代价类型安全的编程语言自身的实现可能存在缓冲区溢出问题。,2023/4/3,缓冲区溢出攻击的防御技术,基于软件的防御技术类型安全的编程语言相对安全的函数库修改的编译器内核补丁静态分析方法动态检测方法基于硬件的防御技术处理器结构方面的改进,2023/4/3,基于软件的防御技术(续),相对安全的标

28、准库函数例如在使用C的标准库函数时,做如下替换strcpy-strncpystrcat-strncatgets-fgets缺点使用不当仍然会造成缓冲区溢出问题。,例如Microsoft Visual Studio提供的C的标准函数库strsafe;,2023/4/3,缓冲区溢出攻击的防御技术,基于软件的防御技术类型安全的编程语言相对安全的函数库修改的编译器内核补丁静态分析方法动态检测方法基于硬件的防御技术处理器结构方面的改进,2023/4/3,基于软件的防御技术(续),修改的编译器增强边界检查能力的C/C+编译器例如针对GNU C编译器扩展数组和指针的边界检查。Windows Visual C

29、+.NET的GS 选项也提供动态检测缓冲区溢出的能力。返回地址的完整性保护将堆栈上的返回地址备份到另一个内存空间;在函数执行返回指令前,将备份的返回地址重新写回堆栈。许多高性能超标量微处理器具有一个返回地址栈,用于指令分支预测。返回地址栈保存了返回地址的备份,可用于返回地址的完整性保护 缺点性能代价检查方法仍不完善,2023/4/3,缓冲区溢出攻击的防御技术,基于软件的防御技术类型安全的编程语言相对安全的函数库修改的编译器内核补丁静态分析方法动态检测方法基于硬件的防御技术处理器结构方面的改进,2023/4/3,基于软件的防御技术(续),内核补丁将堆栈标志为不可执行来阻止缓冲区溢出攻击;将堆或者

30、数据段标志为不可执行。例如Linux的内核补丁Openwall、RSX、kNoX、ExecShield和PaX等实现了不可执行堆栈,并且RSX、kNoX、ExecShield、PaX还支持不可执行堆。另外,为了抵制return-to-libc这类的攻击,PaX增加了一个特性,将函数库映射到随机的内存空间缺点:对于一些需要堆栈/堆/数据段为可执行状态的应用程序不合适;需要重新编译原来的程序,如果没有源代码,就不能获得这种保护。,2023/4/3,缓冲区溢出攻击的防御技术,基于软件的防御技术类型安全的编程语言相对安全的函数库修改的编译器内核补丁静态分析方法动态检测方法基于硬件的防御技术处理器结构方

31、面的改进,2023/4/3,基于软件的防御技术(续),静态分析方法字典检查法遍历源程序查找其中使用到的不安全的库函数和系统调用。例如静态分析工具ITS4、RATS(Rough Auditing Tool for Security)等。其中RATS提供对C,C+,Perl,PHP以及Python语言的扫描检测。缺点:误报率很高,需要配合大量的人工检查工作。,2023/4/3,基于软件的防御技术(续),静态分析方法(续)程序注解法 包括缓冲区的大小,指针是否可以为空,输入的有效约定等等。例如静态分析工具LCLINT、SPLINT(Secure Programming Lint)。缺点:依赖注释的质

32、量,2023/4/3,基于软件的防御技术(续),静态分析方法(续)整数分析法将字符串形式化为一对整数,表明字符串长度(以字节数为单位)以及目前已经使用缓冲区的字节数。通过这样的形式化处理,将缓冲区溢出的检测转化为整数计算。例如静态分析工具BOON(Buffer Overrun detectiON)。缺点:仅检查C中进行字符串操作的标准库函数。检查范围很有限。,2023/4/3,基于软件的防御技术(续),静态分析方法(续)控制流程分析法将源程序中的每个函数抽象成语法树,然后再把语法树转换为调用图/控制流程图来检查函数参数和缓冲区的范围。例如静态分析工具ARCHER(ARray CHeckER)、

33、UNO、PREfast和Coverity等。缺点:对于运行时才会显露的问题无法进行分析;存在误报的可能。,2023/4/3,缓冲区溢出攻击的防御技术,基于软件的防御技术类型安全的编程语言相对安全的函数库修改的编译器内核补丁静态分析方法动态检测方法基于硬件的防御技术处理器结构方面的改进,2023/4/3,基于软件的防御技术(续),动态检测方法 Canary-based 检测方法将canary(一个检测值)放在缓冲区和需要保护的数据之间,并且假设如果从缓冲区溢出的数据改写了被保护数据,检测值也必定被改写。例如动态检测工具StackGuard、StackGhost、ProPolice、PointGu

34、ard等。缺点:多少工具通过修改编译器实现检测功能,需要重新编译程序;这种方法无法检测能过绕过检测值的缓冲区溢出攻击。,2023/4/3,基于软件的防御技术(续),动态检测方法(续)输入检测方法向运行程序提供不同的输入,检查在这些输入条件下程序是否出现缓冲区溢出问题。不仅能检测缓冲区溢出问题,还可以检测其它内存越界问题。采用输入检测方法的工具有Purify、Fuzz和FIST(Fault Injection Security Tool)。缺点:系统性能明显降低。输入检测方法的检测效果取决于输入能否激发缓冲区溢出等安全问题的出现。,2023/4/3,缓冲区溢出攻击的防御技术,基于软件的防御技术类

35、型安全的编程语言相对安全的函数库修改的编译器内核补丁静态分析方法动态检测方法基于硬件的防御技术处理器结构方面的改进,2023/4/3,基于硬件的防御技术,64位处理器的支持 Intel/AMD 64位处理器引入称为NX(No Execute)或者AVP(Advanced Virus Protection)的新特性,将以前的CPU合为一个状态存在的“数据页只读”和“数据页可执行”分成两个独立的状态。ELF64 SystemV ABI通过寄存器传递函数参数而不再放置在堆栈上,使得64位处理器不仅可以抵制需要注入攻击代码的缓冲区溢出攻击还可以抵制return-to-libc这类的攻击。缺点:无法抵制

36、“borrowed code chunks”这类的攻击。可参见Sebastian Krahmer.X86-64 buffer overflow exploits and the borrowed code chunks exploitation technique.http:/www.suse.de/krahmer/no-nx.pdf,Sep.2005.,2023/4/3,缓冲区溢出攻击防御技术展望,Software-based solutions in conjunction with existing hardware-based techniques.Practical security

37、 polices to implement safe software engineering.Comprehensive tools or methodologies should be available to help developers design and implement software in a security conscious manner.,2023/4/3,教材与参考书,教材:李毅超 曹跃,网络与系统攻击技术 电子科大出版社 2007 周世杰 陈伟 钟婷,网络与系统防御技术 电子科大出版社 2007 参考书阙喜戎 等 编著,信息安全原理及应用,清华大学出版社Chr

38、istopher M.King,Curitis E.Dalton,T.Ertem Osmanoglu(常晓波等译).安全体系结构的设计、部署与操作,清华大学出版社,2003(Christopher M.King,et al,Security Architecture,design,deployment&Operations)William Stallings,密码编码学与网络安全原理与实践(第三版),电子工业出版社,2004Stephen Northcutt,深入剖析网络边界安全,机械工业出版社,2003冯登国,计算机通信网络安全,2001Bruce Schneier,Applied Cryptography,Protocols,algorithms,and source code in C(2nd Edition)(应用密码学 协议、算法与C源程序,吴世忠、祝世雄、张文政等译)蔡皖东,网络与信息安全,西北工业大学出版社,2004,2023/4/3,Any Question?,Q&A,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号