Cache Slice Selection Reverse Engineering¶
Bir physical address'i Intel LLC'sinin çekirdek-başına slice'larından birine map'leyen belgelenmemiş hash'i geri kurtar ki eviction set'ler, page coloring ve cross-core saldırılar doğru slice'ı hedefleyebilsin — Maurice ve ark.'nın performance-counter yöntemi.
Mechanism¶
Neden çalışır
Intel'in last-level cache'i çekirdek başına bir slice'a bölünmüştür ve belgelenmemiş bir complex addressing fonksiyonu, trafiği eşit yaymak için her physical address'i bir slice'a hash'ler. Set index tek başına bir line'ın nerede yaşadığını artık söylemez: özdeş set-index bitlerine sahip iki adres farklı slice'larda oturabilir; bu yüzden naif congruence akıl yürütmesi (ve naif page coloring) bozulur.
Slice fonksiyonu linear çıkar: her çıkış biti, physical-address bitlerinin sabit bir alt kümesinin XOR'udur. Linear ve yalnızca physical olduğundan, birçok bilinen physical address için her birinin hangi slice'a düştüğünü gözlemleyip ardından XOR mask'leri için çözerek geri kurtarılabilir. Bilindiğinde, probe etmek yerine herhangi bir adresin slice'ını hesaplayabilirsin; bu da eviction-set construction'ı ve cross-core Prime+Probe'u çok daha verimli kılar.
Bu linear (XOR-tabanlı) yapı Sandy Bridge'ten Kaby Lake'e kadarki nesiller için geçerlidir; daha yeni Intel mimarileri (ör. Coffee Lake ve sonrası) non-linear hash fonksiyonları kullanabilir — bunları XOR-mask çözümüyle değil timing-tabanlı yöntemlerle geri kurtarmak gerekir; bkz. Slice+Slice.
Temiz sinyal uncore CBo (cache-box) performance counter'larından gelir: her slice'ın kendi counter'ı vardır; bu yüzden bir slice'a erişim yalnızca o slice'ın LLC-lookup counter'ını artırır ve timing gürültüsü olmadan map'lemeyi doğrudan açığa çıkarır.
Walkthrough¶
MIAOUS-group slice-reverse kodu üç aşamayı izler.
1. Bilinen physical address'ler edin. Düşük PA bitleri bilinsin diye hugepage'lerden allocate et — "Core makineleri için 2MB page'ler, Xeon makineleri için 1GB":
mmap a hugepage -> PA low bits fixed by 2MiB/1GiB alignment
walk the buffer with a 64-byte stride (one cache line per step)
2. Slice-başına CBo counter'larını programla ve tara. Her line için ona eriş ve
hangi slice'ın counter'ının hareket ettiğini oku — scan programı "biraz bellek
allocate eder ve her adres için her slice'ın erişim sayısını çıkarır (64B stride ile)":
$ ./scan
addr 0x... -> slice 0 (count 1024, others ~0)
addr 0x... -> slice 3 (count 1019, others ~0)
...
# each 64B line is unambiguously attributed to one slice
3. XOR mask'leri için çöz. Gözlemlenen her (PA, slice)'ı linear bir kısıt
olarak ele al; slice bitleri PA bitlerinin XOR'larıdır. Yeterli örnekle, çıkış biti
başına bir mask geri kurtar:
# illustrative form (exact bits are CPU-specific):
o0 = b_i XOR b_j XOR b_k ...
o1 = b_l XOR b_m XOR ...
# of slices = 2^(number of output bits); function generalizes to all PAs
Counter'lar timing'i neden yener
Bir timing/eviction yaklaşımı, her probe için gürültü ve prefetch etkileri arasında bir hit'i bir miss'ten ayırt etmek zorundadır. CBo counter'ları slice'ı doğrudan ve erişim-başına raporlar; yazarlar bunu "slice identification yönteminde error rate'i düşürmek" ve map'lemeyi test edilmemiş adreslere extrapolate etmek için kullanır.
Fonksiyon mikromimariye ve topolojiye özgüdür
Mask'ler CPU modeline ve aktif slice/çekirdek sayısına bağlıdır (ikinin kuvveti olmayan çekirdek sayıları hash'i karmaşıklaştırır). Onu makine başına geri kurtar; Sandy Bridge'ten bir mask Kaby Lake'le eşleşmez. Repo, tam da bu nedenle Kaby Lake güncellemelerini not eder.
Mitigation¶
Slice hashing kısmen kendisi bir side-channel engelidir, ama bir kez reverse edildiğinde saldırıları mümkün kılar; bu yüzden savunmalar downstream primitive'i hedefler:
- Randomized/encrypted cache indexing (CEASER tarzı) line'ları periyodik olarak remap'ler; böylece geri kurtarılmış bir slice/eviction map'lemesi bozulur.
- Way-partitioning (Intel CAT) slice map'lemesinden bağımsız olarak domain'leri izole eder.
- Fonksiyonu reverse etmek, page coloring'in sliced cache'lerde çalışmasını sağlayan şeydir — bkz. Cache Coloring.
References¶
- Maurice, Le Scouarnec, Neumann, Heen, Francillon. Reverse Engineering Intel Last-Level Cache Complex Addressing Using Performance Counters. RAID 2015 — https://cmaurice.fr/pdf/raid15_maurice.pdf
- MIAOUS-group, slice-reverse implementation — https://github.com/MIAOUS-group/slice-reverse
- Inci, Gulmezoglu, Eisenbarth, Sunar et al. Mapping the Intel Last-Level Cache. IACR ePrint 2015/905 — https://eprint.iacr.org/2015/905.pdf