目录
[一、ATF(TF-A)安全通告 TFV-10 (CVE-2022-47630)](#一、ATF(TF-A)安全通告 TFV-10 (CVE-2022-47630))
[2.1 Bug 1:证书校验不足](#2.1 Bug 1:证书校验不足)
[2.2 Bug 2:auth_nvctr()中缺少边界检查](#2.2 Bug 2:auth_nvctr()中缺少边界检查)
[2.3 可利用性分析](#2.3 可利用性分析)
[2.3.1 上游TF-A代码](#2.3.1 上游TF-A代码)
[2.3.2 自定义镜像解析器](#2.3.2 自定义镜像解析器)
一、ATF(TF-A)安全通告 TFV-10 (CVE-2022-47630)
Title | 对X.509证书扩展的不正确校验可能导致读取越界。 |
---|---|
CVE ID | CVE-2022-47630 |
Date | Reported on 12 Dec 2022 |
Versions Affected | v1.2 to v2.8 |
Configurations Affected | 启用可信启动的BL1和BL2,使用get_ext()和auth_nvctr()接口的自定义下游用法。在上游TF-A代码中不可利用。 |
Impact | 越界读 |
Fix Version | * fd37982a19a4a291 "fix(auth): forbid junk after extensions" * 72460f50e2437a85 "fix(auth): require at least one extension to be present" * f5c51855d36e399e "fix(auth): properly validate X.509 extensions" * abb8f936fd0ad085 "fix(auth): avoid out-of-bounds read in auth_nvctr()" Note that 72460f50e2437a85 is not fixing any vulnerability per se but it is required for f5c51855d36e399e to apply cleanly. |
Credit | Demi Marie Obenour, Invisible Things Lab |
二、CVE-2022-47630
此安全通告描述了用于解析TF-A可信启动中的用来解析证书的X.509解析器中的一个漏洞:精心制作的证书可能会导致内存读取越界围。
请注意上游平台不受此影响。只有当(且仅当)下文描述的接口在不同于上游代码的上下文中使用时,下游平台才可能受影响。这类上下文的细节将在本文档的后续部分描述。
要全面理解本安全通告,建议参考以下标准文档:
1)RFC 5280,Internet X.509公钥基础证书(Public Key Infrastructure Certificate )和证书吊销列表Certificate Revocation List(CRL)配置文件。
2)ITU-T X.690,ASN.1编码规则:BER (Basic encoding rules)、CER (Canonical encoding rules)和DER (Distinguished encoding rules)规范。
2.1 Bug 1:证书校验不足
漏洞存在于drivers/auth/mbedtls/mbedtls_x509_parser.c源文件中。根据设计,get_ext()不检查各种mbedtls_*()函数的返回值,因为假定cert_parse()已经保证它们总是成功。但是,它传递扩展的结尾作为这些函数的结束指针,而cert_parse()传递TBSCertificate的结尾。此外,cert_parse()不检查扩展的内容是否与扩展本身具有相同的长度。它也不检查扩展块是否扩展到TBSCertificate的末尾。
这是一个问题,因为mbedtls_asn1_get_tag()在失败时使*p和*len未定义。在实践中,这会导致get_ext()继续以不同于cert_parse()使用(和验证)的偏移量进行解析,这意味着cert_parse()提供的in-bounds保证不再有效。结果是get_ext()有可能读取证书末尾之后的内存。这可能会潜在地访问具有危险读取副作用的内存,或者泄漏微架构状态,这些状态理论上可以通过一些侧信道攻击作为更复杂攻击的一部分来检索。
2.2 Bug 2:auth_nvctr()中缺少边界检查
auth_nvctr()未检查所提供的缓冲区是否足够长以容纳ASN.1 INTEGER。由于auth_nvctr()只读取6个字节,因此可以在缓冲区结束后最多读取6个字节。
2.3 可利用性分析
2.3.1 上游TF-A代码
在上游TF-A代码中,auth_nvctr()的唯一调用者从get_ext()获取输入,这意味着第二个bug是可利用的,第一个也是。因此,只需要考虑第一个bug。
TF-A源代码树(即在drivers/auth/下)中提供的所有标准信任链都要求在调用get_ext()或调用get_ext()的任何函数之前已经验证了证书的签名。从动态配置文件(如fdts/cot_descriptors.dtsi)获取信任链的平台也是安全的,因为无论文件中属性的顺序如何,签名验证总是在调用get_ext()或auth_nvctr()之前完成。因此,不可能在上游TF-A中利用此漏洞进行预认证。
此外,通过get_ext()读取的数据只由身份验证框架(drivers/auth/auth_mod.c)使用,这大大减少了它将接收的输入范围,从而减少了它所产生的影响。具体来说,身份验证框架在三种情况下使用get_ext():
-
从X.509证书中检索hash以检查子证书的完整性(参见auth_hash())。
-
从X.509证书中检索签名详细信息以检查其真实性和完整性(参见auth_signature())。
-
从X.509证书中检索安全计数器值,以防止未经授权的证书回滚到以前的版本(参见auth_nvctr())。
这些都不使用身份验证框架写入越界内存,因此不可能损坏内存。
总之,有两个独立的问题------一个在get_ext()中,另一个在auth_nvctr()中------但这两个问题都不能在TF-A上游代码的上下文中被利用。
只有在以下两种情况下,我们才会在身份验证之前触发此漏洞:
1)该平台使用自定义信任链,在加密认证方法(AUTH_METHOD_SIG)之前使用非易失性计数器认证方法(AUTH_METHOD_NV_CTR)。
2)信任链使用自定义身份验证方法,该方法在加密身份验证之前调用get_ext()。
2.3.2 自定义镜像解析器
如果平台使用自定义镜像解析器而不是证书解析器,那么证书解析器中的错误显然与此无关。auth_nvctr()中的错误可能是相关的,但前提是返回的数据是:
1)从不受信任的来源获取(意味着在身份验证之前读取)。
2)尚未被检查为原始编码的ASN.1标记。
特别是,如果自定义镜像解析器实现在ASN.1 INTEGER中包装了一个32位整数,则不会受到影响。
参考:9.10. Advisory TFV-10 (CVE-2022-47630) --- Trusted Firmware-A 2.9.0 documentation