导语:PostgreSQL 类型缓存漏洞 CVE-2026-120144 以 CVSS 8.8 的高危评分出现在 GitHub Advisory Database 中,其本质是类型缓存失效不完整引发的类型混淆(Type Confusion),可让具备对象创建权限的低权限用户以数据库运行操作系统用户身份执行任意代码。本文从内核缓存机制出发,完整还原攻击链路、利用条件与工业级应急响应方案。
一、漏洞速览:PostgreSQL 类型缓存漏洞的核心事实
CVE-2026-120144 是 PostgreSQL 18 大版本中一个典型的内核级安全缺陷。它的危险之处不在于外部输入校验缺失,而在于数据库内部类型系统与缓存一致性机制之间的时序缝隙——这类问题往往绕过常规的 SQL 注入防护与权限模型,直接触及内存安全边界。
| 评估维度 | 具体信息 | 架构影响 |
|---|---|---|
| 漏洞编号 | CVE-2026-120144 / GHSA-98hh-69ff-2vc7 | 已公开披露 |
| CVSS 评分 | 8.8(High) | 高危,需优先处置 |
| 攻击向量 | Network / Low Complexity / Low Privileges | 远程可利用,门槛低 |
| 影响版本 | PostgreSQL 18.x < 18.7 | 18 之前版本不受影响 |
| 影响后果 | 机密性/完整性/可用性均为 High | 可执行任意 OS 命令 |
| 利用前提 | 攻击者需具备对象创建权限 | 权限模型是第一道防线 |
该漏洞允许对象创建者以数据库进程运行的操作系统用户身份执行任意代码。在容器化部署中,若数据库进程以 root 或高权限用户运行,攻击者可进一步横向移动至宿主机与同网段服务,风险等级需按「内核提权」对待。
二、类型缓存机制与类型混淆原理拆解
要理解 PostgreSQL 类型缓存漏洞的成因,必须先理解 PostgreSQL 的 typcache(类型缓存)设计。PostgreSQL 在会话级与后端进程级维护类型元数据缓存,用于加速复合类型、记录类型与函数参数类型的解析。当复合类型(Composite Type)发生结构变更时,系统会通过缓存失效机制(invalidation)通知各后端刷新缓存。
2.1 正常路径:缓存填充与失效的协作
- 后端进程首次访问某复合类型时,从系统目录读取元数据并填充 typcache 条目。
- 复合类型发生 ALTER 变更时,系统广播缓存失效消息,各后端标记对应缓存条目为失效。
- 后续访问触发重新加载,保证类型布局与系统目录一致。
2.2 缺陷路径:填充中的失效竞态
问题出在「缓存条目正在被填充」这一时间窗口。若复合类型变更恰好发生在缓存填充过程中,失效通知可能被遗漏或部分应用,导致后端保留一份与系统目录不一致的类型布局描述。此后,PostgreSQL 会按旧的类型布局解释新数据,形成类型混淆(Type Confusion)——同一块内存被当作不同类型结构访问,进而可被精心构造的复合类型定义利用,实现越界读写并最终劫持控制流。
类型混淆类漏洞的根因通常不是单一函数缺陷,而是「缓存一致性协议」在并发场景下的不完备。修复方向是让缓存填充与失效具备原子性语义,而非简单加锁——这也是 18.7 补丁的核心思路。
企业级架构规范
flowchart TD
subgraph 接入层 ["接入层与权限边界 (Access & Privilege Tier)"]
A["低权限用户连接 (Network)"] --> B["对象创建权限校验 (CREATE)"]
end
subgraph 规则层 ["类型系统与缓存层 (Type & Cache Tier)"]
B --> C["复合类型定义与 ALTER 变更"]
C --> D["typcache 缓存填充 (Populate)"]
D --> E{"失效通知是否完整?"}
end
subgraph 领域层 ["核心执行与混淆层 (Confusion Tier)"]
E -- "否 (竞态窗口)" --> F["陈旧类型布局残留"]
F --> G["类型混淆 (Type Confusion)"]
G --> H["越界读写 / 控制流劫持"]
end
subgraph 存储层 ["基础设施与宿主层 (Infrastructure Tier)"]
H --> I[("以 DB 运行 OS 用户执行任意代码")]
I --> J["横向移动 / 数据泄露"]
end
三、攻击面评估:谁真正处于风险之中
并非所有 PostgreSQL 实例都同等暴露。该漏洞要求攻击者具备对象创建权限,因此权限模型的设计直接决定了实际攻击面大小。
| 部署场景 | 暴露程度 | 关键判断依据 | 处置优先级 |
|---|---|---|---|
| 多租户 SaaS,租户可建表建类型 | 极高 | 低权限用户即可触发 | P0 立即升级 |
| 内部开发库,开发者拥有 CREATE 权限 | 高 | 内部人员或被盗凭据可利用 | P0 立即升级 |
| 只读从库 / 仅应用账号写入 | 中 | 需评估应用账号权限 | P1 本周内升级 |
| PostgreSQL 17 及更早版本 | 无 | 官方声明不受影响 | 常规维护 |
很多团队误以为「数据库在内网就安全」。但该漏洞的 CVSS 攻击向量为 Network、权限要求为 Low,意味着任何能连接数据库并拥有 CREATE 权限的账号(包括被泄露的应用账号、CI/CD 流水线账号)都可能成为攻击入口。请务必盘点所有具备对象创建权限的角色。
四、工业级应急响应与修复落地
针对 PostgreSQL 类型缓存漏洞,正确的处置顺序是「先止血、再根治、后加固」,而不是简单执行一次升级了事。
4.1 第一步:版本升级(根治)
官方已在 PostgreSQL 18.7 中修复该问题。所有 18.x 实例应尽快升级至 18.7 或更高版本。升级前务必完成备份与兼容性验证。
# 以 Debian/Ubuntu 官方 PGDG 源为例 sudo apt-get update sudo apt-get install -y postgresql-18=18.7-1.pgdg120+1 # 验证版本 psql -c "SELECT version();" # 升级后重启服务使内核补丁完全生效 sudo systemctl restart postgresql
点击展开:升级前备份与回滚检查清单
# 1. 逻辑备份关键库 pg_dump -Fc -d appdb -f /backup/appdb_$(date +%F).dump # 2. 记录当前版本与扩展版本 psql -c "SELECT version();" psql -c "SELECT extname, extversion FROM pg_extension;" # 3. 升级后校验扩展兼容性 psql -c "SELECT extname, extversion FROM pg_extension;" # 4. 回滚预案:保留旧版本二进制与数据目录快照 # 容器场景建议先打镜像快照再滚动更新
4.2 第二步:权限收敛(止血)
在无法立即升级的窗口期,最小权限原则是最有效的缓解手段。核心是撤销非必要角色的 CREATE 权限,并限制复合类型的使用范围。
-- 撤销 PUBLIC 在业务 schema 上的建表建类型权限 REVOKE CREATE ON SCHEMA public FROM PUBLIC; -- 应用账号仅保留 DML 权限,不授予 CREATE REVOKE CREATE ON SCHEMA app_schema FROM app_user; GRANT USAGE ON SCHEMA app_schema TO app_user; GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA app_schema TO app_user; -- 审计当前具备对象创建能力的角色 SELECT r.rolname FROM pg_roles r JOIN pg_auth_members m ON m.member = r.oid WHERE r.rolcanlogin = true ORDER BY r.rolname;
4.3 第三步:运行环境加固(纵深防御)
- 数据库进程以专用低权限系统用户运行,严禁 root 启动。
- 容器部署时启用只读根文件系统、丢弃多余 Linux capabilities。
- 启用连接审计与异常 DDL 告警,重点监控短时间内频繁的复合类型变更。
- 对数据库网络访问实施白名单,避免公网直接暴露。
安全修复不应止步于打补丁。建议将「数据库角色权限基线」纳入 IaC 管理,任何 CREATE 权限的授予都需经过评审,从流程上消除此类漏洞的利用前提。
五、从 PostgreSQL 类型缓存漏洞看数据库内核安全治理
CVE-2026-120144 再次提醒我们:数据库作为数据平面的核心,其内核级缺陷的影响半径远大于应用层漏洞。类型混淆、缓存一致性、并发竞态这三类问题在 C/C++ 实现的内核中反复出现,防御思路应形成体系:
- 版本治理:建立数据库小版本升级节奏,订阅官方安全公告,避免长期停留在旧小版本。
- 权限最小化:将 CREATE 权限视为高危权限,按需授予、定期审计。
- 运行隔离:以容器与低权限用户运行数据库,压缩代码执行后的横向移动空间。
- 可观测性:对 DDL 与类型变更建立审计与告警,缩短异常行为发现时间。
本文核心技术背景源自海外一线安全公告与官方安全页面:
GitHub Advisory Database – GHSA-98hh-69ff-2vc7
NVD – CVE-2026-120144
PostgreSQL 官方安全公告 – CVE-2026-120144
