Skip to content

Evict+Reload

Shared-line state'ini sıfırlamak için clflush yerine cache eviction kullanan bir Flush+Reload varyantı — flush instruction'ının mevcut olmadığı veya kısıtlandığı yerlerde (örn. ARM, JavaScript) saldırıya imkân verir.

Mechanism

Neden çalışır

Evict+Reload, Flush+Reload'un invariant'ını paylaşır: bir shared line'ın cache state'i, bir victim'in erişiminin gözlemlenebilir bir yan etkisidir. Tek fark, attacker'ın line'ı nasıl sıfırladığıdır:

  • Flush+Reload, seçilen bir shared line'ı tüm hierarchy'den evict etmek için clflush kullanır.
  • Evict+Reload ise target line'ı contention ile evict eder — aynı cache set'e map'lenen başka adreslerden oluşan bir eviction set'e erişip target'ı dışarı iter (bkz. eviction set construction).

Üç adım sonra Flush+Reload'u yansıtır:

  1. Shared line'ı evict et (eviction set'e eriş).
  2. Victim çalışırken bekle.
  3. Shared line'ı reload et ve time'la — hızlı ise victim onu re-fetch etti (dokundu), yavaş ise hâlâ uncached'dir.

Bu önemlidir çünkü hiçbir flush instruction'ı gerekmez: unprivileged bir flush'ı olmayan mimarilerde (özellikle ARMageddon çalışmasındaki ARMv7/ARMv8) ve clflush'ın mevcut olmadığı JavaScript'te çalışır.

Walkthrough

Attacker'ın, victim ile bir shared mapping'e ve target line'ın set'i için bir eviction set'e ihtiyacı vardır:

// Conceptual Evict+Reload round on a shared line `target`.
void evict_set(void **es, size_t n) {     // n addresses in target's cache set
    for (size_t i = 0; i < n; i++) (void)*(volatile char *)es[i];
}

uint64_t probe(volatile char *target, void **es, size_t n) {
    evict_set(es, n);                 // step 1: evict target by contention
    nanosleep(&slot, NULL);           // step 2: let the victim run
    uint64_t t0 = rdtscp();
    (void)*target;                    // step 3: reload + time
    return rdtscp() - t0;             // fast => victim accessed target
}

Doğru, minimal bir eviction set kurmak zor kısımdır; bir kez kalibre edildikten sonra hit/miss ayrımı Flush+Reload ile aynıdır.

Beklenen reload timing'i (kavramsal)
victim touched line  : ~80  cycles  (cache hit)
victim idle          : ~250 cycles  (DRAM)
threshold = valley between the peaks

Mitigation

  • Flush+Reload ile aynı: constant-time kod, secret'a bağlı memory erişimi olmaması ve cross-boundary page sharing'i (KSM / dedup) devre dışı bırakmak.
  • Cache partitioning / coloring, eviction set kurma maliyetini yükseltir.

References