发布日期:. 2026-05-14
本次发布包含来自 16.13 的多项修复。 有关 16 主版本新特性的说明,请参见 Section E.15。
防止处理启动包时发生无界递归 (Michael Paquier) § §
恶意客户端可以通过无限交替发送被拒绝的 SSL 和 GSS 加密请求, 使已连接的后端崩溃。
PostgreSQL 项目感谢 Calif.io (与 Claude 和 Anthropic Research 协作)报告此问题。 (CVE-2026-6479)
修复内存分配计算中的多处整数溢出问题 (Tom Lane,Nathan Bossart,Heikki Linnakangas) § § § § § § § § § §
多处代码在计算需要分配多少内存时,未充分注意整数溢出的可能性。 溢出会导致分配过小的缓冲区,调用者随后会写过该缓冲区的末尾。 这至少会触发服务器崩溃,并且很可能可被利用来执行任意代码。 在许多但绝非所有情况下,这种风险只存在于 32 位构建中。
PostgreSQL 项目感谢 Xint Code、 Bruce Dang、Sven Klemm 和 Pavel Kohout 报告这些问题。 (CVE-2026-6473)
在逻辑复制源检查中正确引用对象名称 (Pavel Kohout) §
ALTER SUBSCRIPTION ... REFRESH PUBLICATION 将模式名和关系名未经引用就插入到 SQL 命令中, 从而允许在发布者上执行任意 SQL。
PostgreSQL 项目感谢 Pavel Kohout 报告此问题。 (CVE-2026-6638)
拒绝 ts_headline() 中过长的选项 (Michael Paquier) §
StartSel、StopSel 和 FragmentDelimiter 字符串的长度不得超过 32Kb, 但此前没有对此进行检查。过长的值通常会使服务器崩溃。
PostgreSQL 项目感谢 Xint Code 报告此问题。 (CVE-2026-6473)
防范 timeofday() 和 pg_strftime() 中的恶意时区名 (Tom Lane) § §
精心构造的时区设置可能将 % 序列传递给 snprintf(),从而可能造成崩溃或泄露服务器内存。 另一条导致类似结果的路径,是让 pg_strftime() 使用的固定大小输出缓冲区溢出。
PostgreSQL 项目感谢 Xint Code 报告此问题。 (CVE-2026-6474)
创建多范围类型时,确保用户在为该多范围类型指定的模式上 拥有 CREATE 权限(Jelte Fennema-Nio) §
多范围类型可以放入不同于其父范围类型的模式中, 但此前在这样做时遗漏了必需的权限检查。
PostgreSQL 项目感谢 Jelte Fennema-Nio 报告此问题。 (CVE-2026-6472)
在认证代码中使用时序安全的字符串比较 (Michael Paquier) § §
在检查口令、哈希等值时,使用 timingsafe_bcmp() 而不是 memcpy() 或 strcmp()。 尚不清楚这些函数的数据依赖性在这些位置是否真的可被有效利用, 但为安全起见,将其替换。
PostgreSQL 项目感谢 Joe Conway 报告此问题。 (CVE-2026-6478)
将 PQfn() 标记为不安全,并避免在 libpq 内部使用它(Nathan Bossart) §
对于非整数结果类型,PQfn() 不会获得输出缓冲区的大小, 因此它无法检查服务器返回的数据能否放入缓冲区。 恶意服务器因而可能覆盖客户端内存。若不改变 API 就无法修复这一点, 所以将该函数标记为已废弃。在 libpq 内部, 改用一个能够执行缺失检查的变体版本。
PostgreSQL 项目感谢 Yu Kunpeng 和 Martin Heistermann 报告此问题。 (CVE-2026-6477)
防止 pg_basebackup 和 pg_rewind 中的路径遍历 (Michael Paquier) §
这些应用未能验证从其输入中读取的输出文件路径, 因而恶意来源可以覆盖这些应用可写的任意文件。 通过拒绝绝对路径或包含父目录引用的路径,约束数据可以写入的位置。
PostgreSQL 项目感谢 Tencent Xuanwu Lab 的 XlabAI Team 和 Valery Gubanov 报告此问题。 (CVE-2026-6475)
防范 contrib/intarray 的 query_int 类型以及 contrib/ltree 的 ltxtquery 类型中的字段溢出(Tom Lane) § §
这些查询结构的解析没有检查 16 位字段溢出, 因而可能构造出无效的查询树。执行该查询时,这可能使服务器崩溃。
PostgreSQL 项目感谢 Xint Code 报告此问题。 (CVE-2026-6473)
防范 contrib/ltree 的 lquery 类型中过长的值(Michael Paquier) §
包含超过 64K 个项的值会导致内部溢出, 可能造成栈破坏或错误结果。
PostgreSQL 项目感谢 Vergissmeinnicht、A1ex 和 Jihe Wang 报告此问题。 (CVE-2026-6473)
防止 contrib/spi 中的 SQL 注入和缓冲区越界写 (Nathan Bossart) §
check_foreign_key() 对键值的引用不够谨慎, 并且还使用固定长度缓冲区构造查询。虽然该模块只是作为示例代码, 但仍然不应包含此类危险错误。
PostgreSQL 项目感谢 Nikolay Samokhvalov 报告此问题。 (CVE-2026-6637)
在假定可排序类型上的等值条件意味着唯一性之前,检查是否存在非确定性排序规则 (Richard Guo) § §
许多规划器优化都会假定,例如,如果 x 上存在唯一索引, 则最多只有一个表行能满足 WHERE x = 'abc'。 不过,如果该索引和 WHERE 子句附加了不同的排序规则, 一般来说这个结论是不安全的。当两个排序规则都是确定性排序规则时这是安全的, 因为该属性本质上要求两个字符串相等就意味着逐位相等。 但非确定性排序规则并不如此,因此如果 WHERE 子句或索引任一方具有 非确定性排序规则,基于唯一匹配假设进行优化就可能给出错误的查询结果。
修复连接移除期间 RestrictInfo 结构中关系引用移除不完整的问题 (Tom Lane) § §
已经证明这个疏忽会导致规划器失败,例如意外出现 “FULL JOIN is only supported with merge-joinable or hash-joinable join conditions” 错误。它还可能在其他情况下导致 未能考虑有效的计划。
修正规则动作和规则限定条件中对 NEW 生成列的错误处理 (Richard Guo,Dean Rasheed) §
此前,在 INSERT 情况下,此类列引用会生成 NULL; 在 UPDATE 情况下,则等同于 OLD 值。
修复虚假的 “generated columns are not supported in COPY FROM WHERE conditions” 错误(Tom Lane) §
在 COPY FROM WHERE 条件中使用系统列时, 有时会错误报告此错误。
当 MERGE 在可重复读或可串行化模式下遇到被并发更新的元组时, 正确报告串行化失败(Tender Wang) §
此前,这类场景的行为与较低隔离级别中的行为相同。
修复源表包含已删除列时的 CREATE TABLE ... LIKE ... INCLUDING STATISTICS(Julien Tachoires) §
在这类情况下,扩展统计信息对象可能会被错误复制, 或该命令可能给出错误的报错。
允许 ALTER INDEX ... ATTACH PARTITION 在适当时将父索引标记为有效 (Sami Imseih) §
存在一些边界情况:即使分区索引的所有叶子索引均有效, 该分区索引仍可能保持被标记为无效。 此变更提供了一种机制,使用户可以在不借助手工更新系统目录的情况下纠正这种情况。
修复 ALTER FOREIGN DATA WRAPPER,使其不要删除 包装器对象对其处理器函数的依赖(Jeff Davis) §
不允许复合类型通过多范围成为自身的成员 (Heikki Linnakangas) §
当中间类型是域、数组、复合类型或范围时,我们已经禁止此类情况; 但此前遗漏了多范围。
修复 Datum 镜像比较,使其不受符号扩展差异影响 (David Rowley) §
这修复了一些此前会导致 “could not find memoization table entry” 错误或错误查询结果的情况。
修复带非严格等值操作符的哈希 IN/NOT IN 的错误逻辑(Chengpeng Yan) §
此前的编码可能崩溃或给出错误结果。 所有内置数据类型都有严格的等值操作符, 因此此问题只可能出现在扩展数据类型上。
在 to_char() 中截断过长的区域设置相关数字符号 (Tom Lane) §
如果某个区域设置指定了长度超过 8 字节的货币符号、千位分隔符、 小数符号或正负号符号,就可能出现缓冲区越界写。 现实世界中不存在这样的区域设置,而且非特权攻击者也不太可能在 Postgres 服务器下安装恶意区域设置定义;但为安全起见, 检查过长符号并在需要时截断。
防止解析 Ispell 字典的词缀文件时发生缓冲区越界写 (Tom Lane) § §
损坏或恶意的词缀文件可能使服务器崩溃。 这不被视为安全问题,因为文本搜索配置文件被假定为可信, 但仍然值得修复。
防范窗口聚合的帧起始和结束位置计算中的整数溢出 (Richard Guo) §
用户指定的极大偏移量(接近 INT64_MAX)可能导致错误或错误的查询结果。
修复 array_agg_array_combine(), 使其正确组合数组的空值位图(Dmytro Astapov) §
此错误导致并行化的 array_agg(anyarray) 计算有时产生不正确输出。
如果 sync_file_range() 返回错误码 EINTR,则进行重试(DaeMyung Kang) §
修复 pg_stat_reset_single_table_counters() 在共享系统目录上的错误行为(Chao Li) §
这类场景会产生重置当前数据库的 stat_reset_timestamp 的副作用,而这不是有意的。
当并行应用工作进程空闲时更新活动统计信息 (Zhijie Hou) §
以前,刚完成事务的统计信息可能长时间不被报告,尤其在工作负载较轻时。
修复 pglz_decompress() 接收损坏输入时的缓冲区越界读问题 (Andrew Dunstan) §
此前可能读取输入末尾之后的几个字节,在极其不走运的情况下可能导致崩溃。
确保即使发生错误后,tuplestore 数据结构在内部也保持一致 (Tom Lane) §
此前代码对此不够谨慎,这在大多数时候没有问题, 但对于支撑 WITH HOLD 游标的 tuplestore 则有问题。 在 v15 及更早版本中,这会导致容易重现的崩溃; 目前尚不知道较新分支是否易受影响,但最好在所有分支中保持一致性。
修复 pg_stat_replication 中过早报告 NULL 延迟的问题 (Shinya Kato) §
即使复制活动正在发生,延迟列也经常读作 NULL。
避免处理不记录 WAL 的 GiST 索引时罕见的刷盘失败 (Tomas Vondra) §
不记录日志的 GiST 索引有时仍可能产生 “xlog flush request n/nnnn is not satisfied” 错误,原因是错误地选择了一个 “假 LSN” 来表示插入点。
修复对奇数大小段所需 DSA 页面映射大小的低估问题 (Paul Bunn) §
此误算导致越界访问,并进而造成服务器崩溃。
修复处理扩展数据类型表达式上的扩展统计信息时可能发生的服务器崩溃 (Michael Paquier) §
如果该数据类型的 typanalyze 函数没有计算任何有用的统计信息, 就可能发生 NULL 指针解引用。 核心内置的 typanalyze 函数都不会这样表现,但扩展可能会如此。
修复基于 ICU 的字符串处理中轻微的内存泄漏(Jeff Davis) §
如果启动进程失败,在 postmaster 退出前正确关闭其他子进程 (Ayush Tiwari) §
对此情况的处理依赖于一个早已过时的假定: 启动进程运行时不存在其他 postmaster 子进程, 因此可以立即退出 postmaster。 孤立的子进程最终会注意到 postmaster 已死亡并自行退出, 但更干净的关闭过程仍然是可取的。
修复检查点 WAL 重放与多事务 ID 创建之间的竞态条件 (Heikki Linnakangas) §
跟随来自较旧小版本主库的 WAL 的备库, 可能陷入反复崩溃和重启的循环, 并抱怨 “could not access status of transaction”。
防止 WAL 发送器进程关闭时无限期等待 (Anthonin Bonnefoy) § §
在发布逻辑复制数据的集簇关闭时,WAL 发送器会等待所有待处理 WAL 被写出。 但它没有正确请求执行此操作,因此在某些情况下这可能变成无限期等待。
确保恢复期间对表空闲空间映射的更改会被持久化 (Alexey Makhmutov) §
此前,在重放应当改变空闲空间映射的操作时,WAL 重放确实会更新该映射; 但如果启用了校验和,映射页缓冲区不会被标记为脏, 因此这些更改可能永远不会被写出。在备库上,随着时间推移, 这会导致映射与表的实际内容严重不符。虽然该映射只作为提示使用, 但在备库被提升为活跃服务器后,直到大部分映射被更新修复之前, 这种情况可能在一段时间内造成显著性能下降。
修复某些 ecpg 函数在没有已建立连接的情况下被调用时的崩溃 (Shruthi Gowda) §
修复备份解压和 tar 解析代码中的多项错误 (Andrew Dunstan, Tom Lane, Chao Li) § § §
pg_basebackup 和 pg_verifybackup 中使用的解压和 tar 文件读取代码, 会错误处理 tar 文件填充数据,在边界情况下可能损坏 LZ4 压缩数据, 未检查一些异常错误条件,压缩/解压错误后未退出(导致级联错误报告), 并且会泄漏内存。
在 pg_dumpall 中,不要跳过具有悬挂授权者 OID 的角色 GRANT(Tom Lane) §
作为替代,像 v16 之前那样,通过发出不带任何 GRANTED BY 子句的 GRANT 来处理此类情况。这可以避免在可预见的情况下丢失授权, 因为 v16 之前的服务器不会阻止删除授权者角色。继续针对缺失的授权者发出警告, 但仅当源服务器为 v16 或更高版本时才这样做。
在 pg_upgrade 中,连接到较旧源服务器时注意使用正确的协议版本 (Jacob Champion) §
在尝试从 2018 年以前的服务器升级时,这可能会造成问题。
在 contrib/basic_archive 中,允许启动时归档目录不存在 (Nathan Bossart) §
此前,如果 basic_archive.archive_directory 的设置没有指向一个已存在目录,就会被拒绝。这并不理想, 因为即使该目录稍后出现,归档也会无限期卡住。
修复 contrib/ltree,使其能够处理大小写折叠改变字符串字节长度的情况 (Jeff Davis) §
此前,指定大小写不敏感匹配的 lquery 模式, 可能无法匹配本应匹配的标签。
在 contrib/pg_stat_statements 中, 如果解析 pgss_query_texts.stat 文件时发生错误, 不要泄漏内存(Heikki Linnakangas) §
在 contrib/postgres_fdw 中, 避免因过早清理失败连接而崩溃(Etsuro Fujita) §
如果远程连接的中止清理失败,我们就不能再使用它。 但要将关闭连接对象延迟到事务结束时执行, 因为打开的游标等数据结构中可能仍有对它的引用。
将时区数据文件更新到 tzdata 2026b 发布版本 (Tom Lane) §
British Columbia(America/Vancouver)将从 2026 年 11 月开始全年采用 UTC-07 (实际上就是永久 DST)。本次发布假定其 TZ 缩写从那时起为 MST。这看起来可能会改变,但尚不清楚会使用什么新缩写。 另外还有一项针对 Moldova 的历史修正:自 2022 年以来,他们一直遵循 EU 的 DST 转换时间。
如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。