zookeeper未授权漏洞复现及处理

一、漏洞详情

Zookeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

Zookeeper的默认开放端口是2181。Zookeeper 安装部署之后默认情况下不需要任何身份验证,造成攻击者可以远程利用 Zookeeper,通过服务器收集敏感信息或者在 Zookeeper 集群内进行破坏(比如:kill命令)。攻击者能够执行所有只允许由管理员运行的命令。

二、使用Java解决zk的未授权访问漏洞

还是以digest为例:

//给密码加密

public String getDigestUserPswd(String idPassword) throws NoSuchAlgorithmException {

return DigestAuthenticationProvider.generateDigest(idPassword);

}

//获取ACL列表,这里只设置一个可访问用户,用户名为user,密码为pswd。如果你需要多个,继续add即可。

public List<ACL> getAclList() {

String idPassword = "user:pswd";

if (idPassword == null) {

logger.warn("no digest config,so use world scheme");

return ZooDefs.Ids.OPEN_ACL_UNSAFE;

}

List<ACL> aclList = new ArrayList<>();

try {

Id zkUser = new Id("digest", getDigestUserPswd(idPassword));

ACL acl = new ACL(ZooDefs.Perms.ALL, zkUser);

aclList.add(acl);

} catch (NoSuchAlgorithmException e) {

logger.error(e);

}

return aclList;

}

//给znode设置权限,只有aclList的用户可以访问

public void addDigestScheme(){

zk.setACL(znode, aclList, -1);

}

//创建znode的时候设置ACL

zk.create(znode,data,aclList,...)

//如何访问加密的znode

public void client(){

ZooKeeper zk = new ZooKeeper(xxx)

zk.addAuthInfo("digest","user:pswd".getBytes())

//然后zk就可以访问加密znode了

}

上面的代码仅说明了核心步骤。

我在这里遇到个大坑,就是idpasswod为空的情况,之前直接给返回空了,feature正常启动,但是服务没有成功的发布出去。重要的是构建环境把我在配置文件配置的user信息给删掉了(我不知道)才开始跑的,更坑的是它运行完后直接清除日志了,哪里错了都看不到。

最后哼哧哼哧的啃代码,终于定位到位置。

血泪教训:空指针情况需要正确处理,别TMD的随便返回空,运行没问题不代表功能没问题。

到这里,我们在create节点的时候可以为所有的znode设置访问权限,理论上可以保护我们的数据安全了。

漏洞扫描验证

上面我们在创建znode的时候进行了加密,这样总可以通过漏洞扫描了吧。

重点来了。

但是如果你使用漏洞扫描工具扫描的话,还是有未授权访问漏洞的,为啥呢?

不知道你有没有注意,zk服务端启动后,默认会启动这几个具有world和cdrwa权限的znode,"/" "/zookeeper" "/zookeeper/config"和"/zookeeper/quota"(根据zookeeper的版本不同可能存在不同,并且这几个节点虽然具有world和cdrwa权限,但是是无法删除的,不知道为什么,好在我们可以给它设置ACL列表。另外,官网对着几个节点也没有特别说明,估计和zk本身的一些配置相关吧,不删除最好)。就是这几个znode,会导致你的产品无法通过安全工具的漏洞扫描,你说坑不坑,解决办法也是很简单的,用我们前面说过的zk.setACL为这几个节点设置权限就OK了,千万别忘记根节点"/"了。

好了,到这里,才是真正的解决了这个未授权访问漏洞问题了。

还可以禁用2181端口试试。

相关推荐
孔令飞5 小时前
知己知彼,百战不殆:AI SKILL 实现原理剖析
云原生·go·ai编程
这个DBA有点耶6 小时前
分布式集群的“最后一公里”:分片集群与透明分布式集群的工程代价拆解
数据库·分布式·架构
一条闲鱼_mytube8 小时前
分布式 ID 生成方案:雪花算法与号段模式
分布式·算法·wpf
分布式存储与RustFS8 小时前
把 LSM 引擎直接架在对象存储上:slatedb 能不能跑在 RustFS 上?
运维·云原生·开源·对象存储·分布式存储·s3·性能基准
科学熊9 小时前
Java 分布式理论与高并发编程
java·开发语言·分布式
时间售卖铺11 小时前
MySQL 日志管理
运维·数据库·mysql·云原生
老郭a11 小时前
流量一涨 Pod 扩不出来?K8s HPA 弹性伸缩配置避坑指南
云原生
xianyuCcCcCCCcc13 小时前
Kubernetes Service 与网络代理
网络·云原生·kubernetes
我不会起名字32213 小时前
PV/PVC 一直 Pending:StorageClass 与绑定条件的 4 个检查点
云原生·kubernetes·pvc·排查
XMAIPC_Robot14 小时前
NXP i.MX95 + FPGA 异构计算平台 — 工业多域融合 AI 加速嵌入式控制解决方案
人工智能·分布式·fpga开发·能源·rk3576+fpga