Systematic Ciphertext Side Channels on SEV-SNP (CVE-2021-46744, AMD-SB-1033)¶
AMD SEV(-SNP)'deki deterministic memory encryption, privileged bir host'un sabit guest physical address'lerinde ciphertext değişikliklerini gözlemlemesine ve SNP integrity protection olsa bile secret-dependent plaintext'i çıkarsamasına izin verir.
Mechanism¶
Bug class / invariant
AMD SEV, guest memory'yi tweakable, address-dependent ama deterministic bir mode ile encrypt eder (tweak, bir nonce/counter'dan değil, physical address'ten türetilir). Amaçlanan invariant confidentiality'dir: host, guest plaintext'i hakkında hiçbir şey öğrenmemeli. Kusur şu: determinism, aynı physical address'teki aynı plaintext'in her zaman aynı ciphertext'i ürettiği anlamına gelir. Bir guest'in encrypted DRAM page'lerini meşru olarak okuyabilen malicious bir hypervisor, bu nedenle bir ciphertext-to-value sözlüğü kurabilir ve ciphertext geçişleri için sabit bir konumu izleyebilir. SEV-SNP, integrity (anti-rollback / write protection) ekler ama cipher'a freshness eklemez, bu yüzden read-side ciphertext channel'ı kalır. Secret-dependent değerler (örneğin ara crypto state'i, register spill'leri) gözlemlenebilir address'lere indiğinde host onları kurtarır.
Walkthrough¶
S&P 2022 paper'ı ve AMD-SB-1033'ten üst düzey (mitigation'lar yayınlanmış):
- Malicious host, victim guest'in encrypted page'lerini map'ler ve periyodik olarak okur (SEV'in model'inin host'a verdiği bir yetenek).
- Secret-dependent plaintext'in saklandığı ya da spill edildiği address'leri belirler (constant-time kod yeterli değildir — değerler hâlâ farklıdır).
- Ciphertext blok'larını bilinen/zorlanan plaintext ile korele ederek (sözlük inşası) ya da collision'ları/geçişleri gözlemleyerek plaintext byte'larını çıkarsar.
- Bir hesaplama boyunca (örneğin bir signature) tekrarlanan gözlem, key'leri yeniden inşa etmeye yetecek kadar secret-dependent state leak eder.
Constant-time'ın neden yeterli olmadığı
Constant-time kod, timing ve access-pattern varyasyonunu kaldırır, ama data değerleri hâlâ farklıdır ve deterministik olarak encrypt edilir, bu yüzden ciphertext'in kendisi side channel haline gelir.
Detection¶
- Guest'in içinden bu channel esasen görünmezdir; detection, runtime telemetry'si yerine platform/operatör trust model'ine odaklanır.
- Host/hypervisor stack'ini audit et ve attest et — attack, malicious ya da compromise olmuş bir host varsayar. Beklenen firmware/TCB sürümünün kullanıldığını teyit etmek için SNP attestation'ı kullan.
- Guest'e ait encrypted page'lerin beklenmedik, tekrarlanan read'lerini yapan hypervisor bileşenlerini izle.
Mitigation¶
- AMD'nin developer rehberini izle (AMD-SB-1033 white paper): secret-dependent değerleri sabit, host-observable address'lere yerleştirmekten kaçınan ciphertext-side-channel-resistant kod yaz (örneğin secret storage'ı randomize/refresh et, uzun ömürlü secret-dependent memory residency'sinden kaçın).
- SEV-SNP firmware/TCB'sini güncel tut; AMD'nin sorun için ship ettiği CPU/firmware update'lerini uygula.
- Architectural olarak bu, sonraki platform'larda memory encryption'da nonce/freshness'e doğru hareketleri motive etti — confidential workload'lar için tamamen deterministic encryption kullanmayan hardware'i tercih et.