Skip to content

MDS buffer clear (VERW)

Privilege transition'larda CPU'nun dahili data buffer'larını overwrite etmek için obsolete VERW instruction'ı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:

$ cat /sys/devices/system/cpu/vulnerabilities/mds
Mitigation: Clear CPU buffers; SMT vulnerable

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:

off     : mitigation disabled
full    : CPU affected, MD_CLEAR advertised in CPUID
vmwerv  : CPU affected, MD_CLEAR NOT advertised (guest on un-updated
          hypervisor) — kernel still issues VERW hoping it clears buffers

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.

References