四条 SQL 就能打崩数据库进程:PostgreSQL CVE-2026-6460,22 年类型混淆,8.8 分

11 月 12 日,PostgreSQL 发布安全更新:18.7、17.12、16.16、15.20、14.25,一次修了 52 个安全漏洞,其中 32 个是 8.8 分。头条是 CVE-2026-6460,CVSS 3.1 8.8 分:一个最低权限的登录账号,四条 SQL 就能把数据库进程打崩,研究者还把同一个原语走到了远程代码执行。
这是一个类型混淆。PostgreSQL 内部用 Datum 表示值,Datum 本身不知道自己代表什么类型:8 个字节的载体,可能是直接存的值,也可能是指针。漏洞出在「准备好的语句抓住了旧值,类型系统却在它运行前改了定义」这个缝里。
四条 SQL 是研究者 Mehmet Ince 公开的触发方式:
1 | CREATE TYPE pg_temp.poc2 AS (key uuid); |
PREPARE 时,字面量按 uuid 解析,计划里存的是 16 字节的二进制 UUID(开头是 01 02)。接着 ALTER TYPE 把这个复合类型的字段改成 bytea。输出时 record_out() 按新类型挑输出函数,于是 16 字节的 UUID 被当成 varlena 指针交给 byteaout()。内联数据事后变成了指针,进程直接段错误:server process terminated by signal 11。
关键细节:字面量必须写在 PREPARE 的语句里。如果把它当成参数 $1 传进去,解析会推迟到 EXECUTE 时、类型已经改完,值转得干干净净,不会触发。
从打崩到 RCE:同一个混淆换个用法可以绕过 ASLR。三个 UUID 字段(48 个可控字节)伪造一个 PostgreSQL 数组,字段改成 bigint[] 后,unnest() 按引用返回一个 text 元素(指针),而 SQL 层面现在按值读成 bigint。研究者 8 月发现这个问题,9 月上报了 21 个相关 case,其中 6 个进了这次的 52 个 CVE,6460 是这一族问题的总入口。
条件很低:全部在 pg_temp 里跑,最低权限的登录账号,不需要超级用户、扩展、文件访问,只要 SQL。
根子有多老:这个原语可以追溯到 2004 年 5 月 5 日的提交,也就是 ALTER TABLE ... ALTER COLUMN ... TYPE 刚落地的时候。自那以后发布的每个 PostgreSQL 版本都带着它。
修复:复合属性版本化。每个复合类型的值打上描述符的版本号,输出时发现世界变了就直接报错:row type of datum tuple was altered after the datum's creation。修复提交 11 月 9 日落地,公开通告 11 月 12 日发布。
影响范围:五个分支全在内
受影响的是 18.7 之前、17.12 之前、16.16 之前、15.20 之前、14.25 之前的全部版本,修复版就是这次发布的五个小版本。
这次发布还顺带终结了 PG 14:14.25 是 PG 14 的最后一个版本,之后不再有安全与缺陷修复。11 月 1 日专栏那篇「PostgreSQL 14 退役倒计时」说的就是这天。
时间线:修复先落地,通告后公开
2026 年 11 月 9 日,修复提交落地。
2026 年 11 月 12 日,公开通告发布,52 个 CVE 一次公开;CISA 的 SSVC 记录利用状态为 none,目前没有确认的在野利用。触发用的四条 SQL 已经在研究者的文章里公开。
先做什么
第一,升级:升到 18.7 / 17.12 / 16.16 / 15.20 / 14.25。小版本升级不用 dump/reload,停库换二进制再启动就行。
第二,扩展一起升:这次修复比较侵入,针对旧版本头文件编译的扩展,装在新服务器上跑也不会带上 6460 的检查,必须重编并在同一个变更里和服务器一起更新。
第三,PG 14 的用户:14.25 是最后一版,之后再有漏洞也不会修,排期迁到 15 或更新的分支。
第四,查权限:能登录、能建对象的账号都在影响面里,收一遍不必要的 CREATE 权限和登录账号。
参考资料
[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] PostgreSQL 安全页 CVE-2026-6460:https://www.postgresql.org/support/security/CVE-2026-6460/
[3] Mehmet Ince:How I Ended Up Turning a 22-Year-Old PostgreSQL Type-Confusion Primitive into RCE (CVE-2026-6460):https://mehmetince.net/part-3-6-how-i-ended-up-turning-a-22-year-old-postgresql-type-confusion-primitive-into-rce-cve-2026-6460/
[4] pganalyze:Postgres 18.7 Security Release: The Impact of CVE-2026-6460 & other memory corruption issues:https://pganalyze.com/blog/5mins-postgres-18-7-security-release-cve-2026-6460
[5] OffSeq Threat Radar:CVE-2026-6460:https://radar.offseq.com/threat/cve-2026-6460-cwe-843-type-confusion-in-postgresql
原文作者: liups.com
原文链接: https://liups.com/posts/59773073/
许可协议: 知识共享署名-非商业性使用 4.0 国际许可协议