Meltdown kernel memory read (Variant 3)¶
Meltdown / Rogue Data Cache Load (RDCL), CVE-2017-5754: out-of-order pipeline'ı supervisor-bit permission check'ine karşı yarıştırarak unprivileged bir user process'ten keyfi kernel (ve physical) memory'yi transient olarak okur.
Mechanism¶
Neden çalışır
İşletim sistemleri kernel'i her process'in address space'ine map'ler ve user erişimini yasaklamak için page-table entry'sindeki bir supervisor bit'e güvenir. Permission check architectural olarak zorunlu kılınır — bir kernel adresinin user load'u nihayetinde bir page fault yükseltir ve sonuç atılır.
Meltdown'ın faydalandığı invariant, out-of-order execution'ın fault'un önünden gitmesidir. Etkilenen Intel core'larında, faulting bir load yine de yasak byte'ı geçici bir register'a yerleştirir ve dependent transient instruction'lar, exception yükseltilip transient sonuçlar squash edilmeden önce o değer üzerinde çalışır. Paper'ın ifade ettiği gibi: savunmasız CPU'lar "unprivileged bir process'in privileged (kernel ya da physical) bir adresten geçici bir CPU register'ına data yüklemesine" ve hatta "bu register değerine dayalı daha fazla hesaplama yapmasına, örneğin register değerine dayalı bir array'e erişmesine" izin verir.
Architectural olarak hiçbir şey sızmaz — fault register state'ini atar. Ama transient array access cache state'ini değiştirir ve o microarchitectural side effect hayatta kalır. Attacker, bunu bir cache covert channel (Flush+Reload) aracılığıyla geri kazanır ve zor yakalanan bir transient değeri architectural bir değere dönüştürür. Bu bir race condition'dır: "kazanılabilir (yani doğru değeri okur), ama sık sık kaybedilir (yani 0 değeri okur)", bu yüzden attacker yeniden dener.
Canella et al. taxonomy'sinde bu Meltdown-US'tir (user/supervisor), Intel'in Rogue Data Cache Load'u (RDCL) / "Variant 3."
Walkthrough¶
Meltdown'ın transient çekirdeği (paper, Listing 2): erişilemez bir kernel adresi yüklenir ve bir exception yükseltir; sonraki instruction'lar out-of-order çalışır ve byte'ı bir indirect access aracılığıyla sızdırır:
; rcx = kernel address, rbx = probe array
xor rax, rax
retry:
mov al, byte [rcx] ; faulting load of kernel byte -> al
shl rax, 0xc ; * 4096 (one page per possible byte value)
jz retry ; if 0 was returned, retry (race lost)
mov rbx, qword [rbx + rax] ; transiently touch probe[byte*4096]
Çevreleyen akış (paper, Figure 5):
- Fault'u bastır/handle et. Ya fork-and-crash (transient diziyi bir child'da çalıştır, parent'ta geri kazan) ya da load'ı bir Intel TSX transaction'ına sar ki architectural fault bastırılsın.
- Transient olarak sızdır + encode et. Yukarıdaki diziyi çalıştır; kernel byte'ı, probe array'in 256 page'inden birini seçer.
- Flush+Reload ile decode et. Window çöktükten sonra, 256 probe page'inin her
birinin reload'unu
rdtscpile zamanla; cache'lenmiş tek page index'i sızdırılan byte'ın kendisidir. - Kernel/physical address aralığı boyunca byte byte tekrarla.
Raporlanan performans (paper'dan)
Warning
Meltdown hiçbir software bug'ına dayanmaz — kernel'i user address space'e map'leyen her büyük OS'te çalışır. Kocher et al.'ın Spectre'ı ayrıdır: Spectre, victim'i erişim yetkisi olduğu data'yı sızdırması için kandırır ve KAISER ile mitigate edilmez, oysa Meltdown privilege sınırını doğrudan aşar.
Detection¶
Victim'in içinden zor — Meltdown okur, yazmaz. Host tarafı sinyaller zayıf sezgilerdir: sıkı Flush+Reload timing loop'ları, kernel adreslerinin tekrarlanan faulting load'ları (ya da suppression için TSX kullanıldığında yüksek TSX-abort oranları) ve fork-and-crash pattern'leri.
Mitigation¶
- KAISER / KPTI (page-table isolation). KAISER savunması — başlangıçta KASLR için tasarlanmış ama Meltdown'ın keşfiyle birlikte önemi anlaşılmış — kernel memory'yi user space'e map'lememekle Meltdown'a karşı korur, böylece kernel/physical adresler hiç çözülemez. KPTI (Linux), KVA Shadow (Windows) ve eşdeğerleri olarak yayımlandı. Yazarlar KAISER'ın "derhal deploy edilmesi gerektiğini" vurgular.
- Hardware / microcode. Kök neden hardware'de olduğu için, sonraki CPU'lar RDCL'i silicon'da fix eder; Intel'in advisory'si etkilenen parçaları ve rehberi takip eder.
- KAISER'ın map'li tutmak zorunda olduğu birkaç page (örneğin interrupt handler'lar) için artık exposure kalır.