目录
一、ATF(TF-A)安全通告TFV-11?(CVE-2023-49100)
Title | 恶意的SDEI SMC可能导致越界内存读取(out of bound memory read) |
---|---|
CVE ID | |
Date | Reported on 12 Oct 2023 |
受影响的版本 | TF-A releases v1.5 to v2.9 LTS releases lts-v2.8.0 to lts-v2.8.11 |
受影响的配置 | 使能SDEI support的平台(Platforms) |
影响 | 拒绝服务攻击Denial of Service (secure world panic) |
Fix Version | a7eff3477?“fix(sdei): 确保中断ID是有效的ensure that interrupt ID is valid” |
Credit | Christian Lindenmeier?@_chli_?Marcel Busch?@0ddc0de?IT Security Infrastructures Lab |
????????软件委托异常接口 (SDEI:Software Delegated Exception Interface) 是非安全世界的Arm规范,用于向固件注册处理程序以接收有关系统事件的通知。固件将首先通过异步异常的方式接收系统事件,并在响应中安排注册的处理程序在非安全EL中执行。
????????与SDEI调度程序交互(发出SDEI请求和接收通知)的普通世界软件称为SDEI 客户端。即使客户端在屏蔽异常的情况下执行时,它也会在注册的处理程序处收到事件通知。? ??
????????其实就是在EL1(或EL2)能够注册SDEI中断,其实就是切换到EL3中将该中断注册成group0中断,然后当事件到来时,中断将直接target到EL3,在EL3的处理程序中会dispatcher到EL1(EL2)中再处理。
????????其实就是想让RAS、watchdog中断能够快速响应,而且不被EL1(或EL2)屏蔽。也相当于达到了NMI的效果。
????????此安全通告描述了SDEI服务中的一个漏洞,其中一个恶意的非安全调用者调用无效中断ID的SDEI_INTERRUPT_BIND SMC调用,最终导致越界内存读取。
????????SDEI_INTERRUPT_BIND用于将任何物理中断绑定到正常优先级的SDEI事件。中断可以是私有外设中断(PPI)或共享外设中断(SPI)。
????????详细信息请参考SDEI Specification中SDEI_INTERRUPT_BIND。也可参考该博客13-SDEI: Software Delegated Exception Interface-CSDN博客
????????当SDEI客户端(SDEI client)传递一个没有由GIC实现的中断ID时,该漏洞就存在。这将导致data abort异常或EL3 panic,具体取决于系统中使用的GIC版本。
Call stack:
sdei_interrupt_bind(interrupt ID)
-> plat_ic_get_interrupt_type(interrupt ID)
-> gicv2_get_interrupt_group(interrupt ID)
-> gicd_get_igroupr(distributor base, interrupt ID)
-> gicd_read_igroupr(distributor base, interrupt ID).
????????gicd_read_igroupr()最终将对未实现的IGROUPR寄存器执行MMIO读取。这可能导致data abort或对EL3 memory区域的随机访问。
Call stack:
sdei_interrupt_bind(interrupt ID)
-> plat_ic_get_interrupt_type(interrupt ID)
-> gicv3_get_interrupt_group(interrupt ID, core ID)
-> is_sgi_ppi(interrupt ID)
????????is_sgi_ppi()将在遇到无效的中断ID时以EL3 panic结束。
????????通过确保SDEI客户端提供的中断ID是有效的PPI或SPI来修复该漏洞,否则返回指示参数无效的错误代码。
/* Bind an SDEI event to an interrupt */
static int sdei_interrupt_bind(unsigned int intr_num)
{
sdei_ev_map_t *map;
bool retry = true, shared_mapping;
/* Interrupt must be either PPI or SPI */
if (!(plat_ic_is_ppi(intr_num) || plat_ic_is_spi(intr_num)))
return SDEI_EINVAL;
参考:
1、9.11. Advisory TFV-11 (CVE-2023-49100) — Trusted Firmware-A 2.10.0 documentation
3、13-SDEI: Software Delegated Exception Interface-CSDN博客?
?