Meltdown-PK¶
Intel Memory Protection Keys for Userspace'i (PKU/MPK) transient olarak bypass eder: key korumalı bir page'e faulting bir access yine de data'sını speculative olarak forward eder ve attacker
wrpkruçalıştıramadığında bile PKRU read- ve write-disable bit'lerini çürütür.
Mechanism¶
Neden çalışır
Intel Memory Protection Keys for Userspace (PKU, namıdiğer MPK) — ilk
olarak Skylake-SP server CPU'larında — bir process'in bir page'in access
permission'larını bir syscall ya da TLB flush olmadan doğrudan user space'ten
değiştirmesine izin verir. Her page 4-bit'lik bir protection key ile etiketlenir;
per-thread PKRU register'ı, her key için bir access-disable ve bir
write-disable bit tutar. Permission'ları değiştirmek yalnızca bir wrpkru'dur.
Bu, PKU'yu ucuz in-process isolation için cazip kılar (örneğin aynı address
space'teki bir secret bölgeden bir library'yi sandbox'lamak).
İşin püf noktası: PKRU enforcement, sıradan page permission'ları gibi, lazy
biçimde kontrol edilir. PKU korumalı bir page'e bir load bir #PF yükseltmek
zorundadır, ama etkilenen Intel core'larında değer, fault retire olmadan
önce dependent instruction'lara transient olarak forward edilir. Canella et
al. ("A Systematic Evaluation of Transient Execution Attacks and Defenses") buna
Meltdown-PK adını verir ve PKU'nun sağladığı hem read hem write
isolation'ını bypass ettiğini gösterir.
Kritik özellik — ve onu in-process sandbox'lar için tehlikeli kılan şey:
"Meltdown-PK, bir attacker'ın containing process'te code execution'ı varsa, attacker
wrpkruinstruction'ını çalıştıramasa bile (örneğin blacklisting) çalışır."
Dolayısıyla untrusted code'un korumalı bir bölgeyi yeniden etkinleştirmesini
engellemek için wrpkru'yu bloklayan bir sandbox yeterli değildir: untrusted
code korumalı data'yı yine de transient olarak okur. Ve cross-privilege Meltdown
varyantlarının aksine, Canella et al. hiçbir software workaround'ı olmadığını
belirtir — PKRU, bir privilege level içinde tamamen hardware'de zorunlu kılınır.
Sibling taxonomy'den farkı: Meltdown-PK, PKU/PKRU protection-key
isolation'ını bypass eder (key korumalı page'e #PF) — sıradan present-bit/L1TF
(Meltdown-P), bounds #BR (Meltdown-BR), system
register #GP (Meltdown-GP), lazy-FPU #NM
(Meltdown-NM) ya da read-only R/W-bit transient store
(Meltdown-RW) değil. Ayırt edici nokta: wrpkru bloklansa bile
transient read çalışır ve etkilenen silicon'da in-process software fix'i yoktur.
Walkthrough¶
Yazarların proof-of-concept'i: bir mapping oluştur, hem read'i hem write'ı geri çekmek için PKU kullan, architectural fault'u doğrula, ardından byte'ları transient olarak sızdır.
Kavramsal Meltdown-PK leak'i
// 1. Map a page and stash a secret while still accessible.
char *p = mmap(...);
strcpy(p, "SECRET");
// 2. Use PKU to remove BOTH read and write access (no syscall needed).
pkey_mprotect(p, 4096, PROT_READ | PROT_WRITE, key);
wrpkru(disable_access(key)); // PKRU access-disable + write-disable
// 3. Architecturally, any access now faults:
// char c = *p; -> #PF (as expected)
// 4. Transiently, the value is still forwarded before the fault retires:
flush(probe);
TRANSIENT {
uint8_t v = *(volatile uint8_t *)p; // #PF pending; value forwarded
(void)probe[v * 4096]; // encode into cache
}
uint8_t leaked = reload_index(probe); // Flush+Reload recovers "S",...
"protected memory access'ler bir
#PFüretir. Ancak proof-of-concept'imiz, bir Flush+Reload covert channel ile adversarial bir transient instruction dizisi aracılığıyla data'yı sızdırmayı başarır."
Covert channel, sade Flush+Reload'dur: transient byte, 256-entry'lik bir probe array'in bir line'ını seçer ve sonradan timing ile decode edilir.
Detection¶
Meltdown-PK için özel bir sysfs vulnerability dosyası yoktur; daha geniş Meltdown
(/sys/devices/system/cpu/vulnerabilities/meltdown) sınıfının kaderini paylaşır.
Victim'in tarafından bakıldığında, PKU tabanlı bir sandbox transient read'i hiç
gözlemleyemez — tek sinyali olacak architectural fault'un attacker için hiç
ateşlenmesine gerek yoktur (transient dizi onu handle eder/bastırır).
Mitigation¶
Canella et al., Meltdown-PK'nın PKU desteğiyle Ubuntu 18.04 çalıştıran bir Amazon EC2 C5 (Skylake-SP) instance'ında gösterildiğini raporlar. Mitigation'lar:
- Address-space isolation (Intel'e göre): bir address space içinde PKU'ya güvenmek yerine secret'ı tamamen attacker'ın address space'inin dışında tutun — etkilenen silicon'da in-process bir software fix'i yoktur.
- Silicon fix: yeni
RDCL_NOartı PKU desteğini enumerate eden Meltdown'a-dirençli CPU'lar, Meltdown-PK'yı hardware'de mitigate eder ve transient execution'ın açığa çıkarabileceğini sınırlar. - Genel Meltdown-type savunmalar (fault'un data forward etmesini engelleme), mevcut olduğu yerde bu varyantı da kapsar.
References¶
- Canella et al., A Systematic Evaluation of Transient Execution Attacks and Defenses (USENIX Security 2019)
- Canella et al. (arXiv:1811.05441) — full text, Sec. 4.6 Meltdown-PK
Advisory durumu
Meltdown-PK, Canella et al. (USENIX Security 2019) tarafından açıklandı ve L1TF/Foreshadow'un (INTEL-SA-00161) aksine kendine ait standalone bir Intel advisory'si ya da ayrı bir CVE'si yoktur; daha geniş Meltdown class'ının bir parçasıdır. (SA-00161 L1TF advisory'sidir, PKU'yu kapsamaz.)