不安全的反序列化
应用反序列化的不可信数据可能成为注入向量:不安全的反序列化如何导致任意代码执行或绕过。
快速解答
反序列化不可信数据之所以危险,是因为攻击者控制的字段会映射到对象上;可通过签名/白名单格式、类型白名单、不反序列化不可信输入以及严格校验来缓解。
定义
不安全的反序列化是对不可信数据的不安全重建,可让攻击者控制对象状态并实现任意代码执行或逻辑绕过。
它是什么
反序列化从序列化数据(Java/PHP/Python/.NET)中重建对象。当该数据不可信且反序列化器过于宽松时,攻击者可构造字节以创建攻击者选定的对象——从而导致 RCE 或访问控制/逻辑绕过。
为什么重要
此类利用往往仅凭一个构造的请求、无需身份认证即可完成,并且由于载荷是“合法数据”而绕过常规输入校验。这使其成为高影响且隐匿的关键性故障。
它如何工作
- Java/.NET/PHP “gadget”链:在重建时触发危险方法的序列化对象。
- 语言/格式混淆:内嵌原生对象语法的 JSON。
- 签名/类型绕过:猜测类型或接受多态名称。
检测
- 请求体为原生序列化的数据块(Java/PHP 序列化数据的 base64)。
- JSON 载荷中出现异常的类/类型名称。
- 所用运行时中已知的 CVE gadget。
缓解
- 不要反序列化不可信输入;如确有必要,使用严格的类型白名单。
- 优先使用带 schema 校验的安全格式(结构化 JSON/Protobuf),而非原生序列化。
- 当反序列化不可避免时,要求完整性校验(HMAC/签名);保持运行时已打补丁(见
guides:tool-cve-guide)。
调查
复现构造的数据块,确认运行时中可达的 gadget/CVE,从日志中界定受影响的服务范围,然后打补丁或改用安全的序列化器。