Skip to content

CipherLeaks (CVE-2020-12966)

AMD SEV'e karşı bir ciphertext side channel'ı: guest memory physical address başına deterministik olarak encrypt edildiğinden, VMSA'nın ciphertext'ini okuyan privileged bir hypervisor register-state değişikliklerini infer edebilir ve constant-time RSA/ECDSA key'lerini geri kazanabilir.

Mechanism

Deterministik memory encryption register state'i neden sızdırır

AMD SEV (SEV-ES ve SEV-SNP dahil) guest DRAM'i XEX (XOR-Encrypt-XOR) modunda tweakable bir block cipher ile encrypt eder. 16-byte'lık bir block'un ciphertext'i c = ENC(m ⊕ T(Pm)) ⊕ T(Pm)'dir; burada tweak T(Pm) yalnızca block'un system physical address'i Pm'den türetilir — nonce ya da freshness yoktur. Sonuç olarak, "bir guest VM'in ömrü boyunca, aynı plaintext system physical address Pm'de her zaman aynı ciphertext'e sahip olur." Sızıntı, iki bağımsız olgunun birleşmesidir: (1) SEV, hypervisor'ın encrypt edilmiş guest belleğinin ciphertext'ine read-access yapmasını engellemez ve (2) her VMEXIT'te guest'in register file'ı encrypt edilip VMSA (Virtual Machine Save Area) page'ine depolanır. plaintext→ciphertext map'i adres başına sabit olduğundan, VMSA ciphertext'inin context switch'ler boyunca nasıl değiştiğini izlemek, altta yatan register plaintext'inin nasıl değiştiğini açığa çıkarır — guest'in CPU state'i üzerinde deterministik-encryption oracle'ı.

Walkthrough

Attack iki rejimde ilerler:

  1. Execution-state inference. Hypervisor, instruction pointer / kaydedilmiş register'lara karşılık gelen VMSA ciphertext block'larını izler. Tekrar eden ciphertext değerleri, guest'in ne zaman aynı function'a yeniden girdiğini ya da aynı control-flow noktasına ulaştığını işaretler; böylece adversary, hiçbir timing ölçümü olmadan çalışan function'ları konumlandırıp tanımlayabilir.

  2. Bir dictionary üzerinden plaintext recovery. Plaintext'i küçük, bilinen bir aralık alan bir register için, adversary her aday değer için VMSA ciphertext'ini gözleyerek bir ciphertext→plaintext dictionary'si inşa eder, sonra daha sonraki VMEXIT'lerde secret register içeriklerini okur.

Constant-time OpenSSL crypto'sunu kırma

Makale, klasik timing channel'lara bağışık olan constant-time implementation'lardan key'leri geri kazanır; çünkü sızıntı timing'de değil, değerdedir:

  • RSA: plaintext değerleri 0–31 için bir ciphertext dictionary'si kullanarak private exponent d'yi %100 doğrulukla geri kazanır.
  • ECDSA: plaintext değerleri 0 ve 1 için ciphertext kullanarak secret nonce k'yı %100 doğrulukla geri kazanır (adım başına tek bir sızan bit, k'yı ve dolayısıyla long-term key'i yeniden inşa etmeye yeter).

SEV altında constant-time yeterli değildir

CipherLeaks, constant-time kodu tam olarak şu nedenle yener: execution time'ı değil, deterministik ciphertext üzerinden register değerlerini gözler. Standart timing-side-channel hardening işe yaramaz.

Mitigation

  • CVE-2020-12966 / AMD-SB-1013. AMD'ye 10 Ağustos 2021'e kadar embargo ile açıklandı.
  • AMD'nin düzeltmesi VMSA register protection'dır (VMSA, hypervisor ciphertext okumalarına karşı integrity/confidentiality korumalıdır); SEV-SNP'li 3. Nesil EPYC'te mevcuttur.
  • Genel guest data page'leri üzerindeki daha geniş ciphertext side channel'ı (adres başına deterministik encryption) tek başına VMSA protection ile tamamen kapatılmaz; takip eden çalışmalar (örn. SEV-SNP üzerinde systematic ciphertext side channel'lar) ve software tarafı savunmalar kalan açığı ele alır.

References