Skip to content

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