MDS buffer clear (VERW)¶
Privilege transition'larda CPU'nun dahili data buffer'larını overwrite etmek için obsolete
VERWinstruction'ını (artı bir microcode update) yeniden amaçlandırır ve Microarchitectural Data Sampling leak'ini kapatır.
Mechanism¶
Note
MDS (Microarchitectural Data Sampling), unprivileged kod'un küçük dahili CPU
buffer'larında kalan stale veriyi speculatively okumasına izin verir — store
buffer (CVE-2018-12126, MSBDS), fill buffer (CVE-2018-12130, MFBDS) ve load
port'lar (CVE-2018-12127, MLPDS), artı uncacheable-memory sampling
(CVE-2019-11091, MDSUM). Savunmanın geri kazandırdığı invariant:
daha az ayrıcalıklı bir domain'e geçişten hiçbir architecturally-stale
microarchitectural buffer state sağ çıkmamalıdır. Bir microcode update,
legacy VERW instruction'ına (operand'ı bir memory location olduğunda) o
buffer'ları overwrite etme yan etkisini kazandırır, böylece yazılım user
space'e dönmeden, bir guest'e girmeden ya da idle'a geçmeden hemen önce
onları temizler. SMT core'larda fill buffer'lar (MFBDS) ve load port'lar
(MLPDS) sibling thread'ler arasında paylaşılabilir; store buffer (MSBDS)
ise per-thread partition'landığı için SMT'nin devre dışı bırakılmasını
gerektirmez. MFBDS ve MLPDS için SMT disable edilmedikçe eşzamanlı leakage
sürebilir.
Buffer-clear savunmadır; leak'in kendisi bug'dır. Buffer'lar saldırganın sample'laması için bırakılmak yerine overwrite edildiğinden, speculative forward secret'lar yerine clobber edilmiş veriyi döndürür.
Walkthrough¶
Enumeration: temizleme yan etkisinin desteği MD_CLEAR CPUID bit'i ile
duyurulur.
CPUID.(EAX=07H,ECX=0):EDX[MD_CLEAR = 10] == 1
-> VERW (mem operand) flushes microarchitectural buffers
Kernel temizlemeyi CLEAR_CPU_BUFFERS asm macro'su /
x86_clear_cpu_buffers() (feature flag X86_FEATURE_CLEAR_CPU_BUF) ile yapar
ve bu, kernel→user, host→guest ve idle/C-state transition'larında çağrılır.
Durumu sysfs üzerinden kontrol et:
Olası değerler Not affected, Vulnerable ve
Mitigation: Clear CPU buffers'ı içerir; ilgili olduğunda bir SMT niteleyicisi
(SMT vulnerable, SMT mitigated ya da SMT disabled) eklenir.
Warning
Mitigation: Clear CPU buffers; SMT vulnerable, buffer'ların transition'larda
flush edildiği ama bir sibling hyperthread'in hâlâ eşzamanlı olarak sample
yapabileceği anlamına gelir. Etkilenen SMT parçalarında tam koruma SMT'yi
disable etmeyi gerektirir (mds=full,nosmt). (Store-buffer MSBDS istisnadır:
per-thread partition'landığı için microcode mevcutken SMT disable
gerektirmez.)
Boot-parameter modları ve vmwerv tuhaflığı
mds=full # clear buffers (default on affected CPUs)
mds=full,nosmt # also disable SMT
mds=off # disable the mitigation
Kernel-internal mitigation state'leri:
Detection¶
/sys/devices/system/cpu/vulnerabilities/mds, otoriter durum node'udur.
Vulnerable, microcode/MD_CLEAR olmadığı ve hiçbir temizlemenin yapılmadığı
anlamına gelir; Mitigation: Clear CPU buffers ise VERW tabanlı temizlemenin
aktif olduğunu doğrular.
Mitigation¶
Microcode'u güncel tut ki MD_CLEAR duyurulsun, X86_FEATURE_CLEAR_CPU_BUF'lı
bir kernel çalıştır ve etkilenen parçalarda mds=full,nosmt'i değerlendir. Aynı
VERW temizleme mekanizması, ilgili MDS-ailesi mitigation'ları (TSX
Asynchronous Abort, Processor MMIO stale-data clear) tarafından yeniden
kullanılır; L1D cache flush ise farklı (L1TF) bir buffer'ı
kapsar.