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
網絡安全專家