Skip to content

explanation


Billion Laughs attack

Billion Laughs 攻击(十亿笑声攻击)是一种针对 XML 解析器拒绝服务(DoS)攻击。它也被称为 XML 炸弹指数实体扩展攻击

攻击原理

这种攻击利用了 XML 中实体(entity)的嵌套引用特性,通过构造一个看似不大的 XML 文件,但在解析时会急剧膨胀,消耗大量的内存和 CPU 资源,最终导致系统崩溃或无法响应。

具体来说,它通常这样运作:

  1. 定义嵌套实体: 在 XML DTD(文档类型定义)中,定义一系列嵌套的实体。例如:
    xml
    <!DOCTYPE lolz [
      <!ENTITY lol "lol">
      <!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
      <!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
      <!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
      <!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
      <!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
      <!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
      <!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
      <!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
    ]>
    <lolz>&lol9;</lolz>
  2. 指数级膨胀: 在上面的例子中,lol 实体是 "lol" 字符串。lol2 实体引用了 10 次 lol,所以它展开后会变成 10 个 "lol"。lol3 实体引用了 10 次 lol2,所以它展开后会变成 10times10=100 个 "lol"。以此类推,lol9 实体最终会展开成 109(十亿)个 "lol" 字符串。
  3. 资源耗尽: 当 XML 解析器尝试解析并展开 <lolz>&lol9;</lolz> 中的 &lol9; 实体时,它需要为这十亿个字符分配内存。这会导致内存迅速耗尽,CPU 负载飙升,最终使应用程序或服务器崩溃,无法为合法用户提供服务。

如何防御

防御 Billion Laughs 攻击主要有以下几种方法:

  • 禁用 DTD 处理或限制外部实体引用: 如果你的应用程序不需要解析 DTD 或外部实体,最简单有效的方法就是完全禁用它们。大多数 XML 解析库都提供了相应的配置选项。
  • 限制实体扩展深度和大小: 配置 XML 解析器,限制实体扩展的深度(即嵌套层数)和最终扩展后实体的大小。一旦达到这些限制,解析器就应该抛出错误。
  • 使用安全的 XML 解析器: 确保使用的 XML 解析库是最新版本,并已知能够抵御此类攻击。许多现代的 XML 解析器都内置了对 Billion Laughs 攻击的防护措施。
  • 限制输入文件大小: 在处理 XML 文件之前,对文件大小进行限制。如果文件过大,则拒绝处理。虽然这不能直接防御攻击,但可以作为一道防线。
  • 沙箱化解析环境: 将 XML 解析过程放入一个受限的沙箱环境中,限制其可用的内存和 CPU 资源。这样即使发生攻击,也只会影响沙箱内部,而不会影响整个系统。

总的来说,Billion Laughs 攻击是一种利用 XML 解析特性进行的巧妙攻击,但通过合理的配置和使用安全的解析器,是可以有效防御的。


IP packet

📦 IP 数据包(IP packet)是网络通信中传输数据的基本单元,它在 OSI 模型的第三层(网络层)起作用。它由两大部分组成:

🧱 IP 数据包结构

  1. IP 头部(Header) 包含控制和路由信息,通常是 20 字节(IPv4)或更长(带选项字段):
字段名描述
VersionIP 版本号(IPv4为4,IPv6为6)
IHL (Header Length)IP头部长度
Type of Service服务类型(QoS相关)
Total Length数据包总长度(头部 + 数据)
Identification唯一标识,用于数据包分片
Flags分片相关标志
Fragment Offset分片偏移量
TTL (Time To Live)生存时间,防止数据包无限循环
Protocol指示上层协议(如 TCP=6,UDP=17)
Header ChecksumIP头校验值
Source IP Address发送方的 IP 地址
Destination IP Address接收方的 IP 地址
Options(可选)可选字段,如路由记录、安全参数等
  1. IP 负载(Payload)
  • 即携带的数据部分,通常是上层协议的数据,如 TCP/UDP 段。
  • 举例:一个 TCP/IP 组合中,IP 负载就是 TCP 报文段,里面还有 TCP 头和实际应用数据(如 HTTP 请求)。

Last updated:

Released under the MIT License.