Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

关于特殊构造的url造成越权漏洞的修复方案建议 #4726

Closed
codesverve opened this issue Jan 18, 2021 · 6 comments
Closed

关于特殊构造的url造成越权漏洞的修复方案建议 #4726

codesverve opened this issue Jan 18, 2021 · 6 comments
Labels
status/invalid This doesn't seem right

Comments

@codesverve
Copy link

codesverve commented Jan 18, 2021

常见URL匹配不当造成的越权情形总结,主要有以下几种:

  1. spring对双斜杆url的灵活兼容机制
    spring 能够灵活适应双斜杠情形的URL,如:
/nacos/v1//cs/configs
  1. spring 对基于目录的相对url的灵活兼容机制
/nacos/v1/./cs/configs
/nacos/v1/ns/../cs/configs
  1. spring 对带分号url的处理机制
    如:
/nacos/v1/cs;addition/configs

会被处理为

/nacos/v1/cs/configs
  1. url编码的字符

  2. 在其他编程语言中,可能还会有\u0000造成的文件名截断问题,Java中应该早已不存在该问题了

在spring进行url mapping之前,apache通过request.getRequestDispatcher对url进行了规范,上面1、2种情形,在该阶段被处理成规范的url,参见org.apache.tomcat.util.http.RequestUtil.normalize,这与文件路径的规范化处理File.getCanonicalFile相似。

spring通过org.springframework.web.servlet.handler.AbstractHandlerMapping进行url mapping时,再次对url进行了处理,参见org.springframework.web.util.UrlPathHelper.getLookupPathForRequest,该阶段对应了上面3、4两种情形

所以,我觉得可以考虑参考下面两个方法对url进行一些处理

UrlPathHelper.getLookupPathForRequest
RequestUtil.normalize

上面四种情形,特别是第三种,没翻过源码的可能都不知道还有这种情况,在做权限匹配时需要多加小心。希望能对您有所帮助。

@KomachiSion
Copy link
Collaborator

感谢反馈

我是用最新的1.4.1版本 对以上几种情况进行了实验:

curl -X GET 'localhost:8848/nacos/v1//cs/configs'                                               
{"timestamp":"2021-01-18T14:56:50.189+0800","status":500,"error":"Internal Server Error","message":"The request was rejected because the URL was not normalized.","path":"/nacos/v1//cs/configs"}%

curl -X GET 'localhost:8848/nacos/v1/./cs/configs'
{"timestamp":"2021-01-18T14:57:13.194+0800","status":403,"error":"Forbidden","message":"unknown user!","path":"/nacos/v1/cs/configs"}

curl -X GET 'localhost:8848/nacos/v1/../cs/configs'
{"timestamp":"2021-01-18T14:57:21.902+0800","status":404,"error":"Not Found","message":"No message available","path":"/nacos/cs/configs"}

curl -X GET 'localhost:8848/nacos/v1/cs/;addition/configs'
{"timestamp":"2021-01-18T14:57:49.166+0800","status":500,"error":"Internal Server Error","message":"The request was rejected because the URL contained a potentially malicious String \";\"","path":"/nacos/v1/cs/;addition/configs"}

目前看来勉强能够拦截住。

此外我们强烈不推荐将Nacos暴露在公网环境,目前的鉴权仅能做到简单的权限隔离,远远达不到安全的程度

@zhangguilong
Copy link

最新的漏洞修复后控制台还能登录吗?从升级的结果来看,登录 http://127.0.0.1:8848/nacos/ 已经被拒绝了。

@codesverve
Copy link
Author

最新的漏洞修复后控制台还能登录吗?从升级的结果来看,登录 http://127.0.0.1:8848/nacos/ 已经被拒绝了。

目前来看是会拒绝的,就是说现在是二选一,要么应用auth=true关闭控制台,要么auth=false沿用之前不安全的版本版本。现在一般就是,生产关闭控制台,开发开启控制台了。我也在等,后面是不是有更优的升级版本。

@zhangguilong
Copy link

最新的漏洞修复后控制台还能登录吗?从升级的结果来看,登录 http://127.0.0.1:8848/nacos/ 已经被拒绝了。

目前来看是会拒绝的,就是说现在是二选一,要么应用auth=true关闭控制台,要么auth=false沿用之前不安全的版本版本。现在一般就是,生产关闭控制台,开发开启控制台了。我也在等,后面是不是有更优的升级版本。

我直接拉了个分支把这个问题修复了,给登录的这个http://127.0.0.1:8848/nacos/加了白名单

我这边的项目环境 日常环境 生产环境是通namespace区分的。

private static final String LOGIN = "/nacos/";

        if (LOGIN.equals(new URI(req.getRequestURI()).getPath())) {
            chain.doFilter(request, response);
            return;
        } else {
            Method method = methodsCache.getMethod(req);
            if (method == null) {
                // For #4701, Only support register API.
                resp.sendError(HttpServletResponse.SC_NOT_FOUND, "Not found mehtod for path " + req.getMethod() + " " + req.getRequestURI());
                return;
            }
          其他鉴权代码
       }

@KomachiSion
Copy link
Collaborator

最新的漏洞修复后控制台还能登录吗?从升级的结果来看,登录 http://127.0.0.1:8848/nacos/ 已经被拒绝了。

最新的漏洞修复后控制台还能登录吗?从升级的结果来看,登录 http://127.0.0.1:8848/nacos/ 已经被拒绝了。

目前来看是会拒绝的,就是说现在是二选一,要么应用auth=true关闭控制台,要么auth=false沿用之前不安全的版本版本。现在一般就是,生产关闭控制台,开发开启控制台了。我也在等,后面是不是有更优的升级版本。

请下载最新的1.4.1版本,控制台不可用问题已修复了

@KomachiSion KomachiSion added status/invalid This doesn't seem right and removed status/need feedback labels Jan 25, 2021
@codesverve
Copy link
Author

codesverve commented Feb 24, 2021

最新的漏洞修复后控制台还能登录吗?从升级的结果来看,登录 http://127.0.0.1:8848/nacos/ 已经被拒绝了。

之前重新下载了新版,没能ok(之后不知道是不是有ok的版本),所以就自己动手修改代码,然后制作docker镜像了,现在运行了有一段时间了。今天突然想起来这事,觉得可以分享一下,所以就挖个坟吧。

我这里有自己拉了个分支,在master分支修改了AuthFilter.java文件,排除了对静态路径以及一些使用密钥签名之后的请求了拦截。
https://github.com/alibaba/nacos/compare/master...Uetty:master?expand=1

出于安全考虑,在排除路径之前,参照spring框架、apache tomcat会对路径作的一些处理,同样也对路径做了一些特殊的处理

requestUri = RequestUrlUtil.normalize(requestUri);
requestUri = RequestUrlUtil.uriDecode(requestUri, StandardCharsets.UTF_8);
requestUri = RequestUrlUtil.stripPathParams(requestUri);

该版本建议开启 indetity 校验

nacos.core.auth.enabled=true
# 服务提供者需配置一致的 spring.cloud.nacos.config.accessKey 与 spring.cloud.nacos.discovery.accessKey 
nacos.core.auth.server.identity.key=x-nacos-key
# 服务提供者需配置一致的 spring.cloud.nacos.config.secretKey 与 spring.cloud.nacos.discovery.secretKey 
nacos.core.auth.server.identity.value=c1esb86req402880e401esb86reo0ey2
# base64 之后的 JWT 密钥
nacos.core.auth.default.token.secret.key=MDFlc2I4MDFvMjQwMjg4MGU0MDFlc2I4MDFvMjAwMDE=
# 关闭 user-agent 白名单,这一点很重要,放在外网这就是一个大大的漏洞
nacos.core.auth.enable.userAgentAuthWhite=false

fork项目地址
https://github.com/Uetty/nacos/tree/master

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
status/invalid This doesn't seem right
Projects
None yet
Development

No branches or pull requests

3 participants