PostgreSQL 全球开发组已发布了我们数据库系统的所有受支持版本的更新,包括 9.6.4、9.5.8、9.4.13、9.3.18 和 9.2.22。此版本修复了三个安全问题。它还修补了过去三个月报告的 50 多个其他错误。受以下安全问题影响的用户应尽快更新。受 CVE-2017-7547 影响的用户需要在升级后执行其他步骤来解决此问题。其他用户应计划在下次方便的停机时间内更新。
此版本已修复三个安全漏洞
libpq,以及任何使用 libpq 的连接驱动程序,都会忽略空密码,并且不会将它们传输到服务器。当使用 libpq 或基于 libpq 的连接驱动程序执行基于密码的身份验证方法时,设置空密码似乎等同于禁用密码登录。但是,使用非基于 libpq 的连接驱动程序可能会允许具有空密码的客户端登录。
为了解决此问题,此更新禁止在任何基于密码的身份验证方法中提交空密码。服务器将拒绝在帐户上设置任何空密码。
此修复与外部数据包装器的使用有关,特别是用户映射功能。
在此修复之前,即使用户没有关联外部服务器上的 USAGE 权限,用户也可以访问查看 pg_user_mappings 中的选项。这意味着用户可以看到详细信息,例如服务器管理员而不是用户可能设置的密码。
此修复只会修复使用 initdb 新创建的集群中的行为。要修复现有系统上的此问题,您需要按照以下步骤操作。有关更多详细信息,请参阅发行说明。
在您的 postgresql.conf 文件中,添加以下内容
allow_system_table_mods = true
添加该行后,您需要重新启动 PostgreSQL 集群。
在集群的每个数据库中,以超级用户身份运行以下命令
SET search_path = pg_catalog;
CREATE OR REPLACE VIEW pg_user_mappings AS
SELECT
U.oid AS umid,
S.oid AS srvid,
S.srvname AS srvname,
U.umuser AS umuser,
CASE WHEN U.umuser = 0 THEN
'public'
ELSE
A.rolname
END AS usename,
CASE WHEN (U.umuser <> 0 AND A.rolname = current_user
AND (pg_has_role(S.srvowner, 'USAGE')
OR has_server_privilege(S.oid, 'USAGE')))
OR (U.umuser = 0 AND pg_has_role(S.srvowner, 'USAGE'))
OR (SELECT rolsuper FROM pg_authid WHERE rolname = current_user)
THEN U.umoptions
ELSE NULL END AS umoptions
FROM pg_user_mapping U
LEFT JOIN pg_authid A ON (A.oid = U.umuser)
JOIN pg_foreign_server S ON (U.umserver = S.oid);
您还需要在 *template0* 和 *template1* 数据库上运行该命令,否则该漏洞将存在于您将来创建的数据库中。
首先,您需要允许 *template0* 接受连接。在 PostgreSQL 9.5 中,您可以运行以下命令
ALTER DATABASE template0 WITH ALLOW_CONNECTIONS true;
在 PostgreSQL 9.4 及更低版本中,您必须运行此命令
UPDATE pg_database SET datallowconn = true WHERE datname = 'template0';
然后,在您的 *template0* 和 *template1* 数据库中,按照步骤 3 中的描述运行命令
完成后,您需要禁止从 *template0* 连接。在 PostgreSQL 9.5 中,您可以运行以下命令
ALTER DATABASE template0 WITH ALLOW_CONNECTIONS false;
在 PostgreSQL 9.4 及更低版本中,您必须运行以下命令
UPDATE pg_database SET datallowconn = false WHERE datname = 'template0';
从您的 postgresql.conf 文件中删除以下行
allow_system_table_mods = false
重新启动您的 PostgreSQL 集群
有关更多详细信息,请参阅发行说明。
lo_put() 函数应要求与 lowrite() 相同的权限,但缺少权限检查,这会允许任何用户更改大型对象中的数据。
为了修复此问题,lo_put() 函数已更改为检查目标对象上的 UPDATE 权限。
此更新还修复了过去几个月报告的许多错误。其中一些问题仅影响 9.6 版本,但许多问题影响所有受支持的版本
PostgreSQL 9.2 版本将于 2017 年 9 月结束生命周期。该项目预计只会为该版本发布一次更新。我们敦促用户尽快开始计划升级到更高版本的 PostgreSQL。有关更多信息,请参阅我们的版本控制策略。
所有 PostgreSQL 更新版本都是累积的。与其他次要版本一样,用户无需转储和重新加载数据库或使用 pg_upgrade 来应用此更新版本;您可以简单地关闭 PostgreSQL 并更新其二进制文件。
链接