2025年9月25日: PostgreSQL 18 发布!

PostgreSQL 16.3、15.7、14.12、13.15 和 12.19 发布!

发布于 2024-05-09,作者 PostgreSQL 全球开发组
PostgreSQL 项目 安全

PostgreSQL 全球开发组发布了对所有受支持的 PostgreSQL 版本(包括 16.3、15.7、14.12、13.15 和 12.19)的更新。此版本修复了一个安全漏洞和过去几个月报告的 55 个以上错误。

在系统视图 pg_stats_extpg_stats_ext_exprs 中发现了一个安全漏洞,可能允许已认证的数据库用户查看他们没有足够权限查看的数据。此漏洞的修复仅适用于新安装的 PostgreSQL,即在此修复应用后使用 initdb 工具创建的 PostgreSQL。如果您当前安装了 PostgreSQL 并担心此问题,请遵循“更新”部分中的说明进行补救。

有关更改的完整列表,请参阅 发行说明

PostgreSQL 12 EOL 通知

PostgreSQL 12 将于 2024 年 11 月 14 日停止接收修复。如果您在生产环境中使用 PostgreSQL 12,我们建议您计划升级到更新的、受支持的 PostgreSQL 版本。有关更多信息,请参阅我们的 版本策略

安全问题

CVE-2024-4317:限制 pg_stats_extpg_stats_ext_exprs 条目的可见性给表所有者

CVSS v3.1 基本得分:3.1

支持的、易受攻击的版本:14 - 16。

PostgreSQL 内置视图 pg_stats_extpg_stats_ext_exprs 缺少授权,允许未经授权的数据库用户读取其他用户通过 CREATE STATISTICS 命令创建的最常见值和其他统计信息。最常见的值可能会泄露窃听者无法读取的列值,或者他们无法执行的函数的结果。

此修复仅适用于新安装的 PostgreSQL,即在此修复应用后使用 initdb 工具创建的 PostgreSQL。如果您当前安装了 PostgreSQL 并担心此问题,请遵循“更新”部分中的说明进行补救。

PostgreSQL 项目感谢 Lukas Fittl 报告此问题。

错误修复和改进

本次更新修复了过去几个月报告的 55 个以上错误。以下列出的问题会影响 PostgreSQL 16。其中一些问题也可能影响 PostgreSQL 的其他受支持版本。

  • 修复了使用多行 VALUES 子句的 INSERT 语句时出现的问题,其中目标列是数组或复合类型的域。
  • 在使用 MERGEMERGE ... DO NOTHING 时,需要对目标表具有 SELECT 权限
  • 根据 SQL 标准,当 MERGE 中的目标行在修改期间与多个源行匹配时,将引发错误。
  • 修复了当表在一个布尔列上分区,并且查询包含布尔 IS NOT 子句时,对 NULL 分区的错误修剪。
  • 使 ALTER FOREIGN TABLE ... SET SCHEMA 将任何拥有的序列移动到新模式。
  • CREATE DATABASE 现在可以不区分大小写地识别 STRATEGY 关键字。
  • 修复了 EXPLAIN 在位图堆扫描期间计算堆页的方式,以便显示所有计数页,而不仅仅是包含可见元组的页。
  • 避免在移除孤立的临时表时发生死锁。
  • VACUUM 进行多项修复,包括一项可以减少不必要 I/O 的修复。
  • 多项查询规划器修复。
  • 为拥有数千个角色的安装增加了某些操作的优化。
  • 修复了返回单个复合类型列的 SQL 语言过程的混淆问题。
  • 修复了 date_bin() 中的错误舍入和溢出风险。
  • 检测将 interval 添加或减去到时间戳时发生的整数溢出。
  • 修复了逻辑复制中的多个竞态条件,包括确定是否需要表同步操作。
  • 如果新服务器会话的客户端套接字无法设置为非阻塞模式,则断开连接。
  • initdb -c 现在可以不区分大小写地匹配参数名称。
  • 修复了 PL/pgSQL 对表达式后面的单行注释(-- 样式注释)的解析方式。

更新

所有 PostgreSQL 更新版本都是累积的。与其他次要版本一样,用户不需要转储和重新加载数据库或使用 pg_upgrade 来应用此更新版本;您可以直接关闭 PostgreSQL 并更新其二进制文件。

对于受 CVE-2024-4317 影响且希望修复此问题的现有安装,您需要执行以下步骤:

  1. 在 PostgreSQL 安装的 share 目录中(例如 /usr/share/postgresql/)查找 SQL 脚本 fix-CVE-2024-4317.sql,或从下方任一 URL 从 PostgreSQL git 仓库下载。您需要使用与您的主版本匹配的脚本。

  2. PostgreSQL 16https://git.postgresql.org/gitweb/?p=postgresql.git;a=blob;f=src/backend/catalog/fix-CVE-2024-4317.sql;hb=refs/heads/REL_16_STABLE

  3. PostgreSQL 15https://git.postgresql.org/gitweb/?p=postgresql.git;a=blob;f=src/backend/catalog/fix-CVE-2024-4317.sql;hb=refs/heads/REL_15_STABLE
  4. PostgreSQL 14https://git.postgresql.org/gitweb/?p=postgresql.git;a=blob;f=src/backend/catalog/fix-CVE-2024-4317.sql;hb=refs/heads/REL_14_STABLE

从以上 URL 中,您可以点击标有“raw”的 URL 下载可供复制粘贴的版本。

请务必使用适合您的 PostgreSQL 主版本的脚本。如果看不到此文件,则说明您的版本不受此漏洞影响(仅影响 PostgreSQL 14、15 和 16),或者您的次要版本太旧,还没有此修复。

  1. 在集群的每个数据库中,以数据库超级用户的身份运行 fix-CVE-2024-4317.sql 脚本。例如,在 psql 中,如果文件位于 /usr/share/postgresql/,则命令将如下所示:

\i /usr/share/postgresql/fix-CVE-2024-4317.sql

  1. 您还必须在 template0template1 数据库中执行此脚本,否则漏洞将仍然存在于您稍后创建的数据库中。要修复 template0,您需要暂时允许它接受连接。您可以使用以下命令执行此操作:

ALTER DATABASE template0 WITH ALLOW_CONNECTIONS true;

template0template1 中执行 fix-CVE-2024-4317.sql 脚本后,您应该撤销 template0 接受连接的能力。您可以使用以下命令执行此操作:

ALTER DATABASE template0 WITH ALLOW_CONNECTIONS false;

跳过一个或多个更新版本的用户可能需要运行额外的更新后步骤;请参阅早期版本的发行说明以获取详细信息。

有关更多详细信息,请参阅 发行说明

链接

如果您对此版本公告有任何更正或建议,请将其发送至 pgsql-www@lists.postgresql.org 公共 邮件列表