跳转到主要内容

开源渡劫:PG 小版本发布,修复 52 个漏洞

11 月 12 日,PostgreSQL 全球开发组发布了全线受支持分支的小版本更新:18.7、17.12、16.16、15.20、14.25(这也是 PG 14 退役前的最后一版),同时放出了 PostgreSQL 19 RC 2。

熟悉 PG 社区节奏的老朋友一眼就能看出反常:往年年度大版本大多在 9 月或 10 月发布,今年 PostgreSQL 19 拖到 11 月中旬才出 RC 2。9 月底的 Beta 4 先砍掉了一批大特性,10 月中旬出 RC 1,现在正式版排到了 11 月 19 日。

PostgreSQL 中文站 pgsql.cc 同步更新 18.7–14.25 与 19 RC 2 发布消息

为什么拖这么久?发布团队在 10 月 10 日的邮件里交了底:各维护分支攒下了大批修复,得先把这些改动全合进 PG 19 RC 2,才敢发正式版。看看今天的发布公告就明白分量有多重了——单次修复 52 个安全漏洞(CVE),外加 140 多个 Bug。

PostgreSQL 18.7 等小版本修复的 52 个安全漏洞列表

搁在往年,PostgreSQL 一个季度小版本也就修三五个 CVE。8 月那一轮修了 28 个 CVE 和 110 多个 Bug,当时大家已经觉得够多了,结果三个月后直接涨到了 52 个和 140 多个。放在 PostgreSQL 三十年的发布史上,这个密度也相当罕见。

开源软件“渡劫”

今年漏洞扎堆往外冒,原因并不复杂:AI 辅助代码审计上强度了。

老冯在《当云被打成筛子》《当互联网真被打成筛子》和《渡劫期的 PostgreSQL 生态大更新》里聊过几次,眼下核心开源基础软件都在集体“渡劫”。翻开 18.7 官方发布注记的致谢栏,OpenAI Security Research Team、OpenAI Codex Security、Anthropic OSS program,以及 Claude 与 Ada Logics 的名字排成了一串。

看这 52 个 CVE 的类型,自动化审计的特征也很明显:32 个漏洞的 CVSS v3.1 评分都是 8.8,大片涉及任意代码执行。问题集中在类型混淆(Type Confusion)、释放后使用(Use-After-Free)、堆缓冲区溢出和整数回绕;从复合类型、plperl/pltcl、dblink、刚进内核不久的统计信息导入,一直到 pg_dump、pg_restore、reindexdb、vacuumdb 这些 DBA 日常顺手敲的工具,几乎翻了个遍。哪怕是一帮顶尖 C 语言老手打磨了三十年的代码库,遇上这种全天候的自动化扫描,陈年隐患也得排着队露出来。

这滋味老冯自己也很熟。不光 PostgreSQL,我维护的开源对象存储 Silo 最近也一直在接安全报告、审代码、发补丁,刚放出的 11 月 12 日版本又修掉了一批安全与正确性问题。

除了这 52 个 CVE,顺手修掉的 140 多个常规 Bug 里也有几个分量不轻的坑:在备库上跑并行 pg_dump,可能把导出文件和备库自身数据一起搞坏;增量备份可能打出损坏的备份集;GIN 索引和 pg_trgm 的 GiST 索引可能损坏或漏数据;未限定长度的 bpchar 列,B-tree 索引去重会让仅索引扫描返回错误结果。社区甚至趁这次小版本重写了查询优化器的连接消除(Join Removal)逻辑——官方说得很实在:小版本做这么大改动确实少见,但老代码实在补不动了,再打补丁还得接着漏。

该升还得升

每次发小版本,总有朋友来问老冯:这次急不急着升?

老冯平时的口径一直是:只要数据库老老实实待在内网防火墙后面,连进来跑 SQL 的也都是自己人,按常规维护窗口排期就行,犯不着自己吓自己。

但不用慌不等于拖着不升,尤其遇上今天这种分量的更新。内网隔离防得住公网扫描,防不住应用被打穿后的低权限账号提权——这批漏洞里有不少只要建对象这类普通权限就能触发(比如 CVE-2026-6460),连 pg_dump、pg_restore 都可能栽在恶意源库或来路不明的备份文件手里;至于备份损坏、索引查错数据,防火墙更帮不上忙。再加上 PostgreSQL 14 今天正式退役(EOL),这轮升级还是尽早排上日程。

同一大版本内升级不用折腾 pg_upgrade 或逻辑导出导入,但这回光换内核二进制还不算完。对照官方升级说明和发布注记,有几件手尾得一并处理:

  • C 语言扩展得重编:想把 CVE-2026-6460 彻底堵上,C 扩展必须拿新版头文件重新编译,部分扩展还得改源码。用发行版软件源的,盯一眼扩展包跟上了没有;自己编译的,老老实实重编并测一遍兼容性,别图省事把 composite_type_mismatch 检查关掉。之前那次小版本 ABI 翻车已经敲过警钟:内核和扩展从来是绑在一起的。
  • 问题索引得排查重建:检查受影响的 GIN 索引;重建用了 gist_trgm_ops 的 GiST 索引;重建未限定长度 bpchar 列上的 B-tree 索引(定长 char(n) 不受影响);要是撞上 missing chunk number 报错,按说明把对应表的索引重做一遍。
  • 备份基线与分区表巡检:开了增量备份的,升完级重打一次全量备份刷新基线;分区表顺手查一下有没有不该存在的 NOT NULL NO INHERIT 约束。
  • PG 14 准备搬家:14.25 是最后一班车,还在跑 14 的同学该排大版本升级计划了。

企业订阅客户直接找老冯就行,约个窗口,我们把内核、扩展升级和后续索引约束巡检一并办了;自建团队就辛苦对照上面几条,自己排期跑一轮。

说到底,最近这几个月就是对开源基础软件维护能力的一次集中检验。单次爆出 52 个 CVE 看着吓人,换个角度想反倒是好事——说明这软件有人管,出了问题还有人兜底发补丁。真正麻烦的是那些没人管、半死不活的项目和孤儿分支:漏洞照样被人用 AI 一抓一把,但没人修,摆在那儿就是现成的后门。之前 pgBackRest 停更又续命的风波讲的也是同一个理:开源底座这摊活,总得有活人接着干。

Pigsty 4.6 首日跟进

光催大家升级不够,做发行版的自己手脚得先利索。

PostgreSQL 发版当天,Pigsty v4.6.0 同步跟进,版本基线对齐到 PostgreSQL 18.7 与 Pig 1.11.0,配套的全平台扩展重编译、软件源同步和离线安装包也一并推了出去。

这轮更新不只是换个 PG 内核。为了应对最近密集的安全审计,老冯把仓库里的第三方依赖和几百个 PG 扩展挨个梳理了一遍;手里维护的几个 Go 基础设施项目也集中发了一轮新版:

从数据库内核、扩展生态、包管理供应链到监控与备份存储底座,这一轮都重新对齐了。另外,老冯维护的 PostgreSQL 中文文档 也已经更新了这批最新小版本。

聊个高兴点的:汉化来了

前面聊了一堆修洞渡劫的糟心事,最后说点开心的。

老冯前阵子系统重做并审校的简体中文消息(NLS zh_CN),已经正式进了 PostgreSQL 14 到 19 全部六个大版本。 翻一翻这轮各版本的发布标签,连收官的 14.25 都带上了,一个不落。

从现在起,PG 服务端和命令行工具吐出来的提示与报错,总算能说一口利索的中国话了。前因后果可以看《PostgreSQL 中文版来了》和《为什么要做 PostgreSQL 汉化?》。

老冯的名字 Ruohang Feng,也写进了 PostgreSQL 19 发行说明的致谢名单(Acknowledgments)。11 月 11 日上游合入了 Add translators to release notes credits,把包括老冯在内的一批译者加了进去。

PostgreSQL 19 发行说明致谢名单新增译者 Ruohang Feng

目前官方 Babel 状态表上,PG 19 简体中文各组件覆盖率在 99%–100%,PG 14–18 在 98%–100%;封版前临时变动的几条零星消息,老冯在 pgnls 仓库里也已经补齐到了 100%,后面会一直跟着上游走。

PostgreSQL 官方 Babel 状态表:PG 19 简繁中文翻译覆盖率

想来这事多少也带点黑色幽默。过去这么多年,到处都在喊“做中国人自己的数据库”;放眼一圈,国内多少下游厂商吃着 PostgreSQL 的红利,拿 PG 代码包装出各种商业故事,结果上游最基础的中文消息目录,自何伟平等前辈早年开荒之后,除了几本客户端目录偶有修补,服务端主干一晃七年没人动过。这种费工夫、又没法拿去融资讲故事的苦活,最后还是得有人挽起袖子自己干。

吐槽归吐槽,开源世界本就天下为公。老冯挺希望国内这些下游厂商顺手把上游这波汉化接过去——好事一桩,免得顶着“国产数据库”的招牌,真到报错的时候连句囫囵中国话都说不利索,白白让人看笑话。

写这篇文章的时候,老冯正猫在外地出差的酒店房间里,明天还要去中国企业 AI 大会讲一场。今晚就在一边对着上游公告核细节,一边远程指挥“家里的 Agent 小弟”跑全平台编译打包、同步软件源、发 Pigsty 4.6、编中文文档,争取让大伙儿睁眼就能用上验证妥当的新包。

外头风急,但也不用慌。别焦虑,别侥幸,把该升的版本升了,把自家的底座看住就行。

延伸阅读