前言
今天(2024年07月15日)傍晚开始出现了一个Nacos RCE的0day POC,随手刷了一下能看到很多”安全”媒体都在发这个快讯,且描述的十分夸张,最新版本Nacos亦受影响。每家”安全”媒体的描述都大差不差,看起来似乎是相互借鉴。出于好奇的心理,我打算一探究竟,看看其影响范围是否真有这么严重?
利用路径
综合各媒体的描述,以及POC的README,可以得出漏洞利用的条件是
- Nacos 2.3.2或2.4.0版本
- 未开启Nacos鉴权
没了
刚看到这些文章时,我还是觉得利用条件比较低的,但当我把POC的代码下载下来研磨时,发现事情其实没那么简单
一探究竟
POC的代码其实不长,我比较好奇利用点在哪儿,所以关注了一下POC攻击的端点,为以下两个端点
1 | /nacos/v1/cs/ops/data/removal |
毕竟Nacos也是开源的,我们看看这两个接口都有些神马逻辑
/nacos/v1/cs/ops/data/removal

我看了一下这个接口的改动记录,实际上从2020年开始,这个接口就存在了,且逻辑与现在没有太大差异。
从实现逻辑及注释上来看,是希望能上传一个文件并导入到持久层上,并且这个接口开启了鉴权。
在这块代码里,有一串判断条件引起了我的注意
1 | if (!DatasourceConfiguration.isEmbeddedStorage()) { |
查看DatasourceConfiguration.isEmbeddedStorage(),实际上调用的逻辑是EnvUtil.getStandaloneMode(),判断当前环境是不是单例启动。
换言之,这个接口只有在单例模式下才能调用,集群模式应该被这个判断条件拦截了
/nacos/v1/cs/ops/derby

这个接口的首版同样是在2020年,近几年同样没什么变动。吸引我的也同样是这个判断条件,以及后面一句强转
1 | if (!DatasourceConfiguration.isEmbeddedStorage()) { |
判断条件与上面的接口一致,需要是单例模式,看了一下强转的实现,实际实现是Derby数据库的逻辑
也就是从代码走读的角度来看,利用条件并不是网传的那两个利用条件,至少应该包括是单例且使用Derby数据库。利用版本也应该不止最新版本,毕竟这块代码也已经许久没有动过了
总结来说,从代码走读的角度来看,利用条件应为:
- Nacos 2020年起的某个版本
- 未开启Nacos鉴权
- 单例模式且使用Derby数据库
很多网文强调POC利用可复现,我看了一下大家基本上都是用的最新版本的Nacos并直接使用-m standalone 的命令启动的Nacos,实际上他们在验证时都忽略了一点,这个POC只在单例模式下的Nacos有效。
而生产环境上部署的Nacos,考虑到高可用,往往都会是使用集群模式,且外置存储。因此理论上,这个POC是无法在这种场景下利用的。
By the way
花了点心思研究了一下以后,感觉这些标题党们可太坏了,没有做很好的风险分析,就开始大张旗鼓的宣传紧急,重要的字样,引起大家的焦虑和恐慌。
实际研究下来发现是Derby的场景后,我就回想起社区关于Derby的讨论实际上不少,便翻了翻,找到了不少有趣的信息
首先是发表于2020年12月的这篇Issue,Report a security vulnerability in nacos to execute arbitrary SQL without authentication,这篇Issue报告的漏洞的利用端点,就是本次POC的端点之一,/nacos/v1/cs/ops/derby。但当时这个端点是没有鉴权逻辑的,因此可以利用这个端点直接进行Derby的操作。
关于为什么有这个端点,@KomachiSion实际上也做了解释
另一个Issue是Nacos 存在 SQL 注入漏洞 #10613,报告者同样报告的是/nacos/v1/cs/ops/derby的端点,但这个Issue被标记为Invalid,@KomachiSion也做了回应
回过头来看这个POC,实际这个POC同样也是利用了Nacos的这个功能,对Derby数据库进行管理,而Derby数据库可以执行系统命令,从而产生了RCE。
所以,这个0day社区会收录吗,参考之前的Issue,我觉得不好说..
是特性还是bug?还是得等官方的小伙伴来答疑
让子弹再飞一会儿~