Skip to content

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ış):

  1. Malicious host, victim guest'in encrypted page'lerini map'ler ve periyodik olarak okur (SEV'in model'inin host'a verdiği bir yetenek).
  2. 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).
  3. 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.
  4. 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.

References