欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

浅谈网关执行器的安全漏洞 Index:0, 大小: 0

最编程 2024-03-28 14:11:13
...

       时间:2022年3月

       背景:做为Java开发人员,肯定会用到很多开源技术框架,而这些开源框架在不同的时候总会被爆出有各种安全漏洞,早在1月份log4j被爆出有安全漏洞,各个应用服务紧急升级,但是没遇到过漏洞被攻击的场景。而这次Gateway Actuator被爆出高危漏洞让我有了深刻的体会。

美好的一天,从我写诗一样的代码开始的,到10点半左右,技术经理收到安全部门邮件,转告我们Actuator被爆出高危漏洞,让今天必须解决。What? Actuator是什么漏洞,baidu一下?没有发现。什么漏洞?怎么解决?安全部门邮件也没有说。正在一筹莫展的时候,线上环境出现Bug,很多接口请求都请求失败,报错信息:Index: 0, Size: 0  这是什么鬼? 

先排查线上日志,很快定位到Gateway服务报错,原本5台Gateway实例,其中2台都是这个错误,等于40%的请求,任何接口,只要打到这2台错误的Gateway的请求,全部请求失败。错误日志如下:

java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
    at java.util.ArrayList.rangeCheck(ArrayList.java:657) ~[na:1.8.0_252]
    at java.util.ArrayList.get(ArrayList.java:433) ~[na:1.8.0_252]
    at org.springframework.cloud.gateway.route.RouteDefinitionRouteLocator.combinePredicates(RouteDefinitionRouteLocator.java:219) ~[spring-cloud-gateway-core-2.1.1.RELEASE.jar:2.1.1.RELEASE]
    at org.springframework.cloud.gateway.route.RouteDefinitionRouteLocator.convertToRoute(RouteDefinitionRouteLocator.java:143) ~[spring-cloud-gateway-core-2.1.1.RELEASE.jar:2.1.1.RELEASE]
    at reactor.core.publisher.FluxMap$MapSubscriber.onNext(FluxMap.java:100) ~[reactor-core-3.2.8.RELEASE.jar:3.2.8.RELEASE]
    at org.springframework.cloud.sleuth.instrument.reactor.ScopePassingSpanSubscriber.onNext(ScopePassingSpanSubscriber.java:96) ~[spring-cloud-sleuth-core-2.1.1.RELEASE.jar:2.1.1.RELEASE]

在Gateway-core的报错源码如下:

    private AsyncPredicate<ServerWebExchange> combinePredicates(
            RouteDefinition routeDefinition) {
        List<PredicateDefinition> predicates = routeDefinition.getPredicates();
        AsyncPredicate<ServerWebExchange> predicate = lookup(routeDefinition,
                predicates.get(0));

        for (PredicateDefinition andPredicate : predicates.subList(1,
                predicates.size())) {
            AsyncPredicate<ServerWebExchange> found = lookup(routeDefinition,
                    andPredicate);
            predicate = predicate.and(found);
        }

        return predicate;
    }

红色字体这块,表示从route配置中获取 predicates 是空的,所以才报Index: 0, Size: 0错误。要知道route路由配置中,prodicate是必填的,不允许为空,要不Gateway都启动不了。

查看Gateway配置文件,没改动过,服务实例也没重启过。

在没找到问题的情况,临时解决方案就是重启出现问题的Gateway,重启后恢复正常了,后来总有几个Gateway实例不停的报错。

这时我们通过错误的时间点,在waf上找一找有没有异常的请求。在参照Gateway与Actuator整合的API,找到了如下接口。

如果Gateway和Actuator集成后,是可以提供动态操作route路由的接口的。

创建路由,发送Post请求:/gateway/routes/{id_route_to_create}

删除路由,发送Delete请求:/gateway/routes/{id_route_to_delete}

如果使用创建路由接口,参数是一个不完整的route(因为这个接口没有任何参数校验),就会报我们项目的错误。既然BUG复现了,解决方案就好办了,禁用Gateway专用的Actuator接口。

management.endpoint.gateway.enabled=false

2天后,我才在我们关注的众多公众号上看到Gateway Actuator漏洞的相关文章。和安全部门同步消息之后,才确认就是这个漏洞。

我们折腾了一天,也辛苦了不停重启服务的DevOps。

原文地址:https://www.cnblogs.com/huanshilang/p/16008738.html