Skip to content

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.

References