PostgreSQL版本更新记录(202x)


本文专用于PostgreSQL数据库的重大的更新汇集(不含独立版本更新),截止于2030年之前。
2012-09-24 更新记录:
PostgreSQL 全球开发组发布了当前 PostgreSQL 所有版本的更新,包括 9.2.1, 9.1.6, 9.0.10, 8.4.14 和 8.3.21.该版本修复了 9.1 和 9.2 中存在的关键问题,如果你正在使用这两个版本请立即更新,而 8.3、8.4 和 9.0 用户应该尽快制定停机更新的准备计划。这个更新修复了两个潜在的数据破坏的问题,这两个问题影响 9.1 和 9.2 版本,当服务器崩溃、使用“immediate” 方式关机或者故障时无法转到待机服务器时候发生。首先开发组发现了会破坏 BTREE 和 GIN 索引,其次破坏可视图(visibility map).而这次更新就是为了修复这两个问题。我们强烈建议使用 9.1 和 9.2 的用户在升级完运行 VACUUM 或者构建索引,详情请看 the 2012-09-24 Update wiki page
这次更新还包含修复了一些小问题,包括最新发布的 9.2 版本中的问题,列表如下:
fix sorting issue with IN lists and indexes
fix planner failure when combining GROUP BY with window functions
improve selectivity of text searches using prefixes
prevent rescanning of WITH clauses from giving wrong answers
fix PL/Perl crashing issue
reduce bloat for multi-column GiST indexes
time zone data changes for Fiji
disallow Extensions from circular schema assignment
prevent crashes when default_transaction_isolation is set to "serializable"
several minor fixes to pg_upgrade
要使用这些更新,只需要关闭数据库,更新二进制文件并重启即可。而如果是跨版本的升级,例如 9.1 到 9.2 这样就必须导出数据后升级再重新导入,或者使用 pg_upgrade。如果跨越的版本太多则需自行附加的更新后操作,详情请看发行说明。
PostgreSQL将调整版本号方案
2016年6月消息,PostgreSQL现有的版本号方案是X.Y.Z,X代表重大特性集的更新,Y表示每年发布的大版本更新,Z代表累积补丁更新,PostgreSQL的最新版本是9.5.3。在最近举行的PostgreSQL会议上,开发者讨论版本号方案变更,问题主要与第一个数字有关——随着特性集的成熟,具有里程碑意义的特性越来越少了。因此PostgreSQL项目提议采用X.Y的版本方案,明年的大版本号升级到10,10.2将代表2017年发布的第二个更新,2018年发布的版本将从11开始。
PostgreSQL 9.6.2,9.5.6,9.4.11,9.3.16,9.2.20发布
PostgreSQL全球开发组已经发布了该数据库系统的所有支持版本的更新,包括9.6.2,9.5.6,9.4.11,9.3.16和9.2.20。此版本包括防止索引构建和某些预写日志重播情况下的数据损坏问题的修复程序,下面将详细介绍,它还包含在过去三个月内其他错误报告75个补丁。用户可以计划在下次计划的停机时间应用此更新。
用CREATE INDEX CONCURRENTLY造成损坏
如果在以前没有建立索引的列上调用CREATE INDEX CONCURRENTLY,则存在竞争条件,则在CREATE INDEX CONCURRENTLY命令同时运行的事务更新的行可能已被错误索引。如果怀疑这可能发生,最可靠的解决方案是在安装此更新后重建受影响的索引。这个问题存在于PostgreSQL的9.2,9.3,9.4,9.5和9.6系列中。
修复了可见性和预写日志的稳定性
这些版本包含了几个修复,以提高可见数据和WAL日志记录的稳定性,这里要强调一下。
在此版本之前,当用于目录扫描的特殊快照当前可用时,数据可能会被真空操作过早删除。具体来说,真空操作不会知道这个特殊快照的最早的xmin。错误将与一个消息,如:
"cache lookup failed for relation 1255"
此版本确保vacuum操作将考虑目录扫描快照。此外还有几个修复程序来提高预写日志的稳定性,包括:
* BRIN索引WAL日志记录的修复,其中重放可能使BRIN索引的一部分无用并需要重新计算
* 修复重置未记录表的问,其中将在`wal_level = minimal`设置下创建WAL日志,并且在崩溃后重放时,该表将不会被正确重置
* 修复WAL页头验证,在重新读取段时,在恢复期间会报告“out-of-sequenceTLI” 错误段
这些问题存在于9.6系列的PostgreSQL版本中,也可能存在于9.2,9.3,9.4和9.5系列中。
错误修复和改进
此更新还修复了在过去几个月中报告的一些错误。其中一些问题只影响9.6系列,但许多影响所有支持的版本。在此版本中提供了超过75个修订,包括:
在热备机(hot standby)模式下操作的几个修复
不允许在synchronous_standby_names中将num_sync字段设置为零
不要根据用户的连接限制计算后台工作进程
修复检查可以删除扩展成员对象的时间
修复扩展成员对象的初始权限的跟踪,以便它可以正确地与ALTER EXTENSION … ADD / DROP一起使用
几个vacuum和autovacuum的修复
修复在尝试应用新的视图选项之前,CREATE OR REPLACE VIEW以更新视图查询
确保ALTER TABLE在重建索引时保留索引表空间分配
查询计划器的几个修复程序,包括外部表和CTE的修复程序
围绕全文搜索功能的几个修复程序,以提高搜索的准确性和性能
几个数组函数的几个修复和性能改进
围绕特定ALTER TABLE操作的外键约束与触发器函数的交互的几个修复
删除返回不正确数据的日期/时间数据类型的优化
修正了将视图重排不正确地用作常规表重排
修复”target lists can have at most N entries”问题,在使用ON CONFLICT与宽表时修正不正确的报告
修复“query provides a value for a dropped column”的错误信息,提供了一个值“INSERT或UPDATE期间在具有删除列的表上
阻止UPDATE源表达式中的foo.*的多列扩展
确保为多行VALUES结构准确地确定列类型
psql 命令行工具的几个修复程序
防止pg_start_backup()和pg_stop_backup()的多个调用同时运行
pg_dump,pg_restore和pg_basebackup的几个修复,包括备用服务器上可能的pg_basebackup故障,包括WAL文件
并行工作的几个修复和并行查询的计划,包括在重新扫描期间并行查询可用的工作程序数量减少时修复崩溃
几个PL/pgSQL,PL/Python和PL/Tcl的修复
contrib模块的几个修复
在~/.pgpass文件中允许DOS样式的行尾,甚至在Unix上
更新时区数据文件到tzdata发布2016j为北Cyprus(增加一个新的区域Asia/Famagusta),俄罗斯(增加一个新的区域Europe/Saratov),Tonga和Antarctica/Casey的DST历史变化。意大利,哈萨克斯坦,马耳他和巴勒斯坦的历史修正。切换到喜欢 Tonga 的数字区缩写。
更新
所有PostgreSQL更新版本都是累积的。如果只是小版本号一样,用户不需要转储和重新加载其数据库,也不需要使用pg_upgrade来更新版本; 只需要简单地关闭PostgreSQL数据库并更新其二进制文件。如果你受到上述CREATE INDEX CONCURRENTLY错误的影响,你重建索引。下面是一个如何在生产系统中重建索引而不会失去使用旧索引的示例:
CREATE INDEX CONCURRENTLY new_index_name ON table_name (column_name);
DROP INDEX CONCURRENTLY old_index_name;
ALTER INDEX new_index_name RENAME TO old_index_name;
请注意,使用此方法意味着你将短暂拥有相同索引的两个副本,因此如果磁盘空间是一个问题,你可能需要采取其他方法。如果用户做大版本更新,或者跳过一个或多个更新版本,可能需要运行其他更新后步骤; 有关详细信息,请参阅早期版本的发行说明。
PostgreSQL 六版齐发,修复 3 个安全漏洞
PostgreSQL全球开发小组发布了数据库系统支持的版本更新,包括10.1,9.6.6,9.5.10,9.4.15,9.3.20和9.2.24。此版本修复了三个安全问题,还修复了在过去三个月中报告的BRIN索引,逻辑复制和其他错误中发现的问题。该版本已经修复了三个安全漏洞:
CVE-2017-12172:启动脚本允许数据库管理员修改根文件
CVE-2017-15098:JSON函数中的内存泄露
CVE-2017-15099:INSERT ... ON CONFLICT DO UPDATE无法强制执行SELECT权限
bug修复和改进:
Fix a race condition in BRIN indexing that could cause some rows to not be included in the indexing.
Fix crash when logical decoding is invoked from a PL language function.
Several fixes for logical replication.
Restored behavior for CTEs attached to INSERT/UPDATE/DELETE statements to pre-version 10.
Prevent low-probability crash in processing of nested trigger firings.
Do not evaluate an aggregate function's argument expressions when the conditions in the FILTER clause evaluate to FALSE. This complies with SQL-standard behavior.
Fix incorrect query results when multiple GROUPING SETS columns contain the same simple variable.
完整更新内容请查看发布主页。
2019-02-14 更新记录:
PostgreSQL 于情人节当天对所有受支持的数据库版本发布了更新,包括 PostgreSQL 11.2, 10.7, 9.6.12, 9.5.16 和 9.4.21 这五个不同的分支。更改了 PostgreSQL 接口与fsync()之间的行为,此外还包含了针对分区的修复程序,以及过去三个月内反馈的70多个其他错误。更新亮点就是上面所提到的 PostgreSQL 接口与fsync()之间的行为变更,下面来简单看看。
当在操作系统中可用并在配置文件中启用时(默认启用),PostgreSQL 会使用内核功能fsync()来帮助确保将数据写入磁盘。但在某些操作系统中使用fsync(),当内核无法写出数据时,它会返回失败并刷新应该从其数据缓冲区写入的数据。这种刷新操作对 PostgreSQL 有一个不幸的副作用:如果 PostgreSQL 再次尝试通过调用fsync()将数据写入磁盘,fsync()将报告成功,但实际上 PostgreSQL 保存到磁盘的数据不会被写入。所以,这反映了一种可能存在的数据损坏情况。
而本次更新修改了 PostgreSQL 处理fsync()返回失败的方式:PostgreSQL 将不再重试调用fsync()。在这种情况下,PostgreSQL 然后从预写式日志 (write-ahead log, WAL) 重录数据,以帮助确保写入数据。虽然这可能看起来是次优的解决方案,但目前还没有更好的替代方案,并且根据报告,采用该方案后,这种问题极少发生。还添加了一个新的服务器参数data_sync_retry来管理此行为。如果你确信你的内核在这样的情况下不会将脏数据丢弃至缓冲区,可以设置data_sync_retry为on以恢复原来的行为。
其他的更新诸如 bug 修复和性能改进,请查看发行公告。
2020-11-18 更新记录:
PostgreSQL 全球开发小组已经发布了对数据库系统所有受支持版本的更新,包括 13.1、12.5、11.10、10.15、9.6.20 和 9.5.24。此版本关闭了三个安全漏洞,并修复了过去三个月中报告的 65 个以上的错误,错误修复和改进如下:
修复复制协议中的一个损坏,确保 START_REPLICATION 会有两个 "command completion" 事件。
确保在 PostgreSQL 维护的 SLRU 缓存上调用 fsync。这可以防止由于操作系统崩溃而导致的潜在数据丢失。
修复具有 BYPASSRLS 权限的用户的 ALTER ROLE usage。
当有 child tables 时,不允许在分区表上使用 ALTER TABLE ONLY ... DROP EXPRESSION。
确保 ALTER TABLE ONLY ... ENABLE/DISABLE TRIGGER 不适用于 child tables。
修复分区表上的 ALTER TABLE ... SET NOT NULL 以避免并行 pg_restore 中的潜在死锁。
不允许在分区表上使用 DROP INDEX CONCURRENTLY。
围绕 REINDEX 的统计信息收集和进度报告进行了一些修复。
确保 GENERATED 列在它们所依赖的任何列通过规则或可更新的视图更新时被更新。
支持使用文本数组列作为分区键的哈希分区。
允许 jsonpath.datetime()方法接受 ISO 8601 格式的时间戳。
......
值得注意的是,PostgreSQL 9.5 将在 2021 年 2 月 11 日停止接收修补程序,建议在生产环境中运行 PostgreSQL 9.5 的用户升级到受支持的较新版本的 PostgreSQL。更多信息请参见发行说明。
2021年2月13 更新记录:
PostgreSQL 发布 13.2 到 9.5.25 等多个版本,PostgreSQL 全球开发组发布了我们数据库系统所有受支持版本的更新,包括 13.2、12.6、11.11、10.16、9.6.21 和 9.5.25。此版本将关闭两个安全漏洞,并修复了过去三个月中报告的 80 多个 Bug。包括13.2、12.6、11.11、10.16、9.6.21和9.5.25。此版本关闭了两个安全漏洞,并修复了过去三个月内报告的80多个错误。此外,这是PostgreSQL 9.5的最终版本。如果在生产环境中运行PostgreSQL 9.5,建议制定升级计划。
CVE-2021-3393:分区约束冲突错误拒绝列的泄漏值
受影响的版本:11 - 13
在分区表上具有UPDATE特权但在某些列上没有SELECT特权的用户可能能够从错误消息中获取拒绝的列值。这类似于CVE-2014-8161,但利用的条件更为罕见。PostgreSQL项目感谢Heikki Linnakangas报告此问题。
CVE-2021-20229:单列选择特权允许读取所有列
受影响的版本:13
对单个列具有SELECT特权的用户可以制作一个特殊查询,该查询返回表的所有列。此外,使用列级特权的存储视图将具有不完整的列使用位图。在依赖于列级权限的安全性安装中,建议对所有用户定义的视图执行CREATE或REPLACE,以强制对其进行重新解析。PostgreSQL项目感谢Sven Klemm报告此问题。
此更新修复了过去几个月报告的 80 多个 Bug。其中一些问题仅影响版本 13,但也适用于其他受支持的版本。其中一些修复程序包括:
修复GiST索引的问题,该问题可能导致并发插入会导致索引错误,并且条目放置在错误的页面中。您应该重新索引所有受影响的GiST索引。
修复CREATE INDEX,以确保并发准备好的事务中的行包含在索引中。启用预备事务的安装应重新索引任何并发构建的索引。
修复了散列聚合溢出到磁盘时可能出现的错误查询结果的问题。
修复渐进式排序中的边缘情况,这可能导致排序结果不正确或出现“边界排序中检索到太多元组”错误。
通过扩展查询协议(例如,从准备好的语句)执行执行事务回滚的CALL或DO语句时,避免崩溃。
修复了PL / pgSQL过程在具有执行COMMIT或ROLLBACK的OUT参数的另一个过程上使用CALL时的故障。
从分区表上的BEFORE UPDATE触发器中删除错误,以获取不再适用的限制。
带有联接的查询的几个修复程序可能导致错误消息,例如“无关联N条目”或“无法建立任何N向联接”。
尝试并行化排序时,请勿在ORDER BY表达式中考虑并行限制或返回集合的函数。
修复ALTER DEFAULT PRIVILEGES以安全地处理重复的参数。 将wal_level设置为最小时,包括在事务中重写表时,对行为的一些修复。
CREATE TABLE LIKE的几个修复程序。
确保在提交事务时迅速释放为已删除关系(例如,表)分配的磁盘空间。
修复CLUSTER的进度报告。
...
PostgreSQL 9.5 是 EOL版本
PostgreSQL 9.5是9.X系列最终发布更新版本。如果您在生产环境中运行 PostgreSQL 9.5,我们建议您制定计划升级到更新、受支持的 PostgreSQL 版本。有关详细信息,请参阅我们的版本控制政策。所有 PostgreSQL 更新版本都是累积的。与其他次要版本一样,用户无需转储和重新加载其数据库或使用,以便应用此更新版本;可以简单地关闭 PostgreSQL 并更新其二进制文件。请参阅我们的版本控制政策以获取更多信息。跳过一个或多个更新版本的用户可能需要运行其他更新后步骤;有关详细信息,请参阅早期版本的发行说明。
注意:PostgreSQL 9.6 将在 2021 年 11 月 11 日停止接收修复程序。有关详细信息,请参阅我们的版本控制政策。
2021年11月11 更新记录:
PostgreSQL 全球开发组发布了其数据库系统所有支持版本的更新,包括 14.1、13.5、12.9、11.14、10.19 和 9.6.24。此版本关闭了两个安全漏洞并修复了过去三个月报告的 40 多个错误。其中9.6.24 是 PostgreSQL 9.6 的最终版本。
安全问题
CVE-2021-23214:服务器处理来自中间人的未加密字节
受影响的版本:9.6 - 14。当服务器配置为使用具有 clientcert 要求的信任身份验证或使用证书身份验证时,尽管使用 SSL 证书验证和加密,中间人攻击者可以在首次建立连接时注入任意 SQL 查询。
CVE-2021-23222:libpq 处理来自中间人的未加密字节
受影响的版本:9.6 - 14。尽管使用了 SSL 证书验证和加密,中间人攻击者仍可以向客户端的前几个查询注入错误响应。如果更多先决条件成立,攻击者可以窃取客户端的密码或其他可能在会话早期传输的机密数据。与对 CVE-2021-23214 的任何利用一样,服务器必须使用具有 clientcert 要求的信任身份验证或使用证书身份验证。
其它主要更新内容
在传送以部分 WAL 记录结尾的 WAL 段后主服务器崩溃的情况下修复物理复制。应用此更新时,请在主服务器之前更新备用服务器,以便它们在主服务器发生崩溃时准备好处理修复程序
修复并行 VACUUM 以便它处理低于 min_parallel_index_scan_size 阈值的索引,如果表至少有两个大于该大小的索引
修复 CREATE INDEX CONCURRENTLY 和 REINDEX CONCURRENTLY 写入损坏索引的原因
修复 attaching/detaching 可能允许某些 INSERT/UPDATE 查询在活动会话中行为不当的分区
修复了使用 CREATE TYPE 创建新范围类型的问题,该类型可能导致后续事件触发器或 CREATE TYPE 命令的后续执行出现问题
修复作为组合的一部分的域的数组中元素字段的更新
禁止 FETCH FIRST WITH TIES 和 FOR UPDATE SKIP LOCKED 的组合
修复数字 power() 函数中的极端情况精度损失
修复了在子事务中恢复 Portal 快照的问题,这可能会导致崩溃
如果事务在导出其快照后失败,则正确清理。
修复了备用服务器上可能导致性能下降的 "溢出子事务" 环绕跟踪
确保在升级备用服务器期间正确考虑准备好的事务
确保在重命名表时使用正确的锁定级别
删除同时删除拥有对象的角色时避免崩溃
当 shared_memory_type 为 sysv 时,禁止将 huge_pages 设置为 on
更多详情请查看更新公告。
PostgreSQL 13.3、12.7、11.12、10.17 和 9.6.22 已于2021年5月13日发布,这些版本关闭了三个安全漏洞,并修复了过去三个月中报告的 45 个以上的 bug。主要更新内容:
关闭 CVE-2021-32027:数组下标计算中的整数溢出导致缓冲区溢出,受影响的版本:9.6 - 13。在修改某些 SQL 数组值时,缺失的边界检查让认证的数据库用户向服务器内存的大范围内写入任意字节
关闭 CVE-2021-32028:INSERT ... ON CONFLICT ... DO UPDATE 中的内存泄露,受影响的版本:9.6 - 13。该功能首次出现在9.5中,在一个特意制作的表中使用 INSERT ... ON CONFLICT ... DO UPDATE 命令,攻击者可以读取服务器内存的任意字节。在默认配置中,任何经过认证的数据库用户都可以创建先决条件的对象,并完成这种攻击
关闭 CVE-2021-32029:分区表 UPDATE ... RETURNING 中的内存泄露,受影响的版本: 11 - 13。在一个特意制作的分区表上使用 UPDATE ... RETURNING 命令,攻击者可以读取服务器内存的任意字节。在默认配置中,任何经过认证的数据库用户都可以创建先决条件的对象,并完成这种攻击
修复潜在的不正确的 UPDATE ... RETURNING 输出计算,以进行联合的跨分区更新
在分区表的外键约束上使用时,修复 ALTER TABLE ... ALTER CONSTRAINT。该命令将无法调整叶分区的约束和触发器的 DEFERRABLE 和 INITIALLY DEFERRED 属性,从而导致意外行为。更新到此版本后,用户可以执行 ALTER TABLE ... ALTER CONSTRAINT 命令来修复任何行为不当的分区表
确保将子表与 ALTER TABLE ... INHERIT 附加在一起时,在父级中生成列的生成方式与子级中的生成方式相同
禁止将标识列标记为 NULL
确保 REINDEX CONCURRENTLY 保留了为索引设置的任何统计目标
修复了在某些情况下,在 AFTER 触发器中保存记录可能导致崩溃的问题
修复了 to_char() 如何处理有负数间隔的罗马数字月份格式代码的问题
修复了BRIN 索引位图扫描的问题,该问题可能导致"无法打开文件"的错误
修复了当有许多匹配记录时,GIN tsvector 索引搜索可能出现错误答案的问题
更多详情请查看更新公告。
PostgreSQL 14 Beta 3 发布、9.6 即将 EOL
PostgreSQL 全球开发组于2021年8中旬为所有受支持的版本发布了更新,分别是 13.4、12.8、11.13、10.18、9.6.23 和 14 Beta 3。更新内容包括修复一个安全漏洞,以及修复过去三个月社区报告的超过 75 个错误。完整变更内容查看Release Note。
安全漏洞
CVE-2021-3677:部分查询出现内存泄露,受影响的版本:11 - 13。
漏洞描述:专门设计的查询可以读取服务器内存的任意字节。在默认配置下,任何经过身份验证的数据库用户都可以随意完成此攻击。攻击不需要创建对象的能力。如果服务器设置包括max_worker_processes=0,则无法对已知版本进行此攻击。但是,未被发现的攻击变体可能与该设置无关。PostgreSQL 14 Beta 3 为多域类型(multirange types)引入了unnest功能以及一些错误修复。完整变更点此查看。最后值得注意的是,PostgreSQL 9.6 将于 2021 年 11 月 11 日停止接收修复。如果用户在生产环境中使用的是 PostgreSQL 9.6,官方建议他们计划升级到更新的受支持的 PostgreSQL 版本。更多信息查看版本控制政策。
2022年2月14 更新记录:
PostgreSQL 14.2, 13.6, 12.10, 11.15 和 10.20 发布,版本包括:PostgreSQL 14.2, 13.6, 12.10, 11.15 和 10.20。下面的列出的问题会影响 PostgreSQL 14,其中一些问题也可能会影响其他受支持的 PostgreSQL 版本:
修复了在VACUUM期间 HOT (heap-only tuple) 链改变状态时索引损坏的低概率问题。虽然遇到这种问题的可能性不大,但如果担心,可考虑重新索引。
修复在 TOAST 表索引上使用REINDEX CONCURRENTLY以防止损坏的问题,可通过再次重新索引它们来修复任何 TOAST 索引 。
psql \password命令现在默认为 CURRENT_USER 所定义的角色设置密码。此外,角色名称现在包括在密码提示中。
为分区表构建扩展统计信息。如果之前向分区表添加了扩展统计信息,则应该在这些表上运行ANALYZE。由于autovacuum目前不处理分区表,因此必须定期在任何分区表上运行ANALYZE以更新其统计信息。
修复当统计对象同时被删除时ALTER STATISTICS的崩溃。
修复提取可变长度数据类型时多范围崩溃的问题。
对导致不正确查询结果的查询计划器的若干修复。
对 query plan memoization 的若干修复
修复物理副本的启动以容忍事务 ID 环绕
使用逻辑复制时,当发布包括子表和父表时,避免重复传输分区表的数据。
当分区表的行类型在别处用作复合类型时,不允许更改分区表列的数据类型。
不允许ALTER TABLE ... DROP NOT NULL作为副本标识索引一部分的列。
多个缓存修复,可纠正逻辑复制行为并提高性能。
修复更新表达式索引时的内存泄漏。
避免在REASSIGN OWNED BY操作中泄漏内存,这些操作重新分配了许多对象的所有权。
修复出现在INSERT ... VALUES规则中的整行变量的显示。
修复可能导致无法本地化在多线程使用 libpq 或 ecpglib 中早期报告的错误消息的竞争条件。
修复用于识别父触发器的命令 psql \d
修复使用终端作为数据源或目标时 Windows 上的故障。这影响了 psql\copy命令和使用用 pg_recvlogical with -f -。
修复pg_dump --inserts 和 --column-inserts模式以处理包含生成和删除列的表。
修正postgres_fdw处理异步查询的边缘情况。这些错误可能导致崩溃或在试图运行外域表的并行扫描时出现不正确的结果。
本次更新修复了超过 55 个错误,可查看发行说明获取完整变更列表。
2022年5月16 更新记录:
PostgreSQL 14.3、13.7、12.11、11.16 和 10.21 发布,版本包括:PostgreSQL 14.3、13.7、12.11、11.16 和 10.21。此次更新修复了一个安全漏洞并修复了过去三个月报告的 50 多个错误。如果在使用 ltree 数据类型的列上有任何 GiST 索引,将需要在升级后重新索引它们,可查看发行说明获取完整变更列表。值得注意的是,PostgreSQL 10 将于 2022 年 11 月 10 日停止接收修复。如果在生产环境中运行 PostgreSQL 10,官方建议计划升级到受支持的 PostgreSQL 更新版本。
CVE-2022-1552:Autovacuum、REINDEX 等省略了“security restricted operation”沙箱。受影响的版本:10 - 14。安全团队通常不会测试不受支持的版本,但这个问题已经很老了。
Autovacuum、REINDEX、CREATE INDEX、REFRESH MATERIALIZED VIEW、CLUSTER 和 pg_amcheck 在特权用户维护其他用户的对象时,没有完全做到安全操作。这些命令太晚或根本没有激活相关的保护措施。一个有权限在至少一个模式中创建非临时对象的攻击者可以在超级用户的身份下执行任意的 SQL 函数。虽然及时更新 PostgreSQL 是大多数用户的最佳补救措施,但无法做到这一点的用户可以通过禁用 autovacuum、不手动运行上述命令以及不从pg_dump命令输出恢复来解决该漏洞。在此解决方法下,性能可能会迅速下降。VACUUM是安全的,当受信任的用户拥有目标对象时,所有的命令都是好的。
下面的列出的问题会影响 PostgreSQL 14,其中一些问题也可能会影响其他受支持的 PostgreSQL 版本:
修复了可能导致 ltree列上的 GiST 索引损坏的问题。升级后,用户需要重新索引ltree列上的所有 GiST 索引。
由SELECT列表顶层之外的整行变量(例如tbl.*)生成的 tuples 中的列名现在总是与关联的命名复合类型(如果有的话)相关联。
修复从interval类型中提取 epoch 值时不正确的舍入。
防止调用pg_stat_get_replication_slot(NULL)时出现问题。
修复table_to_xmlschema()中timestamptz和timetz类型的错误输出。
修复与影响异步远程查询的计划程序问题相关的错误。
如果使用SEARCH或CYCLE功能的查询包含重复的公用表表达式 ( WITH) 名称,则修复规划器故障。
修复ALTER FUNCTION以支持在同一命令中更改函数的并行属性及其SET-variable 列表。
修复在前导键是表达式的索引上使用CLUSTER时对表行的错误排序。
如果在排序的 GiST 索引构建后不久发生系统崩溃,防止数据丢失。
修复删除分区索引时出现死锁失败的风险。
修复DROP TABLESPACE和 checkpointing 之间的 race condition,该条件可能无法从表空间目录中删除所有死文件。
修复TRUNCATE与 checkpointing 重叠的命令后崩溃恢复的潜在问题。
重新允许_作为自定义配置参数名称中的第一个字符。
修复 PANIC:当有一个缺失的 WAL 延续记录时,在备用升级期间 xlog 刷新请求未被满足的故障。
修复热备冲突处理中出现 self-deadlock 的可能性。
确保当服务器接近max_sync_workers_per_subscription限制时可以重新启动逻辑复制应用 workers。
不允许在 PL/Perl 函数编译期间执行 SPI 函数。
libpq 现在接受 root 拥有的 SSL 私钥文件,这与服务器自 9.6 版本以来使用的规则相匹配。
在 psql、pg_dump 和 pg_amcheck 中重新允许 database.schema.table 模式。
对 pageinspect 进行了一些修复,以提高整体稳定性。
当外部表上存在BEFORE INSERT ... FOR EACH ROW触发器时禁用postgres_fdw批量插入。
更新 JIT 代码以使用 LLVM 14。
2022年8月16 更新记录:
PostgreSQL 14.5、13.8、12.12、11.17、10.22 和 15 Beta 3 发布,版本包括:14.5、13.8、12.12、11.17 和 10.22,以及 PostgreSQL 15 的第三个 beta 版本。此版本关闭了一个安全漏洞并修复了过去三个月报告的 40 多个错误。
PostgreSQL 10 EOL Upcoming:PostgreSQL 10 将于 2022 年 11 月 10 日停止接收修复。对于在生产环境中运行 PostgreSQL 10 的用户,官方强烈建议升级到更新的、受支持的 PostgreSQL 版本,以便可以继续接收错误和安全修复。可参阅版本控制政策以获取更多信息。
安全问题
CVE-2022-2625:扩展脚本替换不属于扩展的对象,受影响的版本:10 - 14。安全团队通常不会测试不受支持的版本,但这是一个相当古老的问题。一些扩展使用 CREATE OR REPLACE 或 CREATE IF NOT EXISTS 命令。但有些人不遵守 documented rule,只针对已知为扩展成员的对象。攻击需要在至少一个模式中创建非临时对象的权限,能够诱使或等待管理员在该模式中创建或更新受影响的扩展,以及诱使或等待受害者使用 CREATE OR REPLACE 或 CREATE IF NOT EXISTS 中的 object targeted。鉴于所有三个先决条件,攻击者可以作为受害者角色(可能是超级用户)运行任意代码。已知受影响的扩展包括 PostgreSQL 捆绑和非捆绑扩展。PostgreSQL 在核心服务器中阻止了这种攻击,因此无需修改单个扩展。
关于 PostgreSQL 15 Beta 的说明:此版本标志着 PostgreSQL 15 的第三个 beta 版本,并使社区在第三季度末左右暂时向一般可用性迈进了一步。本着开源 PostgreSQL 社区的精神,官方强烈建议用户在系统上测试 PostgreSQL 15 的新功能,以帮助消除可能存在的错误或其他问题。虽然不建议在生产环境中运行 PostgreSQL 15 Beta 3,但鼓励找到针对此 Beta 版本运行典型应用程序工作负载的方法。
错误修复和改进
此更新修复了过去几个月报告的 40 多个错误。下面列出的问题会影响 PostgreSQL 14,其中一些问题也可能会影响其他受支持的 PostgreSQL 版本:
修复了在遇到 missing tablespace directory 时,在备用服务器上重放 CREATE DATABASEwrite-ahead log (WAL) 的问题 。
添加对作为普通目录的 tablespaces 的支持,而不是对其他目录的符号链接。
修复 CREATE INDEX 中的权限检查以使用用户的权限。这修复了依赖于修复 CVE-2022-1552 之前的行为的损坏转储 / 恢复场景。
修复扩展统计的不正确的权限检查代码。
修复扩展统计机制以处理布尔值表达式的最常见值 ( MCV) 类型的统计信息。
修复 ALTER TABLE ... ENABLE/DISABLE TRIGGER 以处理分区表上触发器的递归。
拒绝 ROW() 的表达式和 FROM 中超过 1600 列的函数。
修复逻辑复制订阅者中的内存泄漏。
安排在 SPI_commit()中清理 commit-time errors,而不是期望 callers 这样做。这包括对 PL/Python 中相同场景的修复,该场景报告了 Python 3.11 的崩溃和旧版本的 Python 3 的内存泄漏。
改进 libpq 中对 pipeline mode 下空闲状态的处理。
修复 pg_upgrade以检测接受 anyarray 参数的函数的 non-upgradable usages。
一些 postgres_fdw 修复,包括在存在 WITH CHECK OPTION 约束时防止批量插入。
......
有关可用更改的完整列表,可查看发行说明。
2022年11月12 更新记录:
PostgreSQL 全球开发组针对当前所有被支持版本发布了一次更新,版本包括:15.1、14.6、13.9、12.13、11.18 和 10.23。这是 PostgreSQL 10 系列的最终版本,之后 PostgreSQL 10 将不再接受安全和错误修复。如果你正在生产环境中运行 PostgreSQL 10,官方建议制定升级计划。此次更新修复了过去几个月中报告的超过 25 个 bug。下面列出的问题影响 PostgreSQL 15,其中一些问题也可能影响其他支持的 PostgreSQL 版本。
修复了包含多行 VALUES 子句并设置 DEFAULT 的 INSERT 语句的可更新视图。
禁止 MERGE 在具有外表分区的分区表上使用。
修复了在 ALTER TABLE ... ATTACH PARTITION 执行时构建每个分区外键约束的问题 ,以前可能会构建不正确或重复的约束。
修复了在分区或继承表上使用扩展统计的 planner 故障。
修复逻辑解码中的错误,当 replay 从事务开始和其子事务开始之间的某个点开始时可能导致内存泄漏。
通过允许在更多地方中断来解决 replication workers 关闭缓慢的问题。
禁止逻辑复制到外部表分区。
在 SQL 或 PL/pgSQL 函数语法错误后防止复制工作崩溃。
如果查询被取消,psql -c 现在以非零状态退出。
在 pg_basebackup 中允许跨平台表空间重定位。
修复 pg_dump 以使其包括一些 CHECK 约束的注释。
此版本还更新了时区数据文件以使用 tzdata 版本 2022f。这包括智利、斐济、伊朗、约旦、墨西哥、巴勒斯坦和叙利亚的 DST 法律变更,以及智利、克里米亚、伊朗和墨西哥的历史更正。tzdata 2022f 版本中还有一些其他更改需要注意,这些更改可能会更改 1970 年前时间戳的显示。有关详细说明与可用更改的完整列表,可查看发行说明。
2023年2月15 更新记录:
PostgreSQL 全球开发组针对当前所有被支持版本发布了一次更新,版本包括:15.2、14.7、13.9、12.14、和 11.19。此版本修复了一个安全漏洞并修复了过去几个月报告的 60 多个 bug。
CVE-2022-41862:使用 Kerberos 连接到修改后的服务器时客户端内存泄露。
受影响的版本:12 - 15。
在建立 Kerberos 传输加密的过程中,一个经过修改的、未经认证的服务器或未经认证的中间人可以发送一个未终止的字符串。当 libpq 客户端应用程序有一个 Kerberos 凭据缓存,并且没有明确地禁用选项 gssencmode时,服务器可能会导致 libpq 过度读取并报告一个错误信息,其中包含来自其接收缓冲区及其后的未初始化字节。如果 libpq 的调用者以某种方式使攻击者能够访问该信息,这就实现了 over-read bytes 的泄露。官方表示,其目前还没有确认或排除安排崩溃或在披露的字节中存在明显的机密信息的攻击的可行性。
下面列出的问题影响 PostgreSQL 15,其中一些问题也可能影响其他支持的 PostgreSQL 版本:
如果 GENERATED 列在父表中不存在或子表生成的列与父表有不同的依赖关系,则修复分区表以正确更新子表中的 GENERATED 列。
MERGE命令的几个修复 。
允许 WITH RECURSIVE ... CYCLE 查询访问其 SET 输出列。
修复了在外部表上批量插入可能导致逻辑不一致的问题,例如,BEFORE ROW 触发器可能无法处理本应可用的行。
拒绝在 jsonpath存在性检查中使用未定义的变量 。
修复了直接来自表中 text 列的 jsonb subscripting。
在重新加载时遵循 checkpoint_completion_target 的更新值。
在 recovery_target_xid 模式中记录正确的结束时间戳。
修复了使用逻辑复制时允许列列表超过 100 的问题。
防止在 VACUUM末尾的 “wrong tuple length” 失败 。
使用 query pipelining 后避免在 ANALYZE之后立即提交 。
修复统计收集以在关系更改类型时正确处理(例如,表转换为视图)。
确保在执行短语匹配时可以取消全文搜索查询。
修复 DROP DATABASE逻辑复制 worker 进程之间的死锁。
修复 CREATE SUBSCRIPTION连接尝试失败时的 small session-lifespan 内存泄漏 。
提高了处理 SELECT 查询的启用 hot_standby的副本的性能。
逻辑解码的几个修复,提高了稳定性和臃肿处理。
修复默认逻辑复制插件 pgoutput,使其不发送未列在表的复制列列表中的列。
修复 pg_basebackup中非常大的 tablespace map 文件可能的损坏。
当 public schema 有一个非默认的所有者时,从 pg_dump的 --if-exists 模式中删除一个无害的警告。
修复 psql 命令 \sf 和 \ef 以处理具有 SQL 标准函数体的 SQL 语言函数(即 BEGIN ATOMIC)。
修复 ALTER FUNCTION/PROCEDURE/ROUTINE ... SET SCHEMA 的 tab 完成。
更新 pageinspect 扩展以将其 disk-accessing functions 标记为 PARALLEL RESTRICTED.
修复 seg扩展,使其在输入数字超过 127 位时不会崩溃或 print garbage。
此版本还将时区数据文件更新为 tzdata 版本 2022g,以适应格陵兰和墨西哥的 DST 法律变更,以及加拿大北部、哥伦比亚和新加坡的历史更正。值得注意的是,新时区 America/Ciudad_Juarez 已从 America/Ojinaga 中分离出来。有关可用更改的完整列表,可查看发行说明。
2023年5月14 更新记录:
PostgreSQL 全球开发组针对当前所有被支持版本发布了一次更新,版本包括:15.3、14.8、13.11、12.15 和 11.20。此版本修复了两个安全漏洞并修复了过去几个月报告的 80 多个 bug。
CVE-2023-2454:CREATE SCHEMA ... schema_element 破坏保护性 search_path 更改。
受影响的版本:11 - 15。
这使具有数据库级 CREATE 权限的攻击者能够以 bootstrap 超级用户身份执行任意代码。默认情况下,数据库所有者拥有该权利,并且显式授权可以将其扩展到其他用户。
CVE-2023-2455:行安全策略忽略内联后的用户 ID 更改。
受影响的版本:11 - 15。
虽然 CVE-2016-2193 修复了行安全性和用户 ID 更改之间的大部分交互,但它遗漏了涉及函数内联的场景。在使用特定于角色的策略并且给定查询在一个角色下计划然后在其他角色下执行的情况下,这会导致应用可能不正确的策略。这种情况可能发生在 security definer functions 下,或者当最初计划一个普通用户和查询然后跨多个 SET ROLE 重新使用时。应用不正确的策略可能允许用户完成其他被禁止的读取和修改。这仅影响那些使用 CREATE POLICY 定义行安全策略的数据库。
下面列出的问题影响 PostgreSQL 15,其中一些问题也可能影响其他支持的 PostgreSQL 版本。
当使用 STRATEGY = WAL_LOG 时,对 CREATE DATABASE进行了一些修复,包括可能丢失对模板/源数据库修改的潜在损坏。
修复了 CREATE SCHEMA AUTHORIZATION的崩溃。
MERGE的几个修复程序。
对分区表中的触发器进行了多项修复。
不允许更改存储在索引中的复合类型。
确保从启用了 row-level security 的父表中 COPY TO时,不会从子表复制任何行。
调整文本搜索相关的字符分类逻辑,在数据库默认排序规则使用 provider 时,正确检测当前语言环境是否为 C。
重新允许在 ISO-8601 区间字段中使用指数符号。
改进各种无效 JSON 字符串文字的错误报告。
修复由于 vacuum_defer_cleanup_age 大于当前 64 位 xid 而导致的数据损坏。
查询解析器和规划器的几个修复,包括更好地检测不正确嵌套的聚合。
修复了在 booleanIS NOT TRUE 和 IS NOT FALSE 条件下的 partition pruning bug。在此之前,NULL partitions 会被意外地剪除。
修复 memoize plan execution 中的内存泄漏。
修复在执行分批插入时使用分区的外域表的缓冲区 refcount 泄漏。
恢复对 sub-millisecondvacuum_cost_delay 设置的支持。
视图和规则的几个修复 。
在使用多个扫描键扫描多列时避免不必要的工作。在扫描具有多个扫描键的多列 BRIN 索引时,避免不必要的工作。
在 UPDATE 或 DELETE 操作的逻辑复制期间忽略丢弃的列和生成的列 。
对等待事件的命名和可用性进行了多项修复。
支持带有 SCRAM-SHA-256 通道绑定的 RSA-PSS 证书 。此功能需要使用 OpenSSL 1.1.1 或更新版本构建。
修复会话中使用 cast expressions 的 PL/pgSQL DO块的内存泄漏。
在将列表结构转换为多维 SQL 数组时,加强 PL/Perl 和 PL/Python 的数组维数检查。
修复了 pg_dump,以便可以成功恢复在枚举类型列上进行 hash-partitioned 的分区表 。
修复了 pg_trgm使用 GiST 或 GIN 索引时无法满足的正则表达式可能导致崩溃的问题。
限制 pg_walinspect中的 pg_get_wal_records_info() 内存使用。
此版本还将时区数据文件更新为 tzdata 版本 2023c,以适应埃及、格陵兰、摩洛哥和巴勒斯坦的 DST 法律变更。在遵守莫斯科时间时,Europe/Kirov 和 Europe/Volgograd 现在使用缩写 MSK/MSD 而不是数字缩写,以与遵守莫斯科时间的其他时区保持一致。此外,America/Yellowknife 不再区别于 America/Edmonton;这会影响该地区的一些 1948 年之前的时间戳。
2023年8月11 更新记录:
PostgreSQL 全球开发组针对当前所有被支持版本发布了一次更新,版本包括:15.4、14.9、13.12、12.16 和 11.21,以及 PostgreSQL 16 的第三个测试版。此版本修复了两个安全漏洞并修复了过去几个月报告的 40 多个 bug。如果使用 BRIN 索引来查找 NULL 值, 则升级到此版本后需要重新索引它们。在 PostgreSQL 12 及更高版本上,你可以使用 REINDEX CONCURRENTLY 以避免阻止对受影响的索引和表的写入,例如:REINDEX INDEX CONCURRENTLY your_index_name;
PostgreSQL 11 EOL 通知
PostgreSQL 11 将于 2023 年 11 月 9 日停止接收修复。如果你在生产环境中运行 PostgreSQL 11,建议制定计划升级到更新的受支持版本的 PostgreSQL。参阅版本控制政策以获取更多信息。
安全问题
CVE-2023-39417 :引用中的扩展脚本 @substitutions@允许 SQL 注入。支持的、易受攻击的版本:11 - 15。安全团队通常不会测试不受支持的版本,但这个问题已经存在很久了。如果扩展脚本在 quoting 结构 (dollar quoting, '', or "") 内使用 @extowner@、@extschema@或@extschema:...@,则容易受到攻击。没有捆绑的扩展名存在漏洞。在文档示例和非捆绑扩展中确实存在漏洞。因此,攻击的先决条件是管理员安装了易受攻击的、受信任的、非捆绑扩展的文件。在这一前提条件下,拥有数据库级 CREATE 权限的攻击者就能以引导超级用户身份执行任意代码。PostgreSQL 将在核心服务器中阻止这种攻击,因此无需修改个别扩展。
CVE-2023-39418:MERGE 无法强制执行 UPDATE 或 SELECT 行安全策略。支持的、易受攻击版本:15。
PostgreSQL 15 引入了 MERGE命令,该命令无法根据为 UPDATE 和 SELECT 定义的行安全策略测试新行 。如果 UPDATE 和 SELECT 策略禁止某些行,而 INSERT 策略不禁止,则用户可以存储此类行。后续后果取决于应用程序。这仅影响用于 CREATE POLICY定义行安全策略的数据库。
错误修复和改进
下面列出的问题会影响 PostgreSQL 15,其中一些问题也可能会影响其他受支持的版本。
修复了 BRIN 索引中 NULL 值的处理。此修复不适用于现有 BRIN 索引 - 用户将需要运行 REINDEX来修复任何用于搜索 NULL 值的 BRIN 索引。
避免在 DROP DATABASE 中断时留下损坏的数据库。
针对分区索引的多项修复。
修复如果扩展包含扩展架构之外的任何对象的 ALTER EXTENSION ... SET SCHEMA错误。
修复表访问方法的依赖性跟踪。
不要在规划器中使用部分唯一索引来证明唯一性。
扩展规则操作时,正确处理 RLS 策略表达式和 security-barrier 视图中的子 SELECT。
修复 SERIALIZABLE 事务隔离模式冲突检测中的 race conditions。
修复尝试更新需要 out-of-line TOASTing 的复合列的字段时出现的间歇性故障。
修复查询生命周期中发生的多个内存泄漏。
在 jsonpathdatetime()方法的输入中接受小数秒 。
将 pg_hba.conf 和 pg_ident.conf 中的 token 限制增至 10,240 字节。
JIT 的内存不足错误现在将导致 PostgreSQLFATAL 错误而不是 C++ 异常。
允许在检测到某些类型的 B-tree 索引损坏后继续使用 VACUUM。虽然此修复允许 VACUUM 继续,但用户仍然需要 REINDEX 修复损坏的索引。
避免在崩溃恢复期间 double replay 已准备好的事务。
确保新创建空表上的 checkpoint calls fsync。
Silence “missing contrecord” 错误,以避免记录来自 pg_waldump 和 walsender 的不准确消息。
修复 [fuzzystrmatch] (https://www.postgresql.org/docs/current/fuzzystrmatch.html Soundex difference() 函数以正确处理空输入。
针对 intarray的若干修复,包括禁止在 GiST 索引中使用过大的输入数组。
修复 pg_dump以正确处理需要解析时依赖于唯一索引的 SQL 标准函数体 (BEGIN ATOMIC)。
PostgreSQL 16 Beta 3 中的修复
在 psql 中添加 \drg 命令,以显示有关角色授权信息。
在使用 pg_waldump --save-fullpage 生成的文件名中添加 timeline ID。
修复 parallel VACUUM worker 中发生死锁后的崩溃问题。
参阅发行说明以获取新功能和更改功能的完整列表。
2024年5月13 更新记录:
PostgreSQL 全球开发组发布了所有受支持的 PostgreSQL 版本的更新,包括 16.3、15.7、14.12、13.15 和 12.19。此版本修复了一个安全漏洞以及过去几个月报告的超过 55 个错误。
在系统视图 pg_stats_ext 和中发现了一个安全漏洞 pg_stats_ext_exprs,可能允许经过身份验证的数据库用户查看他们没有足够权限查看的数据。此漏洞的修复仅修复新的 PostgreSQL 安装,即 initdb 应用此修复后使用该实用程序创建的安装。如果您当前安装了 PostgreSQL 并且担心此问题,请按照 “更新” 部分中的说明进行修复步骤。
PostgreSQL 12 EOL 通知
PostgreSQL 12 将于 2024 年 11 月 14 日停止接收修复。如果您在生产环境中运行 PostgreSQL 12,我们建议您制定计划升级到更新的受支持版本的 PostgreSQL。请参阅版本控制政策以获取更多信息。
安全问题
CVE-2024-4317:限制 pg_stats_ext 和 pg_stats_ext_exps 表项对表所有者的可见性
CVSS v3.1 基本分数:3.1
支持的易受攻击的版本:14 - 16。
在 PostgreSQL 内置视图 pg_stats_ext 和 pg_stats_ext_exprs 中,缺少授权允许非特权数据库用户从其他用户的 CREATE statistics 命令中读取大多数常见值和其他统计数据。最常见的值可能会显示窃听者无法读取的列值或无法执行的函数的结果。
此修复仅修复新安装的 PostgreSQL,即在应用此修复后使用 initdb 实用程序创建的 PostgreSQL。如果你有一个当前的 PostgreSQL 安装,并且担心这个问题,请按照 “更新” 部分的说明进行修复步骤。感谢 Lukas Fittl 报告了这个问题。
Bug 修复和改进
此更新修复了过去几个月报告的超过 55 个错误。下面列出的问题会影响 PostgreSQL 16。其中一些问题也可能会影响其他受支持的 PostgreSQL 版本。
修复了 INSERT 多行 VALUES 子句的问题,其中目标列是数组或复合类型上的域。
使用 MERGE (MERGE ... DO NOTHING) 时需要目标表的 SELECT 权限。
根据 SQL 标准,如果 MERGE 中的目标行在修改期间连接到多个源行,则抛出错误。
修复了当表在布尔列上进行分区并且查询具有布尔 is NOT 子句时对 NULL 分区进行错误修剪的问题。
将 ALTER FOREIGN TABLE ... SET SCHEMA 所有拥有的序列移动到新模式中。
CREATE DATABASE 现在识别 STRATEGY 关键字时不区分大小写。
修复了 EXPLAIN 在位图堆扫描期间对堆页面进行计数的方式 ,以显示所有计数的页面,而不仅仅是具有可见元组的页面。
避免在删除孤立临时表期间出现死锁。
对 VACUUM 进行了几个修复,其中一个可以减少不必要的 I/O。
修复了几个查询规划器。
添加对安装具有数千个角色的某些操作的优化。
修复返回单个复合类型列的 SQL 语言过程的混淆。
修复 date_bin() 中不正确舍入和溢出危险。
在时间戳中添加或减去间隔时检测整数溢出。
修复逻辑复制的几个竞争条件,包括确定是否需要表同步操作。
如果一个新的服务器会话的客户端套接字不能进入非阻塞模式,断开连接。
initdb -c 现在匹配参数名称时不区分大小写。
修复 PL/pgSQL 如何解析表达式后面的单行注释(-- 样式注释)。
更新中
所有 PostgreSQL 更新版本都是累积的。与其他次要版本一样,用户无需转储和重新加载其数据库或使用 pg_upgrade 数据库即可应用此更新版本;你可以简单地关闭 PostgreSQL 并更新它的二进制文件。
对于受 CVE-2024-4317 影响且希望修复该问题的现有安装,您必须执行以下步骤:
1. 查找 SQL 脚本 fix-CVE-2024-4317。在 PostgreSQL 安装的共享目录下 (例如 /usr/share/postgresql/),或者从 PostgreSQL Git 存储库下载。你需要使用与主版本匹配的脚本:
2. PostgreSQL 16
3. PostgreSQL 15
4. PostgreSQL 14
在上述 URL 中可以单击标有 “raw” 的 URL 下载可复制和粘贴的版本。请务必使用适合您的 PostgreSQL 主要版本的脚本。如果您没有看到此文件,则要么您的版本不易受到攻击(仅 PostgreSQL 14、15 和 16 受到影响),要么您的次要版本太旧而无法修复。
在集群的每个数据库中,以数据库超级用户身份运行 fix-CVE-2024-4317.sql(文件位于 中 /usr/share/postgresql/)脚本。例如,在 psql 中,执行以下命令:
\i /usr/share/postgresql/fix-CVE-2024-4317.sql
您还必须在 template0 和 template1 数据库中执行此脚本,否则该漏洞仍将存在于您以后创建的数据库中。要修复 template0,您需要暂时允许它接受连接。您可以使用以下命令来执行此操作:
ALTER DATABASE template0 WITH ALLOW_CONNECTIONS true;
在 template0 和 template1 中执行 fix-CVE-2024-4317.sql 的脚本后,您应该取消 template0 接受连接的能力。你可以使用以下命令:
ALTER DATABASE template0 WITH ALLOW_CONNECTIONS false;
跳过一个或多个更新版本的用户可能需要运行额外的更新后步骤;有关详细信息请参阅早期版本的发行说明。
2024年11月15 更新记录:
PostgreSQL 全球开发组针对当前所有被支持版本发布了一次更新,版本包括:17.1、16.5、15.9、14.14、13.17 和 12.21。此版本修复了过去几个月报告的 4 个安全漏洞和 35 多个错误。这是 PostgreSQL v12 系列的最终版本,之后 PostgreSQL 12 将不再接受安全和错误修复。如果你正在生产环境中运行 PostgreSQL 12,官方建议制定升级计划。
安全问题
CVE-2024-10976:PostgreSQL row security below e.g. subqueries 忽略了用户 ID 更改
CVE-2024-10977:PostgreSQL libpq 保留了来自 man-in-the-middle 的错误消息
CVE-2024-10978:PostgreSQL SET ROLE、SET SESSION AUTHORIZATION 重置为错误的用户 ID
CVE-2024-10979:PostgreSQL PL/Perl 环境变量更改执行任意代码
Bug修复与改进
修复附加或分离具有外键约束的表分区时出现的问题。升级后,受此问题影响的用户需要执行手动步骤来完成修复。
修复了当使用 libc 作为默认 collation provider 时,LC_CTYPE 为 C,而 LC_COLLATE 为不同语言的问题。可能会导致不正确的查询结果。此问题仅影响 17.0。
修复 COPY FORCE_NOT_NULL 和 FORCE_NULL. 的验证。
修复当 json_objectagg() 调用包含易失函数时服务器崩溃的问题。
修复提交可序列化事务时的竞争条件。
修复 COMMIT PREPARED中的竞争条件,该条件可能需要在崩溃并恢复后手动删除文件。
减少逻辑解码内存消耗。
修复 ARM(aarch64)系统上的 JIT 崩溃问题。
psql /watch 现在会将小于 1ms 的值视为 0(执行之间无需等待)。
修复在 password file (pgpass) 中使用复制用户凭据失败的问题
pg_combinebackup 现在会在本应包含完整备份的目录中出现增量备份文件时出错。
修复在 vacuumdb 和并行 reindexdb 中避免重新索引临时表和索引的问题。
更多详情可查看官方公告。
2024年11月22 更新记录:
PostgreSQL全球开发组针对当前所有被支持版本于2024年11月下旬发布了一次更新,版本包括:17.2、16.6、15.10、14.15 和 13.18。此外,鉴于上一更新版本中某个问题的性质,还针对 PostgreSQL 12 发布了 12.22 版本。PostgreSQL v12 现已结束生命周期,将不再接收更多修复。如果正在生产环境中运行 PostgreSQL 12,官方建议制定升级计划。
下面列出的问题影响 PostgreSQL 17。其中一些问题也可能会影响其他受支持的 PostgreSQL 版本。
恢复 ALTER ROLE .. SET ROLE和 ALTER DATABASE .. SET ROLE的功能。针对 CVE-2024-10978 的修复,意外地导致如果角色设置来自非交互源,包括以前的 ALTER {ROLE|DATABASE} 命令和 PGOPTIONS环境变量,则无法应用这些设置。
恢复使用 2024-11-14 版本(17.0、16.4、15.8、14.13、13.16、12.20 及更早版本)之前的 PostgreSQL 构建的 timescaledb 和其他 PostgreSQL 扩展的兼容性。此修复会将 struct ResultRelInfo 恢复到以前的大小,因此受影响的扩展无需重建。
修复逻辑复制槽 restart_lsn 可能倒退的情况。
避免在执行 pg_rewind时删除仍然需要的 WAL 文件。
修复与删除共享统计条目相关的竞争条件,这可能会导致统计数据丢失。
修复了当表具有非默认操作类的索引时,ALTER TABLE 在检查索引的 opclass 选项是否已更改时发生的崩溃。
更多详情可查看官方公告。
2025年2月中旬 更新记录:
PostgreSQL全球开发小组已发布对所有受支持的 PostgreSQL 版本的更新,包括 17.3、16.7、15.11、14.16 和 13.19。此版本修复了过去几个月报告的 1 个安全漏洞和 70 多个错误。
安全问题
CVE-2025-1094:PostgreSQL 引用 API 未能中和未通过编码验证的文本中的引用语法
CVSS v3.1 基本分数:8.1
受支持的、易受攻击的版本:13 - 17。
libpq PostgreSQL函数PQescapeLiteral()、PQescapeIdentifier()、PQescapeString()和 中引号语法的不当中和PQescapeStringConn()允许数据库输入提供程序在某些使用模式下实现 SQL 注入。具体来说,SQL 注入要求应用程序使用函数结果构造对 PostgreSQL 交互式终端 psql 的输入。同样,PostgreSQL 命令行实用程序中引号语法的不当中和允许命令行参数源在client_encoding 和BIG5为 或server_encoding 之一时实现 SQL 注入。PostgreSQL 17.3、16.7、15.11、14.16 和 13.19 之前的版本受到影响。EUC_TWMULE_INTERNAL
感谢 Rapid7 首席安全研究员 Stephen Fewer 报告此问题。
错误修复和改进
此次更新修复了过去几个月报告的 70 多个错误。下面列出的问题会影响 PostgreSQL 17。其中一些问题也可能会影响其他受支持的 PostgreSQL 版本。
恢复连接请求中 >63 字节数据库名称和用户名的 v17 之前的截断行为。
不要对并行工作者执行连接权限检查和限制,而是从领导进程继承这些。
从等待事件名称中删除Lock后缀LWLock。
修复窗口聚合中可能重复使用陈旧结果的问题,这可能会导致不正确的结果。
修复了真空中的几种竞争条件 ,在最坏的情况下可能会导致系统目录损坏。
针对截断表和索引的几项修复 ,可防止潜在的损坏。
修复了分离分区的问题,其中其自己的外键约束引用了分区表。
修复FFn(例如FF1)的格式代码to_timestamp,其中之前的整数格式代码FFn将消耗所有可用的数字。
修复 SQL/JSON 并XMLTABLE()在必要时对特定条目进行双引号处理。
包括ldapscheme选项在内 pg_hba_file_rules()。
对的几项修复UNION,包括不合并具有不兼容排序规则的列。
一些修复可能会影响可用性或启动与 PostgreSQL 的连接的速度。
修复逻辑解码输出中的多个内存泄漏。
修复 PL/Python中的几个内存泄漏。
为 增加 psql tab 补全功能 COPY (MERGE INTO)。
显示损坏的pg_controlpg_controldata文件 的信息时更具弹性 。
pg_restore 修复zstd 压缩数据的内存泄漏问题。
已修复pg_basebackup 以正确处理 Windows 上超过 2GB 的 pg_wal.tar 文件。
修改earthdistance 以使用 SQL 标准函数体,这修复了数据库使用此扩展时主要版本升级到 v17 时可能出现的问题。
修复当函数定义未更新到最新版本时pageinspect发生崩溃的 情况。brin_page_items()
尝试取消 postgres_fdw 远程查询时修复竞争条件。
更新
所有 PostgreSQL 更新版本都是累积的。与其他次要版本一样,用户无需转储并重新加载其数据库或使用pg_upgrade即可应用此更新版本;您只需关闭 PostgreSQL 并更新其二进制文件即可。跳过一个或多个更新版本的用户可能需要运行额外的更新后步骤;请参阅早期版本的发行说明了解详细信息。了解更多详细信息请参阅发行说明。
2025年2月20日 更新记录:
PostgreSQL 全球开发组已发布对所有支持的 PostgreSQL 版本(包括 17.4、16.8、15.12、14.17 和 13.20)的更新。
Bug 修复和提升
以下列出的问题影响 PostgreSQL 17。其中一些问题也可能影响其他支持的 PostgreSQL 版本。
改进 libpq 中引号函数的行为。CVE-2025-1094 的修复导致引号函数不遵守其字符串长度参数,在某些情况下导致崩溃。这个问题可能从基于 libpq 集成的 PostgreSQL 客户端库中明显看出。
修复 pg_createsubscriber 中的小内存泄漏
更新
所有 PostgreSQL 更新版本都是累积的。与其他小版本一样,用户无需导出和重新加载他们的数据库或使用 pg_upgrade 来应用此更新版本;您只需关闭 PostgreSQL 并更新其二进制文件即可。
用户如跳过了一个或多个更新版本,可能需要运行额外的更新后步骤;请参阅早期版本的发行说明以获取详细信息。有关详细信息请参阅发行说明。
2012-09-24 更新记录:
PostgreSQL 全球开发组发布了当前 PostgreSQL 所有版本的更新,包括 9.2.1, 9.1.6, 9.0.10, 8.4.14 和 8.3.21.该版本修复了 9.1 和 9.2 中存在的关键问题,如果你正在使用这两个版本请立即更新,而 8.3、8.4 和 9.0 用户应该尽快制定停机更新的准备计划。这个更新修复了两个潜在的数据破坏的问题,这两个问题影响 9.1 和 9.2 版本,当服务器崩溃、使用“immediate” 方式关机或者故障时无法转到待机服务器时候发生。首先开发组发现了会破坏 BTREE 和 GIN 索引,其次破坏可视图(visibility map).而这次更新就是为了修复这两个问题。我们强烈建议使用 9.1 和 9.2 的用户在升级完运行 VACUUM 或者构建索引,详情请看 the 2012-09-24 Update wiki page
这次更新还包含修复了一些小问题,包括最新发布的 9.2 版本中的问题,列表如下:
fix sorting issue with IN lists and indexes
fix planner failure when combining GROUP BY with window functions
improve selectivity of text searches using prefixes
prevent rescanning of WITH clauses from giving wrong answers
fix PL/Perl crashing issue
reduce bloat for multi-column GiST indexes
time zone data changes for Fiji
disallow Extensions from circular schema assignment
prevent crashes when default_transaction_isolation is set to "serializable"
several minor fixes to pg_upgrade
要使用这些更新,只需要关闭数据库,更新二进制文件并重启即可。而如果是跨版本的升级,例如 9.1 到 9.2 这样就必须导出数据后升级再重新导入,或者使用 pg_upgrade。如果跨越的版本太多则需自行附加的更新后操作,详情请看发行说明。
PostgreSQL将调整版本号方案
2016年6月消息,PostgreSQL现有的版本号方案是X.Y.Z,X代表重大特性集的更新,Y表示每年发布的大版本更新,Z代表累积补丁更新,PostgreSQL的最新版本是9.5.3。在最近举行的PostgreSQL会议上,开发者讨论版本号方案变更,问题主要与第一个数字有关——随着特性集的成熟,具有里程碑意义的特性越来越少了。因此PostgreSQL项目提议采用X.Y的版本方案,明年的大版本号升级到10,10.2将代表2017年发布的第二个更新,2018年发布的版本将从11开始。
PostgreSQL 9.6.2,9.5.6,9.4.11,9.3.16,9.2.20发布
PostgreSQL全球开发组已经发布了该数据库系统的所有支持版本的更新,包括9.6.2,9.5.6,9.4.11,9.3.16和9.2.20。此版本包括防止索引构建和某些预写日志重播情况下的数据损坏问题的修复程序,下面将详细介绍,它还包含在过去三个月内其他错误报告75个补丁。用户可以计划在下次计划的停机时间应用此更新。
用CREATE INDEX CONCURRENTLY造成损坏
如果在以前没有建立索引的列上调用CREATE INDEX CONCURRENTLY,则存在竞争条件,则在CREATE INDEX CONCURRENTLY命令同时运行的事务更新的行可能已被错误索引。如果怀疑这可能发生,最可靠的解决方案是在安装此更新后重建受影响的索引。这个问题存在于PostgreSQL的9.2,9.3,9.4,9.5和9.6系列中。
修复了可见性和预写日志的稳定性
这些版本包含了几个修复,以提高可见数据和WAL日志记录的稳定性,这里要强调一下。
在此版本之前,当用于目录扫描的特殊快照当前可用时,数据可能会被真空操作过早删除。具体来说,真空操作不会知道这个特殊快照的最早的xmin。错误将与一个消息,如:
"cache lookup failed for relation 1255"
此版本确保vacuum操作将考虑目录扫描快照。此外还有几个修复程序来提高预写日志的稳定性,包括:
* BRIN索引WAL日志记录的修复,其中重放可能使BRIN索引的一部分无用并需要重新计算
* 修复重置未记录表的问,其中将在`wal_level = minimal`设置下创建WAL日志,并且在崩溃后重放时,该表将不会被正确重置
* 修复WAL页头验证,在重新读取段时,在恢复期间会报告“out-of-sequenceTLI” 错误段
这些问题存在于9.6系列的PostgreSQL版本中,也可能存在于9.2,9.3,9.4和9.5系列中。
错误修复和改进
此更新还修复了在过去几个月中报告的一些错误。其中一些问题只影响9.6系列,但许多影响所有支持的版本。在此版本中提供了超过75个修订,包括:
在热备机(hot standby)模式下操作的几个修复
不允许在synchronous_standby_names中将num_sync字段设置为零
不要根据用户的连接限制计算后台工作进程
修复检查可以删除扩展成员对象的时间
修复扩展成员对象的初始权限的跟踪,以便它可以正确地与ALTER EXTENSION … ADD / DROP一起使用
几个vacuum和autovacuum的修复
修复在尝试应用新的视图选项之前,CREATE OR REPLACE VIEW以更新视图查询
确保ALTER TABLE在重建索引时保留索引表空间分配
查询计划器的几个修复程序,包括外部表和CTE的修复程序
围绕全文搜索功能的几个修复程序,以提高搜索的准确性和性能
几个数组函数的几个修复和性能改进
围绕特定ALTER TABLE操作的外键约束与触发器函数的交互的几个修复
删除返回不正确数据的日期/时间数据类型的优化
修正了将视图重排不正确地用作常规表重排
修复”target lists can have at most N entries”问题,在使用ON CONFLICT与宽表时修正不正确的报告
修复“query provides a value for a dropped column”的错误信息,提供了一个值“INSERT或UPDATE期间在具有删除列的表上
阻止UPDATE源表达式中的foo.*的多列扩展
确保为多行VALUES结构准确地确定列类型
psql 命令行工具的几个修复程序
防止pg_start_backup()和pg_stop_backup()的多个调用同时运行
pg_dump,pg_restore和pg_basebackup的几个修复,包括备用服务器上可能的pg_basebackup故障,包括WAL文件
并行工作的几个修复和并行查询的计划,包括在重新扫描期间并行查询可用的工作程序数量减少时修复崩溃
几个PL/pgSQL,PL/Python和PL/Tcl的修复
contrib模块的几个修复
在~/.pgpass文件中允许DOS样式的行尾,甚至在Unix上
更新时区数据文件到tzdata发布2016j为北Cyprus(增加一个新的区域Asia/Famagusta),俄罗斯(增加一个新的区域Europe/Saratov),Tonga和Antarctica/Casey的DST历史变化。意大利,哈萨克斯坦,马耳他和巴勒斯坦的历史修正。切换到喜欢 Tonga 的数字区缩写。
更新
所有PostgreSQL更新版本都是累积的。如果只是小版本号一样,用户不需要转储和重新加载其数据库,也不需要使用pg_upgrade来更新版本; 只需要简单地关闭PostgreSQL数据库并更新其二进制文件。如果你受到上述CREATE INDEX CONCURRENTLY错误的影响,你重建索引。下面是一个如何在生产系统中重建索引而不会失去使用旧索引的示例:
CREATE INDEX CONCURRENTLY new_index_name ON table_name (column_name);
DROP INDEX CONCURRENTLY old_index_name;
ALTER INDEX new_index_name RENAME TO old_index_name;
请注意,使用此方法意味着你将短暂拥有相同索引的两个副本,因此如果磁盘空间是一个问题,你可能需要采取其他方法。如果用户做大版本更新,或者跳过一个或多个更新版本,可能需要运行其他更新后步骤; 有关详细信息,请参阅早期版本的发行说明。
PostgreSQL 六版齐发,修复 3 个安全漏洞
PostgreSQL全球开发小组发布了数据库系统支持的版本更新,包括10.1,9.6.6,9.5.10,9.4.15,9.3.20和9.2.24。此版本修复了三个安全问题,还修复了在过去三个月中报告的BRIN索引,逻辑复制和其他错误中发现的问题。该版本已经修复了三个安全漏洞:
CVE-2017-12172:启动脚本允许数据库管理员修改根文件
CVE-2017-15098:JSON函数中的内存泄露
CVE-2017-15099:INSERT ... ON CONFLICT DO UPDATE无法强制执行SELECT权限
bug修复和改进:
Fix a race condition in BRIN indexing that could cause some rows to not be included in the indexing.
Fix crash when logical decoding is invoked from a PL language function.
Several fixes for logical replication.
Restored behavior for CTEs attached to INSERT/UPDATE/DELETE statements to pre-version 10.
Prevent low-probability crash in processing of nested trigger firings.
Do not evaluate an aggregate function's argument expressions when the conditions in the FILTER clause evaluate to FALSE. This complies with SQL-standard behavior.
Fix incorrect query results when multiple GROUPING SETS columns contain the same simple variable.
完整更新内容请查看发布主页。
2019-02-14 更新记录:
PostgreSQL 于情人节当天对所有受支持的数据库版本发布了更新,包括 PostgreSQL 11.2, 10.7, 9.6.12, 9.5.16 和 9.4.21 这五个不同的分支。更改了 PostgreSQL 接口与fsync()之间的行为,此外还包含了针对分区的修复程序,以及过去三个月内反馈的70多个其他错误。更新亮点就是上面所提到的 PostgreSQL 接口与fsync()之间的行为变更,下面来简单看看。
当在操作系统中可用并在配置文件中启用时(默认启用),PostgreSQL 会使用内核功能fsync()来帮助确保将数据写入磁盘。但在某些操作系统中使用fsync(),当内核无法写出数据时,它会返回失败并刷新应该从其数据缓冲区写入的数据。这种刷新操作对 PostgreSQL 有一个不幸的副作用:如果 PostgreSQL 再次尝试通过调用fsync()将数据写入磁盘,fsync()将报告成功,但实际上 PostgreSQL 保存到磁盘的数据不会被写入。所以,这反映了一种可能存在的数据损坏情况。
而本次更新修改了 PostgreSQL 处理fsync()返回失败的方式:PostgreSQL 将不再重试调用fsync()。在这种情况下,PostgreSQL 然后从预写式日志 (write-ahead log, WAL) 重录数据,以帮助确保写入数据。虽然这可能看起来是次优的解决方案,但目前还没有更好的替代方案,并且根据报告,采用该方案后,这种问题极少发生。还添加了一个新的服务器参数data_sync_retry来管理此行为。如果你确信你的内核在这样的情况下不会将脏数据丢弃至缓冲区,可以设置data_sync_retry为on以恢复原来的行为。
其他的更新诸如 bug 修复和性能改进,请查看发行公告。
2020-11-18 更新记录:
PostgreSQL 全球开发小组已经发布了对数据库系统所有受支持版本的更新,包括 13.1、12.5、11.10、10.15、9.6.20 和 9.5.24。此版本关闭了三个安全漏洞,并修复了过去三个月中报告的 65 个以上的错误,错误修复和改进如下:
修复复制协议中的一个损坏,确保 START_REPLICATION 会有两个 "command completion" 事件。
确保在 PostgreSQL 维护的 SLRU 缓存上调用 fsync。这可以防止由于操作系统崩溃而导致的潜在数据丢失。
修复具有 BYPASSRLS 权限的用户的 ALTER ROLE usage。
当有 child tables 时,不允许在分区表上使用 ALTER TABLE ONLY ... DROP EXPRESSION。
确保 ALTER TABLE ONLY ... ENABLE/DISABLE TRIGGER 不适用于 child tables。
修复分区表上的 ALTER TABLE ... SET NOT NULL 以避免并行 pg_restore 中的潜在死锁。
不允许在分区表上使用 DROP INDEX CONCURRENTLY。
围绕 REINDEX 的统计信息收集和进度报告进行了一些修复。
确保 GENERATED 列在它们所依赖的任何列通过规则或可更新的视图更新时被更新。
支持使用文本数组列作为分区键的哈希分区。
允许 jsonpath.datetime()方法接受 ISO 8601 格式的时间戳。
......
值得注意的是,PostgreSQL 9.5 将在 2021 年 2 月 11 日停止接收修补程序,建议在生产环境中运行 PostgreSQL 9.5 的用户升级到受支持的较新版本的 PostgreSQL。更多信息请参见发行说明。
2021年2月13 更新记录:
PostgreSQL 发布 13.2 到 9.5.25 等多个版本,PostgreSQL 全球开发组发布了我们数据库系统所有受支持版本的更新,包括 13.2、12.6、11.11、10.16、9.6.21 和 9.5.25。此版本将关闭两个安全漏洞,并修复了过去三个月中报告的 80 多个 Bug。包括13.2、12.6、11.11、10.16、9.6.21和9.5.25。此版本关闭了两个安全漏洞,并修复了过去三个月内报告的80多个错误。此外,这是PostgreSQL 9.5的最终版本。如果在生产环境中运行PostgreSQL 9.5,建议制定升级计划。
CVE-2021-3393:分区约束冲突错误拒绝列的泄漏值
受影响的版本:11 - 13
在分区表上具有UPDATE特权但在某些列上没有SELECT特权的用户可能能够从错误消息中获取拒绝的列值。这类似于CVE-2014-8161,但利用的条件更为罕见。PostgreSQL项目感谢Heikki Linnakangas报告此问题。
CVE-2021-20229:单列选择特权允许读取所有列
受影响的版本:13
对单个列具有SELECT特权的用户可以制作一个特殊查询,该查询返回表的所有列。此外,使用列级特权的存储视图将具有不完整的列使用位图。在依赖于列级权限的安全性安装中,建议对所有用户定义的视图执行CREATE或REPLACE,以强制对其进行重新解析。PostgreSQL项目感谢Sven Klemm报告此问题。
此更新修复了过去几个月报告的 80 多个 Bug。其中一些问题仅影响版本 13,但也适用于其他受支持的版本。其中一些修复程序包括:
修复GiST索引的问题,该问题可能导致并发插入会导致索引错误,并且条目放置在错误的页面中。您应该重新索引所有受影响的GiST索引。
修复CREATE INDEX,以确保并发准备好的事务中的行包含在索引中。启用预备事务的安装应重新索引任何并发构建的索引。
修复了散列聚合溢出到磁盘时可能出现的错误查询结果的问题。
修复渐进式排序中的边缘情况,这可能导致排序结果不正确或出现“边界排序中检索到太多元组”错误。
通过扩展查询协议(例如,从准备好的语句)执行执行事务回滚的CALL或DO语句时,避免崩溃。
修复了PL / pgSQL过程在具有执行COMMIT或ROLLBACK的OUT参数的另一个过程上使用CALL时的故障。
从分区表上的BEFORE UPDATE触发器中删除错误,以获取不再适用的限制。
带有联接的查询的几个修复程序可能导致错误消息,例如“无关联N条目”或“无法建立任何N向联接”。
尝试并行化排序时,请勿在ORDER BY表达式中考虑并行限制或返回集合的函数。
修复ALTER DEFAULT PRIVILEGES以安全地处理重复的参数。 将wal_level设置为最小时,包括在事务中重写表时,对行为的一些修复。
CREATE TABLE LIKE的几个修复程序。
确保在提交事务时迅速释放为已删除关系(例如,表)分配的磁盘空间。
修复CLUSTER的进度报告。
...
PostgreSQL 9.5 是 EOL版本
PostgreSQL 9.5是9.X系列最终发布更新版本。如果您在生产环境中运行 PostgreSQL 9.5,我们建议您制定计划升级到更新、受支持的 PostgreSQL 版本。有关详细信息,请参阅我们的版本控制政策。所有 PostgreSQL 更新版本都是累积的。与其他次要版本一样,用户无需转储和重新加载其数据库或使用,以便应用此更新版本;可以简单地关闭 PostgreSQL 并更新其二进制文件。请参阅我们的版本控制政策以获取更多信息。跳过一个或多个更新版本的用户可能需要运行其他更新后步骤;有关详细信息,请参阅早期版本的发行说明。
注意:PostgreSQL 9.6 将在 2021 年 11 月 11 日停止接收修复程序。有关详细信息,请参阅我们的版本控制政策。
2021年11月11 更新记录:
PostgreSQL 全球开发组发布了其数据库系统所有支持版本的更新,包括 14.1、13.5、12.9、11.14、10.19 和 9.6.24。此版本关闭了两个安全漏洞并修复了过去三个月报告的 40 多个错误。其中9.6.24 是 PostgreSQL 9.6 的最终版本。
安全问题
CVE-2021-23214:服务器处理来自中间人的未加密字节
受影响的版本:9.6 - 14。当服务器配置为使用具有 clientcert 要求的信任身份验证或使用证书身份验证时,尽管使用 SSL 证书验证和加密,中间人攻击者可以在首次建立连接时注入任意 SQL 查询。
CVE-2021-23222:libpq 处理来自中间人的未加密字节
受影响的版本:9.6 - 14。尽管使用了 SSL 证书验证和加密,中间人攻击者仍可以向客户端的前几个查询注入错误响应。如果更多先决条件成立,攻击者可以窃取客户端的密码或其他可能在会话早期传输的机密数据。与对 CVE-2021-23214 的任何利用一样,服务器必须使用具有 clientcert 要求的信任身份验证或使用证书身份验证。
其它主要更新内容
在传送以部分 WAL 记录结尾的 WAL 段后主服务器崩溃的情况下修复物理复制。应用此更新时,请在主服务器之前更新备用服务器,以便它们在主服务器发生崩溃时准备好处理修复程序
修复并行 VACUUM 以便它处理低于 min_parallel_index_scan_size 阈值的索引,如果表至少有两个大于该大小的索引
修复 CREATE INDEX CONCURRENTLY 和 REINDEX CONCURRENTLY 写入损坏索引的原因
修复 attaching/detaching 可能允许某些 INSERT/UPDATE 查询在活动会话中行为不当的分区
修复了使用 CREATE TYPE 创建新范围类型的问题,该类型可能导致后续事件触发器或 CREATE TYPE 命令的后续执行出现问题
修复作为组合的一部分的域的数组中元素字段的更新
禁止 FETCH FIRST WITH TIES 和 FOR UPDATE SKIP LOCKED 的组合
修复数字 power() 函数中的极端情况精度损失
修复了在子事务中恢复 Portal 快照的问题,这可能会导致崩溃
如果事务在导出其快照后失败,则正确清理。
修复了备用服务器上可能导致性能下降的 "溢出子事务" 环绕跟踪
确保在升级备用服务器期间正确考虑准备好的事务
确保在重命名表时使用正确的锁定级别
删除同时删除拥有对象的角色时避免崩溃
当 shared_memory_type 为 sysv 时,禁止将 huge_pages 设置为 on
更多详情请查看更新公告。
PostgreSQL 13.3、12.7、11.12、10.17 和 9.6.22 已于2021年5月13日发布,这些版本关闭了三个安全漏洞,并修复了过去三个月中报告的 45 个以上的 bug。主要更新内容:
关闭 CVE-2021-32027:数组下标计算中的整数溢出导致缓冲区溢出,受影响的版本:9.6 - 13。在修改某些 SQL 数组值时,缺失的边界检查让认证的数据库用户向服务器内存的大范围内写入任意字节
关闭 CVE-2021-32028:INSERT ... ON CONFLICT ... DO UPDATE 中的内存泄露,受影响的版本:9.6 - 13。该功能首次出现在9.5中,在一个特意制作的表中使用 INSERT ... ON CONFLICT ... DO UPDATE 命令,攻击者可以读取服务器内存的任意字节。在默认配置中,任何经过认证的数据库用户都可以创建先决条件的对象,并完成这种攻击
关闭 CVE-2021-32029:分区表 UPDATE ... RETURNING 中的内存泄露,受影响的版本: 11 - 13。在一个特意制作的分区表上使用 UPDATE ... RETURNING 命令,攻击者可以读取服务器内存的任意字节。在默认配置中,任何经过认证的数据库用户都可以创建先决条件的对象,并完成这种攻击
修复潜在的不正确的 UPDATE ... RETURNING 输出计算,以进行联合的跨分区更新
在分区表的外键约束上使用时,修复 ALTER TABLE ... ALTER CONSTRAINT。该命令将无法调整叶分区的约束和触发器的 DEFERRABLE 和 INITIALLY DEFERRED 属性,从而导致意外行为。更新到此版本后,用户可以执行 ALTER TABLE ... ALTER CONSTRAINT 命令来修复任何行为不当的分区表
确保将子表与 ALTER TABLE ... INHERIT 附加在一起时,在父级中生成列的生成方式与子级中的生成方式相同
禁止将标识列标记为 NULL
确保 REINDEX CONCURRENTLY 保留了为索引设置的任何统计目标
修复了在某些情况下,在 AFTER 触发器中保存记录可能导致崩溃的问题
修复了 to_char() 如何处理有负数间隔的罗马数字月份格式代码的问题
修复了BRIN 索引位图扫描的问题,该问题可能导致"无法打开文件"的错误
修复了当有许多匹配记录时,GIN tsvector 索引搜索可能出现错误答案的问题
更多详情请查看更新公告。
PostgreSQL 14 Beta 3 发布、9.6 即将 EOL
PostgreSQL 全球开发组于2021年8中旬为所有受支持的版本发布了更新,分别是 13.4、12.8、11.13、10.18、9.6.23 和 14 Beta 3。更新内容包括修复一个安全漏洞,以及修复过去三个月社区报告的超过 75 个错误。完整变更内容查看Release Note。
安全漏洞
CVE-2021-3677:部分查询出现内存泄露,受影响的版本:11 - 13。
漏洞描述:专门设计的查询可以读取服务器内存的任意字节。在默认配置下,任何经过身份验证的数据库用户都可以随意完成此攻击。攻击不需要创建对象的能力。如果服务器设置包括max_worker_processes=0,则无法对已知版本进行此攻击。但是,未被发现的攻击变体可能与该设置无关。PostgreSQL 14 Beta 3 为多域类型(multirange types)引入了unnest功能以及一些错误修复。完整变更点此查看。最后值得注意的是,PostgreSQL 9.6 将于 2021 年 11 月 11 日停止接收修复。如果用户在生产环境中使用的是 PostgreSQL 9.6,官方建议他们计划升级到更新的受支持的 PostgreSQL 版本。更多信息查看版本控制政策。
2022年2月14 更新记录:
PostgreSQL 14.2, 13.6, 12.10, 11.15 和 10.20 发布,版本包括:PostgreSQL 14.2, 13.6, 12.10, 11.15 和 10.20。下面的列出的问题会影响 PostgreSQL 14,其中一些问题也可能会影响其他受支持的 PostgreSQL 版本:
修复了在VACUUM期间 HOT (heap-only tuple) 链改变状态时索引损坏的低概率问题。虽然遇到这种问题的可能性不大,但如果担心,可考虑重新索引。
修复在 TOAST 表索引上使用REINDEX CONCURRENTLY以防止损坏的问题,可通过再次重新索引它们来修复任何 TOAST 索引 。
psql \password命令现在默认为 CURRENT_USER 所定义的角色设置密码。此外,角色名称现在包括在密码提示中。
为分区表构建扩展统计信息。如果之前向分区表添加了扩展统计信息,则应该在这些表上运行ANALYZE。由于autovacuum目前不处理分区表,因此必须定期在任何分区表上运行ANALYZE以更新其统计信息。
修复当统计对象同时被删除时ALTER STATISTICS的崩溃。
修复提取可变长度数据类型时多范围崩溃的问题。
对导致不正确查询结果的查询计划器的若干修复。
对 query plan memoization 的若干修复
修复物理副本的启动以容忍事务 ID 环绕
使用逻辑复制时,当发布包括子表和父表时,避免重复传输分区表的数据。
当分区表的行类型在别处用作复合类型时,不允许更改分区表列的数据类型。
不允许ALTER TABLE ... DROP NOT NULL作为副本标识索引一部分的列。
多个缓存修复,可纠正逻辑复制行为并提高性能。
修复更新表达式索引时的内存泄漏。
避免在REASSIGN OWNED BY操作中泄漏内存,这些操作重新分配了许多对象的所有权。
修复出现在INSERT ... VALUES规则中的整行变量的显示。
修复可能导致无法本地化在多线程使用 libpq 或 ecpglib 中早期报告的错误消息的竞争条件。
修复用于识别父触发器的命令 psql \d
修复使用终端作为数据源或目标时 Windows 上的故障。这影响了 psql\copy命令和使用用 pg_recvlogical with -f -。
修复pg_dump --inserts 和 --column-inserts模式以处理包含生成和删除列的表。
修正postgres_fdw处理异步查询的边缘情况。这些错误可能导致崩溃或在试图运行外域表的并行扫描时出现不正确的结果。
本次更新修复了超过 55 个错误,可查看发行说明获取完整变更列表。
2022年5月16 更新记录:
PostgreSQL 14.3、13.7、12.11、11.16 和 10.21 发布,版本包括:PostgreSQL 14.3、13.7、12.11、11.16 和 10.21。此次更新修复了一个安全漏洞并修复了过去三个月报告的 50 多个错误。如果在使用 ltree 数据类型的列上有任何 GiST 索引,将需要在升级后重新索引它们,可查看发行说明获取完整变更列表。值得注意的是,PostgreSQL 10 将于 2022 年 11 月 10 日停止接收修复。如果在生产环境中运行 PostgreSQL 10,官方建议计划升级到受支持的 PostgreSQL 更新版本。
CVE-2022-1552:Autovacuum、REINDEX 等省略了“security restricted operation”沙箱。受影响的版本:10 - 14。安全团队通常不会测试不受支持的版本,但这个问题已经很老了。
Autovacuum、REINDEX、CREATE INDEX、REFRESH MATERIALIZED VIEW、CLUSTER 和 pg_amcheck 在特权用户维护其他用户的对象时,没有完全做到安全操作。这些命令太晚或根本没有激活相关的保护措施。一个有权限在至少一个模式中创建非临时对象的攻击者可以在超级用户的身份下执行任意的 SQL 函数。虽然及时更新 PostgreSQL 是大多数用户的最佳补救措施,但无法做到这一点的用户可以通过禁用 autovacuum、不手动运行上述命令以及不从pg_dump命令输出恢复来解决该漏洞。在此解决方法下,性能可能会迅速下降。VACUUM是安全的,当受信任的用户拥有目标对象时,所有的命令都是好的。
下面的列出的问题会影响 PostgreSQL 14,其中一些问题也可能会影响其他受支持的 PostgreSQL 版本:
修复了可能导致 ltree列上的 GiST 索引损坏的问题。升级后,用户需要重新索引ltree列上的所有 GiST 索引。
由SELECT列表顶层之外的整行变量(例如tbl.*)生成的 tuples 中的列名现在总是与关联的命名复合类型(如果有的话)相关联。
修复从interval类型中提取 epoch 值时不正确的舍入。
防止调用pg_stat_get_replication_slot(NULL)时出现问题。
修复table_to_xmlschema()中timestamptz和timetz类型的错误输出。
修复与影响异步远程查询的计划程序问题相关的错误。
如果使用SEARCH或CYCLE功能的查询包含重复的公用表表达式 ( WITH) 名称,则修复规划器故障。
修复ALTER FUNCTION以支持在同一命令中更改函数的并行属性及其SET-variable 列表。
修复在前导键是表达式的索引上使用CLUSTER时对表行的错误排序。
如果在排序的 GiST 索引构建后不久发生系统崩溃,防止数据丢失。
修复删除分区索引时出现死锁失败的风险。
修复DROP TABLESPACE和 checkpointing 之间的 race condition,该条件可能无法从表空间目录中删除所有死文件。
修复TRUNCATE与 checkpointing 重叠的命令后崩溃恢复的潜在问题。
重新允许_作为自定义配置参数名称中的第一个字符。
修复 PANIC:当有一个缺失的 WAL 延续记录时,在备用升级期间 xlog 刷新请求未被满足的故障。
修复热备冲突处理中出现 self-deadlock 的可能性。
确保当服务器接近max_sync_workers_per_subscription限制时可以重新启动逻辑复制应用 workers。
不允许在 PL/Perl 函数编译期间执行 SPI 函数。
libpq 现在接受 root 拥有的 SSL 私钥文件,这与服务器自 9.6 版本以来使用的规则相匹配。
在 psql、pg_dump 和 pg_amcheck 中重新允许 database.schema.table 模式。
对 pageinspect 进行了一些修复,以提高整体稳定性。
当外部表上存在BEFORE INSERT ... FOR EACH ROW触发器时禁用postgres_fdw批量插入。
更新 JIT 代码以使用 LLVM 14。
2022年8月16 更新记录:
PostgreSQL 14.5、13.8、12.12、11.17、10.22 和 15 Beta 3 发布,版本包括:14.5、13.8、12.12、11.17 和 10.22,以及 PostgreSQL 15 的第三个 beta 版本。此版本关闭了一个安全漏洞并修复了过去三个月报告的 40 多个错误。
PostgreSQL 10 EOL Upcoming:PostgreSQL 10 将于 2022 年 11 月 10 日停止接收修复。对于在生产环境中运行 PostgreSQL 10 的用户,官方强烈建议升级到更新的、受支持的 PostgreSQL 版本,以便可以继续接收错误和安全修复。可参阅版本控制政策以获取更多信息。
安全问题
CVE-2022-2625:扩展脚本替换不属于扩展的对象,受影响的版本:10 - 14。安全团队通常不会测试不受支持的版本,但这是一个相当古老的问题。一些扩展使用 CREATE OR REPLACE 或 CREATE IF NOT EXISTS 命令。但有些人不遵守 documented rule,只针对已知为扩展成员的对象。攻击需要在至少一个模式中创建非临时对象的权限,能够诱使或等待管理员在该模式中创建或更新受影响的扩展,以及诱使或等待受害者使用 CREATE OR REPLACE 或 CREATE IF NOT EXISTS 中的 object targeted。鉴于所有三个先决条件,攻击者可以作为受害者角色(可能是超级用户)运行任意代码。已知受影响的扩展包括 PostgreSQL 捆绑和非捆绑扩展。PostgreSQL 在核心服务器中阻止了这种攻击,因此无需修改单个扩展。
关于 PostgreSQL 15 Beta 的说明:此版本标志着 PostgreSQL 15 的第三个 beta 版本,并使社区在第三季度末左右暂时向一般可用性迈进了一步。本着开源 PostgreSQL 社区的精神,官方强烈建议用户在系统上测试 PostgreSQL 15 的新功能,以帮助消除可能存在的错误或其他问题。虽然不建议在生产环境中运行 PostgreSQL 15 Beta 3,但鼓励找到针对此 Beta 版本运行典型应用程序工作负载的方法。
错误修复和改进
此更新修复了过去几个月报告的 40 多个错误。下面列出的问题会影响 PostgreSQL 14,其中一些问题也可能会影响其他受支持的 PostgreSQL 版本:
修复了在遇到 missing tablespace directory 时,在备用服务器上重放 CREATE DATABASEwrite-ahead log (WAL) 的问题 。
添加对作为普通目录的 tablespaces 的支持,而不是对其他目录的符号链接。
修复 CREATE INDEX 中的权限检查以使用用户的权限。这修复了依赖于修复 CVE-2022-1552 之前的行为的损坏转储 / 恢复场景。
修复扩展统计的不正确的权限检查代码。
修复扩展统计机制以处理布尔值表达式的最常见值 ( MCV) 类型的统计信息。
修复 ALTER TABLE ... ENABLE/DISABLE TRIGGER 以处理分区表上触发器的递归。
拒绝 ROW() 的表达式和 FROM 中超过 1600 列的函数。
修复逻辑复制订阅者中的内存泄漏。
安排在 SPI_commit()中清理 commit-time errors,而不是期望 callers 这样做。这包括对 PL/Python 中相同场景的修复,该场景报告了 Python 3.11 的崩溃和旧版本的 Python 3 的内存泄漏。
改进 libpq 中对 pipeline mode 下空闲状态的处理。
修复 pg_upgrade以检测接受 anyarray 参数的函数的 non-upgradable usages。
一些 postgres_fdw 修复,包括在存在 WITH CHECK OPTION 约束时防止批量插入。
......
有关可用更改的完整列表,可查看发行说明。
2022年11月12 更新记录:
PostgreSQL 全球开发组针对当前所有被支持版本发布了一次更新,版本包括:15.1、14.6、13.9、12.13、11.18 和 10.23。这是 PostgreSQL 10 系列的最终版本,之后 PostgreSQL 10 将不再接受安全和错误修复。如果你正在生产环境中运行 PostgreSQL 10,官方建议制定升级计划。此次更新修复了过去几个月中报告的超过 25 个 bug。下面列出的问题影响 PostgreSQL 15,其中一些问题也可能影响其他支持的 PostgreSQL 版本。
修复了包含多行 VALUES 子句并设置 DEFAULT 的 INSERT 语句的可更新视图。
禁止 MERGE 在具有外表分区的分区表上使用。
修复了在 ALTER TABLE ... ATTACH PARTITION 执行时构建每个分区外键约束的问题 ,以前可能会构建不正确或重复的约束。
修复了在分区或继承表上使用扩展统计的 planner 故障。
修复逻辑解码中的错误,当 replay 从事务开始和其子事务开始之间的某个点开始时可能导致内存泄漏。
通过允许在更多地方中断来解决 replication workers 关闭缓慢的问题。
禁止逻辑复制到外部表分区。
在 SQL 或 PL/pgSQL 函数语法错误后防止复制工作崩溃。
如果查询被取消,psql -c 现在以非零状态退出。
在 pg_basebackup 中允许跨平台表空间重定位。
修复 pg_dump 以使其包括一些 CHECK 约束的注释。
此版本还更新了时区数据文件以使用 tzdata 版本 2022f。这包括智利、斐济、伊朗、约旦、墨西哥、巴勒斯坦和叙利亚的 DST 法律变更,以及智利、克里米亚、伊朗和墨西哥的历史更正。tzdata 2022f 版本中还有一些其他更改需要注意,这些更改可能会更改 1970 年前时间戳的显示。有关详细说明与可用更改的完整列表,可查看发行说明。
2023年2月15 更新记录:
PostgreSQL 全球开发组针对当前所有被支持版本发布了一次更新,版本包括:15.2、14.7、13.9、12.14、和 11.19。此版本修复了一个安全漏洞并修复了过去几个月报告的 60 多个 bug。
CVE-2022-41862:使用 Kerberos 连接到修改后的服务器时客户端内存泄露。
受影响的版本:12 - 15。
在建立 Kerberos 传输加密的过程中,一个经过修改的、未经认证的服务器或未经认证的中间人可以发送一个未终止的字符串。当 libpq 客户端应用程序有一个 Kerberos 凭据缓存,并且没有明确地禁用选项 gssencmode时,服务器可能会导致 libpq 过度读取并报告一个错误信息,其中包含来自其接收缓冲区及其后的未初始化字节。如果 libpq 的调用者以某种方式使攻击者能够访问该信息,这就实现了 over-read bytes 的泄露。官方表示,其目前还没有确认或排除安排崩溃或在披露的字节中存在明显的机密信息的攻击的可行性。
下面列出的问题影响 PostgreSQL 15,其中一些问题也可能影响其他支持的 PostgreSQL 版本:
如果 GENERATED 列在父表中不存在或子表生成的列与父表有不同的依赖关系,则修复分区表以正确更新子表中的 GENERATED 列。
MERGE命令的几个修复 。
允许 WITH RECURSIVE ... CYCLE 查询访问其 SET 输出列。
修复了在外部表上批量插入可能导致逻辑不一致的问题,例如,BEFORE ROW 触发器可能无法处理本应可用的行。
拒绝在 jsonpath存在性检查中使用未定义的变量 。
修复了直接来自表中 text 列的 jsonb subscripting。
在重新加载时遵循 checkpoint_completion_target 的更新值。
在 recovery_target_xid 模式中记录正确的结束时间戳。
修复了使用逻辑复制时允许列列表超过 100 的问题。
防止在 VACUUM末尾的 “wrong tuple length” 失败 。
使用 query pipelining 后避免在 ANALYZE之后立即提交 。
修复统计收集以在关系更改类型时正确处理(例如,表转换为视图)。
确保在执行短语匹配时可以取消全文搜索查询。
修复 DROP DATABASE逻辑复制 worker 进程之间的死锁。
修复 CREATE SUBSCRIPTION连接尝试失败时的 small session-lifespan 内存泄漏 。
提高了处理 SELECT 查询的启用 hot_standby的副本的性能。
逻辑解码的几个修复,提高了稳定性和臃肿处理。
修复默认逻辑复制插件 pgoutput,使其不发送未列在表的复制列列表中的列。
修复 pg_basebackup中非常大的 tablespace map 文件可能的损坏。
当 public schema 有一个非默认的所有者时,从 pg_dump的 --if-exists 模式中删除一个无害的警告。
修复 psql 命令 \sf 和 \ef 以处理具有 SQL 标准函数体的 SQL 语言函数(即 BEGIN ATOMIC)。
修复 ALTER FUNCTION/PROCEDURE/ROUTINE ... SET SCHEMA 的 tab 完成。
更新 pageinspect 扩展以将其 disk-accessing functions 标记为 PARALLEL RESTRICTED.
修复 seg扩展,使其在输入数字超过 127 位时不会崩溃或 print garbage。
此版本还将时区数据文件更新为 tzdata 版本 2022g,以适应格陵兰和墨西哥的 DST 法律变更,以及加拿大北部、哥伦比亚和新加坡的历史更正。值得注意的是,新时区 America/Ciudad_Juarez 已从 America/Ojinaga 中分离出来。有关可用更改的完整列表,可查看发行说明。
2023年5月14 更新记录:
PostgreSQL 全球开发组针对当前所有被支持版本发布了一次更新,版本包括:15.3、14.8、13.11、12.15 和 11.20。此版本修复了两个安全漏洞并修复了过去几个月报告的 80 多个 bug。
CVE-2023-2454:CREATE SCHEMA ... schema_element 破坏保护性 search_path 更改。
受影响的版本:11 - 15。
这使具有数据库级 CREATE 权限的攻击者能够以 bootstrap 超级用户身份执行任意代码。默认情况下,数据库所有者拥有该权利,并且显式授权可以将其扩展到其他用户。
CVE-2023-2455:行安全策略忽略内联后的用户 ID 更改。
受影响的版本:11 - 15。
虽然 CVE-2016-2193 修复了行安全性和用户 ID 更改之间的大部分交互,但它遗漏了涉及函数内联的场景。在使用特定于角色的策略并且给定查询在一个角色下计划然后在其他角色下执行的情况下,这会导致应用可能不正确的策略。这种情况可能发生在 security definer functions 下,或者当最初计划一个普通用户和查询然后跨多个 SET ROLE 重新使用时。应用不正确的策略可能允许用户完成其他被禁止的读取和修改。这仅影响那些使用 CREATE POLICY 定义行安全策略的数据库。
下面列出的问题影响 PostgreSQL 15,其中一些问题也可能影响其他支持的 PostgreSQL 版本。
当使用 STRATEGY = WAL_LOG 时,对 CREATE DATABASE进行了一些修复,包括可能丢失对模板/源数据库修改的潜在损坏。
修复了 CREATE SCHEMA AUTHORIZATION的崩溃。
MERGE的几个修复程序。
对分区表中的触发器进行了多项修复。
不允许更改存储在索引中的复合类型。
确保从启用了 row-level security 的父表中 COPY TO时,不会从子表复制任何行。
调整文本搜索相关的字符分类逻辑,在数据库默认排序规则使用 provider 时,正确检测当前语言环境是否为 C。
重新允许在 ISO-8601 区间字段中使用指数符号。
改进各种无效 JSON 字符串文字的错误报告。
修复由于 vacuum_defer_cleanup_age 大于当前 64 位 xid 而导致的数据损坏。
查询解析器和规划器的几个修复,包括更好地检测不正确嵌套的聚合。
修复了在 booleanIS NOT TRUE 和 IS NOT FALSE 条件下的 partition pruning bug。在此之前,NULL partitions 会被意外地剪除。
修复 memoize plan execution 中的内存泄漏。
修复在执行分批插入时使用分区的外域表的缓冲区 refcount 泄漏。
恢复对 sub-millisecondvacuum_cost_delay 设置的支持。
视图和规则的几个修复 。
在使用多个扫描键扫描多列时避免不必要的工作。在扫描具有多个扫描键的多列 BRIN 索引时,避免不必要的工作。
在 UPDATE 或 DELETE 操作的逻辑复制期间忽略丢弃的列和生成的列 。
对等待事件的命名和可用性进行了多项修复。
支持带有 SCRAM-SHA-256 通道绑定的 RSA-PSS 证书 。此功能需要使用 OpenSSL 1.1.1 或更新版本构建。
修复会话中使用 cast expressions 的 PL/pgSQL DO块的内存泄漏。
在将列表结构转换为多维 SQL 数组时,加强 PL/Perl 和 PL/Python 的数组维数检查。
修复了 pg_dump,以便可以成功恢复在枚举类型列上进行 hash-partitioned 的分区表 。
修复了 pg_trgm使用 GiST 或 GIN 索引时无法满足的正则表达式可能导致崩溃的问题。
限制 pg_walinspect中的 pg_get_wal_records_info() 内存使用。
此版本还将时区数据文件更新为 tzdata 版本 2023c,以适应埃及、格陵兰、摩洛哥和巴勒斯坦的 DST 法律变更。在遵守莫斯科时间时,Europe/Kirov 和 Europe/Volgograd 现在使用缩写 MSK/MSD 而不是数字缩写,以与遵守莫斯科时间的其他时区保持一致。此外,America/Yellowknife 不再区别于 America/Edmonton;这会影响该地区的一些 1948 年之前的时间戳。
2023年8月11 更新记录:
PostgreSQL 全球开发组针对当前所有被支持版本发布了一次更新,版本包括:15.4、14.9、13.12、12.16 和 11.21,以及 PostgreSQL 16 的第三个测试版。此版本修复了两个安全漏洞并修复了过去几个月报告的 40 多个 bug。如果使用 BRIN 索引来查找 NULL 值, 则升级到此版本后需要重新索引它们。在 PostgreSQL 12 及更高版本上,你可以使用 REINDEX CONCURRENTLY 以避免阻止对受影响的索引和表的写入,例如:REINDEX INDEX CONCURRENTLY your_index_name;
PostgreSQL 11 EOL 通知
PostgreSQL 11 将于 2023 年 11 月 9 日停止接收修复。如果你在生产环境中运行 PostgreSQL 11,建议制定计划升级到更新的受支持版本的 PostgreSQL。参阅版本控制政策以获取更多信息。
安全问题
CVE-2023-39417 :引用中的扩展脚本 @substitutions@允许 SQL 注入。支持的、易受攻击的版本:11 - 15。安全团队通常不会测试不受支持的版本,但这个问题已经存在很久了。如果扩展脚本在 quoting 结构 (dollar quoting, '', or "") 内使用 @extowner@、@extschema@或@extschema:...@,则容易受到攻击。没有捆绑的扩展名存在漏洞。在文档示例和非捆绑扩展中确实存在漏洞。因此,攻击的先决条件是管理员安装了易受攻击的、受信任的、非捆绑扩展的文件。在这一前提条件下,拥有数据库级 CREATE 权限的攻击者就能以引导超级用户身份执行任意代码。PostgreSQL 将在核心服务器中阻止这种攻击,因此无需修改个别扩展。
CVE-2023-39418:MERGE 无法强制执行 UPDATE 或 SELECT 行安全策略。支持的、易受攻击版本:15。
PostgreSQL 15 引入了 MERGE命令,该命令无法根据为 UPDATE 和 SELECT 定义的行安全策略测试新行 。如果 UPDATE 和 SELECT 策略禁止某些行,而 INSERT 策略不禁止,则用户可以存储此类行。后续后果取决于应用程序。这仅影响用于 CREATE POLICY定义行安全策略的数据库。
错误修复和改进
下面列出的问题会影响 PostgreSQL 15,其中一些问题也可能会影响其他受支持的版本。
修复了 BRIN 索引中 NULL 值的处理。此修复不适用于现有 BRIN 索引 - 用户将需要运行 REINDEX来修复任何用于搜索 NULL 值的 BRIN 索引。
避免在 DROP DATABASE 中断时留下损坏的数据库。
针对分区索引的多项修复。
修复如果扩展包含扩展架构之外的任何对象的 ALTER EXTENSION ... SET SCHEMA错误。
修复表访问方法的依赖性跟踪。
不要在规划器中使用部分唯一索引来证明唯一性。
扩展规则操作时,正确处理 RLS 策略表达式和 security-barrier 视图中的子 SELECT。
修复 SERIALIZABLE 事务隔离模式冲突检测中的 race conditions。
修复尝试更新需要 out-of-line TOASTing 的复合列的字段时出现的间歇性故障。
修复查询生命周期中发生的多个内存泄漏。
在 jsonpathdatetime()方法的输入中接受小数秒 。
将 pg_hba.conf 和 pg_ident.conf 中的 token 限制增至 10,240 字节。
JIT 的内存不足错误现在将导致 PostgreSQLFATAL 错误而不是 C++ 异常。
允许在检测到某些类型的 B-tree 索引损坏后继续使用 VACUUM。虽然此修复允许 VACUUM 继续,但用户仍然需要 REINDEX 修复损坏的索引。
避免在崩溃恢复期间 double replay 已准备好的事务。
确保新创建空表上的 checkpoint calls fsync。
Silence “missing contrecord” 错误,以避免记录来自 pg_waldump 和 walsender 的不准确消息。
修复 [fuzzystrmatch] (https://www.postgresql.org/docs/current/fuzzystrmatch.html Soundex difference() 函数以正确处理空输入。
针对 intarray的若干修复,包括禁止在 GiST 索引中使用过大的输入数组。
修复 pg_dump以正确处理需要解析时依赖于唯一索引的 SQL 标准函数体 (BEGIN ATOMIC)。
PostgreSQL 16 Beta 3 中的修复
在 psql 中添加 \drg 命令,以显示有关角色授权信息。
在使用 pg_waldump --save-fullpage 生成的文件名中添加 timeline ID。
修复 parallel VACUUM worker 中发生死锁后的崩溃问题。
参阅发行说明以获取新功能和更改功能的完整列表。
2024年5月13 更新记录:
PostgreSQL 全球开发组发布了所有受支持的 PostgreSQL 版本的更新,包括 16.3、15.7、14.12、13.15 和 12.19。此版本修复了一个安全漏洞以及过去几个月报告的超过 55 个错误。
在系统视图 pg_stats_ext 和中发现了一个安全漏洞 pg_stats_ext_exprs,可能允许经过身份验证的数据库用户查看他们没有足够权限查看的数据。此漏洞的修复仅修复新的 PostgreSQL 安装,即 initdb 应用此修复后使用该实用程序创建的安装。如果您当前安装了 PostgreSQL 并且担心此问题,请按照 “更新” 部分中的说明进行修复步骤。
PostgreSQL 12 EOL 通知
PostgreSQL 12 将于 2024 年 11 月 14 日停止接收修复。如果您在生产环境中运行 PostgreSQL 12,我们建议您制定计划升级到更新的受支持版本的 PostgreSQL。请参阅版本控制政策以获取更多信息。
安全问题
CVE-2024-4317:限制 pg_stats_ext 和 pg_stats_ext_exps 表项对表所有者的可见性
CVSS v3.1 基本分数:3.1
支持的易受攻击的版本:14 - 16。
在 PostgreSQL 内置视图 pg_stats_ext 和 pg_stats_ext_exprs 中,缺少授权允许非特权数据库用户从其他用户的 CREATE statistics 命令中读取大多数常见值和其他统计数据。最常见的值可能会显示窃听者无法读取的列值或无法执行的函数的结果。
此修复仅修复新安装的 PostgreSQL,即在应用此修复后使用 initdb 实用程序创建的 PostgreSQL。如果你有一个当前的 PostgreSQL 安装,并且担心这个问题,请按照 “更新” 部分的说明进行修复步骤。感谢 Lukas Fittl 报告了这个问题。
Bug 修复和改进
此更新修复了过去几个月报告的超过 55 个错误。下面列出的问题会影响 PostgreSQL 16。其中一些问题也可能会影响其他受支持的 PostgreSQL 版本。
修复了 INSERT 多行 VALUES 子句的问题,其中目标列是数组或复合类型上的域。
使用 MERGE (MERGE ... DO NOTHING) 时需要目标表的 SELECT 权限。
根据 SQL 标准,如果 MERGE 中的目标行在修改期间连接到多个源行,则抛出错误。
修复了当表在布尔列上进行分区并且查询具有布尔 is NOT 子句时对 NULL 分区进行错误修剪的问题。
将 ALTER FOREIGN TABLE ... SET SCHEMA 所有拥有的序列移动到新模式中。
CREATE DATABASE 现在识别 STRATEGY 关键字时不区分大小写。
修复了 EXPLAIN 在位图堆扫描期间对堆页面进行计数的方式 ,以显示所有计数的页面,而不仅仅是具有可见元组的页面。
避免在删除孤立临时表期间出现死锁。
对 VACUUM 进行了几个修复,其中一个可以减少不必要的 I/O。
修复了几个查询规划器。
添加对安装具有数千个角色的某些操作的优化。
修复返回单个复合类型列的 SQL 语言过程的混淆。
修复 date_bin() 中不正确舍入和溢出危险。
在时间戳中添加或减去间隔时检测整数溢出。
修复逻辑复制的几个竞争条件,包括确定是否需要表同步操作。
如果一个新的服务器会话的客户端套接字不能进入非阻塞模式,断开连接。
initdb -c 现在匹配参数名称时不区分大小写。
修复 PL/pgSQL 如何解析表达式后面的单行注释(-- 样式注释)。
更新中
所有 PostgreSQL 更新版本都是累积的。与其他次要版本一样,用户无需转储和重新加载其数据库或使用 pg_upgrade 数据库即可应用此更新版本;你可以简单地关闭 PostgreSQL 并更新它的二进制文件。
对于受 CVE-2024-4317 影响且希望修复该问题的现有安装,您必须执行以下步骤:
1. 查找 SQL 脚本 fix-CVE-2024-4317。在 PostgreSQL 安装的共享目录下 (例如 /usr/share/postgresql/),或者从 PostgreSQL Git 存储库下载。你需要使用与主版本匹配的脚本:
2. PostgreSQL 16
3. PostgreSQL 15
4. PostgreSQL 14
在上述 URL 中可以单击标有 “raw” 的 URL 下载可复制和粘贴的版本。请务必使用适合您的 PostgreSQL 主要版本的脚本。如果您没有看到此文件,则要么您的版本不易受到攻击(仅 PostgreSQL 14、15 和 16 受到影响),要么您的次要版本太旧而无法修复。
在集群的每个数据库中,以数据库超级用户身份运行 fix-CVE-2024-4317.sql(文件位于 中 /usr/share/postgresql/)脚本。例如,在 psql 中,执行以下命令:
\i /usr/share/postgresql/fix-CVE-2024-4317.sql
您还必须在 template0 和 template1 数据库中执行此脚本,否则该漏洞仍将存在于您以后创建的数据库中。要修复 template0,您需要暂时允许它接受连接。您可以使用以下命令来执行此操作:
ALTER DATABASE template0 WITH ALLOW_CONNECTIONS true;
在 template0 和 template1 中执行 fix-CVE-2024-4317.sql 的脚本后,您应该取消 template0 接受连接的能力。你可以使用以下命令:
ALTER DATABASE template0 WITH ALLOW_CONNECTIONS false;
跳过一个或多个更新版本的用户可能需要运行额外的更新后步骤;有关详细信息请参阅早期版本的发行说明。
2024年11月15 更新记录:
PostgreSQL 全球开发组针对当前所有被支持版本发布了一次更新,版本包括:17.1、16.5、15.9、14.14、13.17 和 12.21。此版本修复了过去几个月报告的 4 个安全漏洞和 35 多个错误。这是 PostgreSQL v12 系列的最终版本,之后 PostgreSQL 12 将不再接受安全和错误修复。如果你正在生产环境中运行 PostgreSQL 12,官方建议制定升级计划。
安全问题
CVE-2024-10976:PostgreSQL row security below e.g. subqueries 忽略了用户 ID 更改
CVE-2024-10977:PostgreSQL libpq 保留了来自 man-in-the-middle 的错误消息
CVE-2024-10978:PostgreSQL SET ROLE、SET SESSION AUTHORIZATION 重置为错误的用户 ID
CVE-2024-10979:PostgreSQL PL/Perl 环境变量更改执行任意代码
Bug修复与改进
修复附加或分离具有外键约束的表分区时出现的问题。升级后,受此问题影响的用户需要执行手动步骤来完成修复。
修复了当使用 libc 作为默认 collation provider 时,LC_CTYPE 为 C,而 LC_COLLATE 为不同语言的问题。可能会导致不正确的查询结果。此问题仅影响 17.0。
修复 COPY FORCE_NOT_NULL 和 FORCE_NULL. 的验证。
修复当 json_objectagg() 调用包含易失函数时服务器崩溃的问题。
修复提交可序列化事务时的竞争条件。
修复 COMMIT PREPARED中的竞争条件,该条件可能需要在崩溃并恢复后手动删除文件。
减少逻辑解码内存消耗。
修复 ARM(aarch64)系统上的 JIT 崩溃问题。
psql /watch 现在会将小于 1ms 的值视为 0(执行之间无需等待)。
修复在 password file (pgpass) 中使用复制用户凭据失败的问题
pg_combinebackup 现在会在本应包含完整备份的目录中出现增量备份文件时出错。
修复在 vacuumdb 和并行 reindexdb 中避免重新索引临时表和索引的问题。
更多详情可查看官方公告。
2024年11月22 更新记录:
PostgreSQL全球开发组针对当前所有被支持版本于2024年11月下旬发布了一次更新,版本包括:17.2、16.6、15.10、14.15 和 13.18。此外,鉴于上一更新版本中某个问题的性质,还针对 PostgreSQL 12 发布了 12.22 版本。PostgreSQL v12 现已结束生命周期,将不再接收更多修复。如果正在生产环境中运行 PostgreSQL 12,官方建议制定升级计划。
下面列出的问题影响 PostgreSQL 17。其中一些问题也可能会影响其他受支持的 PostgreSQL 版本。
恢复 ALTER ROLE .. SET ROLE和 ALTER DATABASE .. SET ROLE的功能。针对 CVE-2024-10978 的修复,意外地导致如果角色设置来自非交互源,包括以前的 ALTER {ROLE|DATABASE} 命令和 PGOPTIONS环境变量,则无法应用这些设置。
恢复使用 2024-11-14 版本(17.0、16.4、15.8、14.13、13.16、12.20 及更早版本)之前的 PostgreSQL 构建的 timescaledb 和其他 PostgreSQL 扩展的兼容性。此修复会将 struct ResultRelInfo 恢复到以前的大小,因此受影响的扩展无需重建。
修复逻辑复制槽 restart_lsn 可能倒退的情况。
避免在执行 pg_rewind时删除仍然需要的 WAL 文件。
修复与删除共享统计条目相关的竞争条件,这可能会导致统计数据丢失。
修复了当表具有非默认操作类的索引时,ALTER TABLE 在检查索引的 opclass 选项是否已更改时发生的崩溃。
更多详情可查看官方公告。
2025年2月中旬 更新记录:
PostgreSQL全球开发小组已发布对所有受支持的 PostgreSQL 版本的更新,包括 17.3、16.7、15.11、14.16 和 13.19。此版本修复了过去几个月报告的 1 个安全漏洞和 70 多个错误。
安全问题
CVE-2025-1094:PostgreSQL 引用 API 未能中和未通过编码验证的文本中的引用语法
CVSS v3.1 基本分数:8.1
受支持的、易受攻击的版本:13 - 17。
libpq PostgreSQL函数PQescapeLiteral()、PQescapeIdentifier()、PQescapeString()和 中引号语法的不当中和PQescapeStringConn()允许数据库输入提供程序在某些使用模式下实现 SQL 注入。具体来说,SQL 注入要求应用程序使用函数结果构造对 PostgreSQL 交互式终端 psql 的输入。同样,PostgreSQL 命令行实用程序中引号语法的不当中和允许命令行参数源在client_encoding 和BIG5为 或server_encoding 之一时实现 SQL 注入。PostgreSQL 17.3、16.7、15.11、14.16 和 13.19 之前的版本受到影响。EUC_TWMULE_INTERNAL
感谢 Rapid7 首席安全研究员 Stephen Fewer 报告此问题。
错误修复和改进
此次更新修复了过去几个月报告的 70 多个错误。下面列出的问题会影响 PostgreSQL 17。其中一些问题也可能会影响其他受支持的 PostgreSQL 版本。
恢复连接请求中 >63 字节数据库名称和用户名的 v17 之前的截断行为。
不要对并行工作者执行连接权限检查和限制,而是从领导进程继承这些。
从等待事件名称中删除Lock后缀LWLock。
修复窗口聚合中可能重复使用陈旧结果的问题,这可能会导致不正确的结果。
修复了真空中的几种竞争条件 ,在最坏的情况下可能会导致系统目录损坏。
针对截断表和索引的几项修复 ,可防止潜在的损坏。
修复了分离分区的问题,其中其自己的外键约束引用了分区表。
修复FFn(例如FF1)的格式代码to_timestamp,其中之前的整数格式代码FFn将消耗所有可用的数字。
修复 SQL/JSON 并XMLTABLE()在必要时对特定条目进行双引号处理。
包括ldapscheme选项在内 pg_hba_file_rules()。
对的几项修复UNION,包括不合并具有不兼容排序规则的列。
一些修复可能会影响可用性或启动与 PostgreSQL 的连接的速度。
修复逻辑解码输出中的多个内存泄漏。
修复 PL/Python中的几个内存泄漏。
为 增加 psql tab 补全功能 COPY (MERGE INTO)。
显示损坏的pg_controlpg_controldata文件 的信息时更具弹性 。
pg_restore 修复zstd 压缩数据的内存泄漏问题。
已修复pg_basebackup 以正确处理 Windows 上超过 2GB 的 pg_wal.tar 文件。
修改earthdistance 以使用 SQL 标准函数体,这修复了数据库使用此扩展时主要版本升级到 v17 时可能出现的问题。
修复当函数定义未更新到最新版本时pageinspect发生崩溃的 情况。brin_page_items()
尝试取消 postgres_fdw 远程查询时修复竞争条件。
更新
所有 PostgreSQL 更新版本都是累积的。与其他次要版本一样,用户无需转储并重新加载其数据库或使用pg_upgrade即可应用此更新版本;您只需关闭 PostgreSQL 并更新其二进制文件即可。跳过一个或多个更新版本的用户可能需要运行额外的更新后步骤;请参阅早期版本的发行说明了解详细信息。了解更多详细信息请参阅发行说明。
2025年2月20日 更新记录:
PostgreSQL 全球开发组已发布对所有支持的 PostgreSQL 版本(包括 17.4、16.8、15.12、14.17 和 13.20)的更新。
Bug 修复和提升
以下列出的问题影响 PostgreSQL 17。其中一些问题也可能影响其他支持的 PostgreSQL 版本。
改进 libpq 中引号函数的行为。CVE-2025-1094 的修复导致引号函数不遵守其字符串长度参数,在某些情况下导致崩溃。这个问题可能从基于 libpq 集成的 PostgreSQL 客户端库中明显看出。
修复 pg_createsubscriber 中的小内存泄漏
更新
所有 PostgreSQL 更新版本都是累积的。与其他小版本一样,用户无需导出和重新加载他们的数据库或使用 pg_upgrade 来应用此更新版本;您只需关闭 PostgreSQL 并更新其二进制文件即可。
用户如跳过了一个或多个更新版本,可能需要运行额外的更新后步骤;请参阅早期版本的发行说明以获取详细信息。有关详细信息请参阅发行说明。