Intel Cache Allocation Technology¶
Paylaşılan LLC (ve L2) kapasitesini Class of Service başına capacity bitmask'leriyle bölen, bir victim'in cache footprint'ini izole etmek ve contention ile eviction tabanlı side channel'ları köreltmek için savunma amaçlı kullanılan bir Intel RDT özelliği.
Mechanism¶
Neden çalışır
Birçok cross-core saldırısı (Prime+Probe, eviction-set side channel'lar, cache contention covert channel'ları) attacker ile victim'in aynı last-level cache set'lerini paylaşmasına dayanır: attacker victim line'larını evict eder ve refill'i zamanlar. Cache Allocation Technology (CAT), yazılımın her workload'a cache way'lerinin kısıtlı bir dilimini vermesine izin vererek paylaşılan-kaynak varsayımına saldırır; böylece bir attacker'ın erişimleri victim'inkilerle örtüşmeyen way'lerle sınırlanabilir.
- CAT, her logical CPU / thread'e
IA32_PQR_ASSOCMSR'ı aracılığıyla bir Class of Service (CLOS / COS) atar (OS, context switch'te CLOS alanını yeniden yazar). - Her CLOS'un, bir MSR bloğunda tutulan bir capacity bitmask (CBM)'i vardır —
L3'te CLOS n için
IA32_L3_MASK_n(ve bir L2 karşılığı). Set bir bit "bu CLOS cache'in o kısmına (way'ine) allocate edebilir" anlamına gelir. - Intel hardware'i CBM'in tek, bitişik bir 1'ler dizisi olmasını gerektirir:
0x3,0x6,0xCgeçerlidir;0x5,0x9,0xAdeğildir. Örtüşmeyen mask'lere sahip iki CLOS izole cache alır; örtüşen mask'ler paylaşır. - Code/Data Prioritization (CDP) isteğe bağlı olarak bir CLOS'u ayrı code
(
L3CODE) ve data (L3DATA) mask'lerine böler.
Savunma invariant'ı: victim ve potansiyel attacker, disjoint CBM'lere sahip CLOS'larda çalışıyorsa, attacker victim'in cache way'lerine eviction set'leri kuramaz — contention ve Prime+Probe channel'larının ihtiyaç duyduğu paylaşılan-durum primitive'ini ortadan kaldırır. (CAT yalnızca allocation'ı kontrol eder, dolayısıyla kaba, kapasite seviyesinde bir isolation'dır, her channel'a karşı bir garanti değildir.)
Walkthrough¶
1. Linux resctrl arayüzünü mount et (kernel ≥ 4.10 L3/L2 CAT'i burada açar):
# mount -t resctrl resctrl /sys/fs/resctrl
# optional: -o cdp (L3 code/data split), -o cdpl2 (L2 split)
2. L3 için hardware limitlerini oku:
# cat /sys/fs/resctrl/info/L3/cbm_mask
7ff
# cat /sys/fs/resctrl/info/L3/min_cbm_bits
1
# cat /sys/fs/resctrl/info/L3/num_closids
16
# cat /sys/fs/resctrl/info/L3/shareable_bits
7ff
3. İki izole control group oluştur ve onlara disjoint bitişik mask'ler ver (burada socket 0'daki 11-way bir L3, düşük ve yüksek way'lere bölünmüş):
# mkdir /sys/fs/resctrl/victim /sys/fs/resctrl/untrusted
# echo "L3:0=00f" > /sys/fs/resctrl/victim/schemata # ways 0-3
# echo "L3:0=7c0" > /sys/fs/resctrl/untrusted/schemata # ways 6-10
0x00f ve 0x7c0 hiçbir set bit'i paylaşmaz, dolayısıyla iki group farklı LLC
way'lerine allocate eder. (Her iki mask de bitişik 1 dizileridir ve hardware
kuralını sağlar.)
4. Task'leri (ve/veya CPU'ları) her group'a bağla:
# echo $VICTIM_PID > /sys/fs/resctrl/victim/tasks
# echo $UNTRUSTED_PID > /sys/fs/resctrl/untrusted/tasks
# echo 2-3 > /sys/fs/resctrl/untrusted/cpus_list
Kernel o thread'ler/CPU'lar için IA32_PQR_ASSOC'u programlar; bundan sonra
untrusted task yalnızca victim'in hiç kullanmadığı 6-10 way'lerindeki line'ları
evict edebilir.
Kaba, way-granüler ve tam bir side-channel düzeltmesi değil
CAT, way granülarlığında izole eder ve yalnızca allocation'ı yönetir —
halihazırda mevcut paylaşılan line'lar, inclusive-cache back-invalidation'lar,
prefetcher'lar, paylaşılan read-only page'lerde Flush+Reload ve LLC dışındaki
channel'lar ele alınmaz. Way partitioning ayrıca her group için efektif cache'i
azaltır, bir performans trade-off'u. CAT'i, contention/eviction primitive'ini
ortadan kaldıran bir defense-in-depth olarak değerlendir, tam bir mitigation
olarak değil. Yukarıdaki num_closids, cbm_mask ve way sayısı gibi değerler
örnek niteliğindedir ve SKU'ya göre değişir; kendi platformunda
/sys/fs/resctrl/info/L3/ altındaki değerleri kontrol et.
Detection¶
Cache-partitioning yanlış yapılandırması veya tampering'i resctrl üzerinden
gözlemlenebilir: bir group'un schemata'sı ve CLOS başına IA32_L3_MASK_n
değerleri aktif partition'ı tanımlar; beklenmedik biçimde geniş veya örtüşen bir
CBM (ya da default CLOS 0'a geri taşınmış bir task) kaybolan isolation'a işaret
eder. Monitoring group'ları (mon_data) llc_occupancy'yi açar ve bir workload'ın
footprint'inin kendi way'leri içinde kalıp kalmadığını ortaya koyar.
References¶
- The Linux Kernel. User Interface for Resource Control feature (resctrl). — https://www.kernel.org/doc/Documentation/x86/resctrl.rst
- Intel. Usage Models for Cache Allocation Technology in the Intel Xeon Processor E5 v4 Family. — https://www.intel.com/content/www/us/en/developer/articles/technical/cache-allocation-technology-usage-models.html
- LWN.net. Intel Cache Allocation Technology. — https://lwn.net/Articles/703657/