Skip to content

DRAMA (DRAM Addressing side channel)

Cross-CPU bir covert channel ve shared-memory gerektirmeyen bir side channel kurmak için paylaşılan, bank başına DRAM row buffer'ını kullan; row hit'ler ile row conflict'leri time'la.

Mechanism

Neden çalışır

Her DRAM bank'ının, en son activate edilen row'u cache'leyen tek bir row buffer'ı vardır. Row'u zaten açık olan bir adrese erişmek (row hit) hızlıdır; aynı bank'ta farklı bir row'a erişmek (row conflict) bir precharge + activate zorlar ve ölçülebilir şekilde daha yavaştır. Row buffer, o bank'a map'lenen her CPU ve core tarafından paylaşılır — cache hierarchy'sinin altında oturur, dolayısıyla channel fiziksel CPU'lar boyunca ve herhangi bir shared memory olmadan çalışır.

Leak/transmit/decode invariant'ı:

  • Aynı bank'a ama farklı row'lara map'lenen iki adres row buffer üzerinde alias yapar. Bir sender bir row'u tekrar tekrar activate eder; bir receiver o bank'taki farklı bir row'a kendi erişimini time'lar ve sender aktifken row conflict'leri (yavaş) görür — bu bir covert channel'dır — ya da victim'in erişim pattern'ını çıkarsar — bu da bir side channel'dır.
  • Bunlardan birini kurmak, DRAM address mapping'i bilmeyi gerektirir (hangi physical-address bit'lerinin channel/rank/bank/row seçtiğini). DRAMA, same-bank conflict set'lerini bulmak için physical address çiftlerini time'layarak o belgelenmemiş mapping'i reverse-engineer eder (bkz. DRAM bank/row addressing reverse-engineering).

Walkthrough

Çekirdek primitive bir row-conflict timer'ıdır. İki physical address verildiğinde, bir bank'ı paylaşıp farklı row'lara düşüyorlarsa tekrarlı dönüşümlü erişim yavaştır:

// Conceptual: classify an address pair as same-bank-different-row
static inline uint64_t conflict_time(volatile char *a, volatile char *b) {
    uint64_t t0 = rdtscp();
    *a; *b; *a; *b;          // alternate -> forces activate if different rows
    clflush((void*)a); clflush((void*)b);  // keep them out of cache
    return rdtscp() - t0;
}
// High latency  => same bank, different rows (a conflict set member)
// Low  latency  => different bank (parallel) or same row

Çok sayıda physical address'i süpürmek (/proc/PID/pagemap ya da huge page'ler üzerinden çözümlenen) onları bank'lara kümeler; farklılaşan address bit'leri addressing fonksiyonlarını ortaya çıkarır. Bir cross-CPU covert channel sonra row activation'larını modüle eder.

Beklenen timing ayrımı (kavramsal)
same-bank/diff-row (conflict):  ~330 cycles
different bank (no conflict):   ~230 cycles
threshold chosen at the valley between the two peaks

Mitigation

  • Mapping hardware tarafından tanımlanır ve devre dışı bırakılamaz, ama DRAM bank'larını tenant'lar arasında partition'lamak (bank-aware allocation) cross-tenant aliasing'i sınırlar.
  • Sandbox'larda high-resolution timer'ları kabalaştırmak veya kaldırmak çözünürlüğü düşürür.

References