企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# E.175\. 版本 7.4.8 > **发布日期:** 2005-05-09 这个版本包含各种自7.4.7以来的修复,包括几个安全相关的问题。关于7.4主版本的新特性的信息, 请查阅[Section E.183](#calibre_link-305)。 ## E.175.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.175.2\. 修改列表 * 改变编码函数签名以阻止滥用 * 修改`contrib/tsearch2`以避免不安全的使用`INTERNAL`函数的结果 * 修复允许一个事务因为某些原因(如SELECT FOR UPDATE)比其他原因稍早的被看做是已提交的过时的竞态条件 这是一个非常严重的bug,因为它会导致表面上的数据不一致被应用短暂的看到。 * 修复关系扩展和VACUUM之间的竞态条件 这理论上会导致最近插入的一页数据丢失,尽管这种情况看起来可能性非常小。 没有已知的情况说它会引起超过一个维护的失败。 * 修复`TIME WITH TIME ZONE`值的比较 当使用了`--enable-integer-datetimes`配置开关时,比较代码是错误的。 注意:如果你在`TIME WITH TIME ZONE`字段上有一个索引, 它将需要在安装这个更新之后`REINDEX`, 因为该修复纠正了字段值的排序顺序。 * 为`TIME WITH TIME ZONE`值修复`EXTRACT(EPOCH)` * 修复负的分数秒在`INTERVAL`值中的错误显示 这个错误只在使用了`--enable-integer-datetimes` 配置开关的时候发生。 * 确保在后端关闭期间所做的操作都被统计收集器计数了 这预计能解决pg_autovacuum清理系统目录不够频繁的报告— 没有被告知在后端退出期间由于临时表删除引起的目录删除。 * 在plpgsql中追加缓冲区溢出检查 (Neil) * 修复pg_dump以正确的转储名字包含`%`的触发器 (Neil) * 为更新的OpenSSL建立修复`contrib/pgcrypto` (Marko Kreen) * 为`contrib/intagg`更多的64位修复 * 阻止返回`RECORD`的函数不正确的最优化 * 阻止`to_char(interval)`转储月相关格式的内核 * 阻止`COALESCE(NULL,NULL)`上的崩溃 * 修复`array_map`以正确的调用PL函数 * 修复`ALTER DATABASE RENAME`中的权限检查 * 修复`ALTER LANGUAGE RENAME` * 使得`RemoveFromWaitQueue`清理它本身 这修复了一个锁管理错误,该错误只在这种情况下可以看到: 如果一个事务被从锁等待中踢出(通常通过查询取消), 并且然后锁的持有者在一个非常小的窗口释放它。 * 修复无类型的参数出现在`INSERT ... SELECT`中的问题 * 修复`ALTER TABLE SET WITHOUT OIDS`之后的`CLUSTER`失败