问题报告 纠错本页面

E.195. 版本 7.3.10

发布日期: 2005-05-09

这个版本包含各种自7.3.9以来的补丁,包括几个安全相关的问题。

E.195.1. 迁移到版本 7.3.10

运行7.3.X的不需要转储/恢复。不过, 转储/恢复是处理在7.3.X系统目录中的初始化内容中发现的重大安全问题的一种方式。 使用7.3.10的initdb的dump/initdb/reload序列将自动改正这个问题。

安全问题是非特权用户可以通过SQL命令引用内建字符设置编码转换函数, 但是该函数不是这样使用的,并且对于恶意的参数选择是不安全的。 修复包括改变这些函数声明的参数列表,这样它们可以不再被SQL命令调用。 (这样并不影响它们通过编码转换机制的正常使用。) 强烈推荐所有安装修复这个错误,通过initdb或通过下面给出的手动修复过程。 该错误至少允许非特权数据库用户毁坏他们的服务器进程, 甚至可能允许非特权用户获得数据库超级用户的权限。

如果你希望不做initdb,那么执行下列的过程。作为数据库超级用户,执行:

BEGIN;
UPDATE pg_proc SET proargtypes[3] = 'internal'::regtype
WHERE pronamespace = 11 AND pronargs = 5
     AND proargtypes[2] = 'cstring'::regtype;
-- 该命令应该报告已经更新了90行;
-- 如果不是,那么回滚并调查而不是提交!
COMMIT;

上面的程序必须在每个安装的数据库中执行,包括template1, 并且理论上也包括template0。如果你不修复模板数据库, 那么任何随后创建的数据库将包含相同的错误。template1 可以用与任意其他数据库相同的方式修复,但是修复template0 需要额外的步骤。首先,从任意数据库发出:

UPDATE pg_database SET datallowconn = true WHERE datname = 'template0';

然后连接到template0并执行以上所述的修复程序。最后,执行:

-- 重新冻结template0:
VACUUM FREEZE;
-- 保护它免受未来的变化:
UPDATE pg_database SET datallowconn = false WHERE datname = 'template0';

E.195.2. 修改列表