Skip to content

Meltdown-NM

LazyFP / Lazy FP State Restore (CVE-2018-3665): lazy FPU context switching TS bit'ini set bıraktığında, FPU/SIMD state'ine dokunmak bir device-not-available #NM exception'ı yükseltir — ama transient window, önceki process'in FPU/SIMD register'larını, AES-NI key materyali dahil, sızdırır.

Mechanism

Neden çalışır

Her context switch'te büyük FPU/SIMD register file'ını save/restore etmekten kaçınmak için bazı işletim sistemleri lazy FPU switching kullanır: yeni task'in FPU state'ini hemen restore etmek yerine, CR0'daki TS (Task-Switched) bit'ini set ederler. Yeni task'in çalıştırdığı ilk FPU/SIMD instruction'ı o zaman #NM (device-not-available) ile fault verir ve #NM handler doğru state'i talep üzerine swap eder.

Meltdown-NM, Canella et al. taxonomy'sinin #NM yaprağıdır ("Meltdown-NM / FPU Register Bypass"). LazyFP invariant'ı: #NM fault lazy biçimde handle edilir. LazyFP yazarlarının ifade ettiği gibi, saldırı, "FPU ya da SIMD instruction'larının ilk kullanımına işaret eden fault'u üreten bir instruction'ı izleyen FPU ya da SIMD instruction'larını transient olarak çalıştıran" processor'larda çalışır. O transient window'da FPU/SIMD register file hâlâ önceki task'in içeriğini tutar (henüz swap edilip çıkarılmamışlardır), bu yüzden attacker'ın transient instruction'ları victim'in register'larını okur ve

NM retire olmadan önce onları cache'e encode eder.

Sibling taxonomy'den farkı: Meltdown-NM'yi belirleyen exception #NM'dir (lazy FPU, device-not-available) ve sızdırılan şey başka bir process'in FPU/SIMD register'larıdır — system register'ları (#GP, Meltdown-GP), bounds ihlali (#BR, Meltdown-BR), present-bit/L1TF (Meltdown-P), PKU/PKRU bypass (Meltdown-PK) ya da read-only transient store (R/W, Meltdown-RW) değil.

Bu, memory değil, register state'inin cross-process bir leak'idir. Özellikle tehlikelidir çünkü x86 FPU/SIMD register'ları cryptography için yeniden kullanılır: AES-NI instruction'ları XMM register'ları üzerinde çalışır, dolayısıyla AES round key'leri ve başka bir process'in herhangi bir MMX/SSE/AVX data'sı geri kazanılabilir. Window, gerçek bir #NM ile değil, bir mispredict edilmiş branch'in shadow'unda da açılabilir, dolayısıyla architectural bir fault bile gerekmez.

Walkthrough

// Conceptual Meltdown-NM / LazyFP. Real PoC: Stecklina & Prescher (arXiv:1806.07480)
// Precondition: OS uses lazy FPU switch; TS bit set => FPU access raises #NM,
// but the FPU file still holds the *previous* process's registers.
// Run under fault suppression (signal handler) or a mispredicted-branch shadow.
__m128i v = _mm_load_si128(xmm_state);   // transient read of victim's XMM (e.g. AES key)
uint8_t b = ((uint8_t*)&v)[0];
(void)probe[b * 4096];                    // encode one byte into cache state
// decode: time probe[i*4096]; fastest line index == leaked byte
  1. Lazy state'i zorla. Victim'den bir context switch sonrasında TS bit'i set olur ve victim'in FPU/SIMD register'ları resident kalır.
  2. FPU/SIMD state'ine transient olarak dokun (örneğin bir SSE/AVX read) ki #NM yükseltilsin ama değer transient olarak forward edilsin.
  3. Encode et + Flush+Reload: sızdırılan register'ın her byte'ını bir probe array aracılığıyla; victim'in XMM/YMM içeriğini (örneğin bir AES-NI key'ini) yeniden oluştur.
Sınıflandırma / disclosure gerçekleri
Taxonomy leaf : Meltdown-NM  (exception = #NM, device-not-available)
Aliases       : LazyFP, Lazy FP State Restore
CVE           : CVE-2018-3665
Advisory      : INTEL-SA-00145
Disclosed     : 13 June 2018 (Stecklina & Prescher; Amazon / Cyberus / SYSGO)
Affected      : Intel Sandy Bridge and newer; AMD not affected.
Leaked        : other process's FPU/SIMD registers (MMX/SSE/AVX),
                including AES-NI key material.

Detection

Victim'de architectural iz yok. Güvenilir sinyal runtime değil, konfigürasyondur: bir sistem yalnızca OS/VMM fiilen lazy FPU switching kullanıyorsa exposed olur. Varsayılan olarak eager restore'a düşen (ya da eagerfpu=on ile) kernel'ler exploit edilemez, dolayısıyla detection, kullanımdaki FPU-switch politikasını denetlemeye indirgenir.

Mitigation

  • Eager FPU state restore. Intel'in önerisi (INTEL-SA-00145), "Lazy FP state restore yerine Eager FP state restore'u kullanmaktır" — FPU/SIMD file'ını her zaman context-switch anında save/restore et ki register file asla başka bir process'in secret'larını transient olarak tutmasın. Bu, microcode gerektirmeyen bir software / OS seviyesinde fix'tir.
  • Linux bunu eager-FPU path'i üzerinden sunar (≥ 3.7 kernel'lerde eagerfpu=on); modern kernel'ler lazy FPU'yu tamamen kaldırdı. LazyFP yazarları, "lazy FPU context switching'in tüm işletim sistemlerinde kapatılması gereken tehlikeli bir optimizasyon olduğu" sonucuna varır.
  • KPTI alakasız: bu, kernel-memory page-table isolation'dan bağımsız bir register leak'idir.

References