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)
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.