Mozilla NSS 处理证书时存在代码执行漏洞

Mozilla 开发的 NSS(网络安全服务)加密库集中发现了一个严重漏洞 (CVE-2021-43527),该漏洞可能导致在处理使用指定的 DSA 或 RSA-PSS 数字签名时执行攻击者代码。 DER编码方法(杰出编码规则)。 该问题代号为 BigSig,已在 NSS 3.73 和 NSS ESR 3.68.1 中得到解决。 发行版中的软件包更新适用于 Debian、RHEL、Ubuntu、SUSE、Arch Linux、Gentoo、FreeBSD。 Fedora 尚无可用更新。

该问题出现在使用 NSS 处理 CMS、S/MIME、PKCS #7 和 PKCS #12 数字签名的应用程序中,或者在验证 TLS、X.509、OCSP 和 CRL 实现中的证书时。 该漏洞可能出现在支持 TLS、DTLS 和 S/MIME 的各种客户端和服务器应用程序、使用 NSS CERT_VerifyCertificate() 调用来验证数字签名的电子邮件客户端和 PDF 查看器中。

LibreOffice、Evolution 和 Evince 是易受攻击的应用程序的示例。 该问题还可能影响 Pidgin、Apache OpenOffice、Suricata、Curl、Chrony、Red Hat Directory Server、Red Hat 证书系统、Apache http 服务器的 mod_nss、Oracle Communications Messaging Server、Oracle Directory Server Enterprise Edition 等项目。 不过,该漏洞并未出现在 Firefox、Thunderbird 和 Tor 浏览器中,它们使用单​​独的 mozilla::pkix 库(也包含在 NSS 中)进行验证。 基于 Chromium 的浏览器(除非它们是专门使用 NSS 构建的)在 2015 年之前一直使用 NSS,但后来切换到 BoringSSL,也不受该问题的影响。

该漏洞是由 secvfy.c 文件中 vfy_CreateContext 函数中的证书验证代码错误引起的。 当客户端从服务器读取证书和服务器处理客户端证书时都会发生该错误。 当验证 DER 编码的数字签名时,NSS 将签名解码到固定大小的缓冲区中,并将该缓冲区传递给 PKCS #11 模块。 在进一步处理过程中,错误地检查了 DSA 和 RSA-PSS 签名的大小,如果数字签名的大小超过 16384 位(为缓冲区分配了 2048 字节,没有检查签名是否可以更大))。

包含该漏洞的代码可以追溯到2003年,但直到2012年进行重构才构成威胁。 2017年,在实现RSA-PSS支持时也犯了同样的错误。 为了进行攻击,不需要资源密集型地生成某些密钥来获取必要的数据,因为溢出发生在检查数字签名的正确性之前的阶段。 超出边界的数据部分被写入包含函数指针的内存区域,这简化了工作漏洞的创建。

该漏洞是由 Google 零号项目的研究人员在尝试新的模糊测试方法时发现的,很好地演示了在经过广泛测试的知名项目中,微不足道的漏洞如何能够在很长一段时间内未被检测到:

  • NSS 代码由经验丰富的安全团队使用最先进的测试和错误分析技术进行维护。 有多个计划为识别 NSS 中的漏洞提供巨额奖励。
  • NSS 是最早加入 Google oss-fuzz 计划的项目之一,也在 Mozilla 基于 libFuzzer 的模糊测试系统中进行了测试。
  • 该库代码已在各种静态分析器中进行了多次检查,包括自 2008 年以来一直由 Coverity 服务进行监控。
  • 直到 2015 年,NSS 一直在 Google Chrome 中使用,并由 Google 团队独立于 Mozilla 进行独立验证(自 2015 年起,Chrome 改用 BoringSSL,但仍然支持基于 NSS 的端口)。

导致该问题长期未被发现的主要问题:

  • NSS 模块化库和模糊测试不是作为一个整体进行的,而是在单个组件的层面上进行的。 例如,解码DER和处理证书的代码是分开检查的——在模糊测试期间,可能已经获得了导致问题漏洞显现的证书,但其检查没有到达验证码,问题也没有出现。显露出来。
  • 在模糊测试过程中,对输出大小(10000 字节)设置了严格的限制,而 NSS 中没有类似的限制(正常模式下的许多结构体的大小可能超过 10000 字节,因此需要更多的输入数据来识别问题) 。 对于完整验证,限制应为 224-1 字节 (16 MB),这对应于 TLS 允许的最大证书大小。
  • 关于模糊测试代码覆盖率的误解。 易受攻击的代码已被积极测试,但使用的模糊器无法生成必要的输入数据。 例如,fuzzer tls_server_target 使用一组预定义的现成证书,这将证书验证代码检查限制为仅 TLS 消息和协议状态更改。

来源: opennet.ru

添加评论