Memory Bus Covert Channel¶
Bus locking üzerine kurulu cross-core / cross-VM bir covert channel: cache-line-split (exotic) adresler üzerindeki atomik işlemler global bir memory-bus lock'u (ya da modern CPU'larda coherence-directory contention'ı) assert eder ve bu, başka bir core tarafından memory-latency olarak gözlemlenir.
Mechanism¶
Memory-bus covert channel "Whispers in the Hyper-space: High-speed Covert Channel Attacks in the Cloud" (Wu, Xu, Wang; USENIX Security 2012) çalışmasından gelir. Klasik cache covert channel'lar, gönderen ve alıcının kesin cache-line adreslemesinde anlaşmasını gerektirir; bu da bellek paylaşmayan VM'ler arasında zordur. Memory-bus channel bu gereksinimi, her core'un contention yaşadığı global, sistem çapında bir kaynak üzerinden sinyalleyerek ortadan kaldırır.
Invariant: cache-line-split bir operand üzerindeki LOCK'lu bir atomic, tüm belleği serileştirmeli
x86 atomik instruction'ları (LOCK prefix'i) bir işlemin kesintisiz
tamamlanmasını garanti eder. Normalde CPU bunu, operand'ın bulunduğu yalnızca
o tek cache line'ı locklayarak ucuza gerçekler. Ama operand "exotic" ise
— iki cache line'a yayılan hizalanmamış bir adres — cache-line locking
atomicity'yi garanti edemez, dolayısıyla işlemci tüm sistemin memory
erişimini stall eden bir global bus lock assert etmeye geri döner. Bu
global stall, başka herhangi bir core tarafından artan memory latency olarak
gözlemlenebilir.
Gönderen bunu module eder: 1 göndermek için bus'ı locklar, 0 göndermek için
sessiz kalır. Alıcı sürekli olarak zamanlanmış uncached memory erişimleri
yapar ve bit'i latency'den okur. En yeni platformlarda (entegre memory
controller'lar ve NUMA içeren Intel Nehalem / AMD, paylaşılan front-side bus
yok) global bus lock gitmiştir, ama bir split-line atomic hâlâ sistem çapında
cache-coherence / interconnect contention'ı yaratır; alıcı bunu da aynı
şekilde zamanlayabilir — yani channel architectural değişiklikten sağ çıkar.
Walkthrough¶
Gönderen ve alıcı, aynı fiziksel host üzerindeki iki farklı VM'de bulunan ayrıcalıksız programlardır. Kavramsal olarak:
# Sender — to transmit a '1', create contention:
for (duration of a bit-slot):
LOCK xadd [exotic_addr] ; exotic_addr straddles two cache lines
; -> bus lock / coherence storm
# To transmit a '0': do nothing (no bus contention).
# Receiver — sense the bus state by latency:
for (duration of a bit-slot):
t0 = rdtsc()
<timed UNCACHED memory access> ; forced to go to the bus
t1 = rdtsc()
bit = (t1 - t0 > threshold) ? 1 : 0
Alıcı mutlaka uncached erişimler kullanmalıdır ki probe'u kendi cache'i tarafından emilmek yerine gerçekten contention yaşanan bus/interconnect'e ulaşsın.
Bildirilen bandwidth ve platformlar
Makale iki rejim bildirir:
- Laboratuvar kurulumu: son derece düşük hata oranıyla 700 bps'nin üzerinde bir bandwidth; 746.8 ± 10.1 bps'lik kararlı bir transmission rate aktarılır.
- Gerçek dünya bulutu (Amazon EC2): 100 bps'nin üzerinde bir transmission rate, örneğin bir konfigürasyonda yaklaşık %0.39 hata ile 66.1 bps; hypervisor scheduling baskısı altında rate'ler düşer ve hata biraz yükselir.
İki test platformu kullanıldı:
- Eski, paylaşılan memory-bus'lı bir makine: Intel Core2 + Hyper-V + Windows guest VM'leri (gerçek front-side-bus lock).
- Paylaşılan memory bus'ı olmayan daha yeni bir platform: Intel Xeon (Nehalem) + Xen + Linux guest VM'leri (NUMA / entegre controller, channel coherence-interconnect contention'ına dayanır).
Sağlam bir iletişim protokolü (framing, error correction), virtualization'ın getirdiği scheduling ve timing gürültüsünü ele alır.
Detection¶
Bir savunmacı, ele veren iş yükünü izleyebilir: hizalanmamış, cache-line aşan
operand'lar üzerinde yüksek oranda LOCK'lu atomic issue eden (split lock) bir
process ya da memory latency'si yapılandırılmış, yüksek frekanslı bir kalıpta
salınan birlikte yerleşik bir VM. Modern CPU'lar tam olarak bu davranışı
işaretleyebilen split-lock detection sunar (örneğin split-lock'lu atomic'lerde bir
#AC/alignment-check trap'i).
Mitigation¶
- Split-lock detection / bus-lock control: split-lock atomic issue eden thread'leri trap'le, throttle et ya da öldür (yeni Intel CPU'ları ve OS desteği split lock'ları faultable / rate-limited yapar) ve gönderenin sinyalleme primitive'ini doğrudan ortadan kaldır.
- Scheduler/yerleştirme savunmaları: karşılıklı güvensiz tenant'ların aynı socket'te birlikte yerleşmesinden kaçın; gang/minimum-run-time scheduling gürültü ekler.
- Channel'ın bandwidth'i zaten hypervisor scheduling tarafından kısıtlanır, dolayısıyla VM scheduling'i daha da sıkılaştırmak onu daha çok bozar.