说说GatewayActuator的安全漏洞Index:0,Size:0
时间: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.(ArrayList.java:433) ~[na:1.8.0_252]
at org.springframework.ute.RouteDefinitionRouteLocatorbinePredicates(RouteDefinitionRouteLocator.java:219) ~[spring-cloud-gateway-core-2.1.1.RELEASE.jar:2.1.1.RELEASE]    at org.springframework.vertToRoute(RouteDefinitionRouteLocator.java:143) ~[spring-cloud-gateway-core-2.1.1.RELEASE.jar:2.1.1.RELEASE]
publisher.Next(FluxMap.java:100) ~[reactor-core-3.2.8.RELEASE.jar:3.2.8.RELEASE]
at org.springframework.cloud.Next(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 = Predicates();
AsyncPredicate<ServerWebExchange> predicate = lookup(routeDefinition,
<(0));
for (PredicateDefinition andPredicate : predicates.subList(1,
predicates.size())) {
AsyncPredicate<ServerWebExchange> found = lookup(routeDefinition,
andPredicate);
predicate = predicate.and(found);
}
log4j升级成log4j2
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接⼝。
  2天后,我才在我们关注的众多上看到Gateway Actuator漏洞的相关⽂章。和安全部门同步消息之后,才确认就是这个漏洞。
  我们折腾了⼀天,也⾟苦了不停重启服务的DevOps。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。