细学《Magic In Java API》(hessian部分)
字数 1239 2025-08-10 13:48:25
Magic In Java API:Hessian反序列化漏洞分析与利用
1. 前言
本文基于KCON2023议题《Magic In Java API》进行深入分析,重点探讨sun.print.UnixPrintServiceLookup类在Hessian反序列化中的安全问题。该漏洞可导致远程代码执行(RCE),是Java安全领域的重要研究课题。
2. API核心分析
2.1 UnixPrintServiceLookup类概述
sun.print.UnixPrintServiceLookup是Java打印服务API的一部分,用于在Unix/Linux系统上查找可用的打印机服务。其核心功能包括:
// 获取默认打印服务查找实例
PrintServiceLookup lookup = (PrintServiceLookup) PrintServiceLookup.lookupDefaultPrintService();
// 获取所有打印服务
PrintService[] printServices = lookup.getPrintServices();
2.2 Windows对应实现
Windows系统上对应的实现类是Win32PrintServiceLookup,使用方法类似:
PrintService[] printServices = PrintServiceLookup.lookupPrintServices(null, null);
3. 漏洞原理
3.1 关键问题点
UnixPrintServiceLookup在初始化时会创建一个PrinterChangeListener监听器线程,该线程会持续更新打印服务状态。关键漏洞点位于getAllPrinterNamesBSD方法中:
- 方法执行时会调用系统命令
- 命令参数来自
lpcAllCom数组中的元素 - 若能控制传入参数,则可实现RCE
3.2 反序列化利用路径
通过反序列化攻击可以修改类属性值,主要利用方式包括:
- 利用Java反序列化机制修改
lpcAllCom数组内容 - 控制
UnixPrintServiceLookup执行恶意命令 - Hessian协议的特殊性使得利用更为容易
4. Hessian协议利用细节
4.1 Hessian协议特点
Hessian是一种二进制RPC协议,其反序列化机制具有以下特点:
- 不依赖Java原生序列化机制
- 支持跨语言调用
- 默认配置下反序列化限制较少
4.2 漏洞利用步骤
- 构造恶意
UnixPrintServiceLookup对象 - 通过反射或其他方式修改
lpcAllCom数组 - 将对象序列化为Hessian格式
- 发送给目标服务触发反序列化
5. 防御措施
5.1 修复方案
- 更新JDK补丁,修复
UnixPrintServiceLookup的安全问题 - 限制Hessian反序列化的类白名单
5.2 RASP防护建议
- 监控
UnixPrintServiceLookup类的初始化 - 拦截打印服务相关的系统命令执行
- 对反序列化过程进行深度检测
6. 研究资源
原始Slide获取地址:
https://github.com/knownsec/KCon/tree/master/2023
7. 总结
sun.print.UnixPrintServiceLookup类在Hessian反序列化场景下的安全问题展示了Java API中潜在的危险点。理解其原理对于防御类似攻击具有重要意义,特别是在使用Hessian等二进制RPC协议时需格外注意反序列化安全。