Jump Over ASLR (BTB collision attack)¶
Bir victim'in branch instruction'larının nerede yaşadığını tespit etmek için CPU'nun Branch Target Buffer'ında collision'ları zorlayarak ASLR entropy'sini çökertmeye yetecek kadar address bit'i recover etmek.
Mechanism¶
Neden çalışır
Branch Target Buffer (BTB), front end'in bir branch resolve olmadan önce speculate edebilmesi için branch instruction adreslerinden tahmin edilen target'larına eşlemeleri cache'ler. BTB, branch'in virtual adres bit'lerinin bir alt kümesiyle index'lenir ve o index fonksiyonu tam adresten daha az bit kullanır — dolayısıyla indexing bit'leri çakışan iki farklı branch aynı BTB entry'sinde collide eder ve birbirini evict eder. Kendi branch'lerini kontrol eden bir attacker, bir victim'in branch'iyle collide eden index değerini tarayabilir: collide ettiğinde victim mispredict eder (attacker entry'yi üzerine yazdı) ve ölçülebilir derecede daha yavaş çalışır. Collide eden index, victim branch'inin düşük-sıralı adres bit'lerini açığa çıkardığı ve ASLR'nin randomization'ı tam da o bit'lerde yaşadığı için, onları recover etmek randomization'ı ortadan kaldırır. Attack, BTB'nin üzerinde durduğu security sınırları boyunca — user-to-kernel (KASLR'yi kırmak için) ve SMT üzerinden bir core'u paylaşan process'ler arasında — herhangi bir shared memory olmadan çalışır.
Walkthrough¶
Attacker, BTB index fonksiyonunu haritalandırır, sonra bir victim branch'i için prob eder.
- BTB'yi karakterize et. Yalnızca seçilen bit'lerde farklı olan adreslerde iki branch oluşturarak ve birinin diğerini ne zaman evict ettiğini kontrol ederek (misprediction latency ile tespit edilir) BTB'yi kaç address bit'inin index'lediğini ve eviction davranışını belirle.
// Conceptual: time a branch after a potential collision was created.
mfence();
t0 = rdtscp();
execute_branch(); // mispredicts if its BTB entry was clobbered
t1 = rdtscp();
record(t1 - t0); // high latency => collision / misprediction
- Victim branch'iyle collision oluştur. Attacker branch'lerini, index fonksiyonu altında kernel/victim branch'iyle aynı BTB set'ine map'lenen candidate adreslere yerleştir. Victim'i tetikle (örn. bilinen bir branch çalıştıran bir syscall), sonra attacker branch'ini yeniden çalıştır.
for (candidate = 0; candidate < SEARCH_SPACE; candidate++) {
place_branch_at(candidate);
trigger_victim(); // e.g. enter the kernel via a syscall
if (branch_latency(candidate) > MISPREDICT_THRESHOLD)
report_collision(candidate); // candidate shares index bits with victim
}
- Address bit'lerini recover et. Collide eden candidate'ın index bit'leri, victim branch'inin index bit'lerine eşittir; birkaç branch boyunca birleştirildiğinde bu, randomize edilmiş bölgeyi konumlandırmaya yetecek kadar entropy verir.
Örnek collision scan
Uyarılar
BTB indexing ve tagging microarchitecture'a özgüdür ve genellikle belgelenmemiştir; recover edilen kesin bit'ler ve artık brute-force alanı tam CPU'ya bağlıdır. Attack, branch'lerin konumunu recover eder, dolayısıyla keyfi data layout'unu değil, kod bölgelerini (text/library/kernel base) hedefler.
Detection¶
- Attack,
rdtsc/rdtscptiming ile eşleşen sıkı bir syscall loop'u veya context-crossing branch tetikleyicileri üretir; branch-yoğun kodun high-frequency timing'i işaretlemeye değer bir anomalidir. - Branch misprediction'lar ve BTB ile ilgili olaylar için hardware performance counter'lar, workload'a doğal dağılımlar yerine yapılandırılmış, tarayıcı desenler gösterebilir.
Mitigation¶
- Hedeflenen bölgenin randomization'ında daha güçlü / daha fazla entropy, yalnızca marjinal olarak yardımcı olur çünkü BTB belirli bit'leri açığa çıkarır; daha ince taneli ASLR ile birleştir.
- BTB state'ini domain'ler arasında izole et: collision'lar bir sınırı aşamasın diye privilege geçişlerinde ve context switch'lerde BTB'yi flush et veya partition et. (Sonraki CPU'lar, kısmen bu attack sınıfı tarafından motive edilen BTB/branch-predictor flush kontrolleri — örn. IBPB sınıfı barrier'lar — ekledi.)
- Bir attacker'ın hangi adreslerin collide edeceğini tahmin edememesi için BTB index fonksiyonunu process başına randomize et.
- Attack'in suistimal ettiği same-core paylaşımını ortadan kaldırmak için SMT'yi devre dışı bırak veya güvenilmeyen thread'leri birlikte zamanlamaktan kaçın.