apache-cayenne代码审计
字数 1533 2025-08-23 18:31:24

Apache Cayenne Hessian反序列化漏洞分析与利用

漏洞概述

Apache Cayenne是一个开源的Java持久化框架,提供了对象关系映射(ORM)功能。在4.1及之前版本中,存在Hessian反序列化漏洞,攻击者可以通过构造恶意序列化数据实现远程代码执行(RCE)。

漏洞分析

漏洞位置

漏洞主要存在于以下两个关键类中:

  1. org.apache.cayenne.rop.HessianROPSerializationService - 负责Hessian序列化/反序列化
  2. org.apache.cayenne.rop.ROPServlet#doPost() - 处理HTTP请求的入口点

漏洞原理

  1. ROPServlet从HTTP请求中直接获取输入流
  2. 将输入流传递给HessianROPSerializationService进行反序列化
  3. 在4.1及之前版本中,默认没有启用严格的白名单机制
  4. 攻击者可以构造包含恶意对象的Hessian序列化数据实现RCE

修复情况

  • 漏洞版本:Apache Cayenne 4.1及之前版本
  • 修复版本:4.2及之后版本
  • 修复方式:默认启用白名单机制,只允许org.apache.cayenne.*类的反序列化

漏洞利用

利用条件

  1. 目标系统运行Apache Cayenne 4.1或更早版本
  2. 目标系统暴露了/cayenne-service端点
  3. 目标系统未配置额外的认证或白名单

利用步骤

  1. 构造恶意序列化数据
  2. 向目标发送POST请求,Content-Type设置为application/hessian
  3. 包含基本的Authorization头(示例中使用的是Y2F5ZW5uZS11c2VyOnNlY3JldA==

利用代码分析

提供的EXP利用了以下关键组件:

  1. UnixPrintServiceLookup类 - 用于执行系统命令

    • 通过反射设置osnamelpcFirstComcmdIndex字段
    • lpcFirstCom数组包含要执行的命令
  2. MethodUtil.invoke - 用于反射调用方法

    • 通过反射调用getDefaultPrintService方法
  3. SwingLazyValue - 用于延迟执行

    • 包装MethodUtil.invoke调用
  4. UIDefaults - 用于构造恶意对象

    • 存储SwingLazyValue对象
  5. HashMap构造 - 通过反射构造特殊的HashMap结构

    • 使用HashMap$Node内部类构造恶意数据结构

完整利用流程

  1. 设置UnixPrintServiceLookup的命令执行参数
  2. 创建MethodUtil.invoke的反射调用链
  3. 将调用链包装到SwingLazyValue中
  4. 将SwingLazyValue放入UIDefaults
  5. 构造特殊的HashMap结构
  6. 使用HessianROPSerializationService序列化恶意HashMap
  7. 发送恶意序列化数据到目标服务

防御措施

  1. 升级到Apache Cayenne 4.2或更高版本

  2. 如果无法升级,可以:

    • 配置严格的白名单
    • 限制对/cayenne-service端点的访问
    • 在网络层面实施访问控制
  3. 监控和过滤Hessian序列化流量

  4. 使用Java安全管理器限制敏感操作

总结

该漏洞展示了Hessian反序列化在不加限制情况下的危险性。开发人员应当:

  1. 始终使用最新版本的库
  2. 对反序列化操作实施严格的白名单
  3. 避免直接反序列化不可信的输入
  4. 定期进行代码安全审计

对于安全研究人员,此案例也提醒我们在审计前应先检查目标组件的已知漏洞历史,避免重复劳动。

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反序列化在不加限制情况下的危险性。开发人员应当: 始终使用最新版本的库 对反序列化操作实施严格的白名单 避免直接反序列化不可信的输入 定期进行代码安全审计 对于安全研究人员,此案例也提醒我们在审计前应先检查目标组件的已知漏洞历史,避免重复劳动。