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ş):
- 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. - CPU speculative olarak yanlış path'i alır, böylece sonraki
GS-relative access'ler attacker'ın etkileyebileceği birGSbase kullanır. - Transient, attacker-controlled bir
GS-relative load kernel memory'yi okur; dependent bir access bir secret byte'ı cache'e encode eder. - 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
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üksekcache-misses,IPCanomalileri. - 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/
LFENCEekledi; 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.