Skip to content

Cache Speculation Side-channels (Arm whitepaper)

Arm'ın temel whitepaper'ı: speculative execution'ın Arm core'larında cache state üzerinden nasıl veri sızdırdığını ve bunu hafifleten CSDB/SB barrier dizilerini anlatır.

Mechanism

Speculation cache üzerinden neden sızdırır

Modern Arm core'ları, çözülmemiş branch'lerin ve permission check'lerinin ötesinde instruction'ları speculative olarak çalıştırır. Yanlış spekülasyon yapılırsa speculative iş architectural olarak geri alınır, ama cache üzerindeki microarchitectural yan etkileri persist eder. Arm'ın tarif ettiği temel pattern: bir değer speculative olarak load edilir ve "speculative olarak load edilen değer daha sonra, yine speculative gerçekleştirilebilen ikinci bir load ya da indirect branch için bir adres oluşturmakta kullanılabilir." Bu ikinci access index'i secret'a bağlı olan bir cache line allocate eder. Sonradan cache hit/miss latency'sini ölçebilen bir attacker secret'ı geri kazanır — hızlı = line cache'lenmiş (hit), yavaş = cache'lenmemiş (miss). Architectural rollback cache footprint'ini asla geri almaz, dolayısıyla leak yanlış spekülasyonu atlatarak hayatta kalır.

Whitepaper, speculation tabanlı cache timing channel'larını sayar:

  • Variant 1 — bounds-check bypass (CVE-2017-5753): untrusted, out-of-range index'ler privileged koda geçirilir; bu kod bounds check'in ötesini speculative olarak okur ve sonra o data'yı cache'e sızdırır.
  • Variant 2 — branch target injection (CVE-2017-5715): düşük ayrıcalıklı kod branch predictor'ı eğitir, böylece yüksek ayrıcalıklı kod attacker'ın seçtiği, bir secret'ı cache timing üzerinden sızdıran bir gadget'ı speculative çalıştırır.
  • Variant 3 — rogue data cache load (CVE-2017-5754, "Meltdown"): bu variant köken olarak bir Intel/POWER problemidir; Arm core'larının yalnızca küçük bir altkümesi (örn. Cortex-A75) etkilenir. Etkilenen implementation'larda permission-fault'lu konumlardan yapılan speculative load'lar yine de ileri spekülasyonda kullanılabilir data döndürür; bu da düşük-EL koduna erişilemez bellek okuma imkânı verir. Arm'ın kendi ele aldığı yakın akraba variant, aşağıdaki 3a'dır — bu ikisini birbirine karıştırma.
  • Variant 3a — rogue system register read (CVE-2018-3640): Arm'ın açıkça belgelediği ayrı bir variant; speculative olarak okunan sistem register'ları (yalnızca privileged kodun görmesi gereken hardware state) bir side-channel üzerinden sızabilir. Variant 3'ün aksine keyfi bellek değil, register state hedeftir. Etkilenen core'lar için Arm CPU Security Bulletin'e bakılmalıdır.

Walkthrough

Variant-1 mitigation'ı, out-of-range path'te untrusted offset'i sıfırlayan bir conditional select'i, Consumption of Speculative Data Barrier yani CSDB ile eşleştirir. CSDB şunu garanti eder: "CSDB'den sonra program order'da görünen, bir branch instruction dışındaki hiçbir instruction, herhangi bir data value prediction'ının sonuçlarını kullanarak speculative çalıştırılamaz."

; AArch64 — bounds-check bypass mitigation
    CMP   X0, X1            ; X0 = untrusted offset, X1 = limit
    BGE   out_of_range
    CSEL  X0, XZR, X0, GE   ; force X0 = 0 on the out-of-range path
    CSDB                    ; bar speculation that consumes the predicted X0
    LDRB  W4, [X5, X0]      ; now safe to dereference with X0
; AArch32 equivalent
    CMP    R0, R1
    BGE    out_of_range
    MOVGE  R0, #0           ; conditional move zeroes the offset
    CSDB
    LDRB   R4, [R5, R0]

Arm, bu CSEL/MOV + CSDB kombinasyonunun şu anki ve gelecekteki tüm Arm implementation'larında problemi ele almak için yeterli olduğunu belirtir. Linux kernel'inde aynı şey, CSDB dizisini üreten architecture-neutral nospec/array_index_nospec accessor'ları üzerinden ortaya çıkar.

DSB+ISB ağır el fallback'tir

Conditional-select + CSDB dizisinin eklenemediği yerlerde, bir alternatif, speculation'ı zorla serialize edip drain eden DSB SYS ardından ISB kullanmaktır. Arm bunun CSDB'ye göre "muhtemelen çok daha büyük bir performance etkisine sahip olacağını" belirtir ve yalnızca hafif dizinin pratik olmadığı durumlarda kullanılmalıdır.

SB instruction'ı (ARMv8.0-SB)

Daha yeni core'lar SB (Speculation Barrier) instruction'ını implement eder; bu, kendisinden sonraki instruction'ların, kendisinden önceki speculative execution'dan hesaplanan state kullanılarak speculative çalıştırılmasını engeller. SB yalnızca ARMv8.0-SB extension'ını implement eden işlemcilerde mevcuttur; ona sahip olmayan core'lar DSB+ISB dizisine geri döner. SB, CSDB gibi value-dependent bir barrier'ın geçerli olmadığı, control flow'un unconditional değişimlerini (örn. bir indirect branch'ten sonra ulaşılan bir rutinin başlangıcı) korumak için tasarlanmıştır.

Mitigation

  • Untrusted index'ler üzerindeki bounds check'lerden sonra CSEL/MOV + CSDB ekle (variant 1); kernel'in array_index_nospec tarzı accessor'larını kullan.
  • Variant 2 için branch-predictor hardening / invalidation ve indirect-branch kısıtlamaları kullan.
  • Variant 3, etkilenen implementation'larda KPTI tarzı kernel/user ayrımıyla ele alınır.
  • Control flow'un unconditional değişimleri boyunca speculation'ı engellemek için mümkünse SB, değilse DSB SYS + ISB kullan.

References