在阅读 Internet 协议时,我发现自己正在阅读 ping of Death 攻击:吸引我好奇的是这些攻击永远有效!
我的意思是,为什么没有立即在计算机系统上实现 IPv4 数据包丢弃(对于大于 56 字节 + 标头的数据包)?主机是否有理由接收总长度超过 84 字节的数据包?
在阅读 Internet 协议时,我发现自己正在阅读 ping of Death 攻击:吸引我好奇的是这些攻击永远有效!
我的意思是,为什么没有立即在计算机系统上实现 IPv4 数据包丢弃(对于大于 56 字节 + 标头的数据包)?主机是否有理由接收总长度超过 84 字节的数据包?
没有实现丢包的原因有很多。一个例子是有一种称为巨型帧的技术,它允许高达 9000 字节的有效负载。这些主要在需要移动大量数据并且不需要标题重复性质的 LAN 上得到支持。
还值得注意的是,大多数数据包大于 56 字节 + 标头。标准以太网帧大小为 1500 字节。如果您仅指 ICMP 数据包,则可以实施这样的限制,但为什么呢?有需要更大的 ICMP 数据包的有效用例。拥有一个正确处理非标准数据包的网络堆栈通常比拥有一个任意限制功能的网络堆栈更可取。
主机是否有理由接收总长度超过 84 字节的数据包?
这里涉及多个层次,这是问题的第一部分。ICMP 的 84 字节用于 ping 消息头(有效负载可以更大......您可以在有效负载字段中放置任何您想要的内容)意味着数据包必须由系统通过有线协议接收,重新组装成更大的如果有碎片,IP 协议上的数据包,传递到 ICMP 层,然后将检查协议类型,只有在所有这些之后,你才能检查它的长度。
在编写代码分配内存时,有很多地方可能会出错。例如,由于在一个有效的 IPv4 数据包中不能获得超过 64k 的数据,您可以分配一个 64k 的内存缓冲区。那么当你组装碎片时,如果你没有检查碎片的总和是否小于分配的内存大小,你可能会遇到麻烦。一个特定的失败是相信最后一个可能片段的长度标头在整个重组数据包中始终有效,即使最大偏移数据包不允许在不破坏事物的情况下达到完整大小。
因此,您不能在不重新组装的情况下立即丢弃大多数数据包。您可以在最后一个数据包大小 ( ) 上添加匹配检查if offset > x and offset * 8 + len(y) > 64k,但这需要检查数据包中的额外位,这实际上只适用于防火墙和主机级别。
互联网之所以有效,是因为每个人都同意遵循 TCP/IP 的标准。TCP/IP 允许 Ping 大于 56 字节+标头的数据包,并且简单地丢弃它们,因为您的实现无法处理它们会破坏 TCP/IP。
Ping Of Death 的问题不在于 TCP/IP 的设计,而在于实现问题。您不会更改有效 IP 数据包的规则,因为一个供应商没有正确编写他们的代码。
至于大 ping 数据包的有效使用,它可以用于追查其他网络问题。一个简单的示例是通过将数据包大小设置得越来越小,直到它不被分段来确定您和另一台主机之间的 MTU。
这里已经有几个很好的答案。
我想补充一点,数据包过滤器、防火墙和 IPS 可以处理这种事情。这些类型的设备经常被配置为无视 TCP/IP 的正常规则,以便能够丢弃正确但恶意的流量。示例包括大型 ICMP 数据包、分段的 TCP 数据包、精心设计的数据包标头,以及许多其他格式正确但对于所有经常出现错误的 TCP/IP 或应用程序协议栈的问题。
像这样的规则不能被纳入所有设备,因为它会使 TCP/IP 通常无法正常工作,原因是其他答案已经描述:1)在诊断中需要专门的数据包大小 2)需要大/巨型数据包以提高效率(例如:具有较低开销的 SAN 吞吐量)