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

发布安全更新 2012-02-27

由 PostgreSQL 全球开发组于 2012-02-27 发布

PostgreSQL 全球开发组今日发布了所有活跃 PostgreSQL 对象-关系数据库系统的分支的安全更新,包括版本 9.1.39.0.78.4.118.3.18

pg_dump 用户、用于验证的 SSL 证书用户或使用 SECURITY DEFINER 的触发器用户应立即升级其安装。强烈建议所有其他数据库管理员在下次计划的停机时间升级您的 PostgreSQL 版本。下面包含有关安全修复程序的更多详细信息。

此更新中的错误修复影响的功能包括:二进制复制和热备、GIN、WITH、外部数据包装器、PL/pgsql、PL/python、inet 数据类型、intarray、pgcrypto、pg_upgrade、pg_restore 和 pg_dump。使用这些功能的用户应尽快应用更新。

此版本包含对 9.1 版本的 45 项修复,以及对旧版本的少量修复,包括:

  • 修复了并发 vacuuming 插入操作导致的 btree 索引损坏
  • 从 WAL 重放 DROP TABLESPACE 期间发生的错误中恢复
  • 修复了 WAL 重放期间共享缓冲区的临时零化
  • 修复了 postmaster 在热备崩溃后尝试重启
  • 修复了 SSI 事务清理中的一个边界情况
  • 更改表所有者时,更新每个列的权限,而不仅仅是每个表的权限
  • 修复了 READ COMMITTED 重新检查中数据修改的 WITH 子计划的处理
  • 修复了“找不到 CTE 的计划”失败
  • 修复了 INSERT 表达式中 COLLATE 引起的“不支持的节点类型”错误
  • 避免在提交后删除表文件出现问题时崩溃
  • 修复了处理 inet/cidr 时最近引入的内存泄漏
  • 修复了 GIN 成本估算以处理列 IN (...) 索引条件
  • 修复了 plpgsql 中与 I/O 转换相关的内存泄漏
  • 教会 pg_upgrade 处理 plpython 共享库的重命名(影响升级到 9.1)

与其他次要版本一样,用户在应用此更新版本时不需要转储和重新加载数据库或使用 pg_upgrade;您只需关闭 PostgreSQL 并更新其二进制文件。数据库重新启动后,执行更新后步骤。

此更新包括针对以下问题的三项安全修复:

此修复程序可防止用户定义用户没有 EXECUTE 权限的函数触发器。

CREATE TRIGGER 未对要调用的触发器函数进行任何权限检查。未授权的数据库用户可以将其拥有的表的触发器函数附加到该表,并使其在他们选择的数据上被调用。通常,这将以表所有者的权限执行,因此不会提供额外的功能。但是,如果触发器函数被标记为 SECURITY DEFINER,则可能发生权限提升。

  • CVE-2012-0867:SSL 证书名称检查被截断为 32 个字符,在某些情况下可能导致连接欺骗。

此修复程序解决了 SSL 通用名称截断问题,该问题在特殊情况下可能导致 SSL 连接被劫持。

使用 SSL 证书时,客户端和服务器都可以配置为验证对方的主机名是否与其提供的证书中的通用名称匹配。但是,从证书中提取的名称被错误地截断为 32 个字符。通常这只会导致验证失败,但如果机器的实际主机名恰好是 32 个字符长,则原则上可能会被欺骗。这种情况实际发生的风险似乎很小,攻击者仍然需要在 PostgreSQL 之外采取额外步骤才能成功利用。

  • CVE-2012-0868:对象名称中的换行符在加载 pg_dump 文件时可能被利用来执行代码。

此修复程序从 dumpfile 注释中删除了 '\n' 和 '\r'。

pg_dump 在没有进行清理的情况下将对象名称复制到 SQL 脚本的注释中。包含换行符后跟 SQL 命令的对象名称将导致转储脚本中的 SQL 命令被暴露以供执行。当且如果重新加载转储脚本时,该命令将以运行脚本的用户的特权执行 - 通常是超级用户。

所有受支持的 PostgreSQL 版本均受此影响。请参阅每个版本的发布说明,以获取完整的更改列表,其中包含修复的详细信息和步骤。

立即下载新版本