Sonar检测告警:恶意XSLT可触发远程代码执行,如何修复?
修复Sonar检测到的XSLT远程代码执行安全告警
问题原因
你当前的代码虽然开启了XMLConstants.FEATURE_SECURE_PROCESSING安全特性,但Sonar仍触发告警,核心原因是:部分TransformerFactory的默认实现,即使开启基础安全处理,仍可能允许XSLT执行危险操作(比如调用外部资源、执行嵌入式脚本)——哪怕你的XSLT来自src/main/resources,Sonar也会考虑到资源被篡改或路径被恶意替换的风险。
修复方案
1. 严格管控XSLT文件来源
确保加载的XSLT是完全可信的内部资源:
- 构建阶段对
src/main/resources下的XSLT文件添加哈希校验,防止文件被篡改 - 运行时限制资源目录的读写权限,避免恶意替换XSLT文件
2. 显式禁用危险特性
除了基础安全处理,还要针对性禁用可能触发代码执行或外部访问的特性,适配不同Transformer实现:
TransformerFactory transformerFactory = TransformerFactory.newInstance(); // 开启基础安全处理 transformerFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); // 禁止访问外部DTD和样式表,切断外部资源调用路径 transformerFactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); transformerFactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, ""); // 针对Xalan处理器禁用扩展函数(如果使用该实现) try { transformerFactory.setFeature("http://xml.apache.org/xalan/features/allow-extension-functions", false); } catch (TransformerConfigurationException e) { // 忽略不支持该特性的处理器实现 } // 针对Saxon处理器禁用外部函数调用(如果使用该实现) try { transformerFactory.setFeature("http://saxon.sf.net/feature/allowExternalFunctions", false); } catch (TransformerConfigurationException e) { // 忽略不支持该特性的处理器实现 } final InputStream prunerfileStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("<path to .xsl file which is in src/main/resources>"); Transformer transformer = transformerFactory.newTransformer(new StreamSource(prunerfileStream));
3. 选择安全的XSLT处理器
优先使用JDK默认的TransformerFactory实现(Oracle/OpenJDK),避免使用老旧的第三方处理器(如存在漏洞的旧版Xalan);如果需要使用第三方库,选择经过安全加固的版本,并定期更新依赖。
额外注意事项
- 如果业务需要访问特定可信外部资源,不要直接设为空字符串,而是指定具体的可信域名或路径,比如
"https://trusted-resource.com" - 运行时可以对加载的XSLT内容做校验,比如检查是否包含
<xsl:script>、ext:function等危险标签/语法
内容的提问来源于stack exchange,提问作者Raviteja
相关产品推荐
相关产品推荐

