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:
-
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.
-
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.