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