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

Nacos namespaces未授权访问【原理扫描】 复现与修复 前言作者简介我是笑霸final。个人主页 笑霸final的主页系列专栏java专栏如果文章知识点有错误的地方请指正和大家一起学习一起进步如果感觉博主的文章还不错的话点赞 关注 收藏目录一、问题发现二、问题复现三、修复问题3.1版本升级3.2 手动编译源码四、注意一、问题发现在生产环境中我们通常期望只要开启nacos.core.auth.enabledtrue所有敏感接口都应受权限控制。然而实测发现在 Nacos 3.0 的版本中即使已启用鉴权以下接口仍可被未登录用户直接访问/v1/console/namespaces/v2/console/namespace/list这会导致命名空间列表泄露进而可能辅助攻击者枚举配置如prod、test等环境标识。 注该行为目前未被 Nacos 官方定义为安全漏洞但在安全加固视角下属于鉴权覆盖不全的风险点。二、问题复现“测试环境、非攻击意图,仅用于学习。”当前问题版本 Nacos 低于3安全影响分析基于最小权限原则在 Nacos 2.x 版本中即使启用了nacos.core.auth.enabledtrue部分控制台接口如/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/?spm5238cd80.2677a16c.0.0.176ddcd05CVmLT支持直接升级且 主要操作是替换二进制包但是还是建议对比一下 mysql-schema.sql 确认表结构是否有变化。遗憾的是在 Nacos 3.0.0 以下的所有版本中该接口的鉴权缺失问题仍未被官方纳入修复范围。因此若需在旧版本中实现完整权限控制可考虑手动加固。源码如下3.2 手动编译源码仅用于学习不用于商业分发。v1接口在如下地方加上注解com.alibaba.nacos.console.controller.NamespaceController#getNamespacescom.alibaba.nacos.core.service.NamespaceOperationService#getNamespaceSecured(resourceAuthConstants.CONSOLE_RESOURCE_NAME_PREFIX namespaces, actionActionTypes.READ)或者 Secured(resourcenamespace:list, actionActionTypes.READ)v2接口在如下地方加上注解com.alibaba.nacos.console.controller.v2.NamespaceControllerV2#getNamespaceListSecured(resourceAuthConstants.CONSOLE_RESOURCE_NAME_PREFIX namespaces, actionActionTypes.READ, signTypeSignType.CONSOLE)注意上面添加的注解Secured(resourceAuthConstants.CONSOLE_RESOURCE_NAME_PREFIXnamespaces,actionActionTypes.READ,signTypeSignType.CONSOLE)resource的值其实需要改动不能以AuthConstants.CONSOLE_RESOURCE_NAME_PREFIX开头自己写成其他路径吧否者加上此注解后只有管理员账号才能访问了代码中有硬编码然后编译 命令mvn -Prelease-nacos -Dmaven.test.skiptrue clean install替换 nacos-server.jar** 验证**C:\Users\35886curl-XGEThttp://your-nacos-host:8848/nacos/v1/console/namespaces{timestamp:xxxxxxx,status:403,error:Forbidden,message:user not found!,path:xxxxxxxxxx}C:\Users\35886curl-XGEThttp://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 测试实例无任何外部网络暴露。当前也只是修复这个问题博主并没有真正用于生产环境。仅用于学习交流免责声明本文所有操作均在本地测试环境完成仅用于安全配置验证与学习。不鼓励、不支持对非授权系统进行任何形式的探测。生产环境请严格遵循最小权限原则。。