vlambda博客
学习文章列表

Nacos出现重大安全漏洞,开源项目险遭脱库



主要是关于 Nacos 中一个绕过安全认证直接获取微服务项目配置文件的 安全漏洞。

Nacos安全漏洞的issue
https://github.com/alibaba/nacos/issues/4593

漏洞起源

可能有些小伙伴还不太清楚 Nacos 是啥,它是 SpringCloud Alibaba 微服务架构中的一个组件,主要作用是服务注册和发现以及分布式配置管理。也就是说我们项目的配置都在 Nacos 中存储,里面记录着 MySQL、Redis 等数据库的账号和密码,如果用户能够进入到 Nacos 中,也相当于我们的数据已经在网上裸奔了。

目前 Nacos 官方仓库对该 issue 做了脱敏处理,issue 提主的描述也已经被删除了,但是从 issue 的回答中,陌溪能还原这个安全漏洞的一些描述。

用户发现通过设置请求头:User-Agent: Nacos-Server,就可以绕过Nacos的权限校验,而直接获取到项目的所有配置文件信息,然后题主建议Nacos官方立即对这个问题进行修复。

然后 Nacos 项目的开发者认为,这不是一个 安全漏洞,并且认为通过设置 User-Agent 就相当于开启了白名单,那么就可以忽略鉴权。

Nacos出现重大安全漏洞,开源项目险遭脱库
开发人员的答复

开发人员的答复马上就获得了 300 多人的反对意见。认为开发者将 Nacos 默认密码和本次安全漏洞说成是一个问题。

Nacos出现重大安全漏洞,开源项目险遭脱库
社区小伙伴的修复建议

我觉得上面这个回复非常中肯,就拿陌溪来说,当我部署完 Nacos 后,我首先第一件事就是修改 Nacos 默认的账号和密码,然后换成一个更加安全的。但是对于忽略鉴权这个机制,我并不知情的,所以其它用户也可以通过非法的后门来获取到我的配置。

漏洞复现

在我看完这个 issue 的时候,陌溪和群里小伙伴想着就拿线上部署的蘑菇博客来进行测试。首先我先介绍一下,蘑菇博客使用的 Nacos 版本是 1.4.0,也是前段时间,刚刚发布的最新的一个版本。

首先通过 Chrome 浏览器的F12 观察 nacos 请求的 Network,找到了下面这条Nacos配置文件请求接口

http://your_ip:8848/nacos/v1/cs/configs?dataId=&group=&appName=&config_tags=&pageNo=1&pageSize=10&tenant=dev&search=accurate

然后打开 Postman,填写这个 URL,并设置 GET 请求,同时设置 Headers 请求头,加入 User-Agent:Nacos-Server,如下图所示

Nacos出现重大安全漏洞,开源项目险遭脱库
漏洞复现

从上面的请求 URL 中可以看出,陌溪没有设置任何 Token 相关的操作,只填写了一个固定的请求头,然后发送请求一个 HTTP 请求。

嗯… 果然不出我所料,我的 Nacos 配置直接就获取到了!!!

Nacos出现重大安全漏洞,开源项目险遭脱库
通过URL获取到配置文件
Nacos出现重大安全漏洞,开源项目险遭脱库
被入侵的蘑菇博客数据库

陌溪只需要执行 SQL 导出,就可以轻松将蘑菇博客数据进行脱库,同时我在 issue 中,也看到有小伙伴通过端口扫描工具,一共搜出来 800 多台暴露了公网的 Nacos 服务器,所以这些服务器无一例外,都有可能被脱库!!

Nacos出现重大安全漏洞,开源项目险遭脱库
被扫描出的机器

上次蘑菇博客删库事件: 还历历在目,因为陌溪设置 MySQL 的密码而引起的,而这次很显然是 Nacos 出现的安全漏洞而造成的。

最后陌溪提醒一下,想利用该漏洞搞事情的小伙伴,我劝你善良。

Nacos出现重大安全漏洞,开源项目险遭脱库

解决方法

后面社区小伙伴们,踊跃的提出了自己的修改意见,最后决定通过增加自定义 Key Value 键值对来解决,只有通过设置正确的键值对才能获取配置。

Nacos出现重大安全漏洞,开源项目险遭脱库
修复建议

在今天 Nacos 开发人员已经重视了这个高危安全漏洞,并且紧急的发布了最新的 1.4.1 版本。

Nacos出现重大安全漏洞,开源项目险遭脱库
新版本发布

我们只需要下载最新版本的 Nacos 1.4.1 ,然后修改对应的 application.properties 文件,修改如下内容

# 开启鉴权
nacos.core.auth.enabled=true
# 关闭白名单功能
nacos.core.auth.enable.userAgentAuthWhite=false.
# 配置键值对 [键值对可以自定义]
nacos.core.auth.server.identity.key=aaa
nacos.core.auth.server.identity.value=bbb

最后我们再次使用刚刚的请求进行测试,发现已经无法获取到配置了

修复后再次请求

那么我们需要怎么才能获取到配置呢?只需要在 headers 里面,填写刚刚配置文件中的键值对即可

设置键值对进行请求

因为键值对是我们自定义的,因此每个人的都是不相同的。到这里 Nacos 的安全漏洞已经算是解决了,最后陌溪希望看到本篇文章的小伙伴,如果公司还没有升级最新版的 Nacos,那么强烈建议进行升级!