6

将 Java Bean 序列化为 XML似乎是一种非常简洁的方法:来自许多来源的许多类都可以可靠地序列化,只需使用它们的公共接口XMLEncoderXMLDecoder甚至在 API 参考的许多地方都建议使用这种方法进行序列化。但是用于此的XML 语法似乎非常强大。是否有任何安全机制可以防止来自恶意文档的攻击?或者XMLDecoder出于安全原因,是否应该避免在不受信任的文档上使用?

4

2 回答 2

10

XML 序列化 bean 的反序列化几乎可以导致 JVM 可以执行的任何操作。给你一个丑陋的例子,考虑下面的文档,它会写一个特定的文件,而不会被问到任何问题:

<?xml version="1.0" encoding="UTF-8" ?>
<java version="1.4.0" class="java.beans.XMLDecoder">
  <object class="java.io.PrintWriter">
    <string>/tmp/Hacked.txt</string>
    <void method="println">
      <string>You have been hacked!</string>
    </void>
    <void method="close"/>
  </object>
</java>

这与一个方法大致相同

PrintWriter deserialize() {
    PrintWriter obj = new PrintWriter("/tmp/Hacked.txt");
    obj.println("You have been hacked!");
    obj.close();
    return obj;
}

出于这个原因,我强烈建议不要简单地使用XMLDecoder.

将文档验证为 XML 语言的定义明确且无害的子集,或者将您自己的格式与等技术结合使用。或者在严格控制的环境中执行反序列化,使用不允许任何意外操作的安全管理器。

于 2013-01-13T19:46:35.200 回答
4

不,使用绝对不安全。

MvG 提供的示例(在接受的答案中)并没有描绘出全貌。

看看我在Using XMLDecoder to perform server-side Java Code on an Restlet application (ie Remote Command Execution)博客文章中编写的示例,其中我展示了如何:

  • 启动进程,
  • 上传类文件,
  • 写入服务器端 HTML OutputStream,
  • 创建 XSS 和
  • 触发远程外壳

全部来自 XMLDecoder 解析的 XML 文件/字符串(在博客文章中显示的示例中,通过 Restlet 的 REST API ObjectRepresentation 类)

于 2013-08-06T15:06:16.987 回答