在 range() 函数中通过内存耗尽进行 DOS
安全问题描述 (*): nebula-graphd 服务在执行 range() 函数时没有强制实施足够的上限或内存检查。当用户请求具有极大上限(例如 INT64_MAX)的范围时,服务尝试立即为整个序列分配内存。这种行为导致迅速消耗所有可用服务器内存,触发操作系统的 OOM 杀死程序终止 nebula-graphd 进程。这使得具有执行权限的未授权攻击者能够可靠地使数据库服务崩溃。受影响组件 (*): 组件: nebula-graphd (查询引擎) 版本: v3.8.0,最新版本 环境: Docker 容器 (Linux) 重现步骤 (*): 连接到 NebulaGraph 控制台。执行以下 nGQL 命令,尝试创建上限为最大 64 位整数的范围: RETURN range(1, 9223372036854775807); 注意: 客户端连接立即断开 ("连接拒绝")。服务器日志: 服务器日志显示 OOM Kill 事件: 耗尽内存: 杀死了进程 XXXXXX (nebula-graphd) total-vm:672743924kB... 建议补救措施: 在单个查询中实施范围() 函数可返回的元素数量的硬限制。实现延迟计算(迭代器)以生成范围,以便一次性将整个列表材化为内存。更严格地执行每个查询执行的 MAX_MEMORY 限制,以在操作系统杀死进程之前捕获此问题。崩溃证据: (root@nebula) [(none)]> RETURN range(1, 9223372036854775807); 2025/12/07 06:48:06 循环错误,无法重新连接,无法打开传输,错误: 打开 TCP [127.0.0.1:9669] (http://127.0.0.1:9669/):连接拒绝
内容来源: vesoft-inc/nebula