这类攻击不看流量大小,只看「这个包合不合逻辑」。 它们构造的都是「字段合法但组合非法」的包。
上一节讲「量大」的攻击,这一节讲「量小但畸形」的攻击。 两类的防守思路完全不同:一个靠限速,一个靠一致性检查。
一、四种典型的畸形包
LAND:源地址等于目的地址。机器收到后会「自己回自己」,形成死循环。
Smurf:源地址伪造成受害者,目的地址是广播地址。网段里所有主机都会向受害者回包,形成放大。
死亡之 ping:分片之后总长度超过 65535。老旧系统的重组缓冲区会溢出。
泪滴:分片偏移故意重叠。不同系统对「重叠部分取谁」的处理不一致,就成为绕过检测的口子。
四者的共同点只有一条:都可以用「字段之间的一致性检查」识别出来,不需要看载荷。 所以它们属于防火墙「防得住」的那一类。
二、放大攻击为什么难防
Smurf 这类「反射放大」的结构是: 攻击者伪造源地址为受害者,向第三方网络发请求;第三方网络的主机各自向受害者回包。
放大倍数 = 回应的主机数 ÷ 攻击者发的包数。 一个 200 台主机的网段,放大 200 倍。 攻击者用 1 Mbps 的出口,能打给受害者 200 Mbps。
为什么难防:因为「攻击流量来自很多合法主机」, 在受害者这一侧看,全是「正常的 ICMP 回应」,封谁都不对。
所以正确的防守位置不在受害者,在两个第三方: 一、边界路由器禁掉「以广播地址为目的」的包(不让网络成为放大器)。 二、入口做「源地址校验」(RFC 1918 与 BCP 38),不让伪造源地址的包出去。 这两条是「把自己的网络管好,别成为帮凶」。
三、这类检查放在哪一层
放在防火墙上最合适,因为它有完整的包头,而且已经在路径上。
具体能做的检查有六条: 源地址不是组播或广播、源地址不等于目的地址、分片偏移与长度一致、TTL 不是 0、TCP 标志位组合合理、以及「首部长度与实际长度一致」。
这六条检查的成本极低: 全部是「读几个字节、比几个值」,不需要重组、不需要看载荷,所以对吞吐几乎没影响。 这也是它们应该「默认全开」的原因。
但要注意一件事:这些检查只对「不加密的包头」有效。 一旦进了隧道(IPsec),外层头是干净的,内层头被加密了,所以「检查内层有没有畸形」这件事,隧道这一侧的设备做不到。 这就是隧道的一个副作用:它把包头的可见性拿走了一部分。
四、动手 Demo:几种「畸形包」攻击与它们的共同点
这段摆出四种畸形包各自的构造手法与打中的漏洞, 再用「1 个请求对 200 台主机回应」算 Smurf 的放大倍数。
rows = [
(u"LAND", u"源地址等于目的地址", u"自己回自己,死循环"),
(u"Smurf", u"源地址伪造成受害者", u"放大反射"),
(u"死亡之 ping", u"分片后总长超 65535", u"重组缓冲溢出"),
(u"泪滴", u"分片偏移故意重叠", u"重组偏移算错"),
]
实跑输出:
--------------------------------------------------------------------
几种「畸形包」攻击与它们的共同点
--------------------------------------------------------------------
**它们都不靠流量大,靠「让协议栈做不该做的判断」。**
攻击 构造什么 打哪个漏洞
-------------------------------------------------------------
LAND 源地址等于目的地址 自己回自己,死循环
Smurf 源地址伪造成受害者 放大反射
死亡之 ping 分片后总长超 65535 重组缓冲溢出
泪滴 分片偏移故意重叠 重组偏移算错
**共同点只有一条:都是「合法字段值、非法组合」**,**所以任何「只看字段取值范围」的检查都拦不住。**
**算 Smurf 的放大倍数**:
攻击者发 1 个 ICMP 请求(64 字节)到广播地址。
网段里有 200 台主机会各自回应(各 64 字节)。
放大倍数 = 200 ÷ 1 = 200 倍。
攻击者用 1 Mbps 的出口,能打给受害者 200 Mbps。
**这就是反射放大的公式:攻击者的成本被「回应的主机数」乘掉了。**
**对策不是防受害者,是在边界上禁掉「以广播地址为目的」的包。**
「合法字段值、非法组合」这八个字是这一节的核心: 它解释了为什么「只查字段取值范围」的检查一律无效——因为每个字段单独看都完全合法。
放大倍数那个算式要会自己列:攻击者的成本被「回应的主机数」乘掉了。 所以防放大的关键不是「挡住大流量」,是「不让自己的网络成为放大器」。
最后那条「隧道会拿走包头可见性」值得多想一层: 安全与可视是一对天生的矛盾——加密保护了隐私,同时也保护了攻击者的包头。 所以隧道两端的设备,往往需要在解密之后再检查一次。
30 秒实验
- 在你的出口设备上找一找有没有「禁止源地址为组播」的选项。
- 查一下 BCP 38(源地址校验)是什么,你的运营商做了没有。
- 想一想:为什么分片重叠能被用来绕过入侵检测?
常见误区
- 以为畸形包很少见。扫描器第一轮就会发一堆。
- 以为放大攻击要在受害者侧防。要在源侧与反射侧防。
- 以为加密隧道里也能查畸形包。内层头被加密,看不见。
自测三问(点开对答案)
1. 四种畸形包的共同点是什么? —— 都是「字段合法但组合非法」,可以用包头一致性检查识别。 2. Smurf 攻击的放大倍数由什么决定? —— 由反射网络里回应的主机数决定,攻击者的成本被这个数乘掉。 3. 防放大攻击应该在哪两个位置做? —— 在反射侧禁掉以广播地址为目的的包,在源侧做源地址校验。下一节:从「看包头」进到「看载荷」——内容扫描。
- ☐ (本节完,下一节 05.07.09 基于内容的扫描)