PCILeech¶
Bir FPGA (ya da compromise olmuş bir PCIe device) kullanarak PCIe üzerinden hedefin physical memory'sine raw DMA read/write'lar göndermek; OS'i bypass ederek RAM dump'lamak, logon'u unlock etmek ve code inject etmek.
Mechanism¶
Note
Bus-master yeteneğine sahip bir PCIe device, Direct Memory Access gerçekleştirebilir: host physical memory'yi, hedefteki CPU'yu ya da herhangi bir driver'ı devreye sokmadan, PCIe Transaction Layer Packet'leri (TLP'ler) yayarak okur ve yazar. Eğer platformun IOMMU'su disable, configure edilmemiş ya da yalnızca boot'un geç bir aşamasında enable edilmişse, device'ın DMA'sı address-translation-restricted değildir ve arbitrary physical memory'ye dokunabilir. PCILeech (Ulf Frisk), raw PCIe TLP'leri konuşan bir FPGA sürer ve bu hardware yeteneğini generic bir saldırıya dönüştürür: bus üzerinden full 64-bit physical memory read/write.
Arbitrary physical R/W ile ve driver footprint olmadan PCILeech, kernel yapılarını tarayabilir, patch'leyebilir ve pivot yapabilir. Belgelenen yetenekler arasında OS logon-password check'lerini kaldırma, unsigned driver yükleme, code çalıştırma ve x64 UEFI, Windows, Linux ve FreeBSD hedeflerine karşı SYSTEM/root shell spawn etme yer alır. Target RAM'i gezilebilir bir filesystem olarak expose etmek için MemProcFS ile eşleşir.
Walkthrough¶
Hardware: PCILeech-FPGA bitstream'i ile flash edilmiş bir FPGA board (örn. Screamer M2, ZDMA), hedefin PCIe / M.2 / Thunderbolt slot'una takılı. Ardından saldırgan host'u PCILeech toolkit'ini çalıştırır.
# Dump target physical memory over the FPGA DMA device
pcileech dump -device fpga -out target_ram.raw
# Search and patch: e.g. remove Windows logon password requirement
pcileech wx64_unlock -device fpga
# Mount target memory as a filesystem for live inspection (MemProcFS)
memprocfs -device fpga -mount M:
FPGA raw TLP'ler yaydığı için saldırgan ayrıca seçilen address'lerde hedeflenmiş physical read/write'lar da yapabilir:
Capability : full access to 64-bit physical address space via PCIe TLPs
Targets : x64 UEFI, Windows, Linux, FreeBSD (no driver needed on target)
Primitives : dump RAM, patch kernel logon checks, load unsigned drivers,
inject and execute code, spawn system shell
Detection¶
- Beklenmedik PCIe device enumeration'ı (özellikle hot-pluggable Thunderbolt/M.2 üzerinde) ve bilinmeyen bir function'dan gelen DMA, platform log'larında gözlemlenebilir.
- Rogue bir device'ın DMA'sı korumalı aralıklara çarptığında IOMMU fault log'ları yükselir.
Mitigation¶
- IOMMU/VT-d/AMD-Vi'yi erken ve tüm DMA-capable device'lar için enable et
(Windows'ta Kernel DMA Protection, Linux'ta
iommu=force) ki device DMA'sı translation-restricted olsun. - Kullanılmayan Thunderbolt/PCIe hot-plug'ı disable et, yeni device'lar için kullanıcı yetkilendirmesi iste ve IOMMU setup'ından önceki pencerenin kapanması için pre-boot DMA protection kullan.