XStreamMarshaller 的漏洞警告



当使用带有弹簧批次的XStreamMarshaller时,我收到以下消息:

Security framework of XStream not initialized, XStream is probably vulnerable.

第一次尝试:根据文档,我已尝试重置所有权限,但我仍然收到相同的消息。此外,我在解析XML文件时没有安全错误...所以我认为这段代码不起作用。下面是一个代码示例:

XStreamMarshaller marshaller = new XStreamMarshaller();
marshaller.getXStream().addPermission(NoTypePermission.NONE);

第二次尝试:我也尝试setSupportedClasses方法,但它也不起作用(我仍然收到漏洞消息,并且不支持的类仍然正确解围):

XStreamMarshaller marshaller = new XStreamMarshaller();
marshaller.setSupportedClasses(FooBar.class);

如何使用 XStreamMarshaller 设置安全权限?

注意:根据此线程,安全框架是在 1.4.7 中引入的,它仍然不是强制性的......但它对于XStream 1.5.0将是强制性的!

使用的XStream版本:1.4.10

使用的弹簧批处理版本:4.0.1

有关信息,我正在使用 Spring Boot(但我不确定它是否与这里相关)

"第一次尝试"的解决方案:

它不起作用的原因是XStreamMarshaller使用afterPropertiesSet实例化xstream对象,而不检查是否已创建一个对象,因此我们不能在@Bean方法中使用getXStream()。为了完成这项工作,我们可以在另一个 bean 中注入编组器时设置安全配置:

@Configuration
public class JobSecurityConfig {
public JobSecurityConfig(XStreamMarshaller marshaller) {
XStream xstream = marshaller.getXStream();
XStream.setupDefaultSecurity(xstream);
xstream.allowTypes(new Class[]{Bar.class});
}
}

另一种解决方案:扩展 XSreamMarshaller

您还可以扩展XStreamMarshaller并仅覆盖customizeXStream()方法来设置安全配置。

@Override
protected void customizeXStream(XStream xstream) {
XStream.setupDefaultSecurity(xstream);
xstream.allowTypes(new Class[]{Bar.class});
}

为什么"第二次尝试"不起作用:

setSupportedClasses仅用于编组!..StaxEventItemReader不关心支持的类!

Xstream网站提供了有关安全框架安全框架的详细信息。

提供以下方法来设置安全权限

XStream.addPermission(TypePermission);
XStream.allowTypes(Class[]);
XStream.allowTypes(String[]);
XStream.allowTypesByRegExp(String[]);
XStream.allowTypesByRegExp(Pattern[]);
XStream.allowTypesByWildcard(String[]);
XStream.allowTypeHierary(Class);
XStream.denyPermission(TypePermission);
XStream.denyTypes(Class[]);
XStream.denyTypes(String[]);
XStream.denyTypesByRegExp(String[]);
XStream.denyTypesByRegExp(Pattern[]);
XStream.denyTypesByWildcard(String[]);
XStream.denyTypeHierary(Class);

您也可以参考本教程

我希望这有帮助

来自官方的春季文档:

默认情况下,XStream 允许对任意类进行解组, 这可能会导致不安全的 Java 序列化效果。因此,它是 不建议使用 XStreamMarshaller 从 外部来源(即网络),因为这可能会导致安全性 漏洞。

您正在使用 Spring 的抽象XStreamMarshallerXStream库进行交互。默认情况下,库可以编组/取消编组任意类(包括来自外部 Web 源)。

如果您不这样做(使用来自外部 Web 源的类),您可以简单地忽略该消息。

如果您想删除该消息,请按照 Spring 的官方文档(上面链接)和 XStream 网站(安全配置示例)中的建议进行操作。

它归结为设置支持的类,以确保只有注册的类才有资格进行解组

默认情况下,此属性为空,这意味着 - 支持所有类 - 因此您会收到警告消息。

最新更新