.NET XmlSerializer.Deserialize(TextReader) 安全吗?

信息安全 。网 xml xxe
2021-09-08 21:53:19

.NET 方法XmlSerializer.Deserialize(TextReader)对 XML 漏洞(XXE、XmlBomb 等)是否安全?反序列化期间是否会处理 DTD?

我可以理解为什么XmlSerializer.Deserialize(XmlTextReader)如果XmlTextReader.DtdProcessing设置为DtdProcessing.Parse. 但是,当我们使用 TextReader 时,它是否也不安全?

1个回答

查看 XmlSerializer.Deserialize 代码

XmlSerializer.Deserialize(TextReader) 在内部调用另一个覆盖 - XmlSerializer.Deserialize(XmlTextReader) 并将 XmlResolver 设置为 null,因此它应该免受 XXE 攻击,但是如果您想完全禁用 dtd 处理,则应使用下面的代替。

var xmlTextReader = new XmlTextReader(xmlInput) { DtdProcessing = DtdProcessing.Ignore/Prohibit };
xmlSerializer.Deserialize(xmlTextReader);

但是,我认为完全禁用 DTD 处理没有任何好处(尤其是当它可能会影响您经过时间测试的代码时)。据我了解,只有两种 xml 攻击 - XXE 和 XmlBomb。

如前所述,XXE 应该是不可能的,因为 XmlResolver 设置为 null。

XmlBomb 也应该是不可能的,因为 MaxCharactersFromEntities 设置为有限值而不是 0(0 表示无限制)。如果您确实尝试了这种攻击,您将面临一个异常提示 - “输入文档已超出 MaxCharactersFromEntities 设置的限制”。而不是让应用程序崩溃或遭受 DoS 攻击。