GoFetch: Breaking Constant-Time Crypto with Data Memory-Dependent Prefetchers¶
Apple silicon'ın Data Memory-Dependent Prefetcher'ı, pointer'a benzeyen cached value'ları dereference eder, secret-dependent data'yı leak eder ve M1/M2 üzerinde constant-time cryptographic implementation'ları kırar (end-to-end key extraction M1'de gösterildi; M2/M3'te de aynı DMP davranışı gözlendi, M3'te DIT bit'i ile DMP devre dışı bırakılabilir).
Mechanism¶
Bug class: constant-time threat model'ini ihlal eden bir prefetcher
Constant-time (CT) cryptography tek bir invariant üzerine kuruludur: hiçbir secret value asla bir memory address'i veya bir branch'i etkilemez, böylece execution cache/timing channel'larında secret-dependent bir footprint bırakmaz. Klasik prefetcher'lar buna saygı gösterir — load edilen data value'lara göre değil, access pattern'lere (stride'lar) göre tahmin yaparlar.
Apple M-series CPU'larda bulunan bir Data Memory-Dependent Prefetcher (DMP), bu invariant'ı kırar. DMP, cache'te zaten bulunan value'ları inceler ve bir value bir pointer'a benziyorsa, onu speculatively dereference eder ve işaret edilen address'i cache'e prefetch eder. Apple DMP'si alışılmadık derecede agresiftir: herhangi bir program adına aktive olur ve program onu hiç dereference etmeyi niyetlenmemiş olsa bile pointer-benzeri data'yı kovalar.
Bu, CT garantisini yok eder çünkü artık data value'lar — sadece address'ler değil — memory traffic'i etkiler:
- Bir attacker, victim'ın CT code'undaki intermediate bir secret-dependent value'nun bir pointer'a eşit olmasını (veya ona şekillenmesini) ayarlar.
- DMP o value'nun bir pointer olduğuna "karar verirse", onu dereference eder ve attacker'ın tespit edebileceği (Prime+Probe / Flush+Reload) seçilmiş bir line'ı cache'e çeker.
- DMP'nin fire edip etmediği böylece secret value'nun bir özelliğini açığa çıkarır. Bir chosen-input stratejisini iterate ederek attacker secret bit'lerini teker teker soyar.
Paper, OpenSSL Diffie-Hellman, Go RSA ve post-quantum şemalar CRYSTALS-Kyber ve CRYSTALS-Dilithium'a karşı key extraction gösterir — yani hem classical hem de PQC constant-time code'u çökertir. Paper'ın rapor ettiği rakamlar: bir 2048-bit RSA key'i bir saatin altında, bir 2048-bit DH key'i iki saatin altında; PQC tarafında Kyber-512 için gerekli data ~54 dakikada, Dilithium-2 için ~10 saatte (offline processing hariç) elde edilir.
Walkthrough¶
High-level kavramsal akış (gofetch.fail, USENIX Security 2024)
Yalnızca kavramsal — offset veya gadget yok:
-
DMP'nin varlığını / tetiklendiğini doğrula. Cache'e bir value ve bir target buffer yerleştir; target line'ın prefetch edilip edilmediğini (bir cache channel ile) gözlemle. Ediliyorsa, DMP yerleştirilen value'yu bir pointer olarak dereference etmiştir.
-
Chosen input'lar crafle. Victim CT routine'ine input'lar ver, öyle ki intermediate bir secret-dependent value yalnızca tahmin edilen bir secret bit/limb belirli bir value'ya sahip olduğunda pointer-shaped bir value hâline gelsin.
craft input so that: intermediate = f(secret, guess)
if guess correct -> intermediate looks like a pointer -> DMP fires
if guess wrong -> intermediate not pointer-like -> DMP silent
-
DMP'yi cache üzerinden oku. DMP'nin ekstra dereference'i yapıp yapmadığını tespit etmek için Prime+Probe / Flush+Reload kullan, böylece tahminin doğru olup olmadığı açığa çıkar.
-
Iterate et. Her victim instruction'ı constant-time olsa da, tam key'i yeniden inşa etmek için tüm secret limb'ler/bit'ler boyunca tekrarla.
Detection¶
- On-host çok zor: leak microarchitectural'dır ve victim normal CT code çalıştırır; bir crash veya bariz bir anomali yoktur.
- Behavioral heuristic'ler: bir crypto workload'ına bitişik çok sayıda timed cache ölçümü (Prime+Probe/Flush+Reload loop'ları) yapan co-resident bir process; sürekli eviction-set probing.
- HPC (mevcut olduğunda): crypto operasyonlarıyla correlate olan anomalous prefetch / cache-fill aktivitesi zayıf bir gösterge olabilir.
- Tespit büyük ölçüde pratik değildir; savunma monitoring ile değil, mitigation iledir.
Mitigation¶
- Mevcut M1/M2'de silikonda patch edilemez — bir hardware design özelliğidir. Savunma cryptographic software'dedir.
- DIT bit / DMP disable: bazı Apple core'larda Data-Independent Timing (DIT) kontrolü ve M3'te dedicated bir DMP-disable mekanizması (DIT), hassas code için prefetcher'ı bastırabilir; M1/M2'de per-process bir DMP off switch'i yoktur (yalnızca belirli core'larda bir miktar kontrol).
- Crypto library hardening: hiçbir intermediate secret-dependent value asla pointer-shaped olmasın diye input/ciphertext blinding ve masking; secret data'yı DMP'nin onu bir pointer olarak yorumlayabileceği yere koymaktan kaçın.
- Scheduling isolation: mümkün olduğunda crypto'yu untrusted code ile paylaşılmayan core'larda veya context'lerde çalıştır.
- Library maintainer'ları (OpenSSL, Go, PQC reference code) bu tür karşı önlemleri eklemek için guidance/update yayımladı.