Evict+Reload¶
Shared-line state'ini sıfırlamak için
clflushyerine 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
clflushkullanı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:
- Shared line'ı evict et (eviction set'e eriş).
- Victim çalışırken bekle.
- 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)
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.