Stride/IP Prefetcher Leakage (AfterImage)¶
Per-IP stride prefetcher'ın paylaşılan history table'ını mistrain ederek bir victim'in control flow'unu sızdırmak ve load operasyonlarını izlemek.
Mechanism¶
Note
Intel'in IP-stride prefetcher'ı, load instruction'ının pointer'ıyla (IP) index'lenen küçük bir per-load history table tutar. Her entry, görülen son adresi, gözlemlenen stride'ı ve küçük bir confidence counter'ı saklar; bir load belleği tekrar tekrar sabit bir stride ile gezdiğinde confidence saturate olur ve prefetcher önceden fetch etmeye başlar. AfterImage, bu table'ın güvenlik sınırları arasında paylaşıldığını ve — reverse-engineer edilen Haswell/Coffee Lake parçalarında — yalnızca IP'nin düşük 8 bit'iyle, tam-IP tag'i olmadan index'lendiğini gözlemler; böylece bir saldırgan load'u ile bir victim load'u aynı entry'de collide edebilir. Saldırgan bir entry'yi bilinen bir stride'a mistrain eder, victim'in çalışmasına izin verir, ardından prefetcher state'inin değişip değişmediğini (bir prefetch'in tetiklenip tetiklenmediğini) kontrol ederek hangi secret-dependent load ya da branch'in çalıştığını çıkarsar. Tek başına Spectre ya da Flush+Reload'dan farklı olarak, iletim ne speculation ne de bir cache primitive'i gerektirir — prefetcher state'inin kendisi covert medyumdur (AfterImage-PSC).
Reverse-engineer edilen Haswell/Coffee Lake yapısı: 24 entry, FIFO replacement, bir 2-bit confidence alanı (threshold 2) ve bir 13-bit stride alanı (1 sign bit + 12 magnitude bit, yani |stride| < 2 KiB). Stride'lar cache-line birimleriyle eğitilir, örn. "stride 7" = 7 x 64 B.
Walkthrough¶
Makale (Chen, Pei, Carlson, ASPLOS 2023) üç variant ve bir covert channel tanımlar. Kavramsal akış:
- Prefetcher'ı bil. Index = IP'nin düşük 8 bit'i; 24 FIFO entry; confidence threshold 2 (prefetch'e başlamak için >2 training iterasyonu gerekir).
- Train et. Victim'in hedef load'uyla aynı 8-bit-index'li entry'ye map'lenen bir saldırgan IP'sinde strided bir adres dizisi çalıştırarak seçilen bir stride için confidence'ı saturate et.
- Flush et (cache-measurement variant'ları) — tetiklenen bir prefetch'in dokunacağı line'ları.
- Trigger et. Victim'in çalışmasına izin ver; secret-dependent bir load paylaşılan entry'yi günceller.
- Probe et. Ya olası prefetch hedefinde Prime+Probe / Flush+Reload, ya da prefetcher state'ini doğrudan oku (AfterImage-PSC).
Bildirilen sonuçlar (makaleden)
- Variant 1 (cross-thread control-flow leak): %99; cross-process %97.
- Variant 2 (cross user-kernel boundary): 200 round üzerinden %91.
- Covert channel: 833 bps, hata oranı < %6.
- Timing-constant bir RSA'ya (1024-bit exponent) uçtan uca saldırı: tam anahtar 188 dk'da (~10 s/bit, ~5 iterasyon/bit), bit başına başarı PSC ile %82.
- Platformlar: Intel i7-4770 (Haswell), i7-9700 (Coffee Lake, SGX), Ubuntu 18.04.
Makalede public bir PoC artifact'i Zenodo'da referans gösterilir (DOI 10.5281/zenodo.7218907).
Detection¶
Kanal çok az software izi bırakır; esas olarak microarchitectural anomali izlemeyle gözlemlenebilir. Prefetcher-status variant'ı cache eviction'ından tamamen kaçınır, bu yüzden cache-miss-rate dedektörleri onu kaçırır.
Mitigation¶
Yazarlar her context switch'te (her biri ~1 cycle) tüm 24 prefetcher entry'sini flush etmeyi önerir; bu, en prefetch-duyarlı SPEC CPU2006/2017 iş yüklerinde %0.7 yavaşlama olarak ölçüldü. Diğer seçenekler: cross-domain paylaşımı durdurmak için history table'ı bir context ID (örn. PID) ile tag'lemek, IP-stride prefetcher'ı devre dışı bırakmak (yüksek maliyet) ya da secret-dependent branch'lerden kaçınmak.