细学《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方法中:

  1. 方法执行时会调用系统命令
  2. 命令参数来自lpcAllCom数组中的元素
  3. 若能控制传入参数,则可实现RCE

3.2 反序列化利用路径

通过反序列化攻击可以修改类属性值,主要利用方式包括:

  1. 利用Java反序列化机制修改lpcAllCom数组内容
  2. 控制UnixPrintServiceLookup执行恶意命令
  3. Hessian协议的特殊性使得利用更为容易

4. Hessian协议利用细节

4.1 Hessian协议特点

Hessian是一种二进制RPC协议,其反序列化机制具有以下特点:

  1. 不依赖Java原生序列化机制
  2. 支持跨语言调用
  3. 默认配置下反序列化限制较少

4.2 漏洞利用步骤

  1. 构造恶意UnixPrintServiceLookup对象
  2. 通过反射或其他方式修改lpcAllCom数组
  3. 将对象序列化为Hessian格式
  4. 发送给目标服务触发反序列化

5. 防御措施

5.1 修复方案

  1. 更新JDK补丁,修复UnixPrintServiceLookup的安全问题
  2. 限制Hessian反序列化的类白名单

5.2 RASP防护建议

  1. 监控UnixPrintServiceLookup类的初始化
  2. 拦截打印服务相关的系统命令执行
  3. 对反序列化过程进行深度检测

6. 研究资源

原始Slide获取地址:
https://github.com/knownsec/KCon/tree/master/2023

7. 总结

sun.print.UnixPrintServiceLookup类在Hessian反序列化场景下的安全问题展示了Java API中潜在的危险点。理解其原理对于防御类似攻击具有重要意义,特别是在使用Hessian等二进制RPC协议时需格外注意反序列化安全。

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系统上查找可用的打印机服务。其核心功能包括: 2.2 Windows对应实现 Windows系统上对应的实现类是 Win32PrintServiceLookup ,使用方法类似: 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协议时需格外注意反序列化安全。