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.
-
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*kuzaktaki her adres alias yapar. -
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.
-
Ö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
RDTSCile zamanlanmış birmovb store / movb loadprobe 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.