Skip to content

Cache Coloring

Physically-indexed bir cache'i, örtüşen page-frame / set-index bitleri ("color"ları) farklı olan physical page'leri allocate ederek partition'la; güvenlik domain'lerini ayrık cache set'lerine izole et — bir savunma ve bir saldırganın hangi set'lere erişebileceğini akıl yürütmek için bir mercek.

Mechanism

Neden çalışır

Physically-indexed bir set-associative cache'te set index, physical-address bitlerinden alınır. 4 KiB page'lerle adres bitleri 0..11 page offset'tir (zaten yaptığın page seçimiyle sabit) ve 12+ bitleri OS'un atadığı physical page frame'den gelir. Dolayısıyla set-index alanı page sınırını aşar: bazı index bitleri bit 12'nin üstünde yaşar ve tamamen page'i hangi physical frame'in desteklediği tarafından belirlenir.

O örtüşen bitler page'in color'ıdır. Farklı color'lara sahip iki page'in ayrık cache set'lerine map'lenmesi garantilidir. Her güvenlik domain'ine yalnızca kendi color'larının frame'lerini vererek OS/hypervisor cache'i öyle partition'lar ki bir domain diğerinin line'larını ne evict ne de probe edebilir — sınır boyunca Prime+Probe'u ve conflict tabanlı eviction'ı yener.

Color sayısı (cache_size / (ways × page_size))'dir, yani örtüşme bitlerinin alabileceği farklı değer sayısı. Intel LLC 11 set-index biti kullanır (2048 set); 4 KiB page'lerle page offset'in üstündeki bitler mütevazı bir color sayısı verir. Aynı örtüşme saldırganların da istismar ettiği şeydir: color'ı bilmek, kontrol edilen bir page'in hangi set'leri işgal edebileceğini kısıtlar ve eviction-set construction'a yardımcı olur.

Slicing naif page coloring'i bozar

Sliced Intel LLC'lerde belgelenmemiş bir hash adresleri slice'lara yayar; bu yüzden "aynı color"daki page'ler yine de farklı slice'lara düşebilir ve tam tersi. Page coloring, önce slice fonksiyonunu geri kurtarmadan böyle bir cache'i temiz biçimde partition'layamaz — bkz. Cache Slice Selection Reverse Engineering.

Walkthrough

1. Hedef cache için color geometrisini hesapla:

colors = cache_size / (ways * page_size)
# e.g. a 2 MiB, 16-way slice with 4 KiB pages:
#   2*1024*1024 / (16 * 4096) = 32 colors
# color = physical_index_bits that overlap with the page frame

2. Bir page'in color'ını physical address'inden belirle (PA'yı bilmeyi gerektirir, örn. bir 2 MiB hugepage ya da /proc/<pid>/pagemap aracılığıyla):

// set-index bits that lie above the 12-bit page offset = the color
#define PAGE_SHIFT 12
#define SET_BITS   11           // Intel LLC: 2048 sets
unsigned color(uint64_t pa) {
    unsigned idx = (pa >> 6) & ((1u << SET_BITS) - 1); // 6 = log2(line)
    return idx >> (PAGE_SHIFT - 6);   // keep only bits above the page offset
}

3. Partition'ı zorunlu kıl (defansif kullanım). Her domain'e, color()'ı o domain'in ayrılmış set'inde olan frame'leri allocate et:

$ ./coloralloc --domain A --colors 0-15
$ ./coloralloc --domain B --colors 16-31
verify: no PA in A and B shares a color  -> disjoint LLC sets  -> OK

Cross-domain bir Prime+Probe artık başarısız olur: prober'ın frame'leri victim'in set'lerini index'leyemez; bu yüzden hiçbir conflict miss secret'ı kodlamaz.

Detection

Coloring bir allocation politikasıdır, bir olay değil; allocate edilmiş PA'ları örnekleyip domain'lerin asla bir color'ı paylaşmadığını doğrulayarak onu denetle. Cross-domain conflict-miss timing'inin yokluğu (gürültü döndüren başarılı bir Prime+Probe) onun çalıştığının pratik işaretidir.

Mitigation

Cache coloring zaten bir mitigation'dır: conflict tabanlı LLC side channel'larına karşı sağlam kabul edilen partition'lama savunmalarından biridir. İlgili/tamamlayıcı kontroller:

  • Donanımsal way-partitioning (Intel CAT) domain'leri ayrı set'ler yerine ayrı way'lere izole eder.
  • Randomized/encrypted indexing (CEASER tarzı) eviction-set önkoşulunu farklı bir şekilde yener.

References