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 环境搭建与漏洞复现
环境准备
-
获取漏洞版本代码:
git clone https://github.com/alibaba/Sentinel.git cd Sentinel git checkout release-1.8 -
导入项目到IDE:
- 推荐使用IntelliJ IDEA
- 导入项目后,确保使用release-1.8分支
-
启动服务:
- 运行主类:
sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/DashboardApplication.java - 默认服务端口: 8080
- 运行主类:
漏洞复现步骤
-
准备监听服务:
nc -lvvp 12345 -
构造恶意请求:
curl -XGET 'http://your-ip:8080/registry/machine?app=SSRF-TEST&appType=0&version=0&hostname=TEST&ip=your-ip:12345%23&port=0' -
观察结果:
- 如果漏洞存在,nc监听端口将接收到请求
- 注意
%23是URL编码的#字符,用于注释掉后续不需要的参数
0x02 漏洞深入分析
漏洞触发路径
-
入口点:
MachineRegistryController.java中的receiveHeartBeat方法- 路径:
/registry/machine - 方法签名:
@RequestMapping(value = "/registry/machine", method = RequestMethod.POST) public Result<RegistryInfo> receiveHeartBeat(...)
- 路径:
-
参数处理流程:
- 对
port参数进行基本校验(需要正整数) - 对
ip参数仅进行非空和长度(小于128)校验 - 构造
machineInfo对象并传入addMachine方法
- 对
-
MetricFetcher组件:
MetricFetcher.java的start方法在构造时被调用- 调用链:
start()→fetchAllApp()→doFetchAppMetric()→fetchOnce() - 在
fetchOnce方法中,machineInfo的IP和端口被取出并拼接到URL中
-
SSRF触发点:
String url = "http://" + machine.getIp() + ":" + machine.getPort() + "/" + METRIC_URL_PATH + "?startTime=" + startTime + "&endTime=" + endTime + "&refetch=" + refetch;- 由于没有对IP地址进行严格校验,攻击者可构造恶意IP
- 使用
#可以注释掉后续拼接的参数
关键问题
- 认证缺失: 接口无需认证即可访问
- 输入验证不足:
- 仅检查IP长度和非空,未验证IP格式合法性
- 允许特殊字符如
#通过
- URL拼接不安全: 直接拼接用户输入到请求URL中
0x03 漏洞修复方案
官方修复方式
- 代码位置:
MachineRegistryController.java - 修复方法: 使用
IPAddressUtil工具类进行IP合法性校验if (!IPAddressUtil.isValidIPv4(ip) && !IPAddressUtil.isValidIPv6(ip)) { return Result.ofFail(-1, "Invalid ip: " + 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报告
附录: 完整漏洞利用流程示意图
攻击者请求 -> /registry/machine接口 -> MachineRegistryController ->
构造machineInfo -> MetricFetcher获取指标 -> 拼接恶意URL ->
发起SSRF请求 -> 攻击者控制的服务器
总结
CVE-2021-44139是一个典型的SSRF漏洞,其根本原因在于输入验证不充分和URL构建不安全。通过分析这个漏洞,我们可以学习到:
- 即使简单的参数也需要严格验证
- 认证缺失会放大其他漏洞的影响
- URL构建必须谨慎处理
- 开源组件的安全同样需要重视
对于开发人员和安全研究人员,这个案例提供了宝贵的经验教训,强调了安全编码实践的重要性。