使用XMLDecoder读取文档文件是否安全?

时间:2013-01-13 19:46:35

标签: java security xml-serialization javabeans xml-deserialization

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

2 个答案:

答案 0 :(得分:9)

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语言的定义明确且无害的子集,或将您自己的格式与等技术结合使用。或者在严格控制的环境中执行反序列化,安全管理器将禁止任何意外操作。

答案 1 :(得分:3)

不,它绝对不安全。

示例MvG提供(在接受的答案中)并未绘制完整的图片。

看看我在Using XMLDecoder to execute server-side Java Code on an Restlet application (i.e. Remote Command Execution)博客文章中写的示例,其中我将展示如何:

  • 启动流程,
  • 上传课程文件,
  • 写入服务器端HTML OutputStream,
  • 创建XSS和
  • 触发远程shell

所有XML文件/字符串都由XMLDecoder解析(在博客文章中显示的示例中,通过Restlet的REST API ObjectRepresentation类)