Skip to content

Streamline (flushless cache covert channel)

LLC'den büyük, paylaşılan read-only bir array üzerinden çalışan hızlı bir cache covert channel; burada cache'in kendisi uçuştaki (in-flight) bit'leri buffer'lar — clflush yok ve gönderici ile alıcı asenkron çalışır.

Mechanism

Note

Streamline, LLC'den büyük, paylaşılan read-only bir array üzerinden iletir (shared library'ler ya da OS page de-duplication / KSM yoluyla paylaşılır). Gönderici her bit'i, sıradaki sequential array girişini load ederek (ya da atlayarak) kodlar ve hemen ilerler — asla alıcıyı beklemez (asenkron) ve asla clflush kullanmaz (flushless). Flush'ı gereksiz kılan invariant şudur: array cache boyutunu aştığı için, göndericinin sequential yürüyüşü başa wrap ettiğinde, önceki turdan kalan girişler thrashing erişim deseni tarafından zaten self-evict edilmiş olur. Alıcı geriden gelir, aynı diziyi okur ve her pozisyonu hit (hızlı, değer load edilmişti) veya miss (yavaş) olarak decode eder. Cache, iki taraf arasında uçuştaki bit'leri tutan bir buffer gibi davranır.

Walkthrough

İki taraf da aynı aşırı büyük paylaşılan array'i sequential olarak yürür; göndericinin load deseni her index'teki bit'i kodlar, alıcı her index'i zamanlar:

// shared read-only array A, |A| > LLC size
// sender:
for (i = 0; ; i = (i+1) % N)
    if (bit(i)) (void)A[i];          // load => "1"; skip => "0"; never flush
// receiver (lags behind):
for (i = 0; ; i = (i+1) % N) {
    t0 = rdtsc(); (void)A[i]; t1 = rdtsc();
    decode(i, (t1 - t0) < HIT_THRESHOLD);   // hit => 1, miss => 0
}

Senkronizasyon bit seviyesinde asenkrondur; yalnızca ara sıra kaba (coarse) bir re-sync gerekir, artı rate uyumsuzluğunu tolere etmek için pseudorandom bir kanal kodlaması kullanılır.

Bildirilen performans (Intel Skylake, cross-core)
  • %0.3 bit-error rate'te 1788 KB/s.
  • Flush+Flush'ın (496 KB/s) ~3.6 katı ve Take-a-Way'in (588 KB/s) ~3 katı; Flush+Reload baseline'ı 298 KB/s.
  • Kaba re-senkronizasyon kabaca her 200.000 bit'te bir, milyarlarca bit'in iletimini mümkün kılar.

Mitigation

Memory de-duplication / KSM'yi devre dışı bırakmak, kanalın dayandığı paylaşılan arka array'i ortadan kaldırır. Domain'ler arası cache partitioning ve rastgele (randomized) indexing, kanalın dayandığı self-eviction'ın güvenilirliğini azaltır.

References