Advisory TFV-11 (CVE-2023-49100) ================================ +----------------+-------------------------------------------------------------+ | Title | A Malformed SDEI SMC can cause out of bound memory read. | +================+=============================================================+ | CVE ID | `CVE-2023-49100`_ | +----------------+-------------------------------------------------------------+ | Date | Reported on 12 Oct 2023 | +----------------+-------------------------------------------------------------+ | Versions | TF-A releases v1.5 to v2.9 | | Affected | LTS releases lts-v2.8.0 to lts-v2.8.11 | +----------------+-------------------------------------------------------------+ | Configurations | Platforms with SDEI support | | Affected | | +----------------+-------------------------------------------------------------+ | Impact | Denial of Service (secure world panic) | +----------------+-------------------------------------------------------------+ | Fix Version | `a7eff3477`_ "fix(sdei): ensure that interrupt ID is valid" | +----------------+-------------------------------------------------------------+ | Credit | Christian Lindenmeier `@_chli_`_ | | | Marcel Busch `@0ddc0de`_ | | | `IT Security Infrastructures Lab`_ | +----------------+-------------------------------------------------------------+ This security advisory describes a vulnerability in the SDEI services, where a rogue Non-secure caller invoking a SDEI_INTERRUPT_BIND SMC call with an invalid interrupt ID causes out of bound memory read. SDEI_INTERRUPT_BIND is used to bind any physical interrupt into a normal priority SDEI event. The interrupt can be a private peripheral interrupt (PPI) or a shared peripheral interrupt (SPI). Refer to SDEI_INTERRUPT_BIND in the `SDEI Specification`_ for further details. The vulnerability exists when the SDEI client passes an interrupt ID which is not implemented by the GIC. This will result in a data abort exception or a EL3 panic depending on the GIC version used in the system. - **GICv2 systems:** .. code:: c 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() will eventually do a MMIO read to an unimplemented IGROUPR register. Which may cause a data abort or an access to a random EL3 memory region. - **GICv3 systems:** .. code:: c 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() will end up in an EL3 panic on encountering an invalid interrupt ID. The vulnerability is fixed by ensuring that the Interrupt ID provided by the SDEI client is a valid PPI or SPI, otherwise return an error code indicating that the parameter is invalid. .. code:: c /* 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; .. _CVE-2023-49100: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2023-49100 .. _a7eff3477: https://git.trustedfirmware.org/TF-A/trusted-firmware-a.git/commit/?id=a7eff3477dcf3624c74f5217419b1a27b7ebd2aa .. _IT Security Infrastructures Lab: https://www.cs1.tf.fau.de/ .. _SDEI Specification: https://developer.arm.com/documentation/den0054/latest/ .. _@_chli_: https://twitter.com/_chli_ .. _@0ddc0de: https://twitter.com/0ddc0de