【问题标题】:Parsing data from untrusted Java serialized object从不受信任的 Java 序列化对象解析数据
【发布时间】:2016-07-06 19:22:43
【问题描述】:

我需要解析不受信任的 Java 序列化对象。数据作为字节数组提供给我(在某个时候由 ObjectOutputStream 写入)。

我确实想简单地调用 ObjectInputStream.readObject() 和/或加载实际对象。我正在寻找一种安全解析字节并获取字段名称和值的方法。

--

在查看了用于反序列化对象的 ObjectInputStream procedure 之后,这是我迄今为止的尝试的一个小总结。

我尝试根据预期的流常量递归地提取字段类型/名称(作为 unicode 字符串)。我最终得到一个字段名称列表,其值应按顺序出现在字节数组中。我对这种方法感到不安,因为它可能是错误的。特别适用于似乎是单独的序列化协议,然后是 HashMap、ArrayList 等。但如果我能找到一种方法来读取表示字段值的字节,它可能会起作用:

我可以尝试根据大小/偏移量读取和存储原语,但是当我遇到我的第一个对象时,它会变得有点复杂——不再有明确的方法来区分哪些字节与哪些值相关联(没有以 ObjectInputStream 可能的方式实际加载对象?)。

--

任何人都可以建议一个我显然已经过去的潜在解决方案,或者一个可以帮助解析序列化数据而不加载对象的可信库吗?

感谢您的阅读,感谢所有 cmets/建议!!!如果有不清楚的地方,我深表歉意,如果您能容忍我,我很乐意澄清。

【问题讨论】:

  • 那么你想通过流数据读取,并弄清楚类结构和对应的数据?
  • @K139 没错

标签: java serialization object-serialization


【解决方案1】:

原则上你不能这样做。任何 Java 类都可以通过仅在反序列化期间调用的代码接管自己的序列化并将任意数据写入只有它知道如何解析和重构的流。

【讨论】:

  • 您对提问者有什么建议吗?他们如何实现从不受信任的序列化数据中读取部分或全部字段的目标,而不必将其应用程序暴露给基于反序列化的利用? owasp.org/index.php/Deserialization_of_untrusted_data 的示例部分有一个很好的理由说明即使使用他们自己的自定义类也这样做是危险的。我进行了快速搜索,但找不到任何库,但我不得不猜测其他人也遇到了同样的问题。
  • @JonPeterson 我的回答指出,提问者想要的东西原则上是不可能的。因此,不可能就如何做到这一点提供建议。这肯定很明显吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-19
  • 2014-12-09
  • 1970-01-01
  • 2011-05-20
  • 2013-10-03
  • 2017-01-07
  • 1970-01-01
相关资源
最近更新 更多