CVE-2021-37580 Apache ShenYu 管理员认证绕过漏洞分析
VSole2021-11-18 12:03:43
漏洞信息
ShenYu(原名 Soul)是一款高性能,响应式的网关,同时也是应用于所有微服务场景的,可扩展、高性能、响应式的 API 网关解决方案。
该框架由于JWT认证的不正确使用,导致Apache ShenYu 2.3.0和2.4.0版本存在管理员认证绕过漏洞CVE-2021-37580。
环境搭建
项目地址为:
Apache ShenYu
https://github.com/apache/incubator-shenyu/releases
最近的三个发行版为2.4.1、2.4.0、2.3.0。
docker pull apache/shenyu-admin:2.4.0docker network create shenyudocker run -d -p 9095:9095 --net shenyu apache/shenyu-admin:2.4.0
使用`9095`端口登录系统,默认密码是`admin/123456`。
漏洞分析
根据漏洞信息,漏洞为JWT认证问题,当HTTP请求中包含`X-Access-Token`时,调用StatelessAuthFilter进行token校验,认证的框架是Apache Shiro。
下载2.4.0和2.4.1版本源代码进行补丁对比,最主要的更改位于`JwtUtils.java`。在JWT-token生成和校验时均使用generateAlgorithm函数获取秘钥,其中`JWT`和`JWTVerifier`使用的标准第三方库。
/* JwtUtils.java */ public static String generateToken(final String userName) { try { return JWT.create().withClaim("userName", userName).withExpiresAt(new Date()).sign(generateAlgorithm()); } catch (IllegalArgumentException | JWTCreationException e) { log.error("JWTToken generate fail ", e); } return StringUtils.EMPTY_STRING;} private static DecodedJWT verifierToken(final String token) { DecodedJWT jwt = null; try { JWTVerifier verifier = JWT.require(generateAlgorithm()).build(); jwt = verifier.verify(token); } catch (JWTVerificationException e) { log.info("jwt decode fail, token: {} ", token, e); } return jwt;} private static Algorithm generateAlgorithm() { JwtProperties properties = SpringBeanUtils.getInstance().getBean(JwtProperties.class); return Algorithm.HMAC256(properties.getKey());}
`generateAlgorithm`从`JwtProperties`中读取秘钥,但默认为空。
public class JwtProperties { private String key;}
测试结果如下,代码中`salt`的值可以随意设置。
修复方式
在`generateToken`和`verifyToken`中添加手动设置秘钥。
在API中添加key的读取和认证。

VSole
网络安全专家