不安全反序列化
不安全反序列化 是什么?
不安全反序列化应用对不可信数据进行反序列化的漏洞,攻击者可借此实例化任意对象,常常实现远程代码执行。
当应用把序列化数据(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 标记为过时并予以移除。
● 示例
- 01
Java 应用对会话 Cookie 反序列化,classpath 中存在 Commons Collections,导致 RCE。
- 02
Python 服务对用户控制的字节运行 pickle.loads。
● 常见问题
不安全反序列化 是什么?
应用对不可信数据进行反序列化的漏洞,攻击者可借此实例化任意对象,常常实现远程代码执行。 它属于网络安全的 漏洞 分类。
不安全反序列化 是什么意思?
应用对不可信数据进行反序列化的漏洞,攻击者可借此实例化任意对象,常常实现远程代码执行。
如何防御 不安全反序列化?
针对 不安全反序列化 的防御通常结合技术控制与运营实践,详见上方完整定义。
不安全反序列化 还有哪些其他名称?
常见的别称包括: 不安全的反序列化, 对象反序列化漏洞。