diff --git a/CHANGELOG.md b/CHANGELOG.md index 6fe309d69..f54b17698 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,9 +2,10 @@ # 🚀Changelog ------------------------------------------------------------------------------------------------------------- -# 5.8.17.M1 (2023-03-26) +# 5.8.17.M1 (2023-03-28) ### 🐣新特性 +* 【core 】 SerializeUtil.deserialize增加白名单类,避免RCE vulnerability(issue#3021@Github) ### 🐞Bug修复 diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ObjectUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ObjectUtil.java index 5b1b73dc6..62d6f005a 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/ObjectUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/ObjectUtil.java @@ -588,10 +588,11 @@ public class ObjectUtil { * * @param 对象类型 * @param bytes 反序列化的字节码 + * @param acceptClasses 白名单的类 * @return 反序列化后的对象 */ - public static T deserialize(byte[] bytes) { - return SerializeUtil.deserialize(bytes); + public static T deserialize(byte[] bytes, Class... acceptClasses) { + return SerializeUtil.deserialize(bytes, acceptClasses); } /** diff --git a/hutool-core/src/main/java/cn/hutool/core/util/SerializeUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/SerializeUtil.java index f2c10c1ec..ae801c049 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/SerializeUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/SerializeUtil.java @@ -2,9 +2,12 @@ package cn.hutool.core.util; import cn.hutool.core.exceptions.UtilException; import cn.hutool.core.io.FastByteArrayOutputStream; +import cn.hutool.core.io.IORuntimeException; import cn.hutool.core.io.IoUtil; +import cn.hutool.core.io.ValidateObjectInputStream; import java.io.ByteArrayInputStream; +import java.io.IOException; import java.io.Serializable; /** @@ -59,9 +62,15 @@ public class SerializeUtil { * * @param 对象类型 * @param bytes 反序列化的字节码 + * @param acceptClasses 白名单的类 * @return 反序列化后的对象 */ - public static T deserialize(byte[] bytes) { - return IoUtil.readObj(new ByteArrayInputStream(bytes)); + public static T deserialize(byte[] bytes, Class... acceptClasses) { + try { + return IoUtil.readObj(new ValidateObjectInputStream( + new ByteArrayInputStream(bytes), acceptClasses)); + } catch (IOException e) { + throw new IORuntimeException(e); + } } }