PostgreSQL CVE-2026-120150,扩展记录域检查用后释放

11 月 12 日,PostgreSQL 发布安全更新:18.7、17.12、16.16、15.20、14.25,一次修了 52 个安全漏洞 [1],其中 32 个是 8.8 分 [2]。这是本专栏同批的第四篇:前三篇是 6460(类型混淆打崩进程)、18447(any 输出参数类型混淆)和 116304(并行查询 RECORD 用后释放),这篇是 CVE-2026-120150,CVSS 3.1 8.8 分,CWE-416 用后释放 [3]。它和前三篇的区别在门槛:这篇需要能创建对象,不像 116304 只登录就行;但和 18447 一样,不需要超级用户,能创建对象的账号就能以运行数据库的操作系统用户身份执行任意代码 [3]。

原语:校验一次,指针就悬空一次

域(domain)是建在已有类型上的用户定义类型,可以带 CHECK 约束;复合类型(composite type)是多字段的行类型。PostgreSQL 在内存里用「扩展记录」(expanded record)表示可原地修改的复合值,对这种值做域约束校验时,会经过一段建「哑首部」(dummy header)的代码。

修复提交把问题写成了四步 [5]:(1)build_dummy_expanded_header() 给扩展记录的哑首部建一个子记录,让它的 eoh_context 等于父记录的 er_short_term_cxt;(2)对哑记录的某次操作,在哑记录自己名下建了一个短期内存上下文,它是父记录 er_short_term_cxt 的子上下文;(3)调用方结束时重置父记录的 er_short_term_cxt,这个子上下文随之被释放;(4)下一次再走这段代码,哑首部的 er_short_term_cxt 还是指向那块已释放的内存,成了一个悬空指针,往往已经指向别的无关上下文。

悬空指针之后能走到任意代码执行,报告里已确认可利用 [5]。修复只有一行:每个使用周期开始时把 erh->er_short_term_cxt 清成 NULL,不再复用上一次的指针 [5]。

触发路径是「对复合类型上的域反复做约束校验」[3]。校验本身是常规操作:每次给带域约束的复合值赋值、传参、写回,都会跑一遍域检查;重复跑,悬空指针就被重复复用。

这里错的不是校验逻辑,是内存上下文的生命周期:建上下文、释放上下文、再用指针,三步分属不同的调用,中间没有人把指针清掉。

和前三篇比:门槛回到第二档

6460 要改复合类型定义,四条 SQL(建类型、PREPARE、ALTER TYPE、EXECUTE);18447 要建一个 SQL 函数、声明一个 any 输出参数;116304 只需要登录、跑并行查询;120150 需要能创建对象,比如建一个带 CHECK 约束的域,或者建一张用到这种域的表,然后反复触发域校验。

门槛排序:116304(只登录)< 120150、18447(需 CREATE)< 6460(需改类型定义)。四个都是 8.8 分,最终都是以数据库的操作系统用户身份执行代码。

收 CREATE 权限能挡住这篇,也能挡住 18447,但挡不住 116304。只登录的账号不在这篇的影响面里,这也是这篇和 116304 最大的区别。

影响范围:五个分支全在内

受影响的是 18.7 之前、17.12 之前、16.16 之前、15.20 之前、14.25 之前的全部版本,修复版就是这次发布的五个小版本 [3]。14.25 是 PG 14 的最后一个版本,之后不再有安全与缺陷修复。

时间线与利用状态

2026 年 11 月 12 日,公开通告发布,52 个 CVE 一次公开;CNA PostgreSQL 给出的向量为 CVSS:3.1,8.8 分 [4]。官方安全页标题栏写的是 CVSS 3.0,分数同为 8.8 [3]。

截至 2026 年 11 月 16 日发稿:CISA KEV 未收录 CVE-2026-120150(当前目录共 1781 条,2026.11.13 版)[9];EPSS 0.0058,未来 30 天被利用的预测概率约 0.58% [8];SecurityFocus 标注无公开 exploit,未确认在野利用 [7]。修复提交是公开的,机制描述完整,窗口期不宜久留。

一句提醒:目前还没有公开 PoC,「能创建对象就能触发」这个判断来自官方描述与修复提交的机制,不是已验证的触发结论;但触发路径不需要任何非默认配置,域校验是常规操作。

先做什么

第一,升级:升到 18.7 / 17.12 / 16.16 / 15.20 / 14.25。小版本升级不用 dump/reload,停库换二进制再启动就行。

第二,收 CREATE 权限:这篇的触发条件是能创建对象,收掉不必要的 CREATE 权限能缩小影响面;但收 CREATE 挡不住同批的 116304,那篇只登录就行。

第三,查账号:顺带收一遍不必要的登录账号和默认权限,尤其关注那些只有 SELECT 的账号,它们不在这篇的影响面里,但在 116304 的影响面里。

第四,扩展重编:虽然 120150 本身不破坏扩展兼容性,但同批补丁包含 6460 的 ABI 变动,用了第三方 C 扩展的实例升级后仍需重新编译扩展。

第五,PG 14 的用户:14.25 是最后一版,之后再有漏洞也不会修,排期迁到 15 或更新的分支。

参考资料

[1] PostgreSQL 官方通告:PostgreSQL 18.7, 17.12, 16.16, 15.20, 14.25, and 19 RC 2 Released!:https://www.postgresql.org/about/news/postgresql-187-1712-1616-1520-1425-and-19-rc-2-released-3442/

[2] ComputingForGeeks:PostgreSQL 18.7 Security Update: 52 CVEs and Patch Steps:https://computingforgeeks.com/postgresql-18-7-security-update-cves/

[3] PostgreSQL 安全页 CVE-2026-120150:https://www.postgresql.org/support/security/CVE-2026-120150/

[4] NVD:CVE-2026-120150:https://nvd.nist.gov/vuln/detail/CVE-2026-120150

[5] PostgreSQL 修复提交(Fix use-after-free in expanded-record domain constraint checking):https://postgr.es/c/2d91c1c78

[6] PostgreSQL 18.7 发布说明(E.1. Release 18.7):https://www.postgresql.org/docs/18/release-18-7.html

[7] SecurityFocus:CVE-2026-120150:https://www.securityfocus.com/cve/CVE-2026-120150

[8] FIRST EPSS(CVE-2026-120150,2026-11-15 数据):https://api.first.org/data/v1/epss?cve=CVE-2026-120150

[9] CISA 已知被利用漏洞目录(KEV,2026-11-13 版):https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json

原文作者: liups.com

原文链接: https://liups.com/posts/d3247a3a/

许可协议: 知识共享署名-非商业性使用 4.0 国际许可协议