Skip to content

SLAM

SLAM (VUSec, S&P 2024) — "Spectre based on Linear Address Masking" — yaklaşan address-ignore özelliklerini (Intel LAM, AMD UAI, Arm TBI) suistimal ederek aksi halde exploit edilemez "unmasked" Spectre gadget'larını exploit eder ve bir TLB Evict+Reload kanalı üzerinden sızdırır.

Mechanism

Klasik Spectre mitigation'ları, işe yarar bir disclosure gadget'ının bir secret'ı kullanmadan önce birkaç bite kadar mask'lemesi gerektiğini varsayar (örn. array[secret & 0xff]), çünkü geçerli bir pointer olarak yalnızca küçük, attacker-kontrollü bir index erişilebilir. SLAM şunu gözlemler: address-masking CPU özellikleri tam da bu kısıtlamayı kaldırır: Linear Address Masking (Intel LAM), Upper Address Ignore (AMD UAI) ve Top-Byte Ignore (Arm TBI), CPU'ya translation'dan önce üst pointer bit'lerini yok saymasını söyler ve canonicality kontrollerini gevşetir; böylece üst byte'larında high-entropy secret bit'leri taşıyan bir pointer yine de dereference edilir.

Note

SLAM'in kırdığı invariant şu: doğrudan pointer olarak kullanılan bir secret (**secret, "unmasked" bir gadget) önceden bir non-gadget'tı, çünkü ortaya çıkan noncanonical address, herhangi bir cache/TLB footprint oluşmadan önce fault verirdi. LAM/UAI/TBI etkinken bu üst bit'ler donanım tarafından maskelenir, dereference transient execution sırasında başarılı olur ve secret artık hangi translation'ın gerçekleşeceğini etkiler. SLAM bunu, branch predictor'ı mistrain edip gadget'a ulaşmak için BHI (Branch History Injection) Spectre varyantıyla eşleştirir. Sızıntı bir data-cache kanalı üzerinden değil, 4 KB entry'ler ve bir L1-vs-L2 hit ayrımı kullanan TLB: bir Evict+Reload covert channel üzerinden okunur; bu da SMAP'i atlatır ve düşük gürültülü bir sinyal verir. VUSec'in gadget scanner'ı Linux kernel'inde "tens of thousands" unmasked gadget buldu, "at least hundreds practically exploitable" — masked olanların aksine, deploy edilmiş Spectre mitigation'larından kaçan gadget'lar.

Walkthrough

SLAM uçtan uca bir transient-execution exploit'idir; aşağıdaki adımlar kavramsal pipeline'dır (somut kod için makaleye/PoC'ye bakın).

  1. Bir unmasked gadget bul. Target'ı (örn. Linux kernel) attacker-etkili, secret taşıyan pointer'ları üst bit'leri mask'lemeden dereference eden kod için tara.
  2. Speculatively ona ulaş (BHI). Branch history'yi mistrain et ki victim, gadget'ı out-of-bounds / attacker-seçimi bir path üzerinde transiently yürütsün.
  3. Masking altında dereference et. LAM/UAI/TBI aktifken noncanonical, secret taşıyan pointer transiently kabul edilir — üst bit'ler yok sayılır, translation devam eder ve bir TLB entry secret'ın bir fonksiyonu olarak dokunulur.
  4. TLB Evict+Reload ile oku. İlgili TLB set'ini önceden evict et, transient erişimin bir entry kurmasını bırak, sonra hangi 4 KB page'in translate olduğunu (L1 TLB hit vs. L2 TLB hit) görmek için time-probe yap ve secret bit'lerini timing-tabanlı recovery yöntemleriyle — paper'ın "just-in-time reload" (transient pencerenin bittiği anda hizalanan reload adımı) ve "sliding" (probe penceresini secret pozisyonu boyunca kaydırma) teknikleri (bkz. SLAM paper) — kurtar.
  5. Tekrarla ve yeniden kur. Disclosure primitive'ini iterate etmek tam secret'ları yeniden inşa eder; VUSec, emülasyonlu-LAM bir Ubuntu sisteminde kernel belleğinden root password hash'ini kabaca yarım dakikada sızdırmayı gösterdi (ve uçtan uca "within minutes").
Bir unmasked gadget'ın LAM altında neden exploit edilebilir hale geldiği

// Classic MASKED gadget — index is bounded, low entropy, mitigations cope:
char leak = probe[(secret & 0xFF) * 4096];

// UNMASKED gadget — secret used directly as a pointer:
char *p   = (char *) secret;   // upper bytes carry high-entropy secret bits
char leak = *p;                // pre-LAM: noncanonical -> faults, no footprint
                               // with LAM/UAI/TBI: upper bits ignored ->
                               //                    dereference SUCCEEDS,
                               //                    secret-dependent TLB fill
SLAM sonra hangi translation'ın gerçekleştiğini bir data-cache Flush+Reload yerine bir TLB Evict+Reload timing testiyle çözer; SMAP sınırı boyunca çalışmasını sağlayan şey budur. Spectre ile ve Spectre-BTB'deki BHI/branch-history vektörüyle karşılaştır.

Detection

SLAM bir transient-execution saldırısıdır ve victim'de architectural iz bırakmaz. Pratik "tespit" yüzeyi gadget envanteridir: VUSec'in scanner'ı unmasked dereference gadget'larını sıralar; böylece kernel/kod tabanı bakımcıları, address masking geldiğinde exploit edilebilir hale gelen pattern'leri bulup etkisizleştirebilir.

Mitigation

Warning

SLAM, en tehlikeli olduğu yer LAM/UAI taşıyan gelecekteki CPU'lardır; mevcut bazı AMD parçaları zaten etkilenmiştir (CVE-2020-12965 altında izlenir). Vulnerable bir core'da bir address-masking özelliğini etkinleştirmek attack surface ekler.

  • Intel: LAM'i, masked-ama-untrusted address'lerin sessizce translate edilmemesi için LASS (Linear Address Space Separation) rehberliğiyle birlikte deploy etmeyi planlar.
  • Linux: daha fazla rehberlik gelene dek varsayılan olarak LAM'i devre dışı bırakmak için yamalandı.
  • Arm: TBI için TLB tabanlı side-channel savunmaları üzerine bir advisory yayımladı.
  • AMD: kullanıcıları mevcut Spectre v2 mitigation'larına yönlendirir.
  • Software: unmasked gadget'ları ortadan kaldır (secret-türevli pointer'ları dereference'tan önce mask'le ya da canonicality-kontrol et) ki LAM gevşemesi bir disclosure primitive'ine dönüştürülemesin.

References