Skip to content

Row-buffer conflict timing

Bir DRAM row-buffer hit'ini bir row conflict'ten access latency üzerinden ayırt etmek; bu da cross-CPU bir timing channel ve DRAM addressing reverse-engineering için bir building block sağlar.

Mechanism

Note

Her DRAM bank'inin, o an açık olan row'u tutan, one-entry direct-mapped bir cache gibi davranan tek bir row buffer'ı vardır. Açık row'a yapılan bir request (row hit) doğrudan servis edilir ve hızlıdır. Aynı bank'teki farklı bir row'a yapılan bir request (row conflict) ise önce açık row'u precharge etmek (kapatmak), sonra yenisini row-activate etmek zorunda kalır ki bu belirgin biçimde daha yavaştır. Row buffer core'lar ve socket'ler arasında bile paylaşıldığı için, access'leri bir victim'in aynı bank'teki access'leriyle conflict eden bir attacker — sabit hit-vs-conflict latency farkından — victim'in o bank/row'a dokunduğunu anlayabilir. Aynı latency farkı, hangi physical address'lerin aynı bank'e map'lendiğini açığa çıkarır; DRAM addressing function'ları da bu şekilde reverse-engineer edilir.

Walkthrough

Attacker iki adresi cache'ten flush eder (böylece access'ler DRAM'e ulaşır) ve ikinci access'i time'lar; yüksek bir latency, iki adresin aynı bank'te ama farklı row'larda olduğunu gösterir (bir row conflict):

clflush(a); clflush(b);
mfence();
*(volatile char *)a;                 // opens a's row
t0 = rdtsc();
*(volatile char *)b;                 // row hit if same row; conflict if same bank/diff row
t1 = rdtsc();
// large (t1 - t0)  => row conflict (same bank, different row)

Üç durum şudur: farklı bank'ler (bağımsız, hızlı); aynı bank ve aynı row (row hit, hızlı); aynı bank, farklı row'lar (row conflict, yavaş, çünkü her access diğerinin row'unu kapatır).

Raporlanan ölçümler (DRAMA)
  • Access-time histogram'ına göre, row hit'ler kabaca 180–216 cycle band'inde gerçekleşir, row conflict'ler ise daha yüksek latency'dedir.
  • Shared memory olmadan ~2 Mbps'ye kadar cross-CPU covert channel.
  • DRAM addressing function'ları, physical-address bit'lerinin linear XOR'larıdır; tipik row size 8 KB (64-bit bus). Bunları recover etmek aynı zamanda pratik DDR4 Rowhammer'ı mümkün kılar.

Detection

İlgisiz bir process'ten gelen anormal, sürekli same-bank conflict timing'i gözle görülür belirtidir; pratikte bu channel'ları dedicated performance-counter monitoring olmadan tespit etmek zordur.

Mitigation

Closed-page memory-controller politikaları (her access'ten sonra precharge) timing farkının bir kısmını düzleştirir; bank'leri security domain'ler arasında partition'lamak, channel'ın bağlı olduğu paylaşılan row buffer'ı ortadan kaldırır.

References