E.243. 版本 7.4.8

发布日期: 2005-05-09

这个版本包含各种自7.4.7以来的修复,包括几个安全相关的问题。关于7.4主版本的新特性的信息, 请查阅第 E.251 节

E.243.1. 迁移到版本 7.4.8

运行7.4.X的用户不需要转储/恢复。不过, 有可能在7.4.X系统日志最初的内容中处理两个已经发现的重大安全问题。 一个使用7.4.8的dump/initdb/reload序列initdb将自动纠正这些问题。

较大的安全问题是内建字符集编码转换函数可以被非特权的用户从SQL命令调用, 但是该函数不是设计来这样使用的,并且在恶意的选择参数时是不安全的。 该修复包括改变这些函数声明的参数列表,这样他们可以不再从SQL命令调用。 (这不影响他们通过编码转换机制的正常使用。)

较小的问题是contrib/tsearch2模块创建了几个函数, 这几个函数错误的声明为返回internal而它们不接受internal参数。 这破坏了所有使用internal参数的函数的类型安全。

强烈建议所有的安装都修复这些错误,通过initdb或者通过下面给出的手动修复程序。 该错误至少允许未授权的数据库用户崩溃他们的服务器进程, 并且可能允许未授权的用户获取数据库超级用户的权限。

如果不想做initdb,那么执行下面的程序。作为数据库超级用户,执行:

BEGIN;
UPDATE pg_proc SET proargtypes[3] = 'internal'::regtype
WHERE pronamespace = 11 AND pronargs = 5
     AND proargtypes[2] = 'cstring'::regtype;
-- The command should report having updated 90 rows;
-- if not, rollback and investigate instead of committing!
COMMIT;

下一步,如果你已经安装了contrib/tsearch2,执行:

BEGIN;
UPDATE pg_proc SET proargtypes[0] = 'internal'::regtype
WHERE oid IN (
   'dex_init(text)'::regprocedure,
   'snb_en_init(text)'::regprocedure,
   'snb_ru_init(text)'::regprocedure,
   'spell_init(text)'::regprocedure,
   'syn_init(text)'::regprocedure
);
-- The command should report having updated 5 rows;
-- if not, rollback and investigate instead of committing!
COMMIT;

如果这个命令带有像"function "dex_init(text)" does not exist" 这样的消息失败,那么要么在这个数据库中没有安装tsearch2, 要么你已经执行了该更新。

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

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

下一步,连接到template0,并执行上面的修复步骤。最后,执行:

-- re-freeze template0:
VACUUM FREEZE;
-- and protect it against future alterations:
UPDATE pg_database SET datallowconn = false WHERE datname = 'template0';

E.243.2. 修改列表