从XML或JSON反序列化不受信任的数据

时间:2017-11-17 16:28:47

标签: java json xml security serialization

我知道当一个对象使用标准" Serializable"序列化时,反序列化很容易受到攻击。界面(参考this)。但是,当对象序列化为XML或JSON时是否应用此漏洞?如果是的话,那会怎么样? 我无法真正看到这种情况会如何发生,所以我会很感激一些例子。 提前谢谢。

2 个答案:

答案 0 :(得分:2)

这非常具体取决于您用于反序列化对象的序列化库以及通常使用的参数,因此很难提供单个答案。

至于“是否有可能”,是的,这是可能的。这是XStream的示例漏洞,例如:

http://blog.diniscruz.com/2013/12/xstream-remote-code-execution-exploit.html

答案 1 :(得分:0)

围绕该主题的一般性聊天如下:

对坏数据的良好防御是使用允许编写完整规范的序列化技术。完全说明,我不仅指对象的结构/内容,而且可以指定每个值字段的有效范围,并指定每个列表/数组长度。

这样做的人并不多。 ASN.1,XSD(XML)和AFAIK JSON模式都可以具有值和大小约束。有趣的是,ASN.1和XSD架构之间存在正式定义的转换。

然后是你使用的工具是否真的对这些工具做了什么。我见过的大多数ASN.1工具都做得很好,并且还会告诉您是否正在尝试序列化不符合模式的对象。这个想法是坏的数据被拒绝作为它的读取(所以你永远不会在内存中得到一个无效的对象),你永远不会意外地发送/写入坏数据,即使你想。

某些XSD工具会执行约束检查。我认为xsd2code ++可以。来自Microsoft的AFAIK xsd.exe没有。

我对JSON的土地并不是那么熟悉,但据我所知,人们倾向于阅读整个对象,然后将它们与模式进行比较(这让我觉得“为时已晚”),而不是有一些自动生成的代码读取数据并检查它,因为它这样做。序列化对象时,程序员可以将结果与模式进行比较。

相比之下,Google协议缓冲区等技术根本不允许您进行约束检查。使用GPB,您可以做的最好的事情就是注释.proto文件并希望开发人员阅读它。

代码第一种方法,直接在C#/ Java中编写可序列化的类可以进行约束检查,但前提是你自己编写代码。

有用的旧技术

在我曾经使用的所有序列化中,到目前为止最严格的是ASN.1(使用不错的ASN.1工具)。它是旧的,非常电信化的(20世纪80年代后期,来自国际电联;如果你睡不着觉,请阅读他们的标准之一)。然而,尽管它的年龄很大,它仍然是最新的,不断发展。

例如,由于它是最初的日子,它已经发展了几种令人惊讶的现代电线格式; XML和JSON。恩,那就对了;你可以有一个ASN.1模式,它被编译成代码(C ++,Java,C#),它将串行化为XML或JSON数据格式(以及ASN.1更传统的二进制格式,如BER,uPER​​等)。

约束严格性和数据格式灵活性令人惊讶地有用;您可以从收音机接收一些超紧凑的位编码uPER消息,在读取时对其进行约束检查,然后将其作为JSON / XML传递到其他地方,而无需手动编写任何代码。

当谈到复杂的系统集成问题时,我找不到任何可以击败它的东西。

Useful old technology