Skip to content

CrossLine (AMD SEV)

Kötü niyetli bir hypervisor, kendi VM'ini victim'in ASID'iyle yeniden etiketler ve beklenen crash'ten hemen önce kısa süre çalışır; victim'in encryption key'ini kullanarak encrypted memory'yi decrypt eder veya üzerinde işlem yapar — SEV'in "security-by-crash" isolation'ını kırar.

Mechanism

AMD SEV her guest'in memory'sini, AMD Secure Processor'ın (AMD-SP) Address Space Identifier (ASID) ile seçtiği bir VM Encryption Key (VEK) altında şifreler. ASID ayrıca cache line'ları ve TLB entry'lerini de etiketler. SEV'in tasarımı, hypervisor bir VM'i yanlış ASID altında çalıştırırsa ilk instruction fetch'in çöpe decrypt olacağını ve VM'in anında triple-fault'layacağını varsayıyordu — "security by crash". Ama hypervisor ASID atamasını, VMCB'yi ve nested page table'ları (NPT) kontrol eder.

Note

SEV, ASID'i memory hierarchy boyunca tek access-control token'ı olarak kullanır, ama çalışan bir VM'in ASID'ine hak sahibi olduğunu hiçbir zaman doğrulamaz. CrossLine, triple fault'tan önceki kısa, tamamen attacker'ın kontrolündeki execution window'unu kullanır: attacker kendi VM'ini başlatır, VMCB ASID field'ını victim'in ASID'iyle değiştirir, tam olarak bir kontrollü eylem çalışacak şekilde NPT ve nRIP'i ayarlar ve resume eder. Bu tek eylem artık victim'in VEK'i altında çalışır. SEV'in bel bağladığı invariant — "yanlış ASID ⇒ anında işe yaramaz crash" — yanlıştır, çünkü crash'ten önce bir instruction'lık doğru, victim-key'li execution sızar ve bu tekrarlanıp yönlendirilebilir.

Walkthrough

Ortak kurulum, ardından iki varyant.

  1. Attacker VM'ini başlat kendi ASID'iyle.
  2. VMEXIT'te, VMCB ASID field'ını victim'in ASID'iyle yeniden etiketle.
  3. Execution'ı şekillendir NPT entry'leri ve nRIP üzerinden, böylece yalnızca kontrollü bir fetch/instruction çalışsın.
  4. VMRUN yap ve VM fault'lamadan önce exit'ten sonucu yakala.
CrossLine V1 — page-table walk ile decrypt

Hiçbir victim instruction'ı çalıştırılmaz; decryption'ı hardware page-table walker yapar.

  • Bir nested page fault zorlanması için attacker'ın NPT'sindeki Present bit'lerini temizle.
  • Attacker'ın gCR3'ünü victim'in hedef page'ine yeniden map'le; walk'ın hangi 8-byte block'u yükleyeceğini seçmek için nRIP bit 47-39'u kullan.
  • ASID'i victim'inkine geçir, resume et. Walk hedef block'u victim'in VEK'i altında decrypt eder ve decrypt edilmiş değer EXITINFO2'de faulting address olarak yüzeye çıkar.
  • Kısıt: geri çıkarılan data geçerli bir PTE gibi görünmelidir (Present=1, reserved bit'ler temiz). Page table'lar her zaman uygundur; makale, uygulama binary byte'larının ~%1–6.5'inin bu formatı sağladığını tahmin eder.
  • Hız: SEV'de 4 KB page başına ~39.58 ms; optimizasyon sonrası SEV-ES'te 8-byte block başına ~2.0 ms.
CrossLine V2 — bir victim instruction çalıştırarak encryption/decryption oracle

Keyfi plaintext okumak/yazmak için V1'in üzerine kurulur.

  • Victim'in page table'larını geri çıkarmak ve bir mov (%reg1),%reg2 load'unu (veya encryption oracle için bir store'u) bulmak için V1'i kullan.
  • Victim'in gCR3'ünü, dört page-table seviyesini ve instruction page'ini attacker NPT'sine map'le; nRIP'i instruction'a ayarla ve reg1'i hedef address'e yönlendir.
  • Resume: instruction victim plaintext'ini reg2'ye yükler, VMEXIT'te açığa çıkar. 8-byte block başına tekrarla (4 KB decrypt başına ~113.6 ms; ~104.8 ms encrypt).

Warning

Bir AMD EPYC 7251 üzerinde gösterildi. SEV-ES'te V1 hâlâ çalışır (victim'in VMSA'sını yeniden kullanarak), ama V2 engellenir çünkü RIP integrity-protected, encrypted VMSA içinde yaşar. SEV-SNP'de, Reverse Map Table (RMP) ownership check'i V1'i bir yan etki olarak önler.

Detection

CrossLine victim'le hiçbir I/O gerektirmez ve victim duraklatılmış veya kapatılmış olsa bile çalışır, dolayısıyla victim bunu gözleyemez. SEV-ES'te attacker yalnızca CR2'yi bozar ve takip eden bir nested page fault ile izlerini temizleyebilir — temiz bir in-guest tespit sinyali yoktur.

Mitigation

  • SEV-SNP: Reverse Map Table page ownership'i zorlar ve V1 page-table-walk primitive'ini etkisiz kılar.
  • AMD'ye bildirilen root cause'lar: eksik ASID authentication, triple-fault raporlamasının olmaması ve VMCB yerine yalnızca bir physical address'e bağlı bir VMSA integrity check'i.

References