缓存溢出
缓存溢出(Buffer overflow),是指在存在缓存溢出安全漏洞的计算机中,攻击者可以用超出常规长度的字符数来填满一个域,通常是内存区地址。在某些情况下,这些过量的字符能够作为“可执行”代码来运行。从而使得攻击者可以不受安全措施的约束来控制被攻击的计算机。
缓存溢出(或译为缓冲溢出)为黑客最为常用的攻击手段之一,蠕虫病毒对操作系统高危漏洞的溢出高速与大规模传播均是利用此技术。
缓存溢出攻击从理论上来讲可以用于攻击任何有缺陷不完美的程序,包括对杀毒软件、防火墙等安全产品的攻击以及对银行程序的攻击。
缓存溢出黑客们的惯用伎俩
在unix系统中,通过缓存溢出来获得root权限是目前使用得相当普遍的一种黑客技术。事实上这是一个黑客在系统本地已经拥有了一个基本账号后的首选攻击方式。它也被广泛应用于远程攻击,通过对daemon进程的堆栈溢出来实现远程获得rootshell的技术,已经有很多实例。
在windows系统中,同样存在着缓存溢出的问题。而且,随着internet的普及,win系列平台上的internet服务程序越来越多,低水平的win程序就成为你系统上的致命伤,因为它们同样会发生远程堆栈溢出。而且,由于win系统使用者和管理者普遍缺乏安全防范意识,一台win系统上的堆栈溢出,如果被恶意利用,将导致整个机器被黑客所控制,进而可能导致整个局域网落入黑客之手。本月初在微软的流行产品iis server4.0中就被发现存在一种被称为“非法htr请求”的缺陷。据微软称,此缺陷在特定情况下会导致任意代码都可以在服务器端运行。但用发现这一漏洞的internet安全公司eeye的ceo firas bushnaq的话说,这只是冰山一角而已。bushnaq说,黑客可以利用这一漏洞对iis服务器进行完全的控制,而实际上许多电子商务站点恰恰是基于这套系统的。
黑客如何搅乱缓存
下面让我们了解一下缓存溢出的原理。众说周知,c语言不进行数组的边界检查,在许多运用c语言实现的应用程序中,都假定缓冲区的大小是足够的,其容量肯定大于要拷贝的字符串的长度。然而事实并不总是这样,当程序出错或者恶意的用户故意送入一过长的字符串时,便有许多意想不到的事情发生,超过的那部分字符将会覆盖与数组相邻的其他变量的空间,使变量出现不可预料的值。如果碰巧,数组与子程序的返回地址邻近时,便有可能由于超出的一部分字符串覆盖了子程序的返回地址,而使得子程序执行完毕返回时转向了另一个无法预料的地址,使程序的执行流程发生了错误。甚至,由于应用程序访问了不在进程地址空间范围的地址,而使进程发生违例的故障。这种错误其实是编程中常犯的。
一个利用缓冲区溢出而企图破坏或非法进入系统的程序通常由如下几个部分组成:
1. 准备一段可以调出一个shell的机器码形成的字符串,在下面我们将它称为shellcode。
2. 申请一个缓冲区,并将机器码填入缓冲区的低端。
3. 估算机器码在堆栈中可能的起始位置,并将这个位置写入缓冲区的高端。这个起始的位置也是我们执行这一程序时需要反复调用的一个参数。
4. 将这个缓冲区作为系统一个有缓冲区溢出错误程序的入口参数,并执行这个有错误的程序。
通过以上的分析和实例,我们可以看到缓存溢出对系统的安全带来的巨大威胁。在unix系统中,使用一类精心编写的程序,利用suid程序中存在的这种错误可以很轻易地取得系统的超级用户的权限。当服务程序在端口提供服务时,缓冲区溢出程序可以轻易地将这个服务关闭,使得系统的服务在一定的时间内瘫痪,严重的可能使系统立刻宕机,从而变成一种拒绝服务的攻击。这种错误不仅是程序员的错误,系统本身在实现的时候出现的这种错误更多。如今,缓冲区溢出的错误正源源不断地从unix、windows、路由器、网关以及其他的网络设备中被发现,并构成了对系统安全威胁数量最大、程度较大的一类。