CVE-2026-17566
pgAdmin 4:通过导入/导出数据查询防护中的反斜杠转义不匹配实现 RCE(防护不完整,与 CVE-2025-13780 同源的兄弟漏洞)
- 已发布
- 2026年7月31日
- 已更新
- 2026年8月1日
- 分配 CNA
- PostgreSQL
- 观察到的证据
- 2026年8月4日
初级CVSS
nvd · CVSS 4.0
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X低 · 未来 30 天
- 百分位
- 45.0%
- 型号日期
- 2026年9月21日
EPSS 是统计估计,而不是确定性或影响衡量标准。将其与 CVSS、KEV 状态、暴露程度和您的环境相结合。
总结
pgAdmin 4 的导入/导出数据工具通过将用户提供的 SQL 查询插入到 Jinja 模板中,构建一条 psql `\copy (...)` 命令行,并将渲染后的行通过 `--command` 传递给 psql。为了防止攻击者突破 `(...)` 包装器,`create_import_export_job()`(路由 `POST /import_export/job/<sid>`,仅受普通且常被授予的 `tools_import_export_data` 权限保护)使用手写的括号平衡检查器 `_is_query_parens_balanced()` 验证查询。该检查器始终将单引号前的反斜杠(`\'`)视为转义引号,即假定 `standard_conforming_strings` 为关闭状态。自 9.1(2010 年)起,PostgreSQL 默认将 `standard_conforming_strings` 设为开启,这也是 pgAdmin 4 当前支持的所有 PostgreSQL 版本(13-18)的默认设置;在该默认设置下,psql 自身的 `\copy` 分词器将 `\` 视为普通字符,因此紧随其后的单引号会立即闭合字符串字面量。诸如 `SELECT 'a\') TO PROGRAM 'echo pwned' x'` 之类的查询因此被 pgAdmin 的检查器判定为“平衡”(检查器认为 `)` 仍在字符串内部),而实际渲染命令行中运行的 psql 会在该位置闭合字符串,并将随后的 `)` 视为包装 `\copy (...)` 子查询的结束,从而暴露攻击者选择的 `TO PROGRAM '<command>'` 子句,psql 会通过 `popen()` 执行该子句——即使同一行后续出现语法错误也不受影响。这与 CVE-2025-12762/CVE-2025-13780(在 PLAIN 格式转储恢复期间通过 psql 元命令/COPY 注入实现 RCE)属于同一类漏洞,但通过不同模块(导入/导出数据而非恢复)中独立编写的防御机制触发,且该防御机制存在自身不同的逻辑缺陷(反斜杠转义语义颠倒,而非被 BOM 破坏的正则锚点)。修复方案直接拒绝查询中单引号字符串内的任何反斜杠,而不是在两种可能的 psql 解释中二选一。这是有意为之的保守做法:因为 `\` 的正确解释取决于目标服务器的 `standard_conforming_strings` 设置,而检查器在验证时无法可靠获知该设置,因此拒绝查询比猜测更安全。此问题影响 pgAdmin 4:自 9.18 之前引入 `_is_query_parens_balanced()` 起的所有版本。
来源
1pgAdmin 4 导入/导出 RCE (CVE-2026-17566) PoC - 通过反斜杠转义不匹配实现 TO PROGRAM 注入
负责任的使用
仅在您拥有或有权测试的系统上使用漏洞信息。 Kitploit 链接到公共研究元数据,并且不存储漏洞代码或恶意负载。