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

PostgreSQL 11.5、10.10、9.6.15、9.5.19、9.4.24 和 12 Beta 3 已发布!

发布于 2019-08-08,由 PostgreSQL 全球开发组发布
PostgreSQL 项目 安全

PostgreSQL 全球开发组发布了我们数据库系统的所有支持版本的更新,包括 11.5、10.10、9.6.15、9.5.19 和 9.4.24,以及 PostgreSQL 12 的第三个 beta 版本。此次发布修复了 PostgreSQL 服务器中的两处安全问题、PostgreSQL Windows 安装程序中的一处安全问题,以及自上次发布以来报告的 40 多个 bug。

用户应尽快安装这些更新。

关于 PostgreSQL 12 Beta 的说明

秉承 PostgreSQL 社区开源的精神,我们强烈鼓励您在自己的数据库系统中测试 PostgreSQL 12 的新功能,以帮助我们消除可能存在的任何 bug 或其他问题。虽然我们不建议您在生产环境中使用 PostgreSQL 12 Beta 3,但我们鼓励您尝试在 beta 版本上运行您的典型应用程序工作负载。

您的测试和反馈将帮助社区确保 PostgreSQL 12 版本能够保持我们一贯的标准,提供稳定、可靠的世界领先的开源关系型数据库。

安全问题

此版本修复了四项安全漏洞

CVE-2019-10208SECURITY DEFINER 执行期间,pg_temp 中的 TYPE 执行任意 SQL

受影响版本:9.4 - 11

在存在适当的 SECURITY DEFINER 函数的情况下,攻击者可以在函数所有者的身份下执行任意 SQL。攻击需要对该函数拥有 EXECUTE 权限,并且该函数本身必须包含一个具有不精确参数类型匹配的函数调用。例如,length('foo'::varchar)length('foo') 是不精确的,而 length('foo'::text) 是精确的。作为利用此漏洞的一部分,攻击者使用 CREATE DOMAINpg_temp schema 中创建一个类型。攻击模式和修复与 CVE-2007-2138 类似。

编写 SECURITY DEFINER 函数仍然需要
遵循文档中提到的注意事项

https://postgresql.ac.cn/docs/current/sql-createfunction.html#SQL-CREATEFUNCTION-SECURITY

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

CVE-2019-10209:哈希子计划跨类型比较中的内存泄露

受影响版本:11

在一个包含假设的、用户定义的哈希相等运算符的数据库中,攻击者可以读取服务器内存中的任意字节。要使攻击成为可能,超级用户需要创建不寻常的运算符。并非专门用于攻击的运算符有可能具有启用攻击的属性,但我们并未注意到具体示例。

PostgreSQL 项目感谢 Andreas Seltenreich 报告此问题。

CVE-2019-10210:EnterpriseDB Windows 安装程序将 PostgreSQL 超级用户密码写入未受保护的临时文件

受影响版本:9.4 - 11 版本的 EnterpriseDB Windows 安装程序

EnterpriseDB Windows 安装程序会将密码写入其安装目录中的一个临时文件,创建初始数据库,然后删除该文件。在该文件存在期间的几秒钟内,本地攻击者可以从该文件中读取 PostgreSQL 超级用户的密码。

PostgreSQL 项目感谢 Noah Misch 报告此问题。

CVE-2019-10211:EnterpriseDB Windows 安装程序捆绑的 OpenSSL 从未受保护的目录执行代码

受影响版本:9.4 - 11 版本的 EnterpriseDB Windows 安装程序

当数据库服务器或 libpq 客户端库初始化 SSL 时,libeay32.dll 会尝试从硬编码的目录读取配置。通常,该目录不存在,但任何本地用户都可以创建它并注入配置。此配置可以指示 OpenSSL 加载并执行以运行 PostgreSQL 服务器或客户端的用户身份的代码。大多数 PostgreSQL 客户端工具和库都使用 libpq,并且通过使用其中任何一个都可以遇到此漏洞。此漏洞与 CVE-2019-5443 非常相似,但它独立出现。可以通过设置环境变量 OPENSSL_CONF 为 "NUL:/openssl.cnf" 或任何其他不能作为文件存在的名称来规避此漏洞。

PostgreSQL 项目感谢 curl 安全团队的 Daniel Gustafsson 报告此问题。

错误修复和改进

此次更新还修复了过去几个月报告的 40 多个 bug。其中一些问题仅影响版本 11,但许多问题影响所有支持的版本。

部分修复包括:

  • 修复了在单个命令中修改多个列类型时 ALTER TABLE ... ALTER COLUMN TYPE 的问题。此问题是在之前的累积更新(11.4、10.9、9.6.14、9.5.18、9.4.23 和 12 beta 2)中引入的。
  • 确保分区键列不会由于“间接删除”而被删除,例如从删除键列的数据类型(例如自定义数据类型)的级联删除。此修复程序仅应用于新创建的分区表:如果您认为您有一个受影响的分区表(例如,一个分区键使用自定义数据类型的表),您将需要创建一个新表并将数据迁移到其中,或者使用 pg_upgrade
  • 防止在子分区中有待处理的触发器事件时删除分区表的触发器。这特别影响外键约束,外键约束是通过触发器实现的。
  • 对分区进行了几项额外的修复,包括对分区剪枝的修复,分区剪枝可能导致查询效率低下。
  • 修复了可能导致 EXISTS 查询中出现重复结果行的并行哈希连接。
  • 对查询规划器进行了几项修复。
  • 修复了导致查询死锁的几项问题。
  • 修复了在重建外键约束时多列外键的问题。
  • 防止为继承表构建扩展统计信息。
  • 修复了包含 -infinity/infinity 端点的日期范围的规范化,以确保其行为与文档匹配。
  • 修复了将非常大的 money 值转换为 numeric 时丢失小数位数的问题。
  • 修复了返回复合类型的 PL/pgSQL 函数的问题。
  • 使 libpq 忽略连接服务文件中的 \r 回车符,该回车符在某些极端情况下导致连接失败。
  • psql 进行了几项修复,包括避免在 SET variable = 之后出现不正确的制表符补全选项。
  • 提高 contrib/amcheck 的索引验证的可靠性。
  • initdb 设置为优先使用 C 库定义的时区行为,而不是 localtimeposixrules 定义的行为。这确保 PostgreSQL 使用“真实”时区名称而不是人为名称。
  • 修复 pg_dump 以确保自定义操作符类以正确的顺序转储,以防止创建无法恢复的转储。
  • 修复了使用 -R 选项时 pgbench 可能出现的死锁。
  • 修复了 MIPS CPU 的自旋锁汇编代码,使其能够在 MIPS r6 上工作。

此次更新还包含了 tzdata 2019b 版本,用于巴西的 DST 法律变更,以及香港、意大利和巴勒斯坦的历史性更正。此次更新还增加了对 zic 的新 -b slim 选项的支持,以减小已安装区域文件的尺寸,尽管 PostgreSQL 目前尚未将其使用。

更多详情,请在此处阅读完整的发布说明

https://postgresql.ac.cn/docs/release/

更新

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

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

PostgreSQL 9.4 将于 2020 年 2 月 13 日停止接收修复。请参阅我们的 版本策略 以获取更多信息。

测试 Bug 和兼容性

每个 PostgreSQL 版本的稳定性在很大程度上取决于您——社区——在 PostgreSQL 12 正式发布之前,通过您的工作负载和测试工具测试即将发布的版本,以发现 bug 和回归。由于这是 Beta 版本,数据库行为、功能细节和 API 仍可能发生微小变化。您的反馈和测试将有助于确定新功能的最终调整,因此请在不久的将来进行测试。用户测试的质量有助于我们确定何时可以进行最终发布。

PostgreSQL wiki 上公开提供了一个 未解决问题列表。您可以使用 PostgreSQL 网站上的此表单 报告 bug

https://postgresql.ac.cn/account/submitbug/

Beta 时间表

这是 12 版本第三个 beta 版本。PostgreSQL 项目将在需要时发布额外的 beta 版本进行测试,随后发布一个或多个候选版本,直到 2019 年末最终发布。有关更多信息,请参阅 Beta 测试页面。

链接