Nacos namespaces未授权访问【原理扫描】 复现与修复
前言:
👏作者简介:我是笑霸final。
📝个人主页: 笑霸final的主页
📕系列专栏:java专栏
📧如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀
🔥如果感觉博主的文章还不错的话,👍点赞👍 + 👀关注👀 + 🤏收藏🤏
目录
- 一、问题发现
- 二、问题复现
- 三、修复问题
- 3.1版本升级
- 3.2 手动编译源码
- 四、注意
一、问题发现
在生产环境中,我们通常期望:只要开启
nacos.core.auth.enabled=true,所有敏感接口都应受权限控制。然而实测发现,在 Nacos < 3.0 的版本中,即使已启用鉴权,以下接口仍可被未登录用户直接访问:
/v1/console/namespaces/v2/console/namespace/list这会导致命名空间列表泄露,进而可能辅助攻击者枚举配置(如
prod、test等环境标识)。💡 注:该行为目前未被 Nacos 官方定义为安全漏洞,但在安全加固视角下,属于鉴权覆盖不全的风险点。
二、问题复现
“
测试环境、非攻击意图,仅用于学习。”
当前问题版本 Nacos 低于3
安全影响分析(基于最小权限原则)
在 Nacos 2.x 版本中,即使启用了
nacos.core.auth.enabled=true,部分控制台接口(如/v1/console/namespaces、/v2/console/namespace/list)未纳入统一权限体系。
这可能导致:
- 命名空间列表对外暴露;
- 结合其他信息(如命名空间名称
prod、uat),辅助进行配置路径猜测;- 若配合其他配置泄露风险,可能扩大攻击面。
💡 注意:此行为属于鉴权覆盖不全,并非官方认定的安全漏洞。但在高安全要求场景下,建议主动收敛此类信息暴露。
1、确认nacos开启了鉴权。访问nacos查看是否需要登录。
2 尝试未授权获取 Namespace 列表
“以下操作请在本地测试环境中进行,禁止对非授权系统执行”。
curl -X GET "http://<ip>:8848/nacos/v1/console/namespaces" 或者 curl -X GET "http://<ip>:8848/nacos/v2/console/namespace/list"
可见我的v1接口直接绕过了鉴权。
三、修复问题
3.1版本升级
根据时间,在nacos官网上,查询版本,发现版本2.4.3
打开2.4.3的升级手册:https://nacos.io/docs/v2.4/manual/admin/upgrading/?spm=5238cd80.2677a16c.0.0.176ddcd05CVmLT
支持直接升级,且 主要操作是替换二进制包
但是还是建议对比一下 mysql-schema.sql 确认表结构是否有变化。
遗憾的是,在 Nacos 3.0.0 以下的所有版本中,该接口的鉴权缺失问题仍未被官方纳入修复范围。因此,若需在旧版本中实现完整权限控制,可考虑手动加固。
源码如下
3.2 手动编译源码
仅用于学习,不用于商业分发。
v1接口在如下地方加上注解
com.alibaba.nacos.console.controller.NamespaceController#getNamespaces
com.alibaba.nacos.core.service.NamespaceOperationService#getNamespace
@Secured(resource=AuthConstants.CONSOLE_RESOURCE_NAME_PREFIX +"namespaces", action=ActionTypes.READ)或者 @Secured(resource="namespace:list", action=ActionTypes.READ)
v2接口在如下地方加上注解
com.alibaba.nacos.console.controller.v2.NamespaceControllerV2#getNamespaceList
@Secured(resource=AuthConstants.CONSOLE_RESOURCE_NAME_PREFIX +"namespaces", action=ActionTypes.READ, signType=SignType.CONSOLE)注意上面添加的注解
@Secured(resource=AuthConstants.CONSOLE_RESOURCE_NAME_PREFIX+"namespaces",action=ActionTypes.READ,signType=SignType.CONSOLE)resource的值其实需要改动,不能以AuthConstants.CONSOLE_RESOURCE_NAME_PREFIX开头,自己写成其他路径吧,否者加上此注解后只有管理员账号才能访问了(代码中有硬编码)
然后编译 命令mvn -Prelease-nacos -Dmaven.test.skip=true clean install,
替换 nacos-server.jar
** 验证**
C:\Users\35886>curl-XGET"http://<your-nacos-host>:8848/nacos/v1/console/namespaces"{"timestamp":"xxxxxxx","status":403,"error":"Forbidden","message":"user not found!","path":"xxxxxxxxxx"}C:\Users\35886>curl-XGET"http://<your-nacos-host>:8848/nacos/v2/console/namespace/list"{"timestamp":"xxxxxxxx","status":403,"error":"Forbidden","message":"user not found!","path":"xxxxxxnamespace/list"}C:\Users\35886>成功!!!!!
四、注意
注意:所有截图均来自单机部署的 Nacos 测试实例,无任何外部网络暴露。当前也只是修复这个问题,博主并没有真正用于生产环境。仅用于学习交流
免责声明::本文所有操作均在本地测试环境完成,仅用于安全配置验证与学习。不鼓励、不支持对非授权系统进行任何形式的探测。生产环境请严格遵循最小权限原则。。
