Data Memory-Dependent Prefetcher leak (Augury)¶
Augury, Apple Silicon'ın Data Memory-Dependent Prefetcher'ının (DMP) bellekte bulduğu pointer-şeklindeki değerleri dereference edip target'larını prefetch ettiğini ve core'un mimari olarak hiç okumadığı "data at rest"i sızdırdığını gösterir.
Mechanism¶
Teori / invariant
Bir Data Memory-Dependent Prefetcher (DMP), neyi prefetch edeceğine karar vermek için yalnızca önceki erişimlerin adreslerine değil, belleğin içeriğine bakar. "Pointer'a benzeyen" bir değer gördüğünde, o değeri dereference eder ve işaret edilen line'ı cache'e prefetch eder.
Bu, yalnızca address stream'ini gözlemleyen ve load edilen veriyi hiç okumayan bir stride / IP prefetcher'dan (bkz. stride IP prefetcher leakage) temelden farklıdır. Bir stride prefetcher düzensiz pointer-chasing'i takip edemez; bir DMP ise tam da bunun için kurulmuştur.
Augury, Apple Silicon üzerinde bir Array-of-Pointers (AoP) DMP'yi reverse-engineer etti. Kırdığı kritik invariant: DMP, programın mimari olarak hiç dereference etmediği — speculative olarak bile — pointer'ları kovalar. Bir pointer'ın target'ının cache'e inmiş olması salt gerçeği, o pointer değerinin array'de var olduğunu açığa çıkarır. Bu "data at rest" leakage'ıdır; projenin belirttiği gibi, "speculative execution tamamen devre dışı bırakılabilir ve Augury yine çalışırdı" — bu da onu Spectre/MDS-sınıfı transient-execution saldırılarından ayırır.
Walkthrough¶
Array-of-Pointers tetikleme ve side-channel okuma (kavramsal)
// 1. Setup: build an array of pointers; access entries in order to
// train the AoP DMP to "run ahead".
for (i = 0; i < len(arr); i++) {
*arr[i]; // dereference each pointer
}
// After a few in-order dereferences the DMP starts prefetching FURTHER
// entries of arr AND dereferencing those pointer values itself,
// pulling their targets into cache — even past the bound the program
// actually accessed.
// 2. Readout: probe each candidate TARGET address with a cache timing
// side channel (Flush+Reload / Prime+Probe on the targets, not the
// pointers):
// fast access (~L2 latency) -> DMP prefetched it -> pointer was present
// slow access (cache miss) -> it was not
Repo, "minimal AoP"'yi karakterize eder — DMP'yi güvenilir biçimde aktive eden en küçük pointer-array düzenlemesi ve erişim dizisi (burada kavramsal tutuldu; kesin eleman sayıları/offset'leri tekrar verilmedi).
- Etkilenen: Apple A14, M1, M1 Max doğrulandı; daha eski A-serisi ve M1 Pro şüpheli. Test edilen Intel ve AMD parçaları bu DMP'ye dair hiçbir kanıt göstermedi.
- Kısıtlama: Augury yalnızca pointer'ları / data at rest'i sızdırır — pointer-şeklindeki verinin varlığını ve değerini. Genel bir read primitive değildir.
Tuzaklar / kapsam
- Core'un veri erişimlerini izleyerek çalışan savunmalar (Speculative Load Hardening, transient-execution mitigation'ları) yardımcı olmaz, çünkü sızdırılan veri core tarafından hiç okunmaz.
- GoFetch (USENIX Security 2024) sonradan M-serisi DMP'nin çok daha agresif olduğunu gösterdi: load edilen bir değer salt bir pointer gibi göründüğünde, katı bir AoP training pattern'i olmadan aktive olur. Bu, constant-time cryptography'yi kırar — DMP, secret'tan türetilmiş pointer-benzeri değerleri dereference eder ve secret-dependent bellek erişimleri üretir. GoFetch, M1/M2/M3 üzerinde OpenSSL Diffie-Hellman, Go RSA ve CRYSTALS-Kyber / Dilithium'dan anahtarlar çıkardı.
Detection¶
Leak, sızdırılan pointer'ın hiçbir mimari read'ini üretmez; bu yüzden yazılım tarafı read tracking onu göremez. Pratik detection, saldırıyı kurmak için kullanılan aynı cache timing kanalları aracılığıyla DMP'nin prefetch izini gözlemlemeye dayanır (bkz. Flush+Reload, Prime+Probe).
Mitigation¶
- Apple DIT (Data Independent Timing) biti: DMP'yi M3'te devre dışı bırakır ama M1/M2'de bırakmaz.
- Intel DOIT/DOITM (Data Operand Independent Timing Mode) biti: Intel'in analog
prefetcher'ı Data Dependent Prefetcher (DDP)'dir; DOITM=1 iken (veya
IA32_SPEC_CTRL.DDPD_U) DDP devre dışı kalır ve DOITM'in tek başına yeterli olması Raptor Lake'ten (13. nesil) itibaren garanti edilir. - Bir HID configuration biti (
SYS_APL_HID11_EL1[30]) M1/M2'de DMP'leri devre dışı bırakabilir ama stock macOS'ta açığa çıkmayan kernel desteği gerektirir. - Cryptographic blinding ve per-implementation constant-time sertleştirme işe yarar ama önemli, kimi zaman DMP'ye özgü bir performans maliyeti taşır.
References¶
- Augury: Using Data Memory-Dependent Prefetchers to Leak Data at Rest (publication page, S&P 2022)
- Augury official site (prefetchers.info)
- Augury artifact (GitHub: FPSG-UIUC/augury)
- GoFetch: Breaking Constant-Time Cryptographic Implementations Using DMPs (USENIX Security 2024)
- Intel — Data Dependent Prefetcher (DDP) / DOITM guidance