Thunderclap¶
Gerçek bir cihazı taklit eden (emulate) kötü niyetli bir Thunderbolt/PCIe peripheral'ı, meşru olarak ihtiyaç duyduğu shared-memory üzerinden OS IOMMU korumasını yener.
Mechanism¶
Note
Bir IOMMU, physical adres uzayını per-device I/O virtual address (IOVA) uzaylarına
sanallaştırır ve bir peripheral'a yalnızca ihtiyaç duyduğu belleği gösterir —
process'ler için bir MMU'ya benzer. Thunderclap, IOMMU'yu etkinleştirmenin
yeterli olmadığını gösterir: gerçek, işlevsel bir cihaz gibi davranan kötü
niyetli bir peripheral, driver'lar ve OS alt sistemleriyle (memory allocator'lar,
IOMMU map/unmap) derinlemesine etkileşir ve bu shared-memory etkileşimleri
amaçlanandan çok daha fazlasını sızdırır. İki yapısal kusur sınıfı tanımlanır:
spatial zafiyetler — 4 KiB page translation granülerliği, aynı sayfada birlikte
yerleşmiş komşu veriyi açığa çıkarır — ve temporal zafiyetler — gerektiğinden
daha uzun açık bırakılan mapping'ler tekrar kullanılan belleği açığa çıkarır. Gerçek
bir NIC'i emulate ederek cihaz, veri sızdırmak ya da control flow'u ele geçirmek
için kernel yapılarını (örn. bir mbuf free-function pointer'ı) okur/üzerine yazar.
PCIe ATS, cihazın isteklerini "zaten çevrildi (already translated)" olarak
işaretlemesine bile izin verip IOMMU'yu tamamen bypass edebilir.
Walkthrough¶
Markettos ve diğerleri, NDSS 2019 (Cambridge / Rice / SRI). Araştırma platformu, Intel 82574L (e1000e) gigabit NIC'i emulate eden kısaltılmış bir QEMU çalıştıran bir Intel Arria 10 FPGA üzerindeki Arm Cortex-A9'dur — test edilen her OS'ta driver'ı olan bir cihaz.
- FPGA'yı bir Thunderbolt connector'ın arkasına bağla (dock / projektör / şarj cihazı form faktörü); opsiyonel olarak bir driver bağlansın diye OS'un onayladığı bir vendor/device ID'sini spoof et.
- Baseline modu: keyfi PCIe memory read/write TLP'leri üret ve erişilebilir "pencereler" için düşük IOVA aralığını prob et; IOMMU olmayan sistemlerde tek başına bu tam ele geçirmedir.
- Functional-NIC modu: e1000e modelini çalıştır ki driver IOMMU pencereleri açsın
(
mbuf/skbuffring'leri); meşru görünmek için makul DHCP/DNS trafiği yay. - Spatial exploit: aynı 4 KiB sayfayı paylaşan birlikte yerleşik veriyi oku (VPN cleartext, kernel tabloları).
- Temporal exploit: ring-buffer completion güncellemelerini düşür ki OS bir pencereyi açık tutsun, sonra tekrar kullanılan belleğin yeni sırlar sızdırmasını izle.
- Control-flow hijack: açığa çıkmış bir kernel function pointer'ının (
mbuffree handler ya da birtcpip.syspointer'ı) üzerine yazıp yürütmeyi yönlendir. - ATS bypass: ATS etkinse, IOMMU'yu atlamak için "already-translated" bit'ini set et.
Bildirilen gösterimler (makaleden)
- macOS: bir IPSec VPN'den plaintext çıkardı; bir
mbuffree-function pointer'ının üzerine yazarak root shell aldı (hermbuf= 256 byte). - Linux (Fedora 25 / kernel 4.8): 2 KiB'lık bir skbuff ile bir sayfayı paylaşan
nf_natdispatch table'ını yeniden yazdı; UNIX-socket SSH-agent trafiğini ve VPN cleartext'ini sızdırdı; syscall kernel stack'leri üzerinden KASLR'ı kırdı. - Windows: bir
tcpip.syspointer'ının üzerineKeBugCheckExyazdı (control-flow hijack). - Etkilenen: macOS, FreeBSD, Linux (IOMMU-korumalı) ve Windows. "Saniyeler içinde IOMMU bypass."
Detection¶
Cihaz onaylı bir ID'ye sahip gerçek bir peripheral olarak göründüğünden, OS seviyesindeki device enumeration onu işaretlemez; saldırı penceresi bağlandıktan sonraki birkaç saniyedir.
Mitigation¶
Yazarlar şunları önerir: en kısıtlayıcı izinlerle yalnızca minimum veriyi açığa çıkarın; bellek tekrar kullanılmadan önce IOMMU mapping'lerini tamamen yok ederek (senkron IOTLB invalidation) temporal açığa çıkmayı ortadan kaldırın; per-device IOVA uzaylarını zorlayın; cihazlara kernel pointer'ları sızdırmayı durdurun. Açıklamadan sonra gelen satıcı düzeltmeleri arasında Microsoft Kernel DMA Protection (Windows 10 1803), Thunderbolt için IOMMU'yu etkinleştirip ATS'yi devre dışı bırakan mainline Linux (5.0 — bu hardening 4.21 olarak geliştirildi ama 4.21 sürümü yayımlanmadı, 5.0 olarak numaralandırıldı) ve Apple'ın code-pointer blinding'i (macOS 10.12.4) yer alır.