【问题标题】:Vulnerability warning with XStreamMarshallerXStreamMarshaller 的漏洞警告
【发布时间】:2018-09-02 04:10:33
【问题描述】:

当使用带有 Spring Batch 的 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,Security Framework 是在 1.4.7 中引入的,它仍然不是强制性的....但是 XStream 1.5.0 将是强制性的!

使用的 XStream 版本:1.4.10

使用的 Spring Batch 版本:4.0.1

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

【问题讨论】:

  • 您使用的是哪个版本的 XStream?
  • XStream 版本:1.4.10
  • 真的!此检查是在 1.4.10 中添加的

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


【解决方案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】:

来自official spring docs

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

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

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

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

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

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

【讨论】:

  • 正如我在原始消息中所说,我无法让 XStream 文档正常工作。我也尝试过setSupportedClasses,但它也不起作用。我什至尝试只支持与我的模型无关的类,但我仍然收到漏洞消息,我的 xml 仍然没有正确解组。
【解决方案3】:

“第一次尝试”的解决方案:

它不起作用的原因是XStreamMarshaller用afterPropertiesSet实例化了一个xstream对象而不检查是否已经创建,所以我们不能在@Bean方法中使用getXStream()。为了实现这一点,我们可以在将 marshaller 注入另一个 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 不关心支持的类!

【讨论】:

    猜你喜欢
    • 2016-10-18
    • 1970-01-01
    • 2016-10-19
    • 1970-01-01
    • 1970-01-01
    • 2016-06-13
    • 1970-01-01
    • 1970-01-01
    • 2016-10-18
    相关资源
    最近更新 更多