对错误,漏洞和exploits的说明(3)
这些错误如何成为漏洞的?
一个漏洞就是对目标的保护方面的一个弱点。目标可以是连到一个完整网络的一台计算机的任何部分。我不会说明这儿可能的漏洞的所有不同,因为那几乎不可能,但是我将设法指出什么是漏洞,以及漏洞如何产生的。
按照早期的规定,最普遍的会成为漏洞的编程错误是缓冲区溢出。假设一个基于栈的缓冲区溢出,缓冲区被放置在栈中。栈可以被看成是你的处理器存储数据在里面并能与其共同工作的一个临时工作区。现在,当你溢出一个放置在栈里的缓冲区时,你能够写数据到已分配空间的缓冲区之外,因此可以写其它数据到栈中。而其它数据可以是调用函数的返回地址。假设调用函数的返回地址是12345678,并且返回地址直接存储在缓冲区后面的栈中,那么栈看上去可能会像这样:
XXXXXXXXXX12345678
XXXXXXXXXX是将包含我们的输入的缓冲区。如果我们放一些比缓冲区大小要少的数据在里面,没有任何奇怪的事会发生,但是当我们放12个'A'在这只能承载10个字符的缓冲区中时,多余的2个A就会覆盖掉返回地址部分。从而使返回地址变成一个无效地址,然后函数无法返回,程序就崩溃了。
如果这个程序是一个服务端应用程序,有人能放12个A使程序崩溃,并且导致其他所有用户都无法访问。这就成为了一个拒绝服务攻击的例子。既然这样,这个错误就有了拒绝服务漏洞。
如果我们用与上面同样的例子,但换一个更大的缓冲区,那么溢出缓冲区也就意味着更多的数据在一个实际溢出发生之前必须被放进去,可是当那发生时,我们可以写一些计算机代码(汇编指令),将其作为数据的一部分而放在缓冲区中使用。我们通过覆盖它来改变返回地址,以指向我们溢出的缓冲区后面,程序将会试图执行我们的缓冲区。这时,缓冲区包含了我们放进去的代码,程序并不会崩溃,而是转去执行我们的代码。由于那些代码可以是开启一个shell(命令解释程序)的一小段代码,并且会在那台计算机上监听一个特殊端口,因此这种类型的代码经常被称作shellcode。
随着这些代码的运行,有人便能够连接到那个特殊的端口上,并能执行远程命令,同时获得与在远程计算机开启这个存在漏洞的应用程序的用户所拥有的相同访问权的控制权。
对于配置错误,如果我们看看防火墙的例子,漏洞就更加明显。假如那个防火墙能经由telnet远程配置,那么仅仅不允许访问防火墙的80端口会给网络管理员一个安全上的错误认识,攻击者仍旧能够通过连接到防火墙的23端口进行访问而配置它。
然而,自从消费者开始要求他们所购买的产品应具有不同配置选项以后,厂商就开始着手研发高级别的可配置的软件和设备。这可能让一个设备的配置变得专业化而导致错误很容易发生。类似的设备的配置是如此的复杂,而漏洞能被网络管理员看到,因此允许一个潜在的攻击者访问到网络或系统中他本不应该访问到的部分,所以一个简单的配置错误会导致网络和系统中存在一个潜在的漏洞。
内容版权声明:除非注明,否则皆为本站原创文章。