E.101. 版本 8.4.20
发布日期: 2014-02-20
这个版本包含各种自8.4.19以来的修复。关于8.4主版本的新特性信息, 请查看第 E.121 节。
PostgreSQL社区将在2014年7月停止发布8.4.X版本系列的更新。 建议用户尽快更新到一个最新版本。
E.101.1. 迁移到版本 8.4.20
运行8.4.X版本的用户不需要转储/恢复。
如果你是从一个早于8.4.19的版本升级而来,请查看第 E.102 节。
E.101.2. 修改列表
-
支持GRANT ... WITH ADMIN OPTION限制 (Noah Misch)
不用ADMIN OPTION授予角色应该阻止接受者从授予者角色中添加或删除成员, 但是这个限制很容易通过先执行SET ROLE绕过。 安全影响大多数是一个角色成员可以删除其他成员的访问权限, 违反它的授予者的本意。未经批准的角色成员添加是一个较少的情况, 因为一个不合作的角色成员会提供它大多数的权限给其他成员, 通过创建视图或者SECURITY DEFINER函数。 (CVE-2014-0060)
-
阻止通过手动调用PL验证器函数提升权限 (Andres Freund)
在CREATE FUNCTION期间,隐含的调用PL验证器函数的主要角色, 但是它们也是一个用户可以明确调用的普通SQL函数。 在一个实际上用其他语言编写的函数上调用验证器是不会检查的, 并且可以被权限逃逸利用。该修复包含在每个验证器函数中添加一个权限检查函数调用。 非核心程序语言将也需要在它们自己的验证器函数中做此修改。 (CVE-2014-0061)
-
在表和索引DDL期间避免多个名称查找 (Robert Haas, Andres Freund)
如果名称查找因为当前的活动而有不同的结果,我们可能在一个不同的表上执行了 DDL的某些部分。至少在CREATE INDEX的情况下, 这个可以用来对和索引创建的表不同的表执行权限检查, 允许权限提升攻击。 (CVE-2014-0062)
-
阻止缓存溢出长的日期时间字符串 (Noah Misch)
MAXDATELEN约束对于interval类型的最大可能值来说太小了, 允许在
interval_out()
中缓冲区溢出。 尽管日期时间输入函数很小心的避免缓冲区溢出, 但是该限制太短足够导致它们拒绝一些有效的输入,比如包含非常长时区名的输入。 ecpg库包含这些还有一些它自己的缺陷。 (CVE-2014-0063) -
阻止大小计算中由于整数溢出而导致的缓冲区溢出 (Noah Misch, Heikki Linnakangas)
几个函数,多数是类型输入函数,计算一个分配大小而不检查溢出。 如果发生了溢出,将分配一个很小的缓冲区然后写成过去。 (CVE-2014-0064)
-
阻止固定大小的缓冲区溢出 (Peter Eisentraut, Jozef Mlich)
使用
strlcpy()
和相关的函数提供一个明确的保证, 保证固定大小的缓冲区不会溢出。不像之前的项,这个情况是否真实存在还不清楚, 因为在大多数情况下,这好像是以前对于输入字符串大小的限制。 尽管如此,最好还是屏蔽这种类型的警告。 (CVE-2014-0065) -
如果
crypt()
返回NULL,避免崩溃 (Honza Horak, Bruce Momjian)有几个情况
crypt()
会返回NULL,但是contrib/chkpass 会在返回NULL时崩溃。这会成为一个问题的具体案例是, 如果libc配置为拒绝执行未经批准的哈希算法 (例如"FIPS mode")。 (CVE-2014-0066) -
回归测试说明中make check的文档风险 (Noah Misch, Tom Lane)
因为通过make check启动的临时服务器使用"trust"认证, 相同机器上的另一个用户可以作为数据库超级用户连接到它, 然后潜在的利用启动该测试的操作系统用户的权限。 未来的版本可能包含测试过程中的修改以阻止这个风险, 但是首先需要公众讨论。所以现在,只是警告用户在相同的机器上有不可信的用户时, 反对使用make check。 (CVE-2014-0067)
-
修复一个关系的某些段不是足够大小时可能的WAL记录错误重放 (Greg Stark, Tom Lane)
WAL更新会被应用到错误的页面上,可能会有很多页面都有错误。 除了数据损坏外,已经观察到这种错误会导致备用服务器比主服务器明显的 "膨胀",因为应用的文件更新远远超出了文件尾。 这个错误模式在崩溃恢复期间看起来不是一个重大风险, 仅在最初初始化由来自迅速变化的主服务器的基础备份创建的备用服务器时有风险。
-
确保插入非叶子GIN索引页时,在适当的时候写一个全页的WAL记录 (Heikki Linnakangas)
在系统崩溃期间部分页面写入时,以前的编码会有索引损坏的风险。
-
修复服务器进程退出期间的竞态条件 (Robert Haas)
确保信号处理器程序在进程的MyProc指针不再有效后不要尝试使用它。
-
修复错误报告逻辑中不安全的引用errno (Christian Kruse)
这通常会导致奇怪的行为,比如丢失或不适当的HINT字段。
-
修复在服务器启动期间太早的使用
ereport()
可能的崩溃 (Tom Lane)我们在实际中观察到的主要情况是,如果服务器在一个它没有读取权限的目录中启动, 那么会崩溃。
-
正确的清除OpenSSL套接字写函数中的重试标志 (Alexander Kukushkin)
这个疏忽会导致在意料之外的丢失SSL加密的连接之后查找服务器。
-
修复包含转义符的unicode标识符(U&"..." syntax)的长度检查 (Tom Lane)
如果该标识符的转义形式太长,那么会给出一个虚假的截断警告, 但是该标识符在反转义后实际上不需要截断。
修复由于嵌套子查询的无效规划引起的崩溃,比如 WHERE (... x IN (SELECT ...) ...) IN (SELECT ...) (Tom Lane)
-
确保ANALYZE为表字段创建统计, 即使是表字段中的所有值都是"太宽的" (Tom Lane)
ANALYZE有意的从它的直方图和大多数共同值计算中忽略非常宽的值, 但是它忘了所有取样值都太宽的情况。
-
在ALTER TABLE ... SET TABLESPACE中, 允许使用数据库的缺省表空间时没有权限检查 (Stephen Frost)
CREATE TABLE总是允许这样的使用, 但是ALTER TABLE不是。
修复CASE的一些分支返回一个集合而其他的不返回集合时的 "cannot accept a set"错误 (Tom Lane)
修复pgstat函数中所有零客户端地址的检查 (Kevin Grittner)
-
修复文本搜索解析器可能的多字节字符误分类 (Tom Lane)
当使用C语言环境的多字节编码时,非ASCII字符会被误分类。 在Cygwin上,非C的环境也会失败。
-
修复
plainto_tsquery()
中可能的错误行为 (Heikki Linnakangas)使用
memmove()
而不是memcpy()
复制重叠的内存区域。还没有报告说它实际导致问题,但是它确实是个风险。 为了环境检查的目的,接受SHIFT_JIS作为编码的名字 (Tatsuo Ishii)
-
修复Windows上
PQhost()
的错误行为 (Fujii Masao)如果没有指定主机,那么它应该返回localhost。
-
提高COPY TO STDOUT/FROM STDIN期间libpq 和psql中失败的错误处理 (Tom Lane)
特别的,它修复了服务器连接在COPY FROM STDIN 期间丢失时,9.2及以上版本中会发生的无限循环。 这种场景的变体也可能发生在较老的版本中,或者发生在其他客户端应用中。
修复ecpg中不对齐的描述符 (MauMau)
在ecpg中,正确的处理连接参数中主机名的缺少 (Michael Meskes)
-
修复contrib/dblink连接启动中的性能退化 (Joe Conway)
当客户端和服务器编码匹配时,避免不必要的往返。
在contrib/isn中,修复对ISMN值的校验位的不正确的计算 (Fabien Coelho)
确保仅客户端编码的安装程序作为记录工作 (Peter Eisentraut)
-
在Mingw和Cygwin建立中,在bin目录下安装 libpq DLL (Andrew Dunstan)
这复制了MSVC构造很久以前就已经做了的事情。它应该修复程序的问题, 比如psql因为没有找到DLL而未能启动。
-
不再生成纯文本HISTORY和src/test/regress/README 文件 (Tom Lane)
这些文本文件复制主要的HTML和PDF文档格式。维护它们的困难远远超过了纯文本格式的困难。 发布将仍然包含这些名字的文件,但是它们只是指导读者咨询主文档。 将仍然维护纯文本INSTALL文件,因为那里有一个用户用例。
-
更新时区数据文件到tzdata版本2013i, 因为DST规律在Jordan和Cuba的历史中发生了改变。
另外,时区Asia/Riyadh87、Asia/Riyadh88 和Asia/Riyadh89已经删除了,因为IANA已经不维护它们了, 并且它们也从未代表过实际的民间计时。