Skip to content

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.

  1. 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
}
  1. 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.

  2. Key'i yeniden inşa et: birçok decryption üzerinde geri kazanılan offset/bank dizisinden.

Expected results (Yarom, Genkin, Heninger)
Target:    OpenSSL 1.0.2f scatter-gather constant-time RSA
Flaw:      secret-dependent cache-BANK (not line) access
uarch:     Sandy Bridge (tested Intel Xeon E5-2430)
Result:    full 4096-bit RSA key after observing ~16,000 decryptions
Sharing:   attacker on sibling hyperthread sharing L1D

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.

References