第 6 章 显著的程序漏洞修复
本章论述了 Red Hat Enterprise Linux 7 中修复的、对用户有严重影响的错误。
6.1. 认证和互操作性
目录服务器 rebase 到版本 1.3.10
389-ds-base 软件包已升级到上游版本 1.3.10,它修复了几个程序错误。
现在,如果服务器拒绝了搜索操作,目录服务器会正确地记录搜索基础
在以前的版本中,当 Directory 服务器因为协议错误而拒绝搜索操作时,服务器会记录 base="(null)"
而不是实际搜索基础。在这个版本中,Directory 服务器会将正确的内部变量传递给日志操作。因此,服器会在上述场景中正确记录搜索基础。
Directory Server 改进了对 etime
值进行的日志记录
在以前的版本中,如果某个操作在第二个边界启动并完成,且操作的时间少于一秒,则 Directory 服务器会记录一个错误的 etime
值。因此,日志记录的值太大。在这个版本中解决了这个问题。因此,计算的 etime
值现在更接近开始和结束时间戳。
目录服务器现在在访问日志中记录正确的 etime
值
在以前的版本中,Directory 服务器错误地在 /var/log/dirsrv/slapd-<instance_name>/access
日志文件中格式化 etime
字段。因此,纳秒的时间值比实际值低 10 倍。在这个版本中解决了这个问题。现在,Directory 服务器在 etime
字段中记录正确的纳秒值。
更改了 Directory Server 日志消息的严重性
在以前的版本中,Directory 服务器错误地记录 Event <event_name> should not occur in state <state_name>; going to sleep
信息为 error
。在这个版本中,这个消息的严重性更改为 warning
。
当搜索一个请求中的 1.1
和其他属性时,目录服务器与 RFC 4511 兼容
要只检索匹配的可分辨名称(DN)列表,LDAP 用户可以搜索 1.1
特殊属性。根据 RFC 4511,如果 LDAP 客户端搜索 1.1.
特殊属性与其他搜索请求中的其他属性,则该服务器必须忽略 1.1
特殊属性。
在以前的版本中,当 Directory 服务器用户搜索了同一搜索请求中的 1.1
特殊属性和其他属性时,服务器不会返回任何属性。在这个版本中解决了这个问题。因此,在上述场景中 Directory Server 符合 RFC 4511。
目录服务器以正确顺序返回密码策略控制
在以前的版本中,如果用户的密码已过期,Directory 服务器会根据是否耗尽安全登录,以不同顺序返回密码策略控制。因此,这有时会导致 LDAP 客户端符合 RFC 4511 标准的问题。在这个版本中解决了这个问题,Directory 服务器会以正确顺序返回密码策略控制。
(BZ#1724914)
目录服务器现在还会对扩展操作接收的最大并发 cleanAllRUV
任务应用限制
目录服务器最多支持 64 个并发 cleanAllRUV
任务。在以前的版本中,Directory 服务器只会将这个限制应用到手动创建的任务,而不适用于从扩展操作接收的服务器。因此,超过 64 个并发 cleanAllRUV
任务可以同时运行,并会减慢服务器的速度。在这个版本中,添加了一个计数器来跟踪清理任务和断开线程的数量。因此,最多只有 64 个并发 cleanAllRUV
任务可以同时运行。
将大型 LDIF 文件导入到带有许多嵌套子树的 Directory Server 数据库现在会快得多
在以前的版本中,如果 Directory 服务器数据库包含许多嵌套子树,使用 ldif2db
和 ldif2db.pl
工具导入大型 LDIF 文件会很慢。在这个版本中,Directory 服务器在所有条目后都添加了 ancestorid
索引。因此,将 LDIF 文件导入到带有许多嵌套子树的数据库会非常快。
目录服务器现在仅在之前 SASL 绑定完全初始化连接后处理新操作
在使用 Simple 身份验证和安全层(SASL)框架的绑定过程中, Directory 服务器初始化一组回调功能。在以前的版本中,如果 Directory 服务器在 SASL 绑定过程中收到同一连接的额外操作,这个操作也可以访问和使用回调功能,即使它们还没有完全初始化。因此,Directory 服务器实例会意外终止。在这个版本中,服务器会阻止操作访问和使用回调结构,直到以前的 SASL 绑定成功初始化为止。因此,Directory 服务器不再会在这种情况下崩溃。
现在,在导出更改日志后, cl-dump.pl
和 cl-dump
工具会删除临时文件
在以前的版本中, Directory 服务器中的 cl-dump.pl
和 cl-dump
工具在 /var/lib/dirsrv/slapd-<instance_name>/changelogdb/
目录中创建了临时 LDIF 文件。导出更改日志后,工具会将临时文件重命名为 *.done
。因此,如果临时文件较大,则可能会导致可用磁盘空间较低。在这个版本中,cl-dump.pl
和 cl-dump
现在删除导出末尾的临时文件。另外,在两个工具中添加了 -l
选项来手动保留临时文件。因此,在导出更改日志后 cl-dump.pl
和 cl-dump
释放磁盘空间,或者用户可以选择使用 -l
选项强制使用旧行为。
IdM 将 Apache NSS 模块配置为仅在安装或更新 IdM 服务器或副本时使用 TLS 1.2
在以前的版本中,当管理员安装 Identity Management(IdM)服务器或副本时,安装程序会在 Apache web 服务器的网络安全服务(NSS)模块中启用 TLS 1.0、TLS 1.1 和 TLS 1.2 协议。这个版本提供以下更改:
- 当您设置新服务器或副本时,IdM 只启用强大的 TLS 1.2 协议。
- 在现有的 IdM 服务器和副本中,这个更新会禁用弱 TLS 1.0 和 TLS 1.1 协议。
因此,新的和更新的 IdM 服务器和副本只使用 Apache web 服务器的 NSS 模块中的强大 TLS 1.2 协议。
IdM 现在可以正确地更新 cn=CAcert,cn=ipa,cn=etc,<base_DN>
条目中的证书记录
在以前的版本中,在更新 Identity Management(IdM)证书颁发机构(CA)证书或修改 CA 证书链后,IdM 不会更新存储在 cn=CAcert,cn=ipa,cn=etc,<base_DN>
条目中的证书记录。因此,在 RHEL 6 中安装 IdM 客户端会失败。在这个版本中,IdM 更新 cn=CAcert,cn=ipa,cn=etc,<base_DN>
中的证书记录。现在,管理员在更新 CA 证书或更新 IdM CA 中的证书链后,在 RHEL 6 上安装 IdM 6 会成功。
ipa-replica-install
工具现在验证 --server
中指定的服务器是否提供所有所需的角色
ipa-replica-install
工具提供了一个 --server
选项来指定安装程序应该用来注册的 Identity Management(IdM)服务器。在以前的版本中, ipa-replica-install
不会验证提供的服务器是否提供了证书颁发机构(CA)和密钥恢复颁发机构(KRA)角色。因此,安装程序从提供 CA 和 KRA 角色的不同服务器中复制来自指定服务器和 CA 数据的域数据。在这个版本中,ipa-replica-install
验证指定的服务器是否提供所有所需的角色。因此,如果管理员使用 --server
选项, ipa-replica-install
只从指定服务器复制数据。
ipa sudorule-add-option
当选项添加到现有 sudo 规则时,不再显示假的错误
在以前的版本中,当 sudo 规则已包含主机、主机组、用户或用户组时,ipa sudorule-add-option
命令会错误地处理 sudo 规则内容。因此,尽管成功完成,与 sudooption
参数搭配使用的 ipa sudorule-add-option
命令会返回一个错误。这个程序错误已被解决,ipa sudorule-add-option
现在会在上述场景中显示准确的输出。
(BZ#1691939)
当将帐户从 preserved 变为 stage 时,IdM 不再丢弃所有自定义属性
在以前的版本中,IdM 只处理保留帐户中定义的一些属性。因此,当将帐户从 preserved 变为 stage 时,所有自定义属性都会丢失。在这个版本中,IdM 处理保留帐户中定义的所有属性,且描述的问题不再发生。
(BZ#1583950)
Sub-CA 密钥复制不再失败
在以前的版本中,在 Kerberos 库中更改凭证缓存(ccache)行为会导致轻量级证书颁发机构(CA)密钥复制失败。在这个版本中,IdM 轻量级 CA 密钥复制客户端代码改为更改的 ccache 行为。因此,轻量级 CA 密钥复制现在可以正常工作。
现在,如果系统作为客户端对其他子系统或 LDAP 服务器使用,证书系统现在会记录审计事件
在以前的版本中,如果系统作为客户端到其他子系统或 LDAP 服务器,则证书系统不包含审计事件。因此,服务器不会记录在这种情况下的任何事件。在这个版本中,在证书系统中添加了 CLIENT_ACCESS_SESSION_ESTABLISH_FAILURE
、CLIENT_ACCESS_SESSION_ESTABLISH_SUCCESS
和 CLIENT_ACCESS_SESSION_TERMINATED
事件。因此,证书系统在作为客户端时会记录这些事件。
(BZ#1523330)
python-kdcproxy
库不再丢弃大量 Kerberos 回复
在以前的版本中,如果一个 Active Directory Kerberos 发行中心(KDC)将大型 Kerberos 回复分成多个 TCP 数据包, python-kdcproxy
库会丢弃这些软件包。在这个版本中解决了这个问题。因此,python-kdcproxy
会正确处理大量 Kerberos 回复。
6.2. 编译器和工具
Socket::inet_aton()
现在可以安全地从多个线程中使用
在以前的版本中, Socket::inet_aton()
功能(用于从多个 Perl 线程解析域名)会调用不安全的 gethostbyname()
glibc
功能。因此,偶尔会返回不正确的 IPv4 地址,或者 Perl 解释器意外终止。在这个版本中,Socket::inet_aton()
实现已被修改为使用 thread-safe getaddrinfo()
glibc
而不是 gethostbyname()
。因此,Perl Socket
模块中的 inet_aton()
功能可以从多个线程中安全使用。
sosreport
现在更快地生成 HTML 报告
在以前的版本中,当 sosreport
工具收集数千个文件时, HTML 报告生成非常慢。这个版本提供了对文本报告代码的更改,改进了报告结构和格式。另外,添加了对 JSON 文件格式报告的支持。因此,,HTML 报告现在会无延迟地生成。
6.3. Desktop
32 位和 64 位 fwupd 软件包现在可以在安装或升级系统时一起使用
在以前的版本中,fwupd 软件包中的 /usr/lib/systemd/system/fwupd.service
文件在 32 位和 64 位构架中是不同的。因此,无法同时安装 32 和 64 位 fwupd 软件包,也无法将同时使用了 32 和 64 位 fwupd 软件包的 Red Hat Enterprise Linux 7.5 系统升级到更新的版本。在这个版本中修复了 fwupd,/usr/lib/systemd/system/fwupd.service
文件对于 32 位和 64 位构架都是相同的。因此,现在可以同时安装 32 和 64 位 fwupd 软件包,或将带有 32 和 64 位 fwupd 软件包的 Red Hat Enterprise Linux 7.5 系统升级到更新的版本。
(BZ#1623466)
修复了 libteam
中的内存泄漏问题
在以前的版本中,当用户查询网络团队状态时,libteam
库使用不正确的 JSON API。因此,teamdctl <team_device> state
命令会泄漏内存。在这个版本中,库使用正确的 API,查询团队状态不再泄漏内存。
6.4. 安装和引导
安装程序可以正确地为 Kickstart 网络团队设备设置连接类型
在以前的版本中,安装程序使用 TYPE="Team"
参数而不是 DEVICETYPE="Team"
参数指定为 Kickstart 网络团队设备创建的 ifcfg
文件中的连接类型。因此,在引导过程中不会激活所有使用 network
服务的网络团队设备。在这个版本中,安装程序使用 DEVICETYPE
参数指定 ifcfg
文件中的连接类型。因此,在引导过程中会激活 Kickstart 网络团队设备,即使系统使用 network
服务进行网络配置,例如:NetworkManager 服务被禁用。
(BZ#1680606)
如果没有安装 GTK,安装程序可以正确地处理异常
在以前的版本中,当环境中没有安装 GTK GUI 工具包时,安装程序无法处理异常。因此,这个异常不会传递给用户。在这个版本中,当没有安装 GTK GUI 工具包以及向用户发出异常通知时,安装程序会正确处理异常。
(BZ#1712987)
6.5. 内核
在使用某些 BCC 工具时,IBM Z 系统不再无响应
在以前的版本中,由于内核中的一个错误,在 bcc-tools
软件包中运行 dcsnoop
、runqlen
和 slabratetop
工具会导致 IBM Z 系统变得无响应。在这个版本中解决了这个问题,IBM Z 系统在上述场景中不再挂起。
(BZ#1724027)
虚拟机不再启用不必要的 CPU 漏洞缓解措施
在以前的版本中, MDS_NO
CPU 标记(代表 CPU 不会受到 Microarchitectural Data Sampling(MDS)安全漏洞的影响),当虚拟机使用 CPU host-passthrough 时,不会暴露于客户端操作系统。因此,在一些情况下,客户端操作系统会自动启用主机不需要的 CPU 漏洞缓解功能。在这个版本中,确保了在使用 CPU host-passthrough 时, MDS_NO
标志对客户端操作系统可见,这可以防止上面描述的问题发生。
(BZ#1708465, BZ#1677209)
在 nf-logger
框架中禁用日志的问题已被修复
在以前的版本中,当管理员使用 sysctl
或 echo
命令关闭一个分配的 netfilter
日志记录器时,不会在 NONE
字符串的末尾添加 NUL
字符。因此,strcmp()
会失败并带有一个 No such file or directory
错误。在这个版本中解决了这个问题。现在,命令(如 sysctl net.netfilter.nf_log.2=NONE
)可以正常工作,并会关闭日志记录。
(BZ#1770232)
从休眠恢复现在可以在 megaraid_sas
驱动程序中正常工作
在以前的版本中,当 megaraid_sas
驱动从休眠状态恢复时,Message Signaled Interrupts(MSIx)分配无法正常工作。因此,无法从休眠中正常恢复,并需要重启系统。这个程序错误已被解决,从休眠恢复现在可以正常工作。
(BZ#1807077)
在第二个内核中 kdump 不再失败
在以前的版本中,在磁盘迁移或使用磁盘镜像安装新机器后,kdump initramfs
镜像可能会在第二个内核中失败。在这个版本中,添加了 kdumpctl rebuild
命令来重建 kdump initramfs
镜像。现在,用户可以重建 initramfs
以确保 kdump 在第二个内核中不会失败。
(BZ#1723492)
6.6. 实时内核
现在,通过避免错误的 ktimersoftd
激活来减少隔离 CPU 的延迟
在以前的版本中,对于配置的 KVM-RT 系统,每个 CPU ktimersoftd
内核线程每秒运行一次,即使没有计时器。因此,隔离的 CPU 上的延迟会增加。这个版本为实时内核添加了一个优化功能,且不会在每个 tick 中看到 ktimersoftd
。因此,ktimersoftd
不会在隔离的 CPU 上升级,这会防止干预并减少延迟。
6.7. 网络
现在,当句柄为 0xffffffff
时,tc filter show
现在可以正确的显示过滤
在以前的版本中, TC 流器代码中的一个错误会导致一个不正确的整数溢出。因此,使用 0xffffffff
作为句柄的转储流程规则可能会导致死循环。这个版本可防止 64 位构架中的整数溢出。因此, tc filter show
不再会出现循环,现在过滤器可以被正确显示。
(BZ#1712737)
当尝试应用无效的 TC 规则时,内核不再崩溃
在以前的版本中,当尝试使用具有无效 goto chain
参数的规则替换流量控制(TC)规则时,内核崩溃会发生。在这个版本中,内核会避免在上述场景中出现 NULL 解引用。因此,内核不再崩溃,并记录错误信息。
(BZ#1712918)
现在,当接收 ICMPv6 Packet Too Big
信息时,内核可以正确地更新 PMTU
在某些情况下,如链接本地地址,多个路由可以匹配源地址。在以前的版本中,内核在接收互联网控制消息协议版本 6(ICMPv6)数据包时不会检查输入接口。因此,路由查找可能会返回与输入接口不匹配的目的地。因此,当收到 ICMPv6 Packet Too Big
信息时,内核可将路径最大传输单元(PMTU)更新为不同的输入接口。在这个版本中,内核会在路由查询过程中检查输入接口。因此,内核现在根据源地址更新正确的目的地,PMTU 在上述场景中可以正常工作。
(BZ#1722686)
MACsec 不再丢弃有效帧
在以前的版本中,如果 AES-GCM 的加密上下文没有完全初始化,则传入的帧的解密会失败。因此,MachineSec 丢弃了有效的传入帧,并增加 InPktsNotValid
计数器。在这个版本中,加密上下文的初始化已被修复。现在,使用 AES-GCM 解密可以成功, MACsec 不再丢弃有效的帧。
(BZ#1698551)
当 goto chain
用作二级 TC 控制操作时,内核不再崩溃
在以前的版本中,当 act gact
和 act police
流量控制(TC)规则使用无效的 goto chain
参数作为二级控制操作时,内核会意外终止。在这个版本中,内核会避免使用带有 NULL 解引用的 goto chain
,且不再在上述场景中崩溃。相反,内核会返回 -EINVAL
出错信息。
(BZ#1729033)
内核不再允许使用 NLM_F_EXCL
集添加重复的规则
在以前的版本中,当添加了新策略路由规则时,内核不会检查规则内容。因此,内核可能会添加两个完全相同的规则。这使规则集复杂,NetworkManager 试图缓存规则时可能会造成问题。在这个版本中,NLM_F_EXCL
标志添加到内核中。现在,当添加了一个规则并且设置了标志时,内核会检查规则内容,如果规则已存在,则返回 EEXIST
错误。因此,内核不再添加重复的规则。
(BZ#1700691)
ipset list
命令为 hash
设置类型报告一致的内存
当您向 hash
集类型添加条目时, ipset
工具必须通过分配额外内存块将内存表示大小重新定义新条目的大小。在以前的版本中, ipset
将每个设置分配的总大小设置为仅新块的大小,而不是将该值添加到当前的内存大小中。因此,ip list
命令报告内存大小不一致。在这个版本中,ipset
可以正确地计算内存大小。现在,ipset list
命令显示集合的正确内存大小,输出与 hash
设置类型的实际分配内存匹配。
firewalld
如果禁用 IPv6 协议,不再尝试创建 IPv6 规则
在以前的版本中,如果禁用 IPv6 协议,firewalld
服务会错误地尝试使用 ip6tables
工具创建规则,即使 ip6tables
不应该可用。因此,当 firewalld
初始化防火墙时,服务会记录错误信息。这个版本解决了这个问题,firewalld
现在只在禁用 IPv6 时初始化 IPv4 规则。
firewall-cmd
的 --remove-rules
选项现在只删除与指定条件匹配的直接规则
在以前的版本中,firewall-cmd
命令的 --remove-rules
选项不会检查要删除的规则。因此,命令删除了所有直接规则而不是子集规则。在这个版本中解决了这个问题。因此,firewall-cmd
现在只删除与指定条件匹配的直接规则。
(BZ#1723610)
删除带有 forward-ports
的 firewalld
丰富的规则现在可以正常工作
在以前的版本中, firewalld
服务错误地处理删除使用 forward-ports
设置的规则。因此,从运行时配置中删除带有 forward-ports
的丰富的规则会失败。在这个版本中解决了这个问题。因此,删除带有 forward-ports
的丰富的规则可以正常工作。
数据包不再偏移到其他区,并导致意外行为
在以前的版本中,当在一个区中设置规则时, firewalld
守护进程允许数据包受到多个区的影响。这个行为违反了 firewalld
区概念,其中数据包可能只是个区的一部分。在这个版本中,这个程序错误已被修复, firewalld
可以防止数据包受到多个区的影响。
警告:如果用户知道或者不知道地依赖区进行登陆,则这个变化可能会影响某些服务的可用性。
6.8. 安全性
改进了 OpenSCAP
HTML 报告的可用性
在以前的版本中, OpenSCAP
HTML 报告定义了一个 Accessible Rich Internet Applications(ARIA)参数。因此使用截屏软件的用户无法访问报告中的规则详情。在这个版本中,报告生成模板已更改。因此,带有屏幕读取器的用户现在可以导航到规则详情并与链接和按钮交互。
SELinux 策略现在允许 sysadm_u
用户通过 sudo
来使用 semanage
在以前的版本中,SELinux 策略缺少规则来允许具有 sysadm_u
标签的用户在 sudo
命令中使用 semanage
命令。因此,sysadm_u
用户无法在系统中配置 SELinux。这个版本添加了缺少的规则,标记为 sysadm_u
的 SELinux 用户现在可以更改 SELinux 配置。
6.9. 服务器和服务
使用 mysql_install_db
手动初始化 MariaDB 不再失败
在以前的版本中,用于初始化 MariaDB 数据库的 mysql_install_db
脚本会调用来自/usr/libexec/
目录的 resolveip
二进制代码,而二进制代码实际位于 /usr/bin/
。因此,使用 mysql_install_db
手动初始化数据库会失败。在这个版本中,修正了 mysql_install_db
以正确定位 resolveip
。因此,使用 mysql_install_db
手动初始化 MariaDB 不再会失败。
(BZ#1731062)
ReaR
更新
RHEL 7.8 对 Relax-and-Recover(ReaR
)工具程序引入了大量的更新。
构建目录处理已被更改。在以前的版本中,当 ReaR
遇到故障时,构建目录会保存在临时位置。在这个版本中,非互动运行中的构建目录会默认删除,以防止消耗磁盘空间。
KEEP_BUILD_DIR
配置变量的语义已被改进,使其包含一个新的 errors
值。您可以将 KEEP_BUILD_DIR
变量设置为以下值:
-
errors
在调试错误时保留构建目录(之前的行为) -
y
(true
)始终保留构建目录 -
n
(false
)永不保留构建目录
当 errors
以互动方式执行 ReaR
时(在终端中),默认值为空字符串,如果 false
以非互动方式执行,则默认值为 ReaR
。请注意, KEEP_BUILD_DIR
在 debug 模式(-d
)和 debugscript 模式(-D
)中自动设置为 true
; 此行为没有改变。
主要程序错误修复包括:
- 修复了对 NetBackup 8.0 的支持。
-
ReaR
在每个组有大量用户、组和用户的系统中,不再会出现类似于xrealloc: cannot allocate
的 bash 错误。 -
bconsole
命令现在显示它的提示,它可让您在使用 Bacula 集成时执行恢复操作。 -
现在,当
docker
服务正在运行但没有定义docker
根目录时,或者无法确定docker
服务的状态时,ReaR
也可以正确地备份文件。 - 当使用精简池或在 Migration Mode 中恢复系统时,恢复不再会失败。
-
在使用 LVM 恢复过程中
initramfs
重建非常慢。
6.10. 存储
/dev/sg
中的并发 SG_IO
请求不再导致数据崩溃
在以前的版本中,/dev/sg
设备驱动程序缺少内核数据的同步。同一文件描述符上的并发请求会同时访问驱动程序中的同一数据。
因此, ioctl
系统调用有时会错误地将 SG_IO
请求的有效负载用于不同命令,该命令与正确命令同时发送。这在某些情况下会导致磁盘崩溃。红帽在 Red Hat Virtualization(RHV)中观察到这个错误。
在这个版本中,在 /dev/sg
中添加了并发保护,上面描述的问题不再发生。
(BZ#1710533)
当从活跃/主动集群镜像分离镜像时,生成的逻辑卷现在会被正确激活
在以前的版本中,当您从活跃/主动集群镜像中分离镜像时,生成的新逻辑卷会出现活跃,但没有活跃的组件。在这个版本中,新逻辑卷会被正确激活。