安全更新 2012-02-27 发布

发布于 2012-02-27,作者:PostgreSQL 全球开发组

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 个修复,以及对较旧版本的较少数量的修复,包括

  • 修复了与清理并发的插入操作导致的 B 树索引损坏
  • 从 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 文件时执行代码。

此修复程序从转储文件注释中删除了 '\n' 和 '\r'。

pg_dump 将对象名称复制到 SQL 脚本的注释中,而没有对其进行清理。包含换行符后跟 SQL 命令的对象名称将导致转储脚本中 SQL 命令暴露以供执行。当且仅当转储脚本重新加载时,该命令将以运行该脚本的任何人的权限执行 - 通常是超级用户。

所有受支持的 PostgreSQL 版本都受影响。有关修复和步骤的详细信息,请参阅每个版本的发行说明。

立即下载新版本