Nacos未授权新建用户漏洞(/nacos/v1/auth/users)
目录
一、问题
二、分析漏洞成因及影响范围
三、漏洞修复方案
四、应用修复方案到实际环境中
五、总结
一、问题
1、/nacos/v1/auth/users
漏洞主要涉及未授权访问和权限绕过两个方面。未授权访问通常是由于配置不当或安全机制缺失导致的,而权限绕过则可能是利用了默认密钥、Header注入等手段。
2、存在漏洞的接口验证:通过漏洞未授权新建用户漏洞,该漏洞是代码缺陷,导致可以未授权添加任意用户登录到后台管理系统,导致服务器被控制,或服务器内部资料泄露等等,导致网站处于极度不安全状态。
二、分析漏洞成因及影响范围
1、成因
- 默认JWT密钥:在Nacos <= 2.2.0版本中,JWT密钥默认且固定,攻击者可以通过伪造JWT来绕过身份验证。
- User-Agent绕过:在Nacos的某些版本中,如果请求的User-Agent被设置为"Nacos-Server",则不进行身份验证,允许未授权访问。
2、影响范围
- 影响版本:根据提供的信息,/nacos/v1/auth/users漏洞主要影响Nacos的多个版本,包括但不限于0.1.0到2.2.0。
- 潜在影响:攻击者可以利用这些漏洞创建用户、获取用户列表、敏感配置信息等,进而对系统进行进一步攻击。
三、漏洞修复方案
1、官方修复方案
- 更新至最新版本:官方通常会在新版本中修复已知的安全漏洞。建议将Nacos升级到最新版本(如2.2.0.1或以上),这里我下载的目前最新的2.4.3版本。
- 首先第一步查询下项目之间的版本对照(nacos、Spring Boot 、Spring Cloud Alibaba),不然后期会出现各种无法预测的版本冲突问题,,可以参考链接:版本说明 · alibaba/spring-cloud-alibaba Wiki · GitHub
-
下载nacos,可以通过下方下载地址下载对应的版本:发布历史 | Nacos 官网
-
将下载之后的文件解压
-
修改配置文件
(1)打开conf下的application.properties
- 配置数据库
- 配置nacos账号密码
- 修改token的密钥
- 关闭User-Agent绕过:如果可能,修改Nacos的认证逻辑,确保不再基于User-Agent进行身份验证。
##修改conf/application.properties文件
#使用cluster模式需要数据库配置
db.url=jdbc:mysql://192.168.1.128:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user=ggny
db.password=Ggny
#新版本默认开启及鉴权验证
nacos.core.auth.enabled=true
# 必须设置
# 用于在请求、登录 nacos 时,可通过验证
nacos.core.auth.server.identity.key=nacos
nacos.core.auth.server.identity.value=nacos
# 设置用于生成token的密钥, 需要原文不低于32位的Base64加密的结果,
nacos.core.auth.plugin.nacos.token.secret.key=asdhjhjhjhjhHKJHKkhjkHKJHKhkhkHKjkjKHKhHK=
#user-agent 新版本默认也是关闭的
nacos.core.auth.enable.userAgentAuthWhite=false
(2)打开conf下的cluster.conf 配置nacos服务器ip端口,如果是单机只配置一个ip
192.168.1.112:8848
192.168.1.189:8848
6.启动nacos服务
启动nacos有两种模式,我直接使用cluster模式,启动后访问链接:http://localhost:8848/nacos
(1)windows:bin目录下的startup.cmd文件,修改set MODE="cluster",直接双击启动
(2)linux:bin目录下的startup.sh文件,启动: sh bin/startup.sh -m cluster
7.构建springboot项目,使用的maven进行构建配置对应版本
这里可以根据前边写的nacos版本,找官方给出的对应nacos组件版本,这里我使用的nacos2.4.3版本,由于刚发布,还没有对应版本,但是不用担心,只要使用2.0以上的对应版本,一般都没问题,这里我选择了Spring Cloud Alibaba Version:2.2.9.RELEASE 版本,这是可以根据你目前的springboot版本来决定的,比如我的springboot版本是2.3.12.RELEASE,那样我用Spring Cloud Alibaba Version:2.2.9.RELEASE 版本就可以。这两个版本尽量使一定要对应的,但可以不跟nacos服务器版本对应。如果Spring Cloud Alibaba Version版本和springboot版本相差太多,系统启动会报403错误,系统可能无法启动。
<!-- nacos服务注册/发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.9.RELEASE</version>
</dependency>
<!--// 配置中心-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.2.9.RELEASE</version>
</dependency>
8.springboot配置文件配置
主要是在原有的nacos配置中加入了用户名密码配置,用于鉴权验证,这样每次访问naocs服务器都必须要进行用户名密码验证,这样就杜绝了未授权访问用户漏洞
spring.application.name=AutoControlServer
spring.profiles.active =dev
spring.cloud.nacos.discovery.server-addr= localhost:8848
spring.cloud.nacos.discovery.namespace=545feab4-3a6f-4b54-b371-df7ed4fede7f
#加入了用户名密码验证配置
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
spring.cloud.nacos.config.prefix=AutoControlServer
spring.cloud.nacos.config.server-addr=localhost:8848
spring.cloud.nacos.config.file-extension =yml
spring.cloud.nacos.config.namespace=545feab4-3a6f-4b54-b371-df7ed4fede7f
#加入了用户名密码验证配置
spring.cloud.nacos.config.username=nacos
spring.cloud.nacos.config.password=nacos
2、在原版本上修改相关配置
第二种方案,是我用的方案,就是不升级nacos,但通过更改nacos配置文件,实现升级版本一样的漏洞修复方式。之所以这样主要是因为我比较懒,因为升级到很高版本的nacos,对应系统中的nacos版本也要升级,那对应的springboot版本也要升级才行。我目前springboot版本2.1.1.RELEASE,对应的Spring Cloud Alibaba Version:2.1.2.RELEASE版本,对应nacos1.1.4版本,完全达不到要求(至少要2.0以上才行)。而我并不想升级springboot版本,因为升级springboot版本意味着要升级很多依赖jar包,可能会产生各种版本兼容性问题。所以目前我并不想升级。
1、nacos版本,就算你不想升级,也必须保证最好是nacos2.0以上,因为版本太低了,可能账号密码验证的配置以及功能逻辑,低版本并没有实现。我这里用的就是NACOS2.0.0,他有我需要的配置,正常来说它的对应的springboot版本2.3.12.RELEASE,对应的Spring Cloud Alibaba Version:2.2.7.RELEASE版本,但是实际上使用springboot版本2.1.1.RELEASE,对应的Spring Cloud Alibaba Version:2.1.2.RELEASE版本,也是没有问题的,nacos跟这两个的版本是可以不用一致的,但是版本最好别相差太大。
5、修改配置文件
以为第一种方案已经把如何配置启动等方式写的非常详细,第二种方案中,我只写不一样的地方。
低版本的nacos中,鉴权验证默认是关闭,需要手动开启,nacos用户名密码默认也是空的,这些配置修改以后,就可以实现最新版本nacos一样的效果,修复用户鉴权漏洞。
- 开启及鉴权验证
- 设置nacos用户名密码
- 设置生成新的token秘钥
- 关闭user-agent
##修改conf/application.properties文件
#开启及鉴权验证
nacos.core.auth.enabled=true
# 必须设置
# 用于在请求、登录 nacos 时,可通过验证
nacos.core.auth.server.identity.key=nacos
nacos.core.auth.server.identity.value=nacos
# 设置用于生成token的密钥, 需要原文不低于32位的Base64加密的结果,
nacos.core.auth.plugin.nacos.token.secret.key=asdhjhjhjhjhHKJHKkhjkHKJHKhkhkHKjkjKHKhHK=
#user-agent 关闭
nacos.core.auth.enable.userAgentAuthWhite=false
7.构建springboot项目,使用的maven进行构建配置对应版本
这里前前已经说明,根据我自己的springboot版本2.1.1.RELEASE,引入对应的Spring Cloud Alibaba Version:2.1.2.RELEASE版本。
<!--// 服务发现(注册中心)-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.1.2.RELEASE</version>
</dependency>
<!--// 配置中心-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.1.2.RELEASE</version>
</dependency>
8.springboot配置文件配置
跟第一种方案一样,在原有的nacos配置上加入了用户名密码验证配
spring.application.name=AutoControlServer
spring.profiles.active =dev
spring.cloud.nacos.discovery.server-addr= localhost:8848
spring.cloud.nacos.discovery.namespace=545feab4-3a6f-4b54-b371-df7ed4fede7f
#加入了用户名密码验证配置
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
spring.cloud.nacos.config.prefix=AutoControlServer
spring.cloud.nacos.config.server-addr=localhost:8848
spring.cloud.nacos.config.file-extension =yml
spring.cloud.nacos.config.namespace=545feab4-3a6f-4b54-b371-df7ed4fede7f
#加入了用户名密码验证配置
spring.cloud.nacos.config.username=nacos
spring.cloud.nacos.config.password=nacos
四、安全漏洞验证
这样服务启动后就可以注册到nacos上了,并且解决了安全漏洞,再想不进行验证创建访问用户是不可能的了。
五、总结
针对这个漏洞的解决方案,主要nacos版本升级后,在配置文件中开启了鉴权验证,只要你的nacos开启了鉴权验证,并且对应的系统程序中,nacos客户端依赖版本可以跟服务端匹配,并且修改相应的配置文件,就可以解决这个问题。