前言

今天(2024年07月15日)傍晚开始出现了一个Nacos RCE的0day POC,随手刷了一下能看到很多”安全”媒体都在发这个快讯,且描述的十分夸张,最新版本Nacos亦受影响。每家”安全”媒体的描述都大差不差,看起来似乎是相互借鉴。出于好奇的心理,我打算一探究竟,看看其影响范围是否真有这么严重?

利用路径

综合各媒体的描述,以及POC的README,可以得出漏洞利用的条件是

  1. Nacos 2.3.2或2.4.0版本
  2. 未开启Nacos鉴权

没了

刚看到这些文章时,我还是觉得利用条件比较低的,但当我把POC的代码下载下来研磨时,发现事情其实没那么简单

一探究竟

POC的代码其实不长,我比较好奇利用点在哪儿,所以关注了一下POC攻击的端点,为以下两个端点

1
2
/nacos/v1/cs/ops/data/removal
/nacos/v1/cs/ops/derby

毕竟Nacos也是开源的,我们看看这两个接口都有些神马逻辑

  • /nacos/v1/cs/ops/data/removal

    image-20240715220513249

​ 我看了一下这个接口的改动记录,实际上从2020年开始,这个接口就存在了,且逻辑与现在没有太大差异。

​ 从实现逻辑及注释上来看,是希望能上传一个文件并导入到持久层上,并且这个接口开启了鉴权。

​ 在这块代码里,有一串判断条件引起了我的注意

1
2
3
4
if (!DatasourceConfiguration.isEmbeddedStorage()) {
response.setResult(RestResultUtils.failed("Limited to embedded storage mode"));
return response;
}

​ 查看DatasourceConfiguration.isEmbeddedStorage(),实际上调用的逻辑是EnvUtil.getStandaloneMode(),判断当前环境是不是单例启动。

​ 换言之,这个接口只有在单例模式下才能调用,集群模式应该被这个判断条件拦截了

  • /nacos/v1/cs/ops/derby

    image-20240715221513846

​ 这个接口的首版同样是在2020年,近几年同样没什么变动。吸引我的也同样是这个判断条件,以及后面一句强转

1
2
3
4
5
if (!DatasourceConfiguration.isEmbeddedStorage()) {
return RestResultUtils.failed("The current storage mode is not Derby");
}
LocalDataSourceServiceImpl dataSourceService = (LocalDataSourceServiceImpl) DynamicDataSource
.getInstance().getDataSource();

​ 判断条件与上面的接口一致,需要是单例模式,看了一下强转的实现,实际实现是Derby数据库的逻辑

也就是从代码走读的角度来看,利用条件并不是网传的那两个利用条件,至少应该包括是单例且使用Derby数据库。利用版本也应该不止最新版本,毕竟这块代码也已经许久没有动过了

总结来说,从代码走读的角度来看,利用条件应为:

  1. Nacos 2020年起的某个版本
  2. 未开启Nacos鉴权
  3. 单例模式且使用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实际上也做了解释

image-20240715223421855

另一个Issue是Nacos 存在 SQL 注入漏洞 #10613,报告者同样报告的是/nacos/v1/cs/ops/derby的端点,但这个Issue被标记为Invalid,@KomachiSion也做了回应

image-20240715223724960

回过头来看这个POC,实际这个POC同样也是利用了Nacos的这个功能,对Derby数据库进行管理,而Derby数据库可以执行系统命令,从而产生了RCE。

所以,这个0day社区会收录吗,参考之前的Issue,我觉得不好说..

是特性还是bug?还是得等官方的小伙伴来答疑

让子弹再飞一会儿~