我有一个读取 java Serial 对象的 Java 程序,如果接收到,程序将运行一些业务逻辑。假设我没有 Java 程序源代码,我也没有任何关于 Serial 对象如何实现的文档。这是否可以制作一个fake
可以让程序执行的客户端?
谢谢。
假客户端必须知道预期类的名称,当找不到时,可以从异常消息中发现它;它的 serialVersionUID 同上;以及它的可序列化字段,这些字段同上是不可发现的。理论上可以从序列化流中发现这一点,但鉴于任何类都可以有自己的 writeObject() 或 writeExternalizable() 方法,它可以任意快速地变得任意复杂。
所以我不会因为这个偶然的风险而失去太多的睡眠。
您还可以在 JAR 上签名并密封相关包裹,这样可以消除特定风险。
OTOH,如果您对应用程序安全有真正的需求,那么您找错地方了。
我不完全按照你的想法。
您不能通过让应用程序反序列化对象来将新代码注入应用程序。为了让一个对象在程序中被 / 成功反序列化,该程序必须在类路径上有对象的类。如果没有,反序列化将失败。
另一方面,如果您以某种方式知道该程序已经使用了具有特定安全漏洞的特定类,并且您可以欺骗它以可以利用该漏洞的方式反序列化该类的实例,那么将会有一个忧虑。(我隐约记得这种方法已用于某些易受攻击的类,尽管我不记得任何细节。)
底线是具有安全意识的应用程序不应尝试反序列化可能来自不受信任的来源或可能在传输过程中被修改的对象。
假设 Java 序列化。
从理论上讲,您应该能够查看串行流并查看预期的类和字段。然后您可以及时构建一个类(如果ObjectInputStream
用于解析流,您可能需要每次重新开始读取流(不确定))。在自定义方法之后defaultWriteObject
/中写入的任何数据都无法可靠地解释。putFields
writeObject
在实践中,人们(包括 Java 库的作者)有时会有点调皮,会错过defaultWriteObject
/ putFields
。这意味着流实际上不是正确的格式。由于向后兼容性,现在修复它可能有点晚了。