Skip to content

ECCploit

Rowhammer'a karşı kullanılan ECC DRAM'i, ECC correction latency'sini bir timing side channel olarak kullanarak bypass et; böylece sessiz ve tespit edilemeyen bir bozulma üreten üç adet aynı-word bit flip'i nereye yerleştireceğini keşfet.

Mechanism

ECC bir biti düzeltir, ikisini tespit eder — bu yüzden üçü hedefle

64-bit bir word üzerindeki SECDED ECC, herhangi bir single-bit flip'i düzeltebilir (correct) ve bir double-bit flip'i tespit edebilir (detect) ama düzeltemez; tespit edilen bir double error normalde makineyi crash'ler. Aynı ECC word'ünde üç veya daha fazla flip ise sessizce geçerli bir codeword'e alias olabilir — ne düzeltilir ne de tespit edilir. Dolayısıyla saldırganın amacı, saldırgan tarafından seçilen pozisyonlarda tek bir word'de üç flip mühendisliği yapmaktır; bu da hedef word'ün her bir pozisyonunun flip edilebilirliğini, hiçbir zaman crash tetiklemeden bilmeyi gerektirir.

Buradaki kilit primitif bir timing side channel'dır: flip'i ECC tarafından düzeltilmiş bir word'ü okumak, temiz bir word'ü okumaktan ölçülebilir şekilde daha uzun sürer — bazı sistemlerde ~1000x'e kadar. Bu zamanlama farkı, "bu single flip gerçekleşti ve düzeltildi" diyen bir oracle'dır; saldırganın üç-flip'lik bir pattern'i bir araya getirmeden önce her seferinde tek bir bit pozisyonunu güvenle yoklamasını sağlar.

Bu, Rowhammer ve memory templating yaklaşımlarının bir incelmesidir: templating doğrudan data corruption'ı gözlemleyerek değil, ECC correction oracle'ı üzerinden yapılır. CVE-2018-18904 olarak takip ediliyor.

Walkthrough

1. ECC fonksiyonunu reverse-engineer et (physical access fazı). Kodu öğrenmek için bilinen hatalar enjekte et (örn. cold-boot transplant, needle probing) ki flip'ler planlanabilsin. Bu, platform başına tek seferlik bir çabadır.

2. Timing ile single-flip templating. Hammer'ı, aggressor ve victim word'leri tam olarak bir bitte farklı olacak şekilde ayarla, hammer'la, sonra okumaları zamanla:

for each candidate bit position b:
    set up word so only bit b can flip
    hammer
    t = time_read(victim_word)
    if t >> t_clean:   # correction latency observed
        record b as a flippable, corrected position

3. Üç flip'i bir araya getir. Bağımsız olarak doğrulanmış üç flip edilebilir pozisyonu tek bir ECC word'ünde birleştir ki bozulmuş word geçerli (ama yanlış) bir codeword olsun:

positions {b1,b2,b3} chosen so XOR of their error vectors
hits a different valid codeword -> silent corruption, no crash

ECC saldırganı yavaşlatır, durdurmaz

ECCploit, ECC'nin bir speed bump (hız kesici) olduğunu, bir bariyer olmadığını gösterir. İşi büyük ölçüde artırır (templating dikkatli, pozisyon-pozisyon bir aramaya dönüşür) ve naif yapılırsa crash'leri provoke etmek kolaydır — ama sabırlı bir saldırgan, çoğu zaman unprivileged bir remote shell üzerinden, yine de sessiz bir flip'e ulaşabilir.

Detection

  • Memory controller'ın error counter'larındaki (EDAC / MCA) corrected-ECC event'lerinde bir ani artış, birinin flip edilebilir pozisyonları yokladığının güçlü bir göstergesidir.
  • Zaman içinde kümelenmiş, açıklanamayan machine-check (detected uncorrectable) event'leri.

Mitigation

  • Flip mevcudiyetini azaltmak için refresh-rate artışı / TRR.
  • Timing oracle'ın yok olması için correction latency'yi rate-limit'le veya randomize et.
  • Tekrarlayan corrected error'ları bir güvenlik olayı olarak ele al ve DIMM'i izole et.

References