一、漏洞简介

1.1 漏洞背景

Apache ZooKeeper 是一个开源的分布式协调服务,广泛用于分布式系统中的配置管理、命名服务、分布式同步等场景。ZKConfig 是 ZooKeeper 客户端配置管理的核心组件,负责处理各种配置参数。

1.2 漏洞概述(包含 CVE 编号、危害等级、漏洞类型、披露时间等)

项目 内容
漏洞编号 CVE-2026-24308
危害等级 HIGH / 7.5
漏洞类型 配置信息泄露
披露时间 2026-03-07
影响组件 Apache ZooKeeper 安全
属性
CVE编号 CVE-2026-24308
危害等级 Important(重要)
漏洞类型 敏感信息泄露 (CWE-532)
发现者 Youlong Chen (chenyoulong20g@ict.ac.cn)

漏洞描述: Apache ZooKeeper 3.8.5 和 3.9.4 及早期版本中,ZKConfig 在处理配置值时存在不当行为,导致敏感配置信息(如密码、认证凭据等)在 INFO 级别日志中被明文记录。

补充核验信息:公开时间:2026-03-07;NVD 评分:7.5(HIGH);CWE:CWE-532。

二、影响范围

2.1 受影响的版本

  • Apache ZooKeeper 3.8.0 至 3.8.5
  • Apache ZooKeeper 3.9.0 至 3.9.4

2.2 不受影响的版本

  • Apache ZooKeeper < 3.8.0
  • Apache ZooKeeper ≥ 3.8.6
  • Apache ZooKeeper ≥ 3.9.5

2.3 触发条件(如特定模块、特定配置、特定运行环境等)

  1. 使用受影响版本的 ZooKeeper 客户端
  2. 配置文件中包含敏感信息(如 authProvider 密码、SASL 配置等)
  3. 日志级别设置为 INFO 或更低(默认配置)

三、漏洞详情与原理解析

3.1 漏洞触发机制

ZKConfig 在初始化时会加载所有配置属性,并在 INFO 级别日志中输出配置信息用于调试。问题在于该日志记录未对敏感配置项进行脱敏处理。

3.2 源码层面的根因分析(结合源码与补丁对比)

漏洞代码位置: zookeeper-server/src/main/java/org/apache/zookeeper/server/util/ZKConfig.java

// 受影响代码 (简化示例)
public class ZKConfig {
    public void loadConfiguration() {
        for (Map.Entry<String, String> entry : configProperties.entrySet()) {
            // 问题:直接输出所有配置值,包括敏感信息
            LOG.info("Configuration: {} = {}", entry.getKey(), entry.getValue());
        }
    }
}

修复后代码:

public class ZKConfig {
    private static final Set<String> SENSITIVE_KEYS = Set.of(
        "password", "secret", "auth", "credential", "keyStorePassword"
    );

    public void loadConfiguration() {
        for (Map.Entry<String, String> entry : configProperties.entrySet()) {
            String value = isSensitiveKey(entry.getKey())
                ? "******"
                : entry.getValue();
            LOG.info("Configuration: {} = {}", entry.getKey(), value);
        }
    }

    private boolean isSensitiveKey(String key) {
        return SENSITIVE_KEYS.stream()
            .anyMatch(sensitive -> key.toLowerCase().contains(sensitive));
    }
}

四、漏洞复现(可选)

4.1 环境搭建

# 下载受影响版本
wget https://archive.apache.org/dist/zookeeper/zookeeper-3.9.4/apache-zookeeper-3.9.4-bin.tar.gz
tar -xzf apache-zookeeper-3.9.4-bin.tar.gz
cd apache-zookeeper-3.9.4-bin

# 创建配置文件
cat > conf/zoo.cfg << 'EOF'
tickTime=2000
dataDir=/tmp/zookeeper
clientPort=2181
authProvider.1=org.apache.zookeeper.server.auth.DigestAuthenticationProvider
DigestAuthenticationProvider.superDigest=super:admin123
EOF

# 启动 ZooKeeper
./bin/zkServer.sh start

4.2 PoC 演示与测试过程

# 查看日志文件
tail -f logs/zookeeper-*.out | grep -i "configuration\|password\|digest"

# 预期输出(漏洞存在时):
# 2026-03-21 06:00:00,000 INFO  [main] ZKConfig: Configuration: digestAuthenticationProvider.superDigest = super:admin123
# 2026-03-21 06:00:00,001 INFO  [main] ZKConfig: Configuration: authProvider.1 = org.apache.zookeeper.server.auth.DigestAuthenticationProvider

利用脚本:

#!/usr/bin/env python3
"""
CVE-2026-24308 PoC - 配置信息泄露检测脚本
"""
import re
import sys

def scan_log_for_sensitive_info(log_file):
    """扫描日志文件查找敏感信息"""
    patterns = [
        (r'(password|passwd|pwd)\s*[=:]\s*(\S+)', '密码'),
        (r'(secret|token|key)\s*[=:]\s*(\S+)', '密钥/令牌'),
        (r'(superDigest|auth)\s*[=:]\s*(\S+)', '认证信息'),
    ]

    findings = []
    with open(log_file, 'r') as f:
        for line_num, line in enumerate(f, 1):
            for pattern, desc in patterns:
                match = re.search(pattern, line, re.IGNORECASE)
                if match:
                    findings.append({
                        'line': line_num,
                        'type': desc,
                        'content': line.strip(),
                        'value': match.group(2)
                    })
    return findings

if __name__ == '__main__':
    if len(sys.argv) < 2:
        print("Usage: python poc.py <zookeeper_log_file>")
        sys.exit(1)

    results = scan_log_for_sensitive_info(sys.argv[1])
    if results:
        print(f"[!] 发现 {len(results)} 处敏感信息泄露:")
        for r in results:
            print(f"    行 {r['line']}: [{r['type']}] {r['value']}")
    else:
        print("[+] 未发现敏感信息泄露")

五、修复建议与缓解措施

5.1 官方版本升级建议

当前版本 升级目标版本
3.8.x ≥ 3.8.6
3.9.x ≥ 3.9.5
# 升级命令示例
wget https://downloads.apache.org/zookeeper/zookeeper-3.9.5/apache-zookeeper-3.9.5-bin.tar.gz
# 停止服务、备份数据、替换文件、启动服务

5.2 临时缓解方案(如修改配置文件、关闭相关模块、增加 WAF 规则等)

  1. 调整日志级别properties # log4j.properties log4j.logger.org.apache.zookeeper.server.util.ZKConfig=WARN

  2. 日志文件权限控制bash chmod 600 logs/zookeeper-*.log chown zookeeper:zookeeper logs/

  3. 日志脱敏工具bash # 使用 sed 进行日志后处理 sed -i 's/\(password=\|secret=\|digest=\)[^ ]*/\1*******/g' logs/*.log

六、参考信息 / 参考链接

6.1 官方安全通告

6.2 其他技术参考资料

  • Apache ZooKeeper 官方文档:https://zookeeper.apache.org/doc/