Skip to content

MemJam

4K-aliasing'e dayalı sahte read-after-write bağımlılıklarını (store-to-load forwarding stall'larını) suistimal ederek sub-cache-line, byte granülerliğinde erişim kalıplarını sızdıran ve SGX'te constant-time crypto'yu kıran bir intra-cache-line side channel.

Mechanism

MemJam (Moghimi, Eisenbarth, Sunar; CT-RSA 2018, arXiv:1711.08002), hangi cache line'a erişildiğini gizlemenin yeterli olduğu varsayımını kırar. Klasik "constant-time" crypto savunmaları, secret'a bağlı erişimlerin tümünün aynı cache line set'ine düşmesini sağlar, dolayısıyla cache saldırıları (yalnızca cache-line, 64-byte granülerliğe sahip oldukları için) onları ayırt edemez. MemJam ise Intel'in memory-disambiguation unit'inin bir microarchitectural tuhaflığını suistimal ederek cache line'ın içine ulaşır: 4K aliasing.

Invariant: CPU, load'lar ile store'ları yalnızca düşük 12 adres bit'ini kullanarak ayırt eder

İşlemci, yakın zamanlı bir store'u bağımlı bir load'a forward etmeye çalışır. Bir load'un in-flight bir store'a bağımlı olup olmadığına hızlıca karar vermek için adreslerinin yalnızca düşük 12 bit'ini (page offset) karşılaştırır, çünkü üst bit'ler henüz hazır olmayan physical-address translation gerektirir. 4 KB'nin katı kadar uzaktaki iki adres bu düşük 12 bit'i paylaşır, dolayısıyla erişimler farklı fiziksel line'lara olsa bile CPU sahte bir read-after-write bağımlılığı görür. Bu olduğunda store-to-load forwarding stall eder ve load yaklaşık 5 cycle'lık bir ceza ile yeniden issue edilir. Ceza, kurbanın adresinin son 12 bit'ine göre tetiklenir — ve bu bit'ler intra-cache-line offset'ini içerir. Saldırgan, seçilmiş bir 4 KB-aliasing offset'ine bir store yerleştirip oluşan stall'ları zamanlayarak, kurbanın bir cache line içinde hangi byte/word'e dokunduğunu öğrenir — herhangi bir cache-line saldırısından daha ince granülerlikte.

Walkthrough

Saldırgan (birlikte yerleşmiş bir hyperthread sibling'i ya da bir SGX enclave'i barındıran kötü niyetli bir OS), kurbanın secret'a bağlı read'leriyle 4K-alias yapan bir adrese tekrar tekrar yazar, ardından contention'ın kurbanı ne kadar yavaşlattığını ölçer.

  1. Aliasing offset'ini seç. Düşük 12 bit'i, ilgilenilen kurban sub-cache-line konumunun offset'ine eşit olan bir saldırgan adresi seç. 4096*k uzaktaki her adres alias yapar.

  2. Sahte bağımlılığı üret. Sibling logical core'dan o offset'te sürekli store issue et. Kurban, düşük 12 bit'i eşleşen bir load issue ettiğinde, disambiguation logic'i sahte bir RAW hazard yükseltir ve load'u yeniden issue eder.

  3. Ölç. Ya kurbanın genel yürütmesini zamanla (secret'a bağlı işlemin yavaşlaması, onun aliasing offset'ine dokunduğunu ele verir) ya da RDTSC ile zamanlanmış bir movb store / movb load probe loop'u kullanarak ~5-cycle'lık forwarding stall'ını gözlemle.

Bu, cache-line constant time'ı neden yener (AES T-tables / SM4)

Yazarlar şunlara saldırdı:

  • Intel IPP'deki bir constant-time / cache-protected AES uygulaması (tek küçük bir S-box kullanır / table'ları preload eder, böylece cache saldırıları yalnızca 4 cache line görür) ve IPP'deki cache koruması olan bir SM4 uygulaması.
  • Bir SGX enclave'i içindeki AES.

Bu savunmalar erişimleri yalnızca cache-line granülerliğinde eşitlediğinden, line içindeki secret index hâlâ değişir — tam da MemJam'in okuduğu sinyal. Intra-cache-line sızıntısı, MemJam'in cache saldırılarının recover edemediği key'leri recover etmesini sağladı. CacheBleed'in aksine (eski microarchitecture'lar ve cache-bank conflict'leriyle sınırlı), MemJam SGX yetenekli kuşaklar dahil tüm büyük Intel işlemcilerine uygulanır.

Mitigation

Kök neden, bir secret'ın bir erişimin cache line içindeki offset'ini etkilemesine izin veren software'dir. Mitigation'lar:

  • Byte granülerliğinde gerçek constant-time — yalnızca secret'tan bağımsız cache line'lar değil, secret'tan bağımsız erişim offset'leri; örneğin table'ın her byte/word'üne her zaman dokun ya da veriye bağlı adresleme içermeyen bit-sliced uygulamalar kullan.
  • Secret'a bağlı table lookup'larından tümüyle kaçın (vectorized/bit-sliced AES).
  • SGX threat model'leri için, güvenilmeyen sibling hyperthread'leri enclave thread'leriyle birlikte schedule etme (enclave core'unda HT'yi devre dışı bırak) ve contention yolunu ortadan kaldır.

References