Skip to content

Inclusive LLC Cross-Core Eviction

Intel last-level cache'inin inclusion özelliğini kötüye kullan: shared LLC'den bir line'ı evict etmek, onu başka bir core'un private L1/L2'sinden de evict etmeye zorlar — shared memory olmadan Prime+Probe ve Evict+Reload için cross-core bir eviction primitive'i verir.

Mechanism

Inclusion, shared LLC'yi private cache'ler üzerinde bir kaldıraca çevirir

Geleneksel Intel CPU'larda LLC inclusive'dir: herhangi bir core'un private L1/L2'sinde bulunan her line, shared LLC'de de bulunmak zorundadır. Bunun doğrudan sonucu şu: bir line LLC'den evict edildiğinde, cache coherence mantığı inclusion'ı korumak için onu tüm core'ların private cache'lerinden de evict etmek zorundadır. Yani core X'teki bir attacker LLC'den bir adresi evict ederse, onu core Y'nin L1/L2'sinden de evict etmiş olur.

Bu, core'lar LLC dışında hiçbir şey paylaşmasa bile cross-core bir side channel verir. Bir victim line'ı evict etmek için attacker bir eviction set kurar — aynı LLC set/slice'ına map'lenen, onun associativity'sini taşıracak kadar adres — ve ona erişir (Prime). Victim'in sonraki erişimi miss eder ve yavaştır (Probe), bu da victim'in o set'e dokunduğunu açığa çıkarır. Flush+Reload'un aksine bu, shared memory ve clflush gerektirmez.

Bu, Prime+Probe'in altındaki cross-core temeldir; kendisi de temel set-associative cache eviction primitive'ine, eviction-set construction'a ve çoğu zaman da cache slice-selection reverse engineering'e bağlıdır.

Walkthrough

1. Hedef set/slice için bir LLC eviction set kur. Aynı LLC set'inde (sliced LLC'lerde slice'ında) çakışan adresleri bul.

eviction_set = addresses congruent in LLC set S (and slice)
size >= LLC associativity   (so priming overflows the set)

2. Prime. Attacker core'undan eviction set'e erişip set S'i doldur; S'teki her victim line'ı LLC'den — ve inclusion sayesinde victim core'un private cache'lerinden — çıkar.

for (a in eviction_set) load(a);   // prime set S, evict victim line cross-core

3. Probe. Victim çalıştıktan sonra eviction set'e yeniden erişimi süre tut; yavaş bir erişim, victim'in line'ını S'e geri getirdiği (bir erişim olduğu) anlamına gelir.

t0 = rdtsc(); for (a in eviction_set) load(a); t = rdtsc()-t0;
// t high  -> victim accessed an address in S
Cross-core burada neden çalışır
attacker (core X) evicts addr from LLC
inclusion  -> addr also evicted from victim core Y's L1/L2
victim (core Y) re-accesses addr -> LLC miss -> observable latency

Non-inclusive cache'ler oyunu değiştirir

Daha yeni server microarchitecture'ları (ör. Skylake-SP ve sonrası) non-inclusive LLC kullanır; burada LLC eviction private-cache eviction'ı garanti etmez. Orada attacker bunun yerine snoop filter / coherence directory'sini hedeflemek zorundadır (bkz. Directory Attack).

Mitigation

  • Non-inclusive / directory-based LLC'ler temel inclusion primitive'ini körelir.
  • Cache partitioning (Intel CAT) veya page coloring (cache-coloring): güvenlik domain'lerini LLC'de izole etmek için.
  • Constant-time kod, böylece victim cache footprint'leri secret'tan bağımsız olur.

References