本周,我们将讨论 Linux 内核、Apache 和 openssl 中的几个高严重性漏洞。
Linux 内核中的 ICMPv6 拒绝服务
CVE-2022-0742允许任何人发送130 或 131类型的 ICMPv6 消息,并利用内核中的内存泄漏导致主机内存耗尽。这个漏洞值得注意,因为攻击者只需发送几个数据包,就能导致整个系统拒绝服务。
根本原因 - 要找到根本原因,最好的办法就是查看 git提交历史本身。修复的作者最初是在调查为什么在 ipv6_mc_down() 中添加了synchronize_net ()函数时发现这个问题的。该提交的作者发现 igmp6_event_query()和 igmp6_event_report()丢弃了 skbs,而 skbs 是 linux 内核用来保存数据包信息的数据结构。此漏洞仍在分析中。
这个漏洞有一些注意事项:
- 这不会影响任何 Red Hat Enterprise Linux 版本,因为可用的内核都在 5.13 之前。
- 稳定分支受到影响。
修复该漏洞的唯一办法是更新内核。修复此漏洞的补丁已在上游应用。
Apache 安全咨询
我们将主要关注的漏洞是CVE-2022-23943,但首先我们要快速总结一下公告中的其他 CVE。此次发布的其他漏洞包括CVE-2022-22720,这是一个允许 http 请求走私的漏洞。还有 CVE-2022-22721,如果 httpd.conf 中的LimitXMLRequestBody大于 350MB,该漏洞会导致 32 位系统上的整数溢出。CVE-2022-22719会因mod_lua存在未初始化变量而导致崩溃。
mod_sed是一个可选的Apache 模块,大多数 Linux 系统默认情况下都没有安装或启用该模块。它用于使用模式替换Apache 服务的网页中的文本,类似于 sed 命令的工作方式。
CVE-2022-23943 是一个内存损坏漏洞,可导致 DoS。内存损坏漏洞来自 mod_sed。通过 mod_sed 过滤器发送大量数据会触发漏洞。如果发送的数据包大于 2GB,就会发生有符号整数溢出并导致崩溃。如果发送的数据包超过 4GB,也会发生整数溢出。
根本原因- 根本原因来自函数 appendmem_too_linebuf函数调用 memcpy 时产生的。修正后,函数参数中引用的缓冲区改为使用apr_size_t,而不是 int。 Apr_size_t允许使用 4 字节有符号 int 和 8 字节无符号 int。
这个漏洞有一些注意事项:
- 很少使用 mod_sed;以及
- mod_sed 需要手动安装和配置。它通常不作为其他软件包的依赖项。
针对此漏洞的建议补救措施包括
- 将Apache 更新到大于 2.4.52 的版本
- 禁用 mod_sed
可以通过在httpd.conf 中设置 LimitRequestBody 1073741824 来部分缓解这一问题。不过,这只能阻止恶意客户端发送超过 2GB 的请求。攻击者仍有可能触发 mod_sed 读取超过 2GB 的文件,从而导致漏洞利用。
OpenSSL 中的拒绝服务
OpenSSL 是一个用于管理、创建、验证和签署证书的库和命令行程序。它是历史最悠久的开源密码学库之一,在 linux 系统中几乎随处可见。
OpenSSL 使用BN_mod_sqrt()函数计算模平方根。该函数包含一个错误,非质数模数可能会永远循环。BN_mod_sqrt( 函数用于验证包含压缩形式椭圆曲线公钥或基点编码为压缩形式的显式椭圆曲线参数的证书。要伪造证书造成 DoS,攻击者需要用类似十六进制编辑器的工具修改使用椭圆曲线的证书,使其在数学上无效。
根本原因- 该漏洞的核心是在解析带有压缩格式点的 EC 密钥时;在解析这类密钥时,OpenSSL 会尝试扩展压缩点,试图计算曲线所定义的素数p的平方根模。然而,没有任何地方对p的素数进行了检查,甚至在BN_mod_sqrt()中也没有检查,而这是BN_mod_sqrt()的一个必要条件;因此,由于p不是预期的素数,实现过程中的一个错误将导致无限循环。OpenSSL 的公告可在此处找到。目前已打补丁的版本有
- OpenSSL 3.0.2
- OpenSSL 1.1.1n
- OpenSSL 1.0.2zd
此外,要成功利用这个漏洞还有一些注意事项,必须满足以下条件:
- 攻击者使用椭圆曲线加密技术生成带有某些无效参数的证书,或修改现有证书。
- 攻击者需要让 OpenSSL 验证证书,方法是通过本地访问,或将证书提供给使用mTLS验证用户提供的证书的网络应用程序。
注释