CacheBleed¶
Cache-bank conflict'lerini (cache-line-altı granülerlik) exploit eden bir timing attack; OpenSSL'in "constant-time" scatter-gather RSA'sını kırar ve private key'i geri kazanır — yalnızca cache-line access'lerini eşitleyen bir savunmayı yener.
Mechanism¶
Note
Cache attack'lara karşı constant-time crypto savunmaları, secret'a bağlı data'nın hangi cache line'a access edildiğini asla değiştirmemesini sağlar — scatter-gather tekniği table entry'lerini interleave eder, böylece her secret değer aynı line kümesine dokunur. CacheBleed bunun yetersiz olduğunu gösterir: Sandy Bridge gibi microarchitecture'larda L1 data cache cache bank'lere bölünmüştür ve aynı cycle'da aynı bank'e isabet eden iki load serialize olur (bir bank conflict), latency ekler. Değişmez nokta şu: scatter-gather'ın secret'a bağlı line access'i yoktur, ama secret'a bağlı line-içi offset access'leri vardır — ve offset bank'i seçer. Belirli bank'lerle conflict eden load'lar yayınlayıp onları timing'leyerek attacker, victim'in hangi bank'e (yani hangi low-order address bit'lerine) access ettiğini öğrenir; böylece her access "aynı" cache line'ı kullanmış olsa da secret'a bağlı offset'leri — ve dolayısıyla RSA exponent'ini — geri kazanır.
Walkthrough¶
Attacker, victim RSA process'i ile L1 cache'i paylaşan bir sibling hyperthread üzerinde çalışır ve victim decryption'larını tekrar tekrar tetikler.
- Bank contention üret. Victim hesaplama yaparken seçilmiş bir bank'e load'lar yağdır; load'larının ne kadar sürdüğünü ölç:
// Repeatedly load addresses that map to a target L1 cache bank and time them.
// When attacker and victim loads hit the SAME bank concurrently they conflict => extra latency.
static inline uint64_t probe_bank(char *addr_in_bank, int reps) {
uint64_t t0 = rdtscp_serialize();
for (int i = 0; i < reps; i++)
asm volatile("mov (%0), %%eax\n" :: "r"(addr_in_bank) : "eax");
uint64_t t1 = rdtscp_serialize();
return t1 - t0; // higher => victim used this bank
}
-
Bank başına, victim'in exponentiation window'larıyla korele et; bank kullanım pattern'i scatter-gather'daki secret'a bağlı offset'leri açığa çıkarır.
-
Key'i yeniden inşa et: birçok decryption üzerinde geri kazanılan offset/bank dizisinden.
Expected results (Yarom, Genkin, Heninger)
Detection¶
Patolojik bank-conflicting load pattern'leri yayınlayan bir sibling thread'i izle; L1 bank conflict'leri / load latency anomalileri üzerinde performance counter'lar.
Mitigation¶
OpenSSL'in düzeltmesi sub-line secret'a bağlı access'i kaldırdı (bank'ten bağımsız constant-time exponent window'ları); hassas crypto için SMT'yi devre dışı bırak; untrusted tenant'larla co-residency'den kaçın; data-independent (bank'siz) table access.