XStreamMarshaller 的漏洞警告

Vulnerability warning with XStreamMarshaller

将 XStreamMarshaller 与 spring 批处理一起使用时,我收到以下消息:

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 使用批次:4.0.1

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

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

希望对您有所帮助

来自official spring docs

By default, XStream allows for arbitrary classes to be unmarshalled, which can lead to unsafe Java serialization effects. As such, it is not recommended to use the XStreamMarshaller to unmarshal XML from external sources (i.e. the Web), as this can result in security vulnerabilities.

您正在使用 Spring 的抽象 XStreamMarshallerXStream 库交互。默认情况下,库可以marshall/unmarshall 任意类(包括来自外部网络源)。

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

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

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

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

'First Try' 的解决方案:

它不起作用的原因是 XStreamMarshaller 使用 afterPropertiesSet 实例化一个 xstream 对象而不检查是否已经创建,所以我们不能使用 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});
    }

为什么 'Second Try' 不起作用:

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