反序列化漏洞因接受不可信来源的序列化对象而产生,攻击者可构造恶意对象链触发任意代码执行、权限提升或拒绝服务。Java、PHP、Python、Ruby 均有过因此产生的严重 RCE 漏洞。

| 标志性工具 | ysoserial(2015,Lawrence & Frohoff) |
| OWASP 2017 排名 | A8 不安全反序列化 |
| 典型受害系统 | WebSphere、JBoss、Jenkins(2015 批量漏洞) |
序列化把对象状态转换为字节流,反序列化则逆向还原。问题在于还原过程中,语言运行时会调用对象的特定方法(Java 的 readObject、PHP 的 __wakeup/__destruct、Python pickle 的 __reduce__),攻击者可在这些方法内嵌入恶意逻辑。
更狡猾的是「Gadget Chain」:攻击者不一定需要目标代码中有直接危险的方法,可以把应用程序依赖的类库中多个看似无害的类串联起来——A 类的 readObject 调用 B 类的某个方法,B 触发 C,链条末端执行 Runtime.exec()。2015 年,Gabriel Lawrence 和 Chris Frohoff 发布的 ysoserial 工具收录了多条针对 Apache Commons Collections 的 Gadget Chain,揭示了 WebSphere、JBoss、Jenkins 等广泛部署的 Java 中间件均受影响。
Apache Struts2 的多个高危 RCE(如 CVE-2017-5638,被用于 Equifax 2017 年泄露 1.43 亿用户数据)虽然是 OGNL 表达式注入而非典型反序列化,但同属「不可信输入触发运行时解析」的同一类思路。[1]
最彻底的方案是不反序列化不可信数据,改用 JSON/Protobuf 等数据格式,只传输数据而非对象结构。如果必须使用序列化,应在反序列化前验证签名或 HMAC(但这需要在反序列化发生之前完成,许多框架做不到)。
Java 生态可使用 SerialKiller、NotSoSerial 等黑名单库拦截危险类,JEP 290(Java 9 引入)允许配置反序列化过滤器。但黑名单防御本质上是追猫鼠游戏——ysoserial 每次更新都可能带来新链条。隔离网络、最小权限原则、对反序列化操作的详细日志监控是必要的补充。

| 标志性工具 | ysoserial(2015,Lawrence & Frohoff) |
| OWASP 2017 排名 | A8 不安全反序列化 |
| 典型受害系统 | WebSphere、JBoss、Jenkins(2015 批量漏洞) |
登录 后参与讨论
暂无讨论,来发表第一条评论吧