Nacos身份认证绕过漏洞(QVD-2023-6271)原理分析
2023-03-15 15:38:00

0x00、前言

Nacos身份认证绕过漏洞(QVD-2023-6271)复现与分析

0x01、Nacos描述

Nacos是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

官网:https://nacos.io/
github项目:https://github.com/alibaba/nacos

0x02、漏洞描述

开源服务管理平台 Nacos 中存在身份认证绕过漏洞,在默认配置下未对 token.secret.key 进行修改,导致远程攻击者可以绕过密钥认证进入后台,造成系统受控等后果。

0x03、漏洞范围

0.1.0 <= Nacos <= 2.2.0

0x04、复现

环境搭建

下载漏洞版本:(0.1.0 <= Nacos <= 2.2.0均可)
https://github.com/alibaba/nacos/releases/tag/2.2.0.1

bin目录下启动startup.cmd -m standalone即可


漏洞复现

默认NACOS_AUTH_TOKEN:SecretKey012345678901234567890123456789012345678901234567890123456789

使用默认key进行jwt认证构造

构造的jwt数据进行认证即可获取cookie

header:
{
"alg": "HS256"
}

payload:
{
"sub": "nacos",
"exp": 1678881619
}

key:
SecretKey012345678901234567890123456789012345678901234567890123456789

0x05、分析

本质上还是secretkey密钥硬编码导致可以构造jwt身份数据,核心还是在jwt的鉴权上面。
0.1.0 <= Nacos <= 2.2.0版本中
使用鉴权插件默认token.secret.key:可参考官方文档

nacos使用的jwt认证由三部分构成:
1、header:声明加密格式

{
"alg": "HS256"
}

2、PAYLOAD data数据:身份数据,由sub对象(用户角色)+exp(时间戳)构成
确保时间戳在当前时间范围内即可

{
"sub": "nacos",
"exp": 1678881619
}

3、签名:由header加密格式加密secretkey形成的签名,用于验证数据是否正确

至于选择secret base64 encoded选项

在源码中,位置plugin-default-impl\src\main\java\com\alibaba\nacos\plugin\auth\impl\JwtTokenManager.java中,针对secret会先从配置文件中获取key值

然后将获取的key值进行base64_decode()解码,因此默认key(SecretKey012345678901234567890123456789012345678901234567890123456789)实际上在程序处理中是作为已经被base64编码过后的值,再将base64解码过后的secret值使用hs256签名

当sub对象为nacos,并且签名正确,即可通过nacos鉴权认证,因此由上面部分,使用默认key生成的jwt即可绕过nacos的鉴权

0x06、修复

1、官方更新补丁:https://github.com/alibaba/nacos/releases/tag/2.2.0.1
修复方式:移除了默认key,部署新版本时必须要输入自定义的有效token.secret.key

2、缓解办法:application.properties文件中token.secret.key默认值进行更改。

0x07、参考链接

https://nacos.io/zh-cn/docs/v2/guide/user/auth.html
https://github.com/alibaba/nacos/issues/10060
https://avd.aliyun.com/detail?id=AVD-2023-1655789
https://nox.qianxin.com/article/541