Rowhammer¶
Bir DRAM row'unu tekrar tekrar activate etmek, fiziksel olarak adjacent row'lara charge sızdırır; attacker'ın hiç access etmediği bit'leri flip'ler ve memory isolation'ı kırar.
Mechanism¶
Note
DRAM her bit'i bir capacitor içinde charge olarak saklar; bir row'u okumak onu activate etmeyi gerektirir (row buffer'a sense-amplify). Bir row'u activate etmek, fiziksel olarak komşu row'lardaki charge'ı bozar. Her cell yalnızca periyodik olarak refresh edilir (standart DDR refresh window'u ~64 ms'dir). Bir attacker bir aggressor row'u tek bir refresh interval'i içinde on binlerce kez activate edebilirse, komşu bir victim row'da biriken bozulma, bir veya daha fazla bit'ini flip'lemeye yetecek kadar charge sızdırır — attacker victim'i hiç okumamış veya yazmamış olsa bile. Bu, address edemediğiniz bellek modify edilemez varsayımını ihlal eder ve fault attack'ler ailesinin tamamının kökenidir.
Orijinal çalışma (Kim et al., ISCA 2014), bir refresh interval'i içinde ~139,000 activation'ın vulnerable modüllerde flip indüklemeye yettiğini ve üç büyük vendor'dan test edilen DDR3 modüllerinin %80'inden fazlasının susceptible olduğunu gösterdi.
Bu not temel DRAM disturbance bug'ını ve native (clflush-tabanlı) hammering'i
kapsar. clflush olmadan, yalnızca cache-eviction set'leriyle çalışan remote/JS
varyantı için Rowhammer.js'e; bug'ı memory corruption yerine bir
device-tracking imzasına çeviren uygulama için FP-Rowhammer'a bak.
Walkthrough¶
Klasik native hammering, her iteration'da iki aggressor adresi okur ve onları cache'ten flush eder, böylece her read DRAM'e ulaşır (cache'lenmiş bir read row'u asla re-activate etmezdi):
hammer:
mov (%rax), %r10 ; read aggressor row A
mov (%rbx), %r11 ; read aggressor row B
clflush (%rax) ; evict A from cache
clflush (%rbx) ; evict B from cache
mfence ; order the flushes before next read
jmp hammer
Bozulmanın seçilen bir victim'e düşmesi için, her iki aggressor da victim ile
aynı bank'te ama farklı row'larda bulunmalıdır; bu da DRAM address mapping ve
physical address bilgisini gerektirir (ör. /proc/self/pagemap ya da huge page'ler
üzerinden). Victim'i iki aggressor arasına sıkıştırmak (double-sided), tek bir
tarafı hammer'lamaya kıyasla flip yield'ini büyük ölçüde artırır.
Profiling output'u (conceptual)
Bir templating geçişi, her reproducible flip'i bir offset + direction olarak kaydeder:
Detection¶
DRAM activation rate'lerini açığa çıkaran hardware performance counter'ları ya da ECC-correctable-error storm'ları hammering'i ortaya çıkarabilir. Memory-controller mitigation'ları (TRR, PARA — probabilistic adjacent-row activation, PRAC — per-row activation counting, JEDEC DDR5) şüpheli activation pattern'lerini log'lar veya rate-limit eder.
Mitigation¶
- ECC single-bit flip'leri düzeltir (ama multi-bit flip'ler ve ECC-aware attack'ler bunu bypass eder).
- Artırılmış refresh rate (2x) window'u küçültür — yalnızca kısmi bir fix.
- Target Row Refresh (TRR) / PARA (probabilistic adjacent-row activation) muhtemel victim row'ları refresh eder; birçok TRR implementasyonu sonradan many-sided pattern'lerle bypass edildi.