死亡之Ping
死亡之Ping
最简单的基于IP的攻击可能要数著名的死亡之ping(英文:ping of 死亡, POD),这种攻击主要是由于单个包的长度超过了IP协议规范所规定的包长度。产生这样的包很容易,事实上,许多操作系统都提供了称为ping的网络工具。在为Windows操作系统中开一个DOS窗口,输入ping -l 65500 目标ip -t (65500 表示数据长度上限,-t 表示不停地ping目标地址)就可达到该目的。unix系统也有类似情况。早期的电脑大部分无法处理大于IPv4最大封包大小(65,535字节)的ping封包,因此发送这样大小的ping可以令目标电脑崩溃。在1997-1998年后,几乎所有的现代系统都已经修正了这个问题。
工作
死亡之ping是如何工作的呢,首先是因为以太网长度有限,IP包片段被分片。当一个IP包的长度超过以太网帧的最大尺寸(以太网头部和尾部除外)时,包就会被分片,作为多个帧来发送。接收端的机器提取各个分片,并重组为一个完整的IP包。在正常情况下,IP头包含整个IP包的长度。当一个IP包被分片以后,头只包含各个分片的长度。分片并不包含整个IP包的长度信息,因此IP包一旦被分片,重组后的整个IP包的总长度只有在所有分片都接受完毕之后才能确定。
在IP协议规范中规定了一个IP包的最大尺寸,而大多数的包处理程序又假设包的长度超过这个最大尺寸这种情况是不会出现的。因此,包的重组代码所分配的内存区域也最大不超过这个最大尺寸。这样,超大的包一旦出现,包当中的额外数据就会被写入其他正常区域。这很容易导致系统进入非稳定状态,是一种典型的CPU缓存溢出(Buffer Overflow)攻击。在防火墙一级对这种攻击进行检测是相当难的,因为每个分片包看起来都很正常。
由于使用ping工具很容易完成这种攻击,以至于它也成了这种攻击的首选武器,这也是这种攻击名字的由来。当然,还有很多程序都可以做到这一点,因此仅仅阻塞ping的使用并不能完全解决这个漏洞。预防死亡之ping的最好方法是对操作系统打补丁,使内核将不再对超过规定长度的包进行重组。
在早期TCP/IP的实现中,这种攻击方式能影响到众多系统,如unixLinux麦金塔、Windows、打印机、路由器等。这是一种专门针对一种弱点的非常简单的攻击。一般而言,在ICMP规范中,ICMP回送消息在数据包的数据部分只有65,536个字节。送出超过65,536字节ping封包对IP通讯协定而言不是合法的用法,若送出ping封包时分成多个片段,目标电脑必须不断重组封包,期间可能引发缓冲区溢位,而导致系统崩溃。
现象
这个问题出现在早期的Windows内,不过在接近Windows Me的时候已经见不到了。不仅已经ping不到65500以上,各大网站限制数据包传入大小来防止有人用多台电脑同时ping一个ip导致瘫痪,一般大型网站把数据包压到3000以下;而服务器或者dns一般把数据包压到10000以下来防止这个问题,超过数值会提示连接超时。
参考资料
目录
概述
工作
现象
参考资料