Skip to content

Knock-Knock

Bir sistemin belgelenmemiş physical-to-DRAM address mapping'ini, GF(2) üzerinde linear bir fonksiyon olarak modelleyip row-buffer-conflict timing'inden bank-mask basis'ini polynomial time'da çözerek black-box, platform-agnostic biçimde geri kazanma.

Mechanism

DRAM address scrambling'i GF(2) üzerinde linear'dır — o hâlde tersini al

Modern SoC'ler, physical address'leri DRAM'e (channel/rank/bank/row) belgelenmemiş linear address fonksiyonları kullanarak scramble eder. Knock-Knock'ın içgörüsü şudur: bu fonksiyonlar GF(2) sonlu cismi üzerinde linear olduğundan (her bank-seçen bit, physical-address bit'lerinin bir XOR'udur), tüm mapping bir matris problemi olarak ifade edilebilir. Hangi physical address çiftlerinin aynı bank'e düştüğünü gözlemleyebilirsen, bir constraint matris kurup onun nullspace'ini hesaplayarak bank-mask basis'i — bank addressing'i tanımlayan XOR mask'ler kümesini — eski özel yöntemlerin kullandığı exponential arama yerine polynomial time'da geri kazanabilirsin.

"Aynı bank mı?" gözlemi row-buffer conflict timing'inden gelir: aynı bank'te ama farklı row'lardaki iki address, row-buffer'ı açma/kapama/yeniden açmaya zorlar, dolayısıyla bunlara sırayla erişmek farklı bank'lerdeki address'lere göre ölçülebilir biçimde daha yavaştır. Bu timing parmak izi gereken tek sinyaldir — datasheet yok, debug interface yok — ki bu da onu black-box ve platform-agnostic yapan şeydir.

Bu, row-buffer conflict timing üzerine kurulu, DRAM bank/row addressing reverse-engineering'in titiz bir formalleştirmesidir ve herhangi bir aynı-bank saldırısını (double-sided / many-sided Rowhammer, DRAMA kanalları) besler.

Walkthrough

1. Veri üretimi (hedef üzerinde). Hangi çiftlerin aynı bank'te conflict oluşturduğunu etiketlemek için çok sayıda physical-address çifti arasında alternatif erişimleri zamanla.

for pairs (p_i, p_j):
    t = time_alternating_access(p_i, p_j)
    label conflict if t > threshold   # row-buffer conflict -> same bank
build matrix M of physical-address vectors + conflict labels

2. Tersine çevirme (offline). GF(2) sistemini çöz: bank-addressing matrisini / mask basis'ini elde etmek için kurulan matrisin nullspace'ini hesapla.

nullspace(M) over GF(2)  ->  bank-mask basis
=> closed-form function: physical address -> bank index

3. Mapping'i kullan. Hammering için ya da cross-CPU DRAMA tarzı covert/side kanalları için aynı-bank, row-komşusu address kümelerini doğrudan üret.

Reported result
model:    linear over GF(2); polynomial-time bank-mask recovery
inputs:   only row-buffer-conflict timing (black-box)
accuracy: ~99% across embedded and server systems, in minutes

(Çoğunlukla) linear scrambling varsayar

Temiz GF(2) tersine çevirmesi, mapping'in linear olmasına dayanır. Non-linear ya da keyed scrambler'lar closed-form nullspace yaklaşımını bozar; gerçi sahaya konuşlanmış SoC mapping'lerinin çoğu aslında linear XOR fonksiyonudur.

Mitigation

  • Non-linear / keyed address scrambling linear çözücüyü etkisiz kılar.
  • DRAM seviyesindeki Rowhammer savunmaları (TRR, artırılmış refresh, ECC), geri kazanılan mapping'i tüketen downstream saldırılar için hâlâ geçerlidir.

References