近日,国内外多家安全公司和机构发布了Memcached超级DRDoS(Distributed Reflection Denial of Service)攻击的预警,引发各方关注。据我们的监控显示,目前该攻击的最大峰值流量已经达到了1.35T。而在2月27号,Memcached的反射攻击事件流量范围不过几百兆到最大500G左右。几日之隔,攻击峰值的历史纪录就迅速被翻倍刷新,并且攻击发生的频率从一天十几次到几百次,呈现爆发式增长。这是要搞大事情!
1、事件回顾
根据中国电信云堤的攻击监控数据显示,从本周一至周五(2月26日至3月2日 06:00)短短5天内,全球就发生了79起利用Memcached协议的反射放大攻击。日攻击总流量最高达到419TBytes。
Memcached反射放大攻击日攻击次数
Memcached反射放大攻击日攻击总流量
其中,针对我国境内的Memcached反射放大攻击就有68次,江苏、浙江两省被攻击频繁。针对我国境内的攻击,单次攻击最高攻击峰值达505Gbps。攻击持续时间最长的一次发生在3月1日,持续1.2小时,总攻击流量达103.8TBytes。
中国各省份地区Memcached反射放大攻击次数
从影响范围来看,所有互联网的业务都可能成为Memcached DRDoS的攻击对象。一方面带宽或业务遭受超大流量的攻击,导致出口带宽完全被占满,正常业务无法访问;另一方面企业内部的Memcached系统可能被不法分子利用成为攻击帮凶。我们呼吁各地区、各行业客户保持高度警惕,谨防Memcached反射攻击对服务器造成直接冲击或利用Memcached反射攻击作为障眼法混合其他攻击造成信息安全危害。
2、攻击分析
2.1 什么是Memcached?
Memcached是一个高性能的开源分布式内存对象缓存系统,主要用于提高Web应用的扩展性,能够有效解决大数据缓存的很多问题,在全球范围内都有广泛使用。Memcached基于内存的key-value存储小块数据,并使用该数据完成数据库调用、API调用或页面渲染等。攻击者正是利用key-value这项功能构造了大流量的Memcached反射攻击。这一点在后文会详细介绍。
2.2 Memcached分布情况
最新统计显示,全球总共有3790个Memcached服务器被利用参与到这些Memcached反射放大攻击。这些被利用反射源遍布于全球96个国家或地区范围内。其中,美国就占了全球的1/4。
分布在中国地区的被利用的Memcached服务器位列第二位,占比12.7%。在中国各省份占比如下所示,广东、北京、浙江为TOP3。
绿盟科技威胁情报中心(NSFOCUS Network Threat Intelligence,简称NTI)的统计结果显示,全球范围内存在被利用风险的Memcached服务器为104,506台。分布情况如下:
数据来源:绿盟威胁情报中心
从地理分布来看,美国可被利用的Memcached服务器最多,其次是中国。
数据来源:绿盟威胁情报中心
这些活跃的Memcached反射器为构造超级DRDoS攻击提供了有力的先决条件。如果不及时修复治理,预计基于Memcached反射攻击的攻击事件会继续增加,后果不敢想象。
2.3 Memcached如何形成DRDoS攻击?
Memcached反射攻击的构造过程分为如下3步;
- 收集反射器IP
通过NTI/Shodan等情报引擎找到开放的Memcached系统,获取系统IP;
- 配置反射器
利用开放的Memcached系统作为反射器,并修改key-value配置实现较大的存储容量,为构造反射放大攻击进行准备;
- 发起反射攻击
攻击者将自身IP伪造成攻击的目标地址,并向Memcached反射器发送请求读取Memcached在key-value中存储的信息。Memcached在收到请求后向伪造的虚假源IP进行回复,从而形成反射。
Memcached反射攻击示意图
当大量Memcached被同时利用,并用同一个伪造源IP进行回复,就轻而易举地形成了针对这个伪造源(受害者)的大流量DRDoS攻击。
2.4 Memcached的攻击特征
DRDoS(Distributed Reflective Denial-of-Service)是DDoS攻击分类中的一种。绿盟科技在2015年、2016年及2017年发布的DDoS态势报告中均有说明(报告下载链接http://www.nsfocus.com.cn/research/report_3.html)。报告中通过实际案例及数据统计明确指出了反射攻击的流行性及危害程度,此次Memcached反射攻击的爆发进一步表明DRDoS攻击的热度还将持续下去。
此前各类安全厂商监测到的DRDoS攻击主要是SSDP反射、DNS反射、NTP反射等。下表(引自US-Cert)详细列举了各类反射攻击的放大倍数。
Protocol | Bandwidth Amplification Factor | Vulnerable Command |
DNS | 28 to 54 | see: TA13-088A [4] |
NTP | 556.9 | see: TA14-013A [5] |
SNMPv2 | 6.3 | GetBulk request |
NetBIOS | 3.8 | Name resolution |
SSDP | 30.8 | SEARCH request |
CharGEN | 358.8 | Character generation request |
QOTD | 140.3 | Quote request |
BitTorrent | 3.8 | File search |
Kad | 16.3 | Peer list exchange |
Quake Network Protocol | 63.9 | Server info exchange |
Steam Protocol | 5.5 | Server info exchange |
Multicast DNS (mDNS) | 2 to 10 | Unicast query |
RIPv1 | 131.24 | Malformed request |
Portmap (RPCbind) | 7 to 28 | Malformed request |
LDAP | 46 to 55 | Malformed request [6] |
CLDAP | 56 to 70 | —— |
TFTP | 60 | —— |
Memcache | 10,000 to 51,000 | —— |
仅从放大倍数来看,Memcached反射攻击的危害程度远远高于其他反射攻击类型,US-Cert提供的数据显示它能够实现51,000倍的放大效果。
与其他反射攻击相比,Memcached如何实现这么多倍的放大效果呢?其中的重要原因就是Memcached的key-value功能。前文提到key-value的作用是决定存储容量的大小,正常情况下key-value的值通常不超过几千字节。当Memcached被攻击者利用作为反射器时,key-value的值经过修改可以达到100万字节以上。
攻击过程我们通过实验室也进行了完整复现。
第一步,通过命令修改Memcached上的key-value参数,以提升放大倍数。
send = “set t 0 900 1048501” + “\r\n” + ‘a’ * 1048501 + “\r\n”
socket.sendall(send)
经验证,key-value的最大值为1048501。
第二步通过get命令读取Memcached的存储信息,并反射到目标IP。
get=”\x00\x00\x00\x00\x00\x01\x00\x00get t\r\n”
socket.sendto(get, (host, 11211))
形成的攻击报文如下:
触发Memcached反射攻击的请求报文最小为15字节,包含为8字节(RFC规定字段)+3字节 (get)+1(空格)+最小为1字节(键的名称 )+2字节 (\r\n),而返回的请求数据达到105万字节,理论上可放大到接近7万倍。如此强悍的放大攻击,与其他各类DRDoS攻击形成断崖式的差距对比。
3、Memcached攻击防护加固建议
3.1 Memcached系统自查建议
攻击的形成过程为我们提供了一个很好的预警思路,安全产品可针对Memcached的key-value配置进行检测,在Memcached系统被利用成为攻击源之前就进行拦截。检测流程如下:
(1)检测目的端口为11211的TCP或UDP报文(确保是Memcached服务器);
(2)检测报文是否为set命令(set命令格式参见附录),如果是则执行(3),否则结束检测;
(3)检测set命令后面的bytes字段值(如下图中标注的1048501),是否超过设定的阈值,如果是,则可以怀疑该报文存在异常;
(4)检测到该类异常控制报文后,可有如下两种处理方式:
a. 告警并监控。为了防止被误杀,建议同时监控该Memcached服务器后面的流量变化来进一步判断该服务器是否被用做了反射器。
b. 直接丢弃。如果有足够的证据表明该记录是恶意添加的,直接丢弃可以保证服务器不被当做反射器。
自查举例:假设下图是公网的一台Memcached服务器上获取的数据。
通常情况下,多数value的大小都在64K以内,而最后一条的达到了将近1M,与其他记录有很明显的差别,基本上可以判断该记录存在问题,该服务器可能已经被利用。
3.2 Memcached攻击流量清洗
面对如此大规模、大范围的DDoS攻击威胁,所有网络安全节点都应该加强防范,从攻击防护和外发清洗两方面入手,充分保障基础设施和业务流量的安全。针对此攻击,我们提供如下防护建议:
- 运营商。
运营商及IDC处于网络上游,拥有强大的带宽资源,是攻击最直接的受害者,也是防护的第一道屏障。运营商能够灵活控制路由策略和防护策略进行快速过滤。
1)在边界配置UDP访问控制规则,将源端口为11211的报文进行阻断或限速;
2)在边界配置BGP FlowSpec策略,对源端口为11211的UDP流量进行阻断或限速;
3)利用DDoS防护设备将源端口为11211的UDP流量进行阻断或限速。
- 企业用户
企业用户通常贴近服务终端,熟悉掌握自身业务流量特点,策略配置更加明确,灵活性强。
1)大型企业客户可以采用和运营商相同的策略,在出口边界设备配置UDP访问控制规则或BGP FlowSpec策略对源端口为11211的UDP流量进行阻断或限速;
2)不具备出口路由配置权限的企业客户,可以在抗DDoS等设备上配置防护策略,对源端口为11211的UDP流量进行阻断或限速;
3)考虑企业出口带宽可能被打满的情况,企业客户可通过运营商或云清洗服务在上游执行清洗策略,策略内容同样是对源端口为11211的UDP流量进行阻断或限速。
3.3 Memcached系统防护加固
对于正在使用Memcached系统的用户,为了避免被攻击者利用,使Memcached成为攻击源,对外发起攻击流量,影响自身系统性能,我们提供如下几点建议。
1)在边界网络设备上配置URPF策略,过滤外发的虚假源IP报文;
2)在Memcached系统前进行深度检测,直接过滤报文特征中set key 0 900 64000的第三个字段过大的数据包,这样做可以在Memcached系统被修改利用成为攻击源前进行拦截;
3)对Memcached服务进行安全检查,查看Memcached服务是否监听UDP端口。查找Memcached进程,查看是否有-l参数,如果没有则默认为0.0.0.0。若Memcached服务不需要监听UDP,禁用UDP。详情参考Memcached官方文档:
https://github.com/memcached/memcached/wiki/ConfiguringServer#udp
附录
set 命令的基本语法格式如下:
set key flags exptime bytes [noreply]
value
参数说明如下:
key:键值 key-value 结构中的 key,用于查找缓存值。
flags:包括键值对的整型参数,客户机使用它存储关于键值对的额外信息 。
exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
bytes:在缓存中存储的字节数
noreply(可选): 该参数告知服务器不需要返回数据
value:存储的值(始终位于第二行)(可直接理解为key-value结构中的value)