Skip to content

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 wrpkru instruction'ı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_NO artı 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

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.)