组件风险分析与修复指引:Spring Web5.2.23.RELEASE
字数 2018 2025-08-20 18:18:23
Spring Web 5.2.23.RELEASE 反序列化漏洞(CVE-2016-1000027)分析与修复指南
1. 漏洞概述
漏洞编号: CVE-2016-1000027
影响组件: Spring Framework中的spring-web模块
影响版本: Spring Framework < 6.0版本
漏洞类型: 反序列化漏洞
危害等级: 高危(可导致远程代码执行)
披露时间: 2016年
2. 漏洞背景
Spring Framework是美国威睿(Vmware)公司的一套开源的Java、JavaEE应用程序框架。该框架可帮助开发人员构建高质量的应用。
3. 技术背景
3.1 Spring HTTP Invoker
Spring HTTP Invoker是一种基于HTTP协议提供RPC(远程过程调用)的机制,它使用Java的对象序列化机制实现穿透防火墙或多系统之间的通信。
关键特点:
- 基于HTTP协议传输
- 使用Java原生序列化机制
- 主要用于系统间通信
4. 漏洞成因
4.1 漏洞位置
漏洞存在于以下两个类中:
HttpInvokerServiceExporterRemoteInvocationSerializingExporter
4.2 漏洞原因
在受影响版本中,上述类在处理序列化数据时未进行安全检测,当传输恶意序列化数据时,在反序列化过程中会执行恶意代码。
4.3 漏洞调用链
完整的漏洞调用链如下:
httpinvoker.HttpInvokerServiceExporter.handleRequest
httpinvoker.HttpInvokerServiceExporter.readRemoteInvocation
RemoteInvocationSerializingExporter.createObjectInputStream
RemoteInvocationSerializingExporter.doReadRemoteInvocation
RemoteInvocationSerializingExporter.readObject
5. 漏洞分析
5.1 关键代码分析
-
handleRequest方法:
- 接收客户端发送的请求数据
- 将response数据传输给readRemoteInvocation方法
-
readRemoteInvocation方法:
- 将POST数据分别传输给createObjectInputStream和doReadRemoteInvocation
- 创建对象输入流和执行远程调用
-
doReadRemoteInvocation方法:
- 直接执行readObject进行反序列化操作
- 无任何安全检测或限制
5.2 漏洞利用条件
- 系统使用了受影响版本的Spring Web模块
- HttpInvoker接口暴露在外部网络中
- 攻击者能够构造并发送恶意序列化数据
6. 漏洞复现
6.1 环境搭建
- 使用测试项目: artem-smotrakov/cve-2016-1000027-poc
- 启动服务器端应用
6.2 生成Payload
使用ysoserial工具生成恶意序列化数据:
java -jar ysoserial-all.jar CommonsCollections6 "calc" > CommonsCollections6.bin
注意: 根据实际情况可能需要尝试不同的Gadget链(如CommonsCollections3/6等)
6.3 发送恶意请求
构造HTTP请求:
- 方法: POST
- Content-Type: application/x-java-serialized-object
- 请求体: 上述生成的恶意序列化数据
成功利用后将执行系统命令(如弹出计算器)
7. 修复方案
7.1 官方修复方案
推荐方案: 升级到Spring Framework 6.0或更高版本
在6.0版本中:
- 完全废除了HttpInvokerServiceExporter类
- 从根本上解决了此安全问题
7.2 兼容性考虑
升级障碍:
- Spring Framework 6需要JPA 2.2或更高版本
- 旧组件如jBPM 6.2.0和Hibernate 4.2不兼容Spring 6
- Hibernate 4.2基于JPA 2.0,与Spring 6不兼容
7.3 手动修复方案
当无法升级时,可采用以下手动修复方式:
方案一: 添加执行限制
- 对序列化数据进行检测和限制
- 禁止已知恶意反序列化链
- 缺点: 可能存在绕过风险
方案二: 关闭HttpInvokerServiceExporter功能
- 如果业务未使用该功能,可直接关闭
- 修改handleRequest方法为空实现
具体步骤:
-
解压spring-web jar包:
jar -xf spring-web-5.3.22.jar -
修改HttpInvokerServiceExporter.java源码
-
重新编译:
javac -cp jar/* HttpInvokerServiceExporter.java -
替换原class文件并重新打包:
jar -cvfm0 spring-web-5.3.22_modified.jar META-INF/MANIFEST.MF ./
7.4 修复验证
- 加载修改后的jar包
- 确认HttpInvokerServiceExporter已被修改
- 尝试漏洞利用,确认无法触发
8. 总结与建议
- 漏洞本质: Spring为了方便跨系统调用使用了不安全的序列化机制
- 利用方式: 通过构造恶意反序列化数据实现RCE
- 修复优先级: 应尽快修复,特别是暴露在互联网的系统
- 长期建议:
- 评估升级到Spring 6的可能性
- 如无法升级,实施手动修复
- 限制不必要的外部接口暴露
9. 参考资源
- 官方Commit: 76964e1
- Pivotal官网: https://pivotal.io/
- 组件例外修复分析: CSDN文章
- 漏洞PoC: GitHub仓库