Nacos namespaces未授权访问【原理扫描】 复现与修复

📅 2026/7/10 21:57:09 👁️ 阅读次数 📝 编程学习
Nacos namespaces未授权访问【原理扫描】 复现与修复

前言
👏作者简介:我是笑霸final。
📝个人主页: 笑霸final的主页
📕系列专栏:java专栏
📧如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀
🔥如果感觉博主的文章还不错的话,👍点赞👍 + 👀关注👀 + 🤏收藏🤏

目录

  • 一、问题发现
  • 二、问题复现
  • 三、修复问题
    • 3.1版本升级
    • 3.2 手动编译源码
  • 四、注意

一、问题发现

在生产环境中,我们通常期望:只要开启nacos.core.auth.enabled=true,所有敏感接口都应受权限控制

然而实测发现,在 Nacos < 3.0 的版本中,即使已启用鉴权,以下接口仍可被未登录用户直接访问:

  • /v1/console/namespaces
  • /v2/console/namespace/list

这会导致命名空间列表泄露,进而可能辅助攻击者枚举配置(如prodtest等环境标识)。

💡 注:该行为目前未被 Nacos 官方定义为安全漏洞,但在安全加固视角下,属于鉴权覆盖不全的风险点

二、问题复现

测试环境、非攻击意图,仅用于学习。
当前问题版本 Nacos 低于3

安全影响分析(基于最小权限原则)

在 Nacos 2.x 版本中,即使启用了nacos.core.auth.enabled=true,部分控制台接口(如/v1/console/namespaces/v2/console/namespace/list未纳入统一权限体系
这可能导致:

  • 命名空间列表对外暴露;
  • 结合其他信息(如命名空间名称produat),辅助进行配置路径猜测;
  • 若配合其他配置泄露风险,可能扩大攻击面。

💡 注意:此行为属于鉴权覆盖不全,并非官方认定的安全漏洞。但在高安全要求场景下,建议主动收敛此类信息暴露。

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 测试实例,无任何外部网络暴露。当前也只是修复这个问题,博主并没有真正用于生产环境。仅用于学习交流

免责声明::本文所有操作均在本地测试环境完成,仅用于安全配置验证与学习。不鼓励、不支持对非授权系统进行任何形式的探测。生产环境请严格遵循最小权限原则。。