Skip to content
Vol. 1 · Ed. 2026
CyberGlossary
Entry № 603

不安全反序列化

审核人Cybersecurity entrepreneur & security researcher

不安全反序列化 是什么?

不安全反序列化应用对不可信数据进行反序列化的漏洞,攻击者可借此实例化任意对象,常常实现远程代码执行。


当应用把序列化数据(Java/PHP/Python/.NET 的二进制格式、YAML 或带类型元信息的 JSON)还原为对象时,反序列化器可能会调用构造函数、魔术方法或 gadget 链 —— 也就是一系列已加载的方法,当它们被串联起来时,会抵达 Runtime.exec 这类危险的调用点。在输入不可信的情况下,攻击者构造的 payload 会在反序列化过程中触发这种行为,从而导致远程代码执行(RCE)、认证绕过、文件写入或拒绝服务(DoS)。

最典型的案例是 CVE-2015-4852:Oracle WebLogic 通过 T3 协议在 TCP 7001 端口不安全地反序列化未经认证的 Java 对象,而当 classpath 中存在 Apache Commons Collections 时,ysoserial 工具便可生成一条可用的 RCE gadget 链。Oracle 的第一版补丁采用了脆弱的类黑名单,而没有从根本上禁止对不可信数据的反序列化。类似的缺陷也出现在 Apache Struts(CVE-2017-9805,经由 XStream)以及大量 PHP unserialize() 对象注入漏洞中。在 OWASP 的榜单中,该类别从 A8:2017 并入了更宽泛的 A08:2021 —— 软件与数据完整性失效

flowchart LR
  A[攻击者] -->|构造的序列化数据块<br/>cookie / T3 / API 请求体| APP[应用]
  APP -->|反序列化不可信字节| DZ[反序列化器]
  DZ -->|实例化对象<br/>调用魔术方法| GC[classpath 上的<br/>gadget 链]
  GC -->|抵达危险调用点| RCE[Runtime.exec / 文件写入]
  APP -. 防御 .-> SIG[签名 payload +<br/>类型白名单]
  SIG -.->|拒绝未知类型| DROP[丢弃]

防御措施:绝不对不可信数据进行反序列化;优先使用无类型恢复、绑定 schema 的格式(纯 JSON、Protobuf);对序列化 payload 进行签名或 HMAC;对可反序列化的类型强制执行严格白名单;并保持运行时更新 —— 现代 .NET 已将 BinaryFormatter 标记为过时并予以移除。

示例

  1. 01

    Java 应用对会话 Cookie 反序列化,classpath 中存在 Commons Collections,导致 RCE。

  2. 02

    Python 服务对用户控制的字节运行 pickle.loads。

常见问题

不安全反序列化 是什么?

应用对不可信数据进行反序列化的漏洞,攻击者可借此实例化任意对象,常常实现远程代码执行。 它属于网络安全的 漏洞 分类。

不安全反序列化 是什么意思?

应用对不可信数据进行反序列化的漏洞,攻击者可借此实例化任意对象,常常实现远程代码执行。

如何防御 不安全反序列化?

针对 不安全反序列化 的防御通常结合技术控制与运营实践,详见上方完整定义。

不安全反序列化 还有哪些其他名称?

常见的别称包括: 不安全的反序列化, 对象反序列化漏洞。

相关术语

另见