【问题标题】:Is it safe to use XMLDecoder to read document files?使用 XMLDecoder 读取文档文件是否安全?
【发布时间】:2013-01-13 19:46:35
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    不,使用它绝对不安全。

    MvG 提供的示例(在接受的答案中)并未描绘完整的画面。

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

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

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

    【讨论】:

    • 对我来说,我的回答证明了任意代码执行,而您描述的所有其他方面只是这种情况的症状。但我想不是每个人都会建立这种联系,尤其是与服务器进程建立联系,所以最好明确说明这一点。并且找到了一个易受攻击的框架使这变得更加切实。您是否就此联系过 Restlet 开发人员?
    【解决方案2】:

    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 语言子集,要么将您自己的格式与 等技术结合使用。或者在严格控制的环境中执行反序列化,使用不允许任何意外操作的安全管理器。

    【讨论】:

    • 确实如此。当前 Java 编程语言安全编码指南的指南 3-8“JavaBeans 组件的长期持久性支持 Java 语句的执行”。 oracle.com/technetwork/java/seccodeguide-139067.html#3-8
    • @MvG,有没有办法可以从上面示例中的任何随机对象生成 xml 转储?我尝试使用 XMLEncoder / XStream 但我无法获得与您的 xml 等效的确切语法,相当于 deserialize() 实现。
    猜你喜欢
    • 2012-11-23
    • 1970-01-01
    • 2020-10-18
    • 2015-12-29
    • 2020-03-03
    • 1970-01-01
    • 2012-05-07
    • 2020-07-31
    • 1970-01-01
    相关资源
    最近更新 更多