A.12. 版本 7.3.10 #
发行日期
2005-05-09
本次发布包含对 7.3.9 的多方面修复,其中包括若干与安全相关的问题。
A.12.1. 迁移到版本 7.3.10
对于运行 7.3.X 的用户,不需要进行转储/恢复。不过,它是处理在 7.3.X 系统目录初始内容中发现的一个重要安全问题的可行方式之一。使用 7.3.10 的 initdb 执行转储/initdb/重载序列将自动更正此问题。
该安全问题在于:内置字符集编码转换函数可以由无特权用户通过 SQL 命令调用,但这些函数并非为这种用法设计,无法防御恶意选择的参数。修复方式是更改这些函数的声明参数列表,使它们不再能从 SQL 命令中调用。(这不影响编码转换机制对它们的正常使用。)强烈建议所有安装通过 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;
上述步骤必须在安装的每个数据库中执行,包括
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';
A.12.2. 变更
更改编码函数的签名以防止误用
修复一个古老的竞态条件:它允许一个事务在某些用途上(例如 SELECT FOR UPDATE)比在其他用途上稍早被看作已提交
这是一个极其严重的缺陷,因为它可能导致应用程序短暂地看到表面上的数据不一致。
修复关系扩展与 VACUUM 之间的竞态条件
理论上这可能造成丢失一整页新插入的数据,尽管该场景发生的概率似乎极低。尚无已知案例表明它造成过比断言失败更严重的后果。
修复
TIME WITH TIME ZONE值的比较在使用了
--enable-integer-datetimes配置开关的情况下,比较代码是错误的。注意:如果你在TIME WITH TIME ZONE列上有索引,在安装此更新后需要对其执行REINDEX,因为此修复更正了列值的排序顺序。修复
TIME WITH TIME ZONE值的EXTRACT(EPOCH)修复
INTERVAL值中负小数秒的显示错误此错误只在使用了
--enable-integer-datetimes配置开关时发生。plpgsql 中更多的缓冲区溢出检查(Neil)
修复 pg_dump,使其能正确转储包含
%的触发器名(Neil)防止
to_char(interval)在与月份相关的格式下转储核心修复
contrib/pgcrypto以适配较新的 OpenSSL 构建(Marko Kreen)contrib/intagg的更多 64 位修复防止对返回
RECORD的函数的不正确优化