RSB stuffing / RSB filling¶
Context switch ve VM-exit'te Return Stack Buffer'ın her entry'sini controlled benign entry'lerle overwrite ederek hiçbir attacker- veya guest-controlled return prediction'ın hayatta kalmamasını ve RSB'nin asla BTB'ye underflow etmemesini sağlama.
Mechanism¶
Note
Return Stack Buffer (RSB, namı diğer Return Address Stack) return
target'larını predict eden küçük bir hardware stack'tir: bir call return
address'i push'lar, bir ret onu predicted target olarak pop'lar. Önceki
call'lardan daha fazla ret execute edildiğinde RSB underflow eder;
Skylake ve bazı sonraki core'larda predictor o zaman BTB'ye fallback
eder (indirect predictor) — ki bunu bir attacker poison'lamış olabilir;
ret2spec / SpectreRSB primitive'i. Kernel, context switch ve VM-exit'te
RSB'yi controlled benign entry'lerle stuffing ederek savunur, böylece
(a) her entry attacker/guest-controlled olmak yerine bilinen bir speculation
trap olur ve (b) RSB asla BTB'ye underflow etmez. RSB, ret2spec tarafından
ölçülen Intel core'larda ~16 entry derinliğindedir.
Walkthrough¶
Linux'ta fill, arch/x86/include/asm/nospec-branch.h içindeki
FILL_RETURN_BUFFER'dır. RSB_CLEAR_LOOPS = 32 benign entry push'lar; her
stuffed slot gerçek bir call yapar (bir RSB entry push'lamak için) ardından
return site'ında bir speculation trap gelir:
#define RSB_CLEAR_LOOPS 32 /* To forcibly overwrite all entries */
/* __FILL_RETURN_SLOT, conceptually: */
// ANNOTATE_INTRA_FUNCTION_CALL
// call 772f ; push a benign RSB entry
// int3 ; speculation trap if speculatively "returned" to
// 772:
Loop, her birinde iki slot yaparak nr/2 iterasyon koşar, ardından push'lanan
return address'leri add $(BITS_PER_LONG/8)*2, %_ASM_SP ile gerçek stack'ten
temizler ve jnz misprediction'ına karşı bir barrier olarak bir lfence ekler.
Header comment'i, her RSB entry'sinin speculative bir ret için kullanılırsa
sonsuz bir pause; lfence; jmp capture loop'una düştüğünü belirtir.
Macro, ilgili CPU feature'ı üzerinde ALTERNATIVE_2 ile patch edilir, böylece
maliyet yalnızca mitigation'ın gerekli olduğu yerde ödenir.
Mitigation¶
Bu zaten bir mitigation'dır — ret2spec / SpectreRSB için ve cross-privilege RSB poisoning için. Sınırlamaya dikkat: SpectreRSB'nin yazarları, bilinen tek bir defense'in (Retpoline dahil) her RSB variant'ını durdurmadığını rapor eder ve RSB refilling Skylake-ve-sonrası client part'larda shipped edildi ama universal olarak değil, dolayısıyla deployment boşlukları mevcuttu.