分析Emissary 的反序列化漏洞 (CVE-2021-32634)
字数 1407 2025-08-05 08:19:38
Emissary 反序列化漏洞分析 (CVE-2021-32634) 教学文档
1. 漏洞概述
CVE-2021-32634 是 NSA 开发的 Emissary 项目中发现的两个不安全的反序列化漏洞。这些漏洞存在于 WorkSpaceClientEnqueueAction 和 WorkSpaceAdapter 类中,允许攻击者通过精心构造的序列化数据执行任意代码。
2. Emissary 项目简介
Emissary 是一个基于 P2P 的数据驱动工作流引擎,运行在异构的、可能广泛分散的、多层的 P2P 计算资源网络中。主要特点包括:
- 工作流不是预先计划的,而是随着数据发现而动态确定
- 高度可配置的框架
- 主要组件:
emissary.place.ServiceProviderPlace:用户扩展执行工作的基类emissary.core.MobileAgent:管理工作流的类emissary.directory.DirectoryPlace:管理可用服务及 P2P 网络连接
3. 漏洞详细分析
3.1 第一个漏洞 (WorkSpaceClientEnqueueAction)
漏洞位置:emissary.server.mvc.internal.WorkSpaceClientEnqueueAction 类
漏洞代码:
@POST
@Path("/WorkSpaceClientEnqueue.action")
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Produces(MediaType.TEXT_PLAIN)
public Response workspaceClientEnqueue(
@FormParam(WorkSpaceAdapter.CLIENT_NAME) String clientName,
@FormParam(WorkSpaceAdapter.WORK_BUNDLE_OBJ) String workBundleString) {
// 漏洞代码
final ObjectInputStream ois = new ObjectInputStream(
new ByteArrayInputStream(workBundleString.getBytes("8859_1")));
WorkBundle paths = (WorkBundle) ois.readObject();
success = place.enque(paths);
// ...
}
攻击向量:
- 通过认证的 POST 请求访问
/WorkSpaceClientEnqueue.action端点 - 表单参数
WorkSpaceAdapter.WORK_BUNDLE_OBJ(即tpObj) 被解码并反序列化 - 攻击者可构造恶意序列化数据实现 RCE
限制条件:
- 需要身份验证后才能利用
- 由于修复了 CSRF 漏洞,无法通过 CSRF 代表已登录用户利用
3.2 第二个漏洞 (WorkSpaceAdapter)
漏洞位置:emissary.server.mvc.adapters.WorkSpaceAdapter 类
漏洞代码:
public boolean inboundEnque(final HttpServletRequest req) throws NamespaceException {
final EnqueRequestBean bean = new EnqueRequestBean(req);
// ...
}
// EnqueRequestBean 构造函数
EnqueRequestBean(final HttpServletRequest req) {
setPlace(RequestUtil.getParameter(req, CLIENT_NAME));
setPaths(RequestUtil.getParameter(req, WORK_BUNDLE_OBJ));
}
// setPaths 方法中的反序列化
void setPaths(final String s) {
final ObjectInputStream ois = new ObjectInputStream(
new ByteArrayInputStream(s.getBytes("8859_1")));
this.paths = (WorkBundle) ois.readObject();
}
攻击向量:
- 通过调用
inboundEnque()方法并传入恶意序列化数据 - 目前代码中未直接调用此方法,属于"定时炸弹"漏洞
4. 漏洞利用条件
-
对于第一个漏洞:
- 攻击者需要有效的身份验证凭据
- 能够发送 POST 请求到
/WorkSpaceClientEnqueue.action - 能够控制
WORK_BUNDLE_OBJ参数
-
对于第二个漏洞:
- 需要应用程序在后续版本中启用
inboundEnque()方法调用 - 能够控制传入的
WORK_BUNDLE_OBJ参数
- 需要应用程序在后续版本中启用
5. 修复建议
- 避免使用 Java 原生序列化机制处理不受信任的数据
- 使用安全的替代方案,如:
- JSON 或 XML 等安全的数据交换格式
- 使用白名单验证反序列化的类
- 实现自定义的序列化/反序列化逻辑
- 对于必须使用 Java 序列化的场景:
- 实现
ObjectInputFilter限制可反序列化的类 - 使用加密签名验证序列化数据的完整性
- 实现
6. 漏洞影响
成功利用这些漏洞可能导致:
- 远程代码执行 (RCE)
- 服务器完全被控制
- 敏感数据泄露
- 进一步内网渗透