explanation
Billion Laughs attack
Billion Laughs 攻击(十亿笑声攻击)是一种针对 XML 解析器的拒绝服务(DoS)攻击。它也被称为 XML 炸弹或指数实体扩展攻击。
攻击原理
这种攻击利用了 XML 中实体(entity)的嵌套引用特性,通过构造一个看似不大的 XML 文件,但在解析时会急剧膨胀,消耗大量的内存和 CPU 资源,最终导致系统崩溃或无法响应。
具体来说,它通常这样运作:
- 定义嵌套实体: 在 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> - 指数级膨胀: 在上面的例子中,
lol实体是 "lol" 字符串。lol2实体引用了 10 次lol,所以它展开后会变成 10 个 "lol"。lol3实体引用了 10 次lol2,所以它展开后会变成个 "lol"。以此类推, lol9实体最终会展开成(十亿)个 "lol" 字符串。 - 资源耗尽: 当 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 数据包结构
- IP 头部(Header) 包含控制和路由信息,通常是 20 字节(IPv4)或更长(带选项字段):
| 字段名 | 描述 |
|---|---|
| Version | IP 版本号(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 Checksum | IP头校验值 |
| Source IP Address | 发送方的 IP 地址 |
| Destination IP Address | 接收方的 IP 地址 |
| Options(可选) | 可选字段,如路由记录、安全参数等 |
- IP 负载(Payload)
- 即携带的数据部分,通常是上层协议的数据,如 TCP/UDP 段。
- 举例:一个 TCP/IP 组合中,IP 负载就是 TCP 报文段,里面还有 TCP 头和实际应用数据(如 HTTP 请求)。
