apache-cayenne代码审计
字数 1533 2025-08-23 18:31:24
Apache Cayenne Hessian反序列化漏洞分析与利用
漏洞概述
Apache Cayenne是一个开源的Java持久化框架,提供了对象关系映射(ORM)功能。在4.1及之前版本中,存在Hessian反序列化漏洞,攻击者可以通过构造恶意序列化数据实现远程代码执行(RCE)。
漏洞分析
漏洞位置
漏洞主要存在于以下两个关键类中:
org.apache.cayenne.rop.HessianROPSerializationService- 负责Hessian序列化/反序列化org.apache.cayenne.rop.ROPServlet#doPost()- 处理HTTP请求的入口点
漏洞原理
ROPServlet从HTTP请求中直接获取输入流- 将输入流传递给
HessianROPSerializationService进行反序列化 - 在4.1及之前版本中,默认没有启用严格的白名单机制
- 攻击者可以构造包含恶意对象的Hessian序列化数据实现RCE
修复情况
- 漏洞版本:Apache Cayenne 4.1及之前版本
- 修复版本:4.2及之后版本
- 修复方式:默认启用白名单机制,只允许
org.apache.cayenne.*类的反序列化
漏洞利用
利用条件
- 目标系统运行Apache Cayenne 4.1或更早版本
- 目标系统暴露了
/cayenne-service端点 - 目标系统未配置额外的认证或白名单
利用步骤
- 构造恶意序列化数据
- 向目标发送POST请求,Content-Type设置为
application/hessian - 包含基本的Authorization头(示例中使用的是
Y2F5ZW5uZS11c2VyOnNlY3JldA==)
利用代码分析
提供的EXP利用了以下关键组件:
-
UnixPrintServiceLookup类 - 用于执行系统命令
- 通过反射设置
osname、lpcFirstCom和cmdIndex字段 lpcFirstCom数组包含要执行的命令
- 通过反射设置
-
MethodUtil.invoke - 用于反射调用方法
- 通过反射调用
getDefaultPrintService方法
- 通过反射调用
-
SwingLazyValue - 用于延迟执行
- 包装MethodUtil.invoke调用
-
UIDefaults - 用于构造恶意对象
- 存储SwingLazyValue对象
-
HashMap构造 - 通过反射构造特殊的HashMap结构
- 使用HashMap$Node内部类构造恶意数据结构
完整利用流程
- 设置UnixPrintServiceLookup的命令执行参数
- 创建MethodUtil.invoke的反射调用链
- 将调用链包装到SwingLazyValue中
- 将SwingLazyValue放入UIDefaults
- 构造特殊的HashMap结构
- 使用HessianROPSerializationService序列化恶意HashMap
- 发送恶意序列化数据到目标服务
防御措施
-
升级到Apache Cayenne 4.2或更高版本
-
如果无法升级,可以:
- 配置严格的白名单
- 限制对/cayenne-service端点的访问
- 在网络层面实施访问控制
-
监控和过滤Hessian序列化流量
-
使用Java安全管理器限制敏感操作
总结
该漏洞展示了Hessian反序列化在不加限制情况下的危险性。开发人员应当:
- 始终使用最新版本的库
- 对反序列化操作实施严格的白名单
- 避免直接反序列化不可信的输入
- 定期进行代码安全审计
对于安全研究人员,此案例也提醒我们在审计前应先检查目标组件的已知漏洞历史,避免重复劳动。