一、漏洞简介¶
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 触发条件(如特定模块、特定配置、特定运行环境等)¶
- 使用受影响版本的 ZooKeeper 客户端
- 配置文件中包含敏感信息(如
authProvider密码、SASL 配置等) - 日志级别设置为 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 规则等)¶
-
调整日志级别:
properties # log4j.properties log4j.logger.org.apache.zookeeper.server.util.ZKConfig=WARN -
日志文件权限控制:
bash chmod 600 logs/zookeeper-*.log chown zookeeper:zookeeper logs/ -
日志脱敏工具:
bash # 使用 sed 进行日志后处理 sed -i 's/\(password=\|secret=\|digest=\)[^ ]*/\1*******/g' logs/*.log
六、参考信息 / 参考链接¶
6.1 官方安全通告¶
6.2 其他技术参考资料¶
- Apache ZooKeeper 官方文档:https://zookeeper.apache.org/doc/