ATF(TF-A)安全通告TF-V11——恶意的SDEI SMC可能导致越界内存读取(CVE-2023-49100)

发布时间:2024年01月24日

目录

一、ATF(TF-A)安全通告TFV-11?(CVE-2023-49100)

二、透过事务看本质SDEI是干啥的呢?

三、CVE-2023-49100

1、GICv2 systems

2、GICv3 systems

四、漏洞修复


一、ATF(TF-A)安全通告TFV-11?(CVE-2023-49100)

Title

恶意的SDEI SMC可能导致越界内存读取(out of bound memory read)

CVE ID

CVE-2023-49100

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是干啥的呢?

????????软件委托异常接口 (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的效果。

97d72e7c80db4d239fbf59835b1e970e.png

三、CVE-2023-49100

????????此安全通告描述了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版本。

1、GICv2 systems

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区域的随机访问。

2、GICv3 systems

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;

7fe7748d2f2844bc90c167ca06dadff4.png

参考:

1、9.11. Advisory TFV-11 (CVE-2023-49100) — Trusted Firmware-A 2.10.0 documentation

2、SDEI初探-透过事务看本质?

3、13-SDEI: Software Delegated Exception Interface-CSDN博客?

?

文章来源:https://blog.csdn.net/yuxiaochen99/article/details/135823784
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。