XStream的安全框架未初始化,XStream可能存在漏洞。

39

XStream的安全框架未初始化,可能存在漏洞。

我在使用 XStream (1.4.10) 时一直收到这个控制台错误。

我尝试了以下方法:

XStream.setupDefaultSecurity(xs);

xs.addPermission(AnyTypePermission.ANY); xs.addPermission(NoTypePermission.NONE);

但都解决不了问题。

我不需要任何高级的安全设置,只是想要消除警告。也许还要为 1.5.x 准备代码。

4个回答

43

在处理安全问题时,我不会掉以轻心。首先要了解问题的严重性,这里有一篇好文章或者另一篇

然后找出人们推荐的解决方案。开始的好地方是从xstream网站本身开始。在xstream security page上有一个示例,您可以将其用作起点。

这将是我的设置,基本上允许大多数您的代码。

XStream xstream = new XStream();
// clear out existing permissions and set own ones
xstream.addPermission(NoTypePermission.NONE);
// allow some basics
xstream.addPermission(NullPermission.NULL);
xstream.addPermission(PrimitiveTypePermission.PRIMITIVES);
xstream.allowTypeHierarchy(Collection.class);
// allow any type from the same package
xstream.allowTypesByWildcard(new String[] {
    "com.your.package.**"
});

然而,经过更深入地研究他们的源代码后,这是我的看法:

XStream.setupDefaultSecurity(this); // to be removed after 1.5
xstream.allowTypesByWildcard(new String[] {
    "com.your.package.**"
});

因此,升级到1.5后,您只需要一行代码。

请注意,根据您的应用程序反序列化场景,您可能需要更多的通配符。这不是一种通用答案,而是我认为一个很好的起点。


第一个链接已经失效。 - Seyit Bilal

12

我曾经遇到同样的“问题”,并通过允许相关类型来解决:

Class<?>[] classes = new Class[] { ABC.class, XYZ.class };
XStream xStream = new XStream();
XStream.setupDefaultSecurity(xStream);
xStream.allowTypes(classes);

也许这对您有所帮助。

祝好运!


我也可以指定一个巨大的超类吗? - Georgian
@GGrec 不行...我尝试传递超类,但它对子类报错。 - Alien

1
它还可以通过指定允许类的全包括模式来工作:
xstream.allowTypesByRegExp(new String[] { ".*" });

5
这基本上是禁用XStream试图让您配置的安全功能。除非您不关心应用程序的安全性,否则不要这样做。 - Thomas Leplus
1
一定要小心使用! - Gaurav
1
此外,需要在调用之前添加xstream.addPermission(NoTypePermission.NONE);以禁用警告。 - Gaurav

0
任何看到这篇文章的人,可能是因为 CVE-2021-21351 的原因。
早期版本的 XStream 存在 RCE 漏洞。您应该立即升级到 1.46.1 或更高版本。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接