缓冲区溢出历史回顾

作者:fannywei

在国外,早在80年代初就有人开始讨论溢出攻击,1989年,Spafford提交了一份关于运行在VAX机上的BSD版UNIX的fingerd的缓冲区溢出程序的技术细节的分析报告,这引起了一部分安全人士对这个研究领域的重视,但毕竟仅有少数人从事研究工作,对于公众而言,没有太多具有学术价值的可用资料。来自L0pht heavy Industries的Mudge写了一篇如何利用BSDI上的libc/syslog缓冲区溢出漏洞的文章。然而真正有教育意义的第一篇文章诞生在1996年,Aleph One在Underground发表的论文详细描述了Linux系统中栈的结构和如何利用基于栈的缓冲区溢出。Aleph One的贡献还在于给出了如何写开一个shell的Exploit的方法,并给这段代码赋予shellcode的名称,而这个称呼沿用至今,虽然已经部分失去了它原有的含义。我们现在对这样的方法耳熟能详--编译一段使用系统调用的简单的C程序,通过调试器抽取汇编代码,并根据需要修改这段汇编代码。他所给出的代码可以在x86/Linux,SPARC/Solaris和Sparc/SunOS系统正确的工作。受到Aleph One的文章的启发,Internet上出现了大量的文章讲述如何利用缓冲区溢出和如何写一段所需的Exploit。1997年,Smith综合以前的文章,提供了如何在各种Unix变种中写缓冲区溢出Exploit更详细的指导原则。Smith还收集了各种处理器体系结构下的shellcode,包括Aleph One公布的和AIX和HPUX的。他在文章中还谈到了*nix操作系统的一些安全属性,例如SUID程序,Linux栈结构和功能性等,并对安全编程进行了讨论,附带了一些有问题的函数的列表,并告诉人们如何用一些相比更安全的代码替代它们。1998年来自“Cult of the Dead Cow”的Dildog在Bugtrq邮件列表中以Microsoft Netmeeting为例子详细介绍了如何利用Windows的溢出,这篇文章最大的贡献在于提出了利用栈指针的方法来完成跳转,返回地址固定地指向地址,不论是在出问题的程序中还是在动态链接库中,该固定地址包含了用来利用栈指针完成跳转的汇编指令。Dildog提供的方法避免了由于进程线程的区别而造成栈位置不固定。Dildog还有另外一片经典之作The Tao of Windows Buffer Overflows。集大成者是dark spyrit,在99年Phrack 55上总提出使用系统核心DLL中的指令来完成控制的想法,将Windows下的溢出Exploit推进了实质性的一步。Litchfield在1999年为Windows NT平台创建了一个简单的shellcode。他详细讨论了Windows NT的进程内存和栈结构,以及基于栈的缓冲区溢出,并以rasman.exe作为研究的实例,给出了提升权限创建一个本地shell的汇编代码。1999年w00w00安全小组的Conover写了基于堆的缓冲区溢出的教程,开头写道:“基于Heap/BSS的溢出在当今的应用程序中已经相当普遍,但很少有被报道”。他注意到当时的保护方法,例如非执行栈,不能防止基于堆的溢出。并给出了大量的例子。

有关缓冲区溢出的保护

面临越来越多的来自缓冲区溢出攻击的威胁,1998年1月C. Cowan, C. Pu等人提出了侦测和防止缓冲区溢出发生的自适应技术,引起了多方的关注。5月份,在美国Oakland举行的IEEE安全和密码学术年会上C. Cowan, T. Chen等人展示了Immunix根据自动侦测和预防技术开发的StackGuard系统。后来,Richard Jones和Paul Kelly开发了一个gcc的补丁,用来实现C程序完全的数组边界检查,防范溢出问题。目前对于缓冲区溢出,主要从静态和动态两个角度来保护,静态保护指的是不执行代码,而通过静态分析来发现代码中可能存在的漏洞;动态的缓冲区溢出保护有两个含义,第一个是通过执行代码分析程序的特性,测试是否存在漏洞,还有一个是保护主机上运行的程序来防止来自外部的缓冲区溢出攻击。静态的保护技术包括编译时加入限制条件,返回地址保护,二进制改写技术,基于源码的代码审计等。2002年IEEE在Oakland举办了关于Security和Privacy的讨论会,K. Ashcraft和D.R. Engler做了“Using Programmer Written Compiler Extensions to Catch Security Holes”的报告。ICDCS 2001年会议上T. Chiueh和Fu-hau Hsu提出了RAD保护方法,采用在编译时加入对返回地址的保护机制。U.Shankar,K.Talwar,J.S.Foster,D.Wagner,在文章“Detecting Format String Vulnerabilities with Type Qualifiers”中提出使用类型限定词来检测格式化字符串漏洞。该技术也可用于动态检测中。
动态保护技术包括虚拟路径(VtPath),基于下推自动机的虚拟栈,拦截非安全函数进行缓冲区分析,非执行堆栈等。Libsafe工具是通过拦截所有已知有问题的库函数调用来分析缓冲区溢出的存在性,Libverify使用二进制重写进程内存强制对重要的栈在使用之前进行检测。M.Prasad,T. Chiueh的论文“A Binary Rewriting Defense against Stack based Buffer Overflow Attacks”详细介绍了二进制重写技术在检测中的应用。在 2001年IEEE在Oakland的会议上,D.Wagner和D.Dean所做的“Intrusion Detection via Static Analysis”报告谈到了基于下推自动机的虚拟栈技术。但该技术有个潜在的问题――不可能路径问题。H.H.Feng, O.M.Kolesnikov等在Anomaly Detection Using Call Stack Information中提出了才用虚拟路径方法,通过数次程序的执行记录系统调用之间形成的虚拟路径以此作为程序正常的运行模式,一旦违背了这个路径信息就认为产生了攻击。虽然较好的解决了前面谈到的不可能路径问题,但是又带来了新的问题,如果学习的次数不够,路径信息将会不足以进行充分的判断,可能会带来漏判或者误判。

〉〉我一直想知道,是谁最先发现缓冲区溢出会导致网络机器不安全,这个问题可不可考证?

没有找到这个方面的资料

C程序的缓冲区溢出问题早在70年代初就被认为是C语言数据完整性模型的一个可能的后果。这是因为在初始化、拷贝或移动数据时,C语言并不自动地支持内在的数组边界检查。虽然这提高了语言的执行效率,但其带来的影响及后果却是深远和严重的。

〉〉我一直想知道,是谁最先发现缓冲区溢出会导致网络机器不安全,这个问题可不可考证?

讲到这个问题,就不免多说两句,hack分三个层次,我自己归纳的,也许不恰当:

提出问题,发现问题,解决问题

提出问题的人:第一个层次,比如说第一个发现缓冲区溢出的人,或者提出这个漏洞存在性的问题的人;当然还包括其他漏洞这里只是举个例子。

发现问题的人:第二个层次,比如知道有了缓冲区溢出这个类型的漏洞,从软件中找到这样的漏洞,就是能发现软件存在的问题。

解决问题的人:第三个层次,公布了漏洞能很快写出漏洞exploit,就是解决现实利用的问题。

恕我孤陋,国内目前大多数人恐怕都还停留在第三个层次,而且我看到了他们中某些人的满足状,觉得能写一个exploit很nb,便被称作大虾,很享受这种称呼。有时候写个exploit,就发布二进制版本。。唉,不就一层窗户纸,懒得捅破了。如果你是靠exploit卖钱的,干脆就什么都不要说,安静一点,图利好了。当然一个exploit也有高下之分,能写一个很好的exploit也是很有学问的,在这里也要向推动exploit技术进步的人致敬。

第二个层次的人国内已经屈指可数了。有些牛man在网上是无名氏的,很多人只知道网上那几个名字,你不知道的还多呢。不要把你的无知当个性。

第三个层次的人。。。。。。汗!

本来什么领域都是金字塔形状,所以这没有什么奇怪。希望同行互相勉励,共同进步。

我自己不是什么牛man,所以大家不要对我妄加猜测,偶随便讲两句,不要拿我和这几个层次对号入座。

temporary:关于缓冲区溢出历史,这篇论文应该提一下,Buffer Overflows: Attacks and Defenses for the Vulnerability of the Decade. http://www.immunix.com/pdfs/discex00.pdf

历史可以更早的推到1988年的Morris蠕虫,利用的攻击方法之一就是fingerd的缓冲区溢出。当时还没有建立正规的漏洞新系通告机制。漏洞发现后只有很少的人知道。

国内缓冲区溢出历史的发展可以回溯水木清华当年的讨论,以及后来ipxodi和scz的普及文章。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值