XStreamMarshaller的漏洞警告

时间:2018-03-23 13:06:56

标签: spring spring-boot spring-batch xstream spring-oxm

当使用带弹簧批的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设置安全权限?

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

使用的XStream版本:1.4.10

使用的Spring Batch版本:4.0.1

有关信息,我使用的是Spring Boot(但我不确定它与此相关)

3 个答案:

答案 0 :(得分:4)

首次尝试'

的解决方案

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

@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并不关心支持的课程!

答案 1 :(得分:1)

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

以下方法用于设置安全权限

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

您也可以参考此Tutorial

我希望这会有所帮助

答案 2 :(得分:1)

来自official spring docs

  

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

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

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

如果您要删除该消息,请按照Spring的官方文档(上面链接的)和XStream网站(security config example)中的建议进行删除。

归结为setting up supported classes以确保只有已注册的课程才有资格进行解组

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