gpt4 book ai didi

java - 使用 xstream 注入(inject)恶意对象

转载 作者:行者123 更新时间:2023-11-29 06:12:54 25 4
gpt4 key购买 nike

我可以安全地使用 XStream 来处理来自系统外部的 XML 吗?使用 xstream 处理“潜在恶意 XML”时的最佳做法是什么?

比方说,我的代码中某处有这样一个类:

 package hazard;
class Dangerous {
public Dangerous() {
AtomicBomb.getInstance().nuke();
}
}

恶意用户可能会提交 XML 文件,例如:

 <hazard.Dangerous/>

并使 XStream 调用 nuke() 方法。

这个例子非常理论化。正如所指出的,我不希望构造函数做这种事情。但是我可以确定类路径中可用的任何库中的构造函数都没有此类问题(例如,分配一些资源,如文件描述符)。

重点是发送 XML 文件允许攻击者创建任意对象。更现实的方法可能是使用一些类而不是另一个。

public class Foo<T implements Bar> {
private T t;
// Getters/setters ...
}

public interface Bar {
public void bar();
}

public class Bar1 implements Bar {
// ...
}

public class Bar2 implements Bar {
// ...
}

使用(恶意的)XML 输入:

<foo>
<!-- I expect bar1 -->
<package.Bar2/>
</foo>

现在使用 Java 代码:

Bar<Foo1> bar = (Bar<Foo1>) xstream.fromXML(xml);
// I expect to have a bar1 but I have a bar2.
bar.getT().foo();

乍一看,解决方案是提供自定义 Mapper(在 realClass() 方法中完成的工作)。

最佳答案

绝不允许 xstream(或任何其他序列化框架)编码除干净、纯 javabean(getter 和 setter)之外的任何内容。

更新:您提到的关于使用 Mapper 的理论应该可行,尽管它需要您构建一些脚手架和自定义配置。另一种方法是利用XStream的特性指定一个专门的类加载器来解析类。您将尝试将所有应该允许由 xstream 编码的类放在单独的 JAR 中(将其视为域模块)。然后创建一个干净的类加载器,它只加载该 JAR 并将其分配给 xstream。这样,xstream 将不知道其范围之外的任何类,无法反序列化任何您不希望它反序列化的内容。

尝试类似的东西

ClassLoader bootstrapClassLoader = ClassLoader.getSystemClassLoader().getParent();
List urls = new ArrayList();
urls.add(new File("yourJarOfXstreamBeanClasses.jar").toURL());
ClassLoader xstreamClassLoader = new URLClassLoader(urls.toArray(new URL[0]), bootstrapClassLoader);
XStream xstream = new XStream();
xstream.setClassLoader(xstreamClassLoader);

关于java - 使用 xstream 注入(inject)恶意对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6187678/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com