安全之安全(security²)博客目录导读
ATF(TF-A)安全通告汇总
目录
一、ATF(TF-A)安全通告 TFV-4 (CVE-2017-9607)
二、CVE-2017-9607
一、ATF(TF-A)安全通告 TFV-4 (CVE-2017-9607)
Title | 错误的固件更新SMC可能导致在AArch32状态下复制或验证安全内存中的意外数据 |
---|---|
CVE ID | CVE-2017-9607 |
Date | 20 Jun 2017 |
Versions Affected | None (only between 22 May 2017 and 14 June 2017) |
Configurations Affected | 使用AArch32 BL1的平台加上在BL31之前执行的不受信任的非安全世界固件更新代码 |
Impact | 复制或验证安全内存中的意外数据 |
Fix Version | Pull Request #979 (merged on 14 June 2017) |
Credit | ARM |
二、CVE-2017-9607
include/lib/utils_def.h头文件提供了check_uptr_overflow()宏,其目的是检测在计算基指针和偏移量之和时可能发生的算术溢出。如果给定基指针和偏移量的总和将产生一个足够大的值,则该宏的计算结果为1,这可能导致不可预测的行为。
宏代码在代码版本commit c396b73的第52行:
/** Evaluates to 1 if (ptr + inc) overflows, 0 otherwise.* Both arguments must be unsigned pointer values (i.e. uintptr_t).*/
#define check_uptr_overflow(ptr, inc) \(((ptr) > UINTPTR_MAX - (inc)) ? 1 : 0)
这个宏不能正确地为AArch32镜像工作。当两个参数的和落在[2^ 32,2 ^64 - 1]范围内时,它无法检测溢出。因此,任何依赖该宏来检测此类整数溢出的AArch32代码实际上都不受保护。
自Pull Request #678合并以来(2016年8月18日),错误代码一直存在于ARM可信固件(TF-A)中。然而,在合并Pull Request #939(2017年5月22日)之前,上游代码并不容易受到攻击,该请求引入了对可信引导(Trusted Board Boot, TBB)功能的AArch32支持。在此之前,在AArch32代码中没有使用check_uptr_overflow()宏。
该漏洞位于BL1 FWU SMC处理代码中,当满足以下所有条件时,可能会被利用:
1)平台代码使用TF BL1和TRUSTED_BOARD_BOOT构建选项。
2)平台代码使用bl1/bl1_fwu.c中提供的固件更新(Firmware Update, FWU)代码,这是TBB支持的一部分。
3)TF BL1是用ARCH=aarch32编译选项编译的。
在这种情况下,当处理FWU_SMC_IMAGE_COPY和FWU_SMC_IMAGE_AUTH smc时,AArch32 BL1镜像可能无法在输入验证检查中检测到潜在的整数溢出。
FWU_SMC_IMAGE_COPY SMC处理程序设计用于将镜像复制到安全内存中,以便后续身份验证。这是由bl1_fwu_image_copy()函数实现的,该函数具有以下函数原型:
static int bl1_fwu_image_copy(unsigned int image_id,uintptr_t image_src,unsigned int block_size,unsigned int image_size,unsigned int flags)
image_src是一个SMC参数,因此可能被攻击者控制。一个非常大的32位值,例如2^32 -1,可能会导致image_src和block_size的和溢出32位类型,check_uptr_overflow()将无法检测到。根据它的实现,特定于平台的函数bl1_plat_mem_check()可能会被这些未清理的值打败,并允许进行下面的内存复制操作,这将会绕过去。如果内存映射在BL1的地址空间中,这可能允许攻击者将意外数据复制到安全内存中,或者导致致命异常。
FWU_SMC_IMAGE_AUTH SMC处理程序设计用于验证驻留在安全内存中的镜像。这是由bl1_fwu_image_auth()函数实现的,该函数具有以下函数原型:
static int bl1_fwu_image_auth(unsigned int image_id,uintptr_t image_src,unsigned int image_size,unsigned int flags)
类似地,如果攻击者通过SMC接口控制了image_src或image_size参数,并注入了和溢出的值,他们可能会破坏bl1_plat_mem_check()函数,并使身份验证模块读取平台代码通常允许的数据之外的数据,或者使平台崩溃。
注意,在这两种情况下,都需要一个单独的漏洞来利用这个漏洞;例如,让系统根据意外的安全内存访问改变其行为的方法。此外,为了发送触发整数溢出的错误FWU SMC,需要破坏非安全世界的FWU代码。
当启用TRUSTED_BOARD_BOOT和ARCH=aarch32构建选项时,已知该漏洞会影响所有ARM标准平台。其他平台如符合上述条件,亦可能受到影响。
参考:9.4. Advisory TFV-4 (CVE-2017-9607) — Trusted Firmware-A 2.9.0 documentation