导语:PostgreSQL 扩展路径劫持(CVE-2026-6467)是 2026 年数据库安全领域最值得警惕的提权类缺陷之一——它把“仅具备 CREATE 权限的普通租户”直接抬升为可执行任意代码的 bootstrap 超级用户。本文以架构师视角完整拆解该漏洞的信任边界崩塌过程、攻击链复现路径与生产环境加固落地清单。
一、PostgreSQL 扩展路径劫持:一次信任边界的静默崩塌
在 PostgreSQL 的权限模型中,CREATE 权限长期被视为“低危权限”——它只允许在指定 schema 内建表、建函数、建类型。但 CVE-2026-6467 打破了这个假设:当 CREATE EXTENSION 与 ALTER EXTENSION 在执行可信扩展(trusted extension)脚本时,若脚本内部的 search_path 解析被攻击者可控的 schema 抢先命中,那么脚本中本应指向系统对象的引用就会被替换为攻击者预置的同名对象,从而以 bootstrap 超级用户(即 initdb 阶段创建的超级用户上下文)执行任意 SQL。
这不是一个简单的“路径未固定”问题,而是一次对象解析时序与权限上下文错配导致的提权。攻击者只需两个原语:ALTER SCHEMA ... RENAME 制造命名冲突,或 CREATE EXTENSION ... SCHEMA "$user" 将扩展安装到以当前用户命名的 schema 中,即可让可信扩展脚本“找错对象”。
企业级架构规范
flowchart TD
subgraph 接入层 ["攻击者接入与权限层 (Attacker & Privilege Tier)"]
A["低权限租户 (仅 CREATE 权限)"] --> B["ALTER SCHEMA RENAME 制造命名冲突"]
A --> C["CREATE EXTENSION ... SCHEMA $user"]
end
subgraph 规则层 ["扩展安装与搜索路径解析层 (Extension & Search Path Tier)"]
B --> D["可信扩展脚本执行 (trusted extension)"]
C --> D
D --> E["search_path 解析命中攻击者同名对象"]
end
subgraph 领域层 ["提权执行层 (Privilege Escalation Tier)"]
E --> F["脚本以 bootstrap 超级用户上下文执行"]
F --> G["任意 SQL / 任意代码执行"]
end
subgraph 存储层 ["持久化与影响层 (Impact Tier)"]
G --> H[("数据库完全失陷 / 数据泄露与篡改")]
end
二、漏洞原理拆解:可信扩展为何“找错对象”
2.1 可信扩展的权限假设
PostgreSQL 引入 trusted extension 机制,本意是让非超级用户也能安装经过审核的扩展(如 hstore、pgcrypto 的部分场景)。其安全前提是:扩展脚本由扩展作者编写,执行时以受控上下文运行,脚本内引用的对象应当稳定解析到系统或扩展自身 schema。然而该前提依赖于 search_path 的确定性——一旦解析顺序可被攻击者影响,脚本内的函数调用、类型引用、操作符绑定就可能指向攻击者对象。
2.2 两个攻击原语
- ALTER SCHEMA … RENAME:攻击者将自己拥有的 schema 重命名为扩展脚本期望的 schema 名,使脚本在解析时优先命中攻击者 schema 下的同名对象。
- CREATE EXTENSION … SCHEMA “$user”:利用
$user占位符将扩展安装到以当前用户名命名的 schema,而该 schema 位于搜索路径前列,从而劫持脚本内的对象解析。
两者共同指向同一个根因:扩展脚本执行期间未将 search_path 固定为安全值,且对象解析发生在权限提升之后。ALTER EXTENSION 同样受影响,意味着即使扩展已安装,后续的扩展变更操作仍可能被劫持。
该漏洞的可怕之处在于攻击门槛极低:攻击者无需超级用户、无需文件系统权限,仅凭数据库级 CREATE 权限即可完成提权。在多租户 SaaS、共享数据库实例、以及“给业务账号开 CREATE 权限”的常见运维习惯下,这几乎等同于把超级用户钥匙交给了普通租户。
三、影响范围与版本矩阵
根据 GHSA-pm32-vprj-4hwf 公告,受影响版本为 PostgreSQL 18.7、17.12、16.16、15.20、14.25 之前的全部版本。CVSS 评分 7.2(High),攻击向量为网络可达的数据库连接,权限要求为低权限(CREATE),机密性、完整性、可用性均受严重影响。
| 评估维度 | 受影响版本 | 修复版本 | 架构处置建议 |
|---|---|---|---|
| 主版本 18 | < 18.7 | 18.7 | 立即升级 |
| 主版本 17 | < 17.12 | 17.12 | 立即升级 |
| 主版本 16 | < 16.16 | 16.16 | 立即升级 |
| 主版本 15 | < 15.20 | 15.20 | 立即升级 |
| 主版本 14 | < 14.25 | 14.25 | 立即升级 |
仅升级数据库内核并不等于闭环。若业务侧仍保留“普通账号持有 CREATE 权限 + 可自由创建 schema”的授权模型,未来同类搜索路径类缺陷仍可能被利用。升级必须与权限收敛同步推进。
四、攻击链复现与验证思路(授权环境)
在隔离测试环境中,安全团队可按如下思路验证自身实例是否暴露:以低权限账号创建同名 schema 或使用 $user schema,随后触发可信扩展安装,观察脚本内对象解析是否命中攻击者对象。以下为验证性 SQL 片段,仅用于授权测试。
-- 仅限授权隔离环境验证
-- 1. 低权限账号创建可控 schema
CREATE SCHEMA attacker_schema AUTHORIZATION low_priv_user;
-- 2. 制造命名冲突或使用 $user 模式安装扩展
CREATE EXTENSION IF NOT EXISTS pgcrypto SCHEMA "$user";
-- 3. 观察扩展脚本执行期间的对象解析与权限上下文
-- 若脚本内引用命中 attacker_schema 下同名对象,则存在暴露面
SELECT current_user, current_schema(), current_setting('search_path');
验证阶段务必在快照可回滚的隔离实例进行,禁止在生产主库直接执行 CREATE EXTENSION 类操作。验证完成后立即回滚快照,避免残留 schema 与对象污染后续审计基线。
五、生产加固与升级落地清单
5.1 内核升级
按版本矩阵升级至 18.7 / 17.12 / 16.16 / 15.20 / 14.25 及以上。升级前完成扩展兼容性检查与逻辑复制槽状态确认,升级后复核 pg_available_extensions 与已安装扩展版本。
点击展开:升级执行命令与备用脚本
# Debian/Ubuntu 系示例:升级 PostgreSQL 16 至 16.16+ apt-get update apt-get install -y postgresql-16=16.16-1.pgdg120+1 # 重启并校验版本 pg_ctlcluster 16 main restart psql -c "SELECT version();" # 校验已安装扩展 psql -c "SELECT extname, extversion FROM pg_extension;"
5.2 权限收敛
- 撤销普通业务账号的
CREATE权限,改为按 schema 精确授权。 - 禁止业务账号创建 schema,schema 由 DBA 统一规划与命名。
- 对可信扩展安装实施白名单,仅允许 DBA 在受控 schema 中执行。
5.3 运行时防护
在应用连接层强制设置 search_path,避免依赖默认解析顺序;对 CREATE EXTENSION、ALTER EXTENSION 语句开启审计日志;在多租户场景下考虑独立实例或独立数据库隔离,避免共享实例内的 schema 命名空间竞争。
把“扩展安装”视为一次特权变更操作,纳入变更审批与审计链路,而不是当作普通 DDL。这是防止 PostgreSQL 扩展路径劫持类缺陷被二次利用的架构级护栏。
六、架构师视角的长期启示
CVE-2026-6467 再次提醒我们:数据库的权限模型不是静态的,而是由“权限 + 解析上下文 + 执行时序”三者共同决定的动态边界。搜索路径类漏洞(search_path hijacking)在 PostgreSQL 生态中并非首次出现,其反复出现的根因是对象解析的可控性与权限提升的时序耦合。对于架构师而言,防御策略应当从“打补丁”上升到“权限最小化 + 解析确定性 + 特权操作审计”的三层模型。
在多租户与云原生数据库普及的今天,PostgreSQL 扩展路径劫持的教训具有普遍性:任何“低权限即可触发、内部却以高权限执行”的机制,都必须假设输入侧完全不可信,并在执行前固定所有解析上下文。
本文核心技术背景源自 GitHub Security Advisory 官方公告:
GHSA-pm32-vprj-4hwf (CVE-2026-6467 PostgreSQL CREATE EXTENSION 搜索路径提权)
