PostgreSQL CVE-2026-18447,any 输出参数类型混淆

11 月 12 日,PostgreSQL 发布安全更新:18.7、17.12、16.16、15.20、14.25,一次修了 52 个安全漏洞 [1],其中 32 个是 8.8 分 [2]。昨天专栏写了同批的头条 CVE-2026-6460,这篇是同批的第二个类型混淆:CVE-2026-18447,CVSS 3.1 8.8 分,CWE-843 [3]。一个能创建 SQL 函数的账号,把一个输出参数声明成 any 类型,就能以运行数据库的操作系统用户身份执行任意代码 [3]。

原语:校验只管住了输入,没管住输出

PostgreSQL 有一类伪类型(pseudo-type),any 是其中之一:它不是一个真正的数据类型,只是一个占位符,表示「任何类型都可以」。SQL 语言函数的校验器 fmgr_sql_validator() 本来会拒绝不安全的伪类型参数,但它只检查了输入参数,漏了输出参数 [5]。

于是,一个 SQL 语言函数可以声明一个类型为 any 的输出列。函数返回结果时,tupledesc_match() 按声明的输出列逐一核对结果行,用 IsBinaryCoercible() 判断类型是否兼容;但 IsBinaryCoercible() 对 any 接受一切类型。结果行就可能按一个与实际物理布局不符的元组描述符来读,先是内存内容泄露,再走到任意代码执行 [5]。

修复很直接:让校验器对所有模式的参数都做伪类型检查,不只输入参数。发布说明里写的是「不允许把 SQL 函数声明为返回 any 类型」[6]。修复提交 11 月 9 日落地,作者 Peter Geoghegan,报告人 Peter Geoghegan 与 AdaLogics 的 Stephan Lipp,Tom Lane 复核 [5]。

和昨天的 6460 是同一批,不是一个原语

两个漏洞同批、同族、不同原语。6460 是复合类型加准备好的语句再加 ALTER TYPE 改类型,触发要四条 SQL;18447 只要建一个 SQL 函数、声明一个 any 输出参数。两个都是 CWE-843 类型混淆,都是 8.8 分,最终都是以数据库的操作系统用户身份执行代码。

条件上 18447 更低一档:6460 要改复合类型定义,18447 只需要创建函数的权限。都不需要超级用户、扩展、文件访问,只要能登录、能在某个 schema 里创建对象。

修复的份量也不同:6460 的修复是复合属性版本化,改动相当大;18447 的修复只是收紧校验器,一处检查补上漏掉的参数模式。

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

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

时间线与利用状态

2026 年 11 月 9 日,修复提交落地 [5]。2026 年 11 月 12 日,公开通告发布,52 个 CVE 一次公开;NVD 当天收录,尚未给出自己的评分,CNA PostgreSQL 给出的向量为 CVSS:3.1,8.8 分 [4]。

截至 2026 年 11 月 14 日发稿:CISA KEV 未收录 CVE-2026-18447(11 月 13 日版目录,共 1781 条)[9];EPSS 0.0059,未来 30 天被利用的预测概率约 0.59% [8];未确认在野利用与公开 PoC [7]。不过修复提交是公开的,机制描述完整,触发条件只是建一个函数,窗口期不宜久留。

先做什么

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

第二,查权限:能登录、能在 schema 里创建函数或对象的账号都在影响面里,收一遍不必要的 CREATE 权限和登录账号。

第三,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-18447:https://www.postgresql.org/support/security/CVE-2026-18447/

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

[5] PostgreSQL 修复提交(Reject pseudo-type output parameters in SQL functions):https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=eb423d5987a70a7afc64d6f74b5ae724f1bd202e

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

[7] SecurityOnline:PostgreSQL Security Update Fixes 52 CVEs, CVE-2026-6460:https://securityonline.info/postgresql-security-update-52-cves/

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

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

原文作者: liups.com

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

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