PostgreSQL 17.1、16.5、15.9、14.14、13.17 和 12.21 发布!

发布于 2024-11-14,由 PostgreSQL 全球开发组发布
PostgreSQL 项目 安全

PostgreSQL 全球开发组已发布对所有受支持的 PostgreSQL 版本的更新,包括 17.1、16.5、15.9、14.14、13.17 和 12.21。此版本修复了 4 个安全漏洞和过去几个月报告的 35 多个错误。

有关更改的完整列表,请查看发行说明

PostgreSQL 12 终止生命周期通知

这是 PostgreSQL 12 的最终版本。PostgreSQL 12 现在已到生命周期结束,将不再接收安全和错误修复。如果您在生产环境中运行 PostgreSQL 12,我们建议您制定计划升级到更新的、受支持的 PostgreSQL 版本。请查看我们的版本策略以获取更多信息。

安全问题

CVE-2024-10976:PostgreSQL 行安全(例如,子查询)忽略用户 ID 更改

CVSS v3.1 基本评分:4.2

受支持的、易受攻击的版本:12 - 17。

PostgreSQL 中对具有行安全性的表的不完整跟踪允许重用查询来查看或更改与预期不同的行。CVE-2023-2455CVE-2016-2193 修复了行安全性和用户 ID 更改之间的大部分交互。他们错过了子查询、WITH 查询、安全调用者视图或 SQL 语言函数引用具有行级安全策略的表的情况。这与之前的两个 CVE 具有相同的后果。也就是说,在使用了特定角色的策略并且在某个角色下计划了给定的查询然后在其他角色下执行的情况下,它会导致可能应用不正确的策略。这种情况可能发生在安全定义器函数下,或者当最初计划了一个公共用户和查询,然后跨多个 SET ROLE 重用时。

应用不正确的策略可能会允许用户完成原本禁止的读取和修改。这仅影响使用了 CREATE POLICY 定义行安全策略的数据库。攻击者必须根据特定应用程序的查询计划重用模式、用户 ID 更改和特定角色的行安全策略来定制攻击。PostgreSQL 17.1、16.5、15.9、14.14、13.17 和 12.21 之前的版本都受影响。

PostgreSQL 项目感谢 Wolfgang Walther 报告此问题。

CVE-2024-10977:PostgreSQL libpq 保留来自中间人攻击的错误消息

CVSS v3.1 基本评分:3.1

受支持的、易受攻击的版本:12 - 17。

PostgreSQL 中客户端使用服务器错误消息允许在当前 SSL 或 GSS 设置下不受信任的服务器向 libpq 应用程序提供任意非 NULL 字节。例如,中间人攻击者可以发送一条很长的错误消息,psql 的人工或屏幕抓取器用户会将其误认为是有效的查询结果。对于用户界面明确指示一个错误消息和其他文本之间边界的客户端,这可能不是一个问题。PostgreSQL 17.1、16.5、15.9、14.14、13.17 和 12.21 之前的版本都受影响。

PostgreSQL 项目感谢 Jacob Champion 报告此问题。

CVE-2024-10978:PostgreSQL SET ROLE、SET SESSION AUTHORIZATION 重置为错误的用户 ID

CVSS v3.1 基本评分:4.2

受支持的、易受攻击的版本:12 - 17。

PostgreSQL 中不正确的权限分配允许权限较低的应用程序用户查看或更改与预期不同的行。攻击需要应用程序使用 SET ROLESET SESSION AUTHORIZATION 或等效功能。当应用程序查询使用来自攻击者的参数或将查询结果传递给攻击者时,就会出现此问题。如果该查询对 current_setting('role') 或当前用户 ID 做出反应,则它可能会修改或返回数据,就像会话没有使用 SET ROLESET SESSION AUTHORIZATION 一样。攻击者无法控制应用哪个不正确的用户 ID。来自权限较低的来源的查询文本在此处不是问题,因为 SET ROLESET SESSION AUTHORIZATION 不是未经审查的查询的沙箱。PostgreSQL 17.1、16.5、15.9、14.14、13.17 和 12.21 之前的版本都受影响。

PostgreSQL 项目感谢 Tom Lane 报告此问题。

CVE-2024-10979:PostgreSQL PL/Perl 环境变量更改执行任意代码

CVSS v3.1 基本评分:8.8

受支持的、易受攻击的版本:12 - 17。

PostgreSQL PL/Perl 中对环境变量的不正确控制允许无特权的数据库用户更改敏感的进程环境变量(例如 PATH)。这通常足以启用任意代码执行,即使攻击者缺少数据库服务器操作系统用户。PostgreSQL 17.1、16.5、15.9、14.14、13.17 和 12.21 之前的版本都受影响。

PostgreSQL 项目感谢 Coby Abrams 报告此问题。

错误修复和改进

此更新修复了过去几个月报告的 35 多个错误。下面列出的问题会影响 PostgreSQL 17。其中一些问题也可能会影响其他受支持的 PostgreSQL 版本。

  • 修复附加或分离具有外键约束的表分区时的问题。升级后,受此问题影响的用户需要执行手动步骤才能完成修复。有关更多信息,请参阅“升级”部分和发行说明。
  • 修复当 LC_CTYPECLC_COLLATE 为不同语言环境时,使用 libc 作为默认排序规则提供程序的问题。这可能会导致不正确的查询结果。如果您的数据库中存在这些设置,请在更新到此版本后重新索引任何受影响的索引。此问题仅影响 17.0。
  • 多个查询计划程序修复,包括如果分区排序规则不匹配,则不允许连接分区(分区分段连接)。
  • 修复 MERGE ... WHEN NOT MATCHED BY SOURCE 操作可能存在的错误答案或 wrong varnullingrels 计划程序错误。
  • 修复 COPY FORCE_NOT_NULLFORCE_NULL 的验证。
  • 修复当 json_objectagg() 调用包含易变函数时服务器崩溃的问题。
  • 确保在分区表和 CREATE TABLE ... USING 中指定的非内置访问方法之间存在已注册的依赖项。此修复仅防止在此更新之后创建的分区表出现问题。
  • 修复提交可序列化事务中的竞争条件。
  • 修复 COMMIT PREPARED 中的竞争条件,该条件可能会在崩溃和恢复后需要手动删除文件。
  • 修复 pg_cursors 视图,以通过排除未完全设置的游标来防止错误。
  • 减少逻辑解码内存消耗。
  • 修复以防止稳定函数在从 CALL 语句的参数列表中调用且 CALL 位于 PL/pgSQL EXCEPTION 块中时接收陈旧的行值。
  • 修复 ARM (aarch64) 系统上的 JIT 崩溃。
  • 现在,psql \watch 将小于 1 毫秒的值视为 0(执行之间无等待)。
  • 修复无法在 密码文件pgpass)中使用复制用户的凭据的问题。
  • 如果增量备份文件存在于应包含完整备份的目录中,pg_combinebackup 现在会引发错误。
  • 修复以避免在 vacuumdb 和并行 reindexdb 中重新索引临时表和索引。

此版本还将时区数据文件更新为 tzdata 版本 2024b。此 tzdata 版本将旧的 System-V 兼容区域名称更改为复制相应的地理区域;例如,PST8PDT 现在是 America/Los_Angeles 的别名。主要可见的结果是,对于引入标准化时区之前的的时间戳,该区域被认为表示指定位置的当地平均太阳时。例如,在 PST8PDT 中,诸如 1801-01-01 00:00 之类的 timestamptz 输入之前会被呈现为 1801-01-01 00:00:00-08,但现在它会呈现为 1801-01-01 00:00:00-07:52:58

此外,还有针对墨西哥、蒙古和葡萄牙的历史更正。值得注意的是,Asia/Choibalsan 现在是 Asia/Ulaanbaatar 的别名,而不是一个单独的区域,主要是因为发现这些区域之间的差异是基于不可靠的数据。

更新

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

如果您的分区表具有外键约束,并且您已运行 ATTACH PARTITION/DETACH PARTITION 命令,则您需要在升级后采取进一步的步骤。您可以通过在现在独立的表上为每个错误的约束执行 ALTER TABLE ... DROP CONSTRAINT,然后重新添加约束来解决此问题。如果重新添加约束失败,您将需要手动重新建立引用表和被引用表之间的一致性,然后重新添加约束。

此查询可用于识别损坏的约束并构建重新创建它们所需的命令

SELECT conrelid::pg_catalog.regclass AS "受约束表", conname AS 约束, confrelid::pg_catalog.regclass AS "引用", pg_catalog.format('ALTER TABLE %s DROP CONSTRAINT %I;', conrelid::pg_catalog.regclass, conname) AS "删除", pg_catalog.format('ALTER TABLE %s ADD CONSTRAINT %I %s;', conrelid::pg_catalog.regclass, conname, pg_catalog.pg_get_constraintdef(oid)) AS "添加" FROM pg_catalog.pg_constraint c WHERE contype = 'f' AND conparentid = 0 AND (SELECT count(*) FROM pg_catalog.pg_constraint c2 WHERE c2.conparentid = c.oid) <> (SELECT count(*) FROM pg_catalog.pg_inherits i WHERE (i.inhparent = c.conrelid OR i.inhparent = c.confrelid) AND EXISTS (SELECT 1 FROM pg_catalog.pg_partitioned_table WHERE partrelid = i.inhparent));

由于可能有一个或多个 ADD CONSTRAINT 步骤会失败,因此您应该将查询的输出保存在文件中,然后尝试执行每个步骤。

此外,如果您运行的是 PostgreSQL 17.0 并且使用 libc 作为默认排序规则提供程序,并且已将 LC_CTYPE 设置为 C,而 LC_COLLATE 设置为不同的语言环境,则需要重建基于文本的索引。您可以使用 REINDEX INDEX CONCURRENTLY 命令来执行此操作。

跳过一个或多个更新版本的用户可能需要运行其他更新后步骤;有关详细信息,请参阅早期版本的发行说明。

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

链接

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