事件概述
2026 年 7 月 16 日,ArcadeData 官方通过 GitHub Security Advisory(GHSA-x9f9-r4m8-9xc2)公布了 ArcadeDB 发行版本 26.7.2 之前的一个高危漏洞,NVD 于 2026-08-01 给出 CVE 编号 CVE-2026-67340,2026-08-03 被 CISA-ADP 加入资产调度记录。该漏洞被 VulnCheck 评定为 CVSSv3.1 9.8(严重)、CVSSv4.0 9.3(严重),依然是资产库场景下极少见的“未授权 RCE”质量。
ArcadeDB 是一款支持图、文档、锡值与树型数据的多模型 NoSQL 数据库,广泛用于快速原型验证、实时推荐、边缘计算、知识图谱等场景。本次漏洞出现在它的 arcadedb-engine 组件中的脚本触发器执行器(ScriptTriggerExecutor)。
技术细节
ArcadeDB 允许在表上创建受驱动的脚本(trigger),默认使用 GraalVM 中的 JavaScript 引擎执行。为了让脚本能够调用部分宿主机 Java API,ScriptTriggerExecutor 在 allowedPackages 中包含了 java.lang.*、java.util.*、java.time.*、java.math.*,同时将主机访问氡权设为 HostAccess.ALL。
问题在于,java.lang.Runtime.getRuntime().exec(...) 依然可以被调用。具体构造路径为。
- 创建一个 JavaScript 触发器,代码中使用
Java.type("java.lang.Runtime")获取主机 JVM 中的Runtime类; - 调用
Runtime.getRuntime().exec(["id"])或new ProcessBuilder(...).start()运行任意系统命令; - 随后向该表插入一条记录触发触发器,服务器进程权限下的代码就会被执行。
ArcadeDB 官方本意设置的反射黑名单以及 allowCreateProcess(false) 都不能阻止该调用:黑名单不能阻止 Java.type 主机类查找,而 allowCreateProcess(false) 仅限制 GraalVM 自身的客户端进程 API,不会影响通过 java.lang.Runtime 调用的主机进程。
问题的另一个难点是权限阈值太低:创建触发器只需要 UPDATE_SCHEMA 权限(schema admin),仓位严格低于安全管理员。这意味着在典型多租户场景下,任何具有表结构修改权的帐号都可以植入钔钉。
SecureLayer7 已在公开博客中发布 PoC,仅需两条 SQL 语句即可在服务器上调用 id、读取任意文件:
-- 步骤1:创建钔钉触发器(需 UPDATE_SCHEMA 权限)
CREATE TRIGGER rce_trigger ON Document AFTER INSERT
EXECUTE JAVASCRIPT 'var RT = Java.type("java.lang.Runtime");
var p = RT.getRuntime().exec(["id"]);
var is = p.getInputStream();
var sc = Java.type("java.util.Scanner");
var out = new sc(is).useDelimiter("\A").next();
out;'
-- 步骤2:插入记录点火触发器
INSERT INTO Document SET x = 1
影响评估
- 严重性评分:CVE-2026-67340 在 NVD CVSSv3.1 上评定为 9.8(严重),CVSSv4.0 为 9.3,CWE-94(代码注入)。全局可用性已被 CISA-ADP 加入 SSVC 记录并标记为“可自动化、技术影响为总体”。
- 利用复杂度:低。需要 UPDATE_SCHEMA 权限,但该权限常作为普通 DBA 账号标配,多租户 SaaS 场景下不可避免。
- 实际危害:受影响产品包括但不限于全球开发者开发的测试环境、在线推荐、边缘计算后端。与传统 SQL 注入不同,本漏洞允许跨语言调用主机 JVM,能直接获取服务器 shell。与漏洞同场揭示的还有 IMPORT DATABASE 的 SSRF、BACKUP/EXPORT DATABASE 缺乏授权、包体体积限制绕过等伴随问题。
修复建议
- 立即升级:升级到 arcadedb-engine 26.7.2 或更高版本。该补丁从
allowedPackages中删除了java.lang.*,仅保留java.util.*、java.time.*、java.math.*,这些包中不含可执行原语。 - 调整权限阈值:若需保留触发器能力,将创建触发器的门槛从
UPDATE_SCHEMA提升到UPDATE_SECURITY,限定仅安全管理员可创建。 - 主机访问氡权改造:将
HostAccess.ALL改为HostAccess.EXPLICIT,与其依赖一个明确的@HostAccess.ExportAPI 面向脚本暴露,避免“整包允许”的设计。 - 计量脚本汇总扫描:检查库中现有触发器,对使用
Java.type、java.lang.Runtime、ProcessBuilder的脚本进行审计并重新生成。 - 网络层隔离:将 ArcadeDB 端口限定在可信以太网/VPN 中,拒绝公网直接访问;打开访问日志,以便对发生异常触发器创建、插入请求进行告警。