前几天利用memcached进行流量放大攻击的新闻引发热议从原理上来看不复杂也不是什么新颖的攻击方式但在此之前我并没有见到过有关这类攻击的介绍这次事件之所以能够吸引人的注意主要是因为

  1. Memcached被广泛使用其中有许多暴露在公网
  2. 放大倍数非常可观

之所以说是反射攻击是因为攻击者并非直接将大量的流量打向目标而是利用memcached将流量放大并打向目标

下图是正常用户请求memcached的示意图

正常用户的请求

UDP协议本身设计得比较简单没有握手过程很容易伪造来源地址不过由于伪造来源地址后收不到服务器端的响应一般没有实际用途然而当响应体大小远大于请求体的时候UDP服务便成了天然的流量放大器

下图演示了攻击者将来源地址伪造成被攻击者的地址引导memcached向被攻击者发送报文的示意图

攻击者伪造地址,引导 memcached 向被攻击者发送报文

如果基于UDP的应用层协议设计不当比如这里的memcached又恰好被广泛使用暴露于公网那么很容易被攻击者利用上演一出借刀杀人

要利用TCP服务器就没有容易了建立TCP连接需要经历三次握手其核心在于服务器端的初始序列号Initial Sequence Number, ISN客户端只有获知ISN才能与服务器端正式建立TCP连接从而发送真正的请求体——而一旦伪造了来源地址便无法收到ISN

RFC 76124提到ISN的生成器与一个32位的虚拟时钟相绑定时钟大约每4微秒增加一因此ISN大约每4.55小时循环一次然而这种与时间相关的ISN生成器生成出的ISN是比较容易预测的从而引发off-path attackRFC 65284建议使用与四元组相关的伪随机算法来产生ISN

回归这件事本身memcached或者类似的反射攻击或许还会持续——只要公网上还暴露着能被利用的memcached或者其他类似带有设计缺陷的服务攻击就不会停止而对于开发者在设计暴露于公网基于UDP的应用层协议的时候可能需要多操一份心了