如何构建反序列化攻击的利用链?

1 人参与

反序列化攻击的利用链,并不是把几个危险类简单拼接,而是让外部可控数据经过对象恢复流程,最终触发具有安全影响的操作。在授权测试中,分析重点应是证明“输入可控、触发可达、状态可传递、危险操作可执行”这几个条件能否同时成立,而不是看到反序列化接口就直接判定存在远程代码执行。

从入口追踪触发路径

首先确认不可信数据是否真正进入反序列化器,以及类型限制是否在对象恢复前生效。例如,ObjectInputStream.readObject() 返回后的业务类型强转,不能阻止此前已经发生的反序列化回调。入口是否需要认证、数据是否受到完整性保护,也会影响攻击者的实际控制范围。

随后分析对象恢复期间可能执行的方法。所谓 Gadget,是已有类中可被借用的行为片段;利用链则依赖这些片段之间能够衔接的调用关系。审计时需要逐段确认:哪个方法负责触发、它读取哪些对象属性、这些属性是否可控,以及调用结果能否传递到下一环。

类路径中存在某个类库,只能说明具备候选条件。对象状态不满足要求、类型不兼容、触发分支不可达,都可能让链条中断。

用证据连接每一环

可将链路按实际执行顺序记录为:输入入口、恢复回调、中间调用、危险操作。每一环都应标注可控字段、触发条件与阻断条件,尤其要区分“能够创建对象”和“能够触发目标行为”,二者不是同一件事。

验证应在隔离环境中进行,以无害、可观察的行为确认调用顺序,不以执行系统命令作为必要证明。若链条未触发,应定位第一个不成立的条件,而不是盲目替换载荷。

同一份链路分析也应指导修复:在入口前置类型白名单,用 ObjectInputFilter 约束允许恢复的对象,并限制对象图规模;再检查危险行为是否仍可由合法类型间接触达。真正有效的利用链分析,既说明路径如何成立,也能指出在哪个边界切断它。

参与讨论

1 条评论
  • 光子守墓人

    入口可控这点确实最容易被忽略

    回复