Skip to content

SWAPGS (CVE-2019-1125)

Kernel entry path'inde SWAPGS'in çalışıp çalışmayacağını mis-speculate eden, kernel memory access'leri için kısa süreliğine yanlış GS base'i kullanan Spectre-v1-tarzı bir speculative side channel.

Mechanism

Bug class / invariant

x86-64 SWAPGS instruction'ı, ring0/ring3 boundary'sinde user GS base'ini kernel GS base'iyle (ve geri) swap eder. Kernel entry stub'ları, trap'in user mode'dan mı yoksa kernel mode'dan mı geldiğine bağlı bir conditional branch ile SWAPGS'in çalışıp çalışmayacağına karar verir. Güvenlik invariant'ı şudur: kernel içine girildikten sonra GS-relative memory access'leri kernel per-CPU base üzerinden çözülür. SWAPGS bu invariant'ı speculative olarak kırar: branch predictor execution'ı yanlış path'e yönlendirebilir (SWAPGS'i architectural olarak doğru seçime karşı çalıştırarak ya da atlayarak), böylece bir GS-relative load, misprediction squash edilmeden önce attacker'ın etkilediği bir base'i transient şekilde dereference eder. Transient load'un cache state üzerindeki etkisi hayatta kalır ve leak'i oluşturur. Kritik olarak, SWAPGS bir serializing instruction değildir, bu yüzden mevcut Spectre-v1 LFENCE yerleşimleri ve KPTI bu gadget'ı kapsamadı.

Walkthrough

Public Bitdefender/Red Hat advisory'lerinden üst düzey (zaten patch edilmiş):

  1. Kernel entry'de swapgs stub'ı, trap origin'e göre SWAPGS'i conditional olarak çalıştırır. Bir attacker ilgili conditional branch'i mistrain eder.
  2. CPU speculative olarak yanlış path'i alır, böylece sonraki GS-relative access'ler attacker'ın etkileyebileceği bir GS base kullanır.
  3. Transient, attacker-controlled bir GS-relative load kernel memory'yi okur; dependent bir access bir secret byte'ı cache'e encode eder.
  4. Pipeline mis-speculation'ı squash ettikten sonra attacker byte'ı bir cache-timing probe ile (bir probe array üzerinden Flush+Reload) kurtarır.
Kavramsal entry-path şekli
; conceptual only — real stubs differ by kernel version
test   <came-from-user>
jz     .skip_swapgs        ; branch may mis-speculate
swapgs                     ; speculatively run/skipped against the truth
.skip_swapgs:
mov    rax, gs:[<offset>]  ; transient load with wrong GS base

Detection

  • Bu, architectural bir crash olmadan saf bir speculative read'tir, bu yüzden doğrudan host sinyalleri zayıftır. Leak'i değil, exploitation harness'larını tespit etmeye odaklan.
  • Yüksek kernel entry oranlarıyla (syscall'lar, fault'lar) eşleşmiş sıkı Flush+Reload/cache-timing loop'ları çalıştıran process'leri izle — perf/EDR telemetry'sinde yüksek cache-misses, IPC anomalileri.
  • Hypervisor introspection'ı (örneğin memory-introspection ürünleri), anormal tekrarlayan kernel-entry training pattern'lerini işaretleyebilir.
  • OS-level mitigation'ın gerçekten uygulandığını doğrula (aşağıya bakın) — patch'in yokluğu kendi başına en yüksek sinyalli "detection"dır.

Mitigation

  • OS vendor patch'lerini uygula: Windows (Microsoft, 2019-07 cumulative update'leri) ve Linux, swapgs entry path'lerine serialization/LFENCE ekledi; reboot gerekli.
  • Bunlar software fix'leridir — microcode-only bir mitigation yoktur. Kernel build'inin swapgs-gadget fix'ini içerdiğinden ve enabled olduğundan emin ol.
  • Defense-in-depth: KPTI, generic Spectre-v1 hardening ve entry code'da speculation barrier'ları tutmak, ilgili entry-path gadget'larına maruziyeti azaltır.

References