Mayhem¶
Rowhammer bit flip'lerini register ve stack değişkenlerine yönlendirerek, bir kurbanın yalnızca kalıcı verisi değil, geçici program durumu da bozulur.
Mechanism¶
Note
Klasik Rowhammer istismarları uzun ömürlü veri yapılarındaki (page-table
entry'ler, durağan RSA key'leri) bit'leri flip'ler. Mayhem, CPU register'larında
tutulan değerlerin kalıcı olarak güvende olmadığını gözlemler: calling convention
ve signal delivery, register içeriğini rutin olarak thread'in stack'ine spill
eder; orada DRAM'de bulunur ve başka herhangi bir byte gibi hammer'lanabilir hâle
gelir. Mayhem'in dayandığı değişmez şudur: bir fonksiyon call'ı boyunca push
edilen callee-saved bir register ya da signal delivery tarafından bir
ucontext/sigcontext'e spill edilen bir register kümesi, ölçülebilir bir
window boyunca öngörülebilir bir stack offset'inde durur. Saldırgan
deterministik biçimde flip'lenen bir DRAM cell'i profillemişse ve kurbanın
stack'ini hedef değişken o cell'e düşecek şekilde düzenlemişse, spill window'u
sırasındaki bir flip, kurbanın daha sonra reload ettiği değeri bozar.
Zor kısım senkronizasyon'dur: flip, değer DRAM'deyken ve reload edilmeden önce
isabet etmelidir. Mayhem bir "blocking window" kullanır — kurbanı stall etmeye
(örn. bir blocking syscall'da) zorlar, böylece spill edilen değer hammer'lanacak
kadar uzun süre bellekte kalır. Yazarlar (Adiletta, Tol, Sunar, ve diğerleri,
ASIACCS 2024) bunu uçtan uca saldırılara zincirler: sudo / SSH authentication
check'lerini bypass etme ve key'i geri kazanmak için bir OpenSSL ECDSA signature
hesaplamasını fault'lama.
Walkthrough¶
Saldırı kompozisyonunun (paper'dan) dört kavramsal aşaması vardır. Memory templating ve fiziksel yerleşim standart Rowhammer toolchain'ini yeniden kullanır; yeni olan iş, spill'i bulmak ve flip'i zamanlamaktır.
1. Template DRAM -> find a cell with a reproducible 1->0 (or 0->1) flip
2. Massage victim stack -> arrange the target stack slot onto that cell
3. Open a blocking window -> stall the victim so the spilled register persists
4. Hammer aggressor rows -> flip the spilled value; victim reloads corrupt data
Spill edilmiş bir karşılaştırma sonucu kanonik hedeftir. Kavramsal olarak, bir authentication check şuna benzer bir şeye derlenir:
int authed = verify(password); // result lives in a register
some_blocking_call(); // register spilled to stack, value in DRAM
if (authed) grant_root(); // reloaded after the window
Blocking window sırasında spill edilen authed'ı 0'dan sıfır olmayan bir değere
flip'lemek, başarısız bir check'i başarıya çevirir. Paper, sudo ve SSH public-key
authentication'ın çalışan bypass'larını ve bir OpenSSL signature fault'unu
raporlar; bu da register/stack değişkenlerinin pratik bir Rowhammer hedefi
olduğunu gösterir.
Mitigation¶
- Altta yatan bit flip'leri önleyen herhangi bir savunma (refresh-bilinçli scrubbing ile ECC, TRR/PRAC, guard row'lar) Mayhem'i engeller.
- Fiziksel yerleşim üzerindeki saldırgan kontrolünü azaltmak (domain-bilinçli allocation) 2. aşamanın maliyetini yükseltir.
- Güvenlik açısından kritik kararları cache'lemek yerine yeniden hesaplamak ve hassas değerlerin blocking call'lar boyunca uzun spill'lerinden kaçınmak, window'u küçültür.