Skip to content

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.

  1. 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.
  2. 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.
  3. Functional-NIC modu: e1000e modelini çalıştır ki driver IOMMU pencereleri açsın (mbuf/skbuff ring'leri); meşru görünmek için makul DHCP/DNS trafiği yay.
  4. Spatial exploit: aynı 4 KiB sayfayı paylaşan birlikte yerleşik veriyi oku (VPN cleartext, kernel tabloları).
  5. 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.
  6. Control-flow hijack: açığa çıkmış bir kernel function pointer'ının (mbuf free handler ya da bir tcpip.sys pointer'ı) üzerine yazıp yürütmeyi yönlendir.
  7. 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 mbuf free-function pointer'ının üzerine yazarak root shell aldı (her mbuf = 256 byte).
  • Linux (Fedora 25 / kernel 4.8): 2 KiB'lık bir skbuff ile bir sayfayı paylaşan nf_nat dispatch 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.sys pointer'ının üzerine KeBugCheckEx yazdı (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.

References