说说Gateway Actuator的安全漏洞 Index: 0, Size: 0

 

       时间:2022年3月

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

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

  先排查线上日志,很快定位到Gateway服务报错,原本Gateway集群有5台实例,其中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 错误。要知道 Gateway 配置文件中的 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}

  一段正常的 routes 应该 id、uri、order、predicates、filters 都是齐全的。如下:

      routes:
        - id: order-server
          uri: lb://order-server
          order: 8001
          predicates:
            - Path=/api/order/**
          filters:
            - StripPrefix=2

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

management.endpoint.gateway.enabled=false

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

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

 

posted @ 2022-03-15 15:44  闲人鹤  阅读(3234)  评论(0编辑  收藏  举报