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

MvG*_*MvG 6 java security xml-serialization javabeans xml-deserialization

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

MvG*_*MvG 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>
Run Code Online (Sandbox Code Playgroud)

这与方法大致相同

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

出于这个原因,我强烈建议不要简单地使用不受信任的来源读取数据XMLDecoder.

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